栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

EEPROM学习(IIC)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

EEPROM学习(IIC)

1.什么是EEPROM

EEPROM (Electrically Erasable Programmable Read-Only Memory),带电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。

2.AT24C08介绍及引脚接口

 

A0、A1、NC悬空

3.什么叫主从机?

单片机和24C08通信,我的单片机就叫主机,24C02叫从机

4.芯片从地址

 AT24C设备地址为如下,前四位固定为1010,A2~A0为由管脚电平。AT24CXX EEPROM Board模块中默认为接地。A2~A0为000,最后一位表示读写操作。所以AT24Cxx的读地址为0xA1,写地址为0xA0。

 实例:
利用定时器产生秒表,每过一秒把变化的数字写入AT24C02内部,然后从AT24C02内部读取储存的数据,并显示在数码管上。

  • 数码管显示
oid display(uchar shi,uchar ge)
{
    dula=1;
    P0=table[shi];
    dula=0;
    P0=0xff;
    wela=1;
    P0=0xfe;
    wela=0;
    delayms(5);

    dula=1;
    P0=table[ge];
    dula=0;
    P0=0xff;
    wela=1;
    P0=0xfd;
    wela=0;
    delayms(5);  
}
  • 1ms延时
void delayms(uchar x)
{
	uchar a,b;
	for(a=x;a>0;a--)
	 for(b=110;b>0;b--);
}

完整代码如下:

#include
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
bit write=0;
sbit dula=P2^6;
sbit wela=P2^7;
uchar temp;
uchar num,num_sec,address_point;

uchar code table[]={
     0x3f,0x06,0x5b,0x4f,
	 0x66,0x6d,0x7b,0x07,
	 0x7f,0x6f,0x77,0x7c,
	 0x39,0x5e,0x79,0x71};

void display(uchar,uchar);
void delay()
{ ;; }
void start()  //开始信号
{	
	sda=1;
	delay();
	scl=1;
	delay();
	sda=0;
	delay();
}

void stop()   //停止
{
	sda=0;
	delay();
	scl=1;
	delay();
	sda=1;
	delay();
}

void respons()  //应答
{
	uchar i;
	scl=1;
	delay();
	while((sda==1)&&(i<250))i++;
	scl=0;
	delay();
}

void init()
{
	sda=1;
	delay();
	scl=1;
	delay();
}

void write_byte(uchar date)
{
	uchar i,temp;
	temp=date;


	for(i=0;i<8;i++)
	{
		temp=temp<<1;
		scl=0;
	    delay();
		sda=CY;
		delay();
		scl=1;
		delay();
	//	scl=0;
     //   delay();
	}
	scl=0;//传输完毕需要释放SDA线,如果不释放的话如果下次读写方向改变,数据线不空闲 
	delay();
	sda=1;
	delay();
}

uchar read_byte()
{
	uchar i,k;
	scl=0;
	delay();
	sda=1;
	delay();
	for(i=0;i<8;i++)
	{
		scl=1;
		delay();	
		k=(k<<1)|sda;
		scl=0;
		delay();	
	}
	return k;
}

void delayms(uchar x)
{
	uchar a,b;
	for(a=x;a>0;a--)
	 for(b=100;b>0;b--);
}

void write_add(uchar address,uchar date)
//把某数据写进EEPROM的某地址,参数地址和参数数据可以是任意进制的数字,
//因为写入的时候都转成了16进制
{
	start();
	write_byte(0xa0);
	respons();
	write_byte(address);
	respons();
	write_byte(date);
	respons();
	stop();
}

uchar read_add(uchar address)
{
	uchar date;
	start();
	write_byte(0xa0);
	respons();
	write_byte(address);
	respons();
	start();
	write_byte(0xa1);
	respons();
	date=read_byte();
	stop();
	return date;
}

void main()
{	
	uchar shi,ge;
	init();
	TH1=(65535-45872)/256;
	TL1=(65535-45872)%256;
	TMOD=0x10;
	EA=1;
	ET1=1;
	TR1=1;	
	while(1)
	{
		write_add(address_point,num_sec);
		delayms(100);
		P1=read_add(address_point);
		temp=P1;
		shi=temp/10;
		ge=temp%10;
		display(shi,ge);
	}		
}

void display(uchar shi,uchar ge)
{
	dula=1;
	P0=table[shi];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfe;
	wela=0;
	delayms(5);

	dula=1;
	P0=table[ge];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfd;
	wela=0;
	delayms(5);
		
}

void T1_time()interrupt 3
{
	TH1=(65535-45872)/256;
	TL1=(65535-45872)%256;
	num++;
	if(num==20)
	{
		num=0;
		num_sec++;	
		address_point++;
	}
	
}

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869958.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号