第46节:利用AT24C02进行掉电后的数据保存
时间:11-22
来源:互联网
点击:
- ta=0;tempdata<8;tempdata++)
- {
- eeprom_scl_dr=0;
- delay_short(2);
- eeprom_scl_dr=1;
- delay_short(2);
- outdata<=1;
- if(eeprom_sda_dr_sr==1)outdata++;
- eeprom_sda_dr_sr=1; //51单片机的IO口在读取数据之前要先置一,表示数据输入
- delay_short(2);
- }
- return(outdata);
- }
- void write24(unsigned char dd) //发送一个字节的时序
- {
- unsigned char tempdata;
- for(tempdata=0;tempdata<8;tempdata++)
- {
- if(dd>=0x80)eeprom_sda_dr_sr=1;
- else eeprom_sda_dr_sr=0;
- dd<=1;
- delay_short(2);
- eeprom_scl_dr=1;
- delay_short(4);
- eeprom_scl_dr=0;
- }
- }
- unsigned char read_eeprom(unsigned int address) //从一个地址读取出一个字节数据
- {
- unsigned char dd,cAddress;
- cAddress=address; //把低字节地址传递给一个字节变量。
- /* 注释一:
- * IIC通讯过程是一个要求一气呵成的通讯过程,中间不能被其它中断影响时序出错,因此
- * 在整个通讯过程中应该先关闭总中断,完成之后再开中断。但是,这样就会引起另外一个新
- * 问题,如果关闭总中断的时间太长,会导致动态数码管不能及时均匀的扫描,在操作EEPROM时,
- * 数码管就会出现闪烁的现象,解决这个问题最好的办法就是在做项目中尽量不要用动态扫描数码管
- * 的方案,应该用静态显示的方案。那么程序上还有没有改善的方法?有的,下一节我会讲这个问题
- * 的改善方法。
- */
- EA=0; //禁止中断
- start24(); //IIC通讯开始
- write24(0xA0); //此字节包含读写指令和芯片地址两方面的内容。
- //指令为写指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
- ack24(); //发送应答信号
- write24(cAddress); //发送读取的存储地址(范围是0至255)
- ack24(); //发送应答信号
- start24(); //开始
- write24(0xA1); //此字节包含读写指令和芯片地址两方面的内容。
- //指令为读指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
- ack24(); //发送应答信号
- dd=read24(); //读取一个字节
- ack24(); //发送应答信号
- stop24();//停止
- /* 注释二:
- * 在写入或者读取完一个字节之后,一定要加上一段延时时间。在11.0592M晶振的系统中,
- * 写入数据时经验值用delay_short(2000),读取数据时经验值用delay_short(800)。
- * 否则在连续写入或者读取一串数据时容易丢失数据。如果一旦发现丢失数据,
- * 应该适当继续把这个时间延长,尤其是在写入数据时。
- */
- delay_short(800);//此处最关键,此处的延时时间一定要,而且要足够长,此处也是导致动态数码管闪烁的根本原因
- EA=1; //允许中断
- return(dd);
- }
- void write_eeprom(unsigned int address,unsigned char dd) //往一个地址存入一个字节数据
- {
- unsigned char cAddress;
- cAddress=address; //把低字节地址传递给一个字节变量。
- EA=0; //禁止中断
- start24(); //IIC通讯开始
- write24(0xA0); //此字节包含读写指令和芯片地址两方面的内容。
- //指令为写指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
- ack24(); //发送应答信号
- write24(cAddress); //发送写入的存储地址(范围是0至255)
- ack24(); //发送应答信号
- write24(dd);//写入存储的数据
- ack24(); //发送应答信号
- stop24();//停止
- delay_short(2000);//此处最关键,此处的延时时间一定要,而且要足够长,此处也是导致动态数码管闪烁的根本原因
- EA=1; //允许中断
- }
- unsigned int read_eeprom_int(unsigned int address) //从一个地址读取出一个int类型的数据
- {
- unsigned char ucReadDataH;
- unsigned char ucReadDataL;
- unsigned intuiReadDate;
- ucReadDataH=read_eeprom(address); //读取高字节
- ucReadDataL=read_eeprom(address+1);//读取低字节
- uiReadDate=ucReadDataH;//把两个字节合并成一个int类型数据
- uiReadDate=uiReadDate<8;
- uiReadDate=uiReadDate+ucReadDataL;
- return uiReadDate;
- }
- void write_eeprom_int(unsigned int address,unsigned int uiWriteData) //往一个地址存入一个int类型的数据
- {
- unsigned char ucWriteDataH;
- unsigned char ucWriteDataL;
- ucWriteDataH=uiWriteData>>8;
- ucWriteDataL=uiWriteData;
- write_eeprom(address,ucWriteDataH); //存入高字节
- write_eeprom(address+1,ucWriteDataL); //存入低字节
- }
- void display_service(void) //显示的窗口菜单服务程序
- {
- switch(ucWd)//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
- {
- case 1: //显示P--1窗口的数据
- if(ucWd1U
AT24C02掉电数据保 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
