第 20 章 i2c 接口器件 2401 及 c51 编程

29
第 20 第 I2C 第第第第 2401 第 C51 第第 1 2401 第第第第第第第第第第 2 AT24CXX 第第第第第第第 3 2401 第第第第第

Upload: sierra

Post on 19-Jan-2016

84 views

Category:

Documents


2 download

DESCRIPTION

第 20 章 I2C 接口器件 2401 及 C51 编程. 1 、 2401 的性能特点和引脚分布 2 、 AT24CXX 系列的内部结构 3 、 2401 的工作原理. AT24CXX 的性能特点和引脚分布. AT24CXX 系列内存是 Atmel 公司生产的高集成度串行 EEPROM ,可进行电擦除,提供的接口形式是 I2C ,其封装和引脚功能如下所示:. AT24CXX 内存的种类和特征. AT24CXX 内存的种类和特征如下表所示的字型代码表如下所示:. AT24CXX 系列 EEPROM 的内部结构. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 20 章 I2C 接口器件 2401 及 C51 编程

第 20 章 I2C 接口器件 2401 及 C51 编程

1 、 2401 的性能特点和引脚分布

2 、 AT24CXX 系列的内部结构

3 、 2401 的工作原理

Page 2: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX的性能特点和引脚分布

AT24CXXAT24CXX 系列内存是系列内存是 AtmelAtmel 公司生产的高集成度串公司生产的高集成度串行行 EEPROMEEPROM ,可进行电擦除,提供的接口形式是,可进行电擦除,提供的接口形式是 I2CI2C ,,其封装和引脚功能如下所示:其封装和引脚功能如下所示:

Page 3: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX内存的种类和特征

AT24CXXAT24CXX 内存的种类和特征如下表所示的字型代码表如下所示:内存的种类和特征如下表所示的字型代码表如下所示:

型号型号 容量容量 /KB/KB 页页 页面写入字节页面写入字节

AT24C01AT24C01 11 88字节字节 //页,页, 128128页页    88字节字节 //页   页   

AT24C02AT24C02 22 88字节字节 //页,页, 256256页页       88字节字节 //页   页   

AT24C04AT24C04 44 88字节字节 //页,页, 256256页,页, 22块块

      88字节字节 //页     页     

AT24C08AT24C08 8888字节字节 //页,页, 256256页,页, 44

块块 1616字节字节 //页页

AT24C16AT24C16 1616 88字节字节 //页,页, 256256页,页, 88块块       1616字节字节 //页     页     

Page 4: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列 EEPROM的内部结构

AT24CXXAT24CXX系列系列 EEPROMEEPROM的内部结构如下图所示:的内部结构如下图所示:

Page 5: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列 EEPROM芯片的寻址 AT24CXXAT24CXX系列系列 EEPROMEEPROM芯片的寻址方式如下图所示:芯片的寻址方式如下图所示:

型号型号 控制码控制码 片选片选 读读 //写写 总线访问的器件总线访问的器件

AT24C01AT24C01 10101010 A2A1A0A2A1A0 1/01/0            最多最多 88个   个   

AT24C02AT24C02 10101010 A2A1A0A2A1A0 1/01/0          最多最多 88个  个  

AT24C04AT24C04 10101010 A2A1a8A2A1a8 1/01/0                    最多最多 44个个          

AT24C08AT24C08 10101010 A2a9a8A2a9a8 1/01/0 最多最多 22个个

AT24C16AT24C16 10101010 a10a9a8a10a9a8 1/01/0                              最多最多 11个个              

Page 6: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的工作方式

一、写操作方式一、写操作方式 分为字节写、页写,字节写和页写的操作分为字节写、页写,字节写和页写的操作工作方式时序分别如下图所示:工作方式时序分别如下图所示:

Page 7: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的工作方式

一、读操作方式一、读操作方式 分为读当前地址内容、读随机地址内容和读顺序地址内分为读当前地址内容、读随机地址内容和读顺序地址内容,其操作时序分别如下图所示:容,其操作时序分别如下图所示:

Page 8: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例

例例 11读写读写 AT24C01AT24C01 ,使用按键,使用按键 S1S1、、 S2S2取得一取得一个个 0~2550~255之间的数值之间的数值 (( 在数码管低在数码管低 33位上显示位上显示 ),),按下按下 S3S3键后键后 ,,将该数据写入将该数据写入 AT24C01AT24C01 的的 1010号号单元中单元中 ,,按下按下 S4S4键则从键则从 AT24C01AT24C01 中读出该操作中读出该操作数并进行显示数并进行显示 ,,源程序如下源程序如下 ::

#include <REG51.H>#include <REG51.H> #include <intrins.H>#include <intrins.H> #define uchar unsigned char#define uchar unsigned char #define uint unsigned int#define uint unsigned int uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0xuchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x

66,0x6d,0x7d,0x07,0x7f,0x6f};66,0x6d,0x7d,0x07,0x7f,0x6f};

Page 9: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 uchar ACT[4]={0xfe,0xfd,0xfb,0xf7}; uchar ACT[4]={0xfe,0xfd,0xfb,0xf7}; sbit SDA=P3^7;sbit SDA=P3^7; sbit SCL=P3^6;sbit SCL=P3^6; bdata char com_data;bdata char com_data; sbit mos_bit=com_data^7;sbit mos_bit=com_data^7; sbit low_bit=com_data^0;sbit low_bit=com_data^0; uchar cnt,x;uchar cnt,x; void delay_iic(int n);void delay_iic(int n); uchar rd_24c01(char a);uchar rd_24c01(char a); void wr_24c01(char a,char b);void wr_24c01(char a,char b); /***************************************//***************************************/ void init(void)void init(void) {{ TMOD=0x01;TMOD=0x01; TH0=-(1000/256);TH0=-(1000/256); TL0=-(1000%256);TL0=-(1000%256); ET0=1;ET0=1; TR0=1;TR0=1; EA=1;EA=1; }}

Page 10: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 uchar scan_key(void)uchar scan_key(void) {{ uchar temp;uchar temp; temp=P3;temp=P3; return temp;return temp; }} /********************************//********************************/ void delay(uint k)void delay(uint k) {{ uint data i,j;uint data i,j; for(i=0;i<k;i++)for(i=0;i<k;i++) {for(j=0;j<121;j++){for(j=0;j<121;j++) {;}}{;}} }} /******************************//******************************/ void main(void)void main(void) {uchar key_val;{uchar key_val; init();init(); while(1)while(1) {{ key_val=scan_key();key_val=scan_key(); switch(key_val)switch(key_val) {{ case 0xfb:if(x<255)x++;delay(300);break;case 0xfb:if(x<255)x++;delay(300);break; case 0xf7:if(x>0)x--;delay(300);break;case 0xf7:if(x>0)x--;delay(300);break; case 0xef:EA=0;wr_24c01(10,x);delay_iic(250);EA=1;break;case 0xef:EA=0;wr_24c01(10,x);delay_iic(250);EA=1;break; case 0xdf:EA=0;x=rd_24c01(10);delay_iic(250);EA=1;break;case 0xdf:EA=0;x=rd_24c01(10);delay_iic(250);EA=1;break; default:break;default:break; }} }} }}

Page 11: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void time0(void) interrupt 1void time0(void) interrupt 1 {{ uchar dis_val;uchar dis_val; TH0=-(1000/256);TH0=-(1000/256); TL0=-(1000%256);TL0=-(1000%256); dis_val=x;dis_val=x; if(++cnt>2)cnt=0;if(++cnt>2)cnt=0; switch (cnt)switch (cnt) {{ case 0:P0=SEG7[dis_val%10];P2=ACT[cnt];break;case 0:P0=SEG7[dis_val%10];P2=ACT[cnt];break; case 1:P0=SEG7[(dis_val%100)/10];P2=ACT[cnt];break;case 1:P0=SEG7[(dis_val%100)/10];P2=ACT[cnt];break; case 2:P0=SEG7[dis_val/100];P2=ACT[cnt];break;case 2:P0=SEG7[dis_val/100];P2=ACT[cnt];break; default:break;default:break; }} }}

Page 12: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void start()void start() {{ SDA=1;_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_(); SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_(); SDA=0;_nop_();_nop_();_nop_();_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_(); }} //*****************************************//***************************************** void stop()void stop() {{ SDA=0;_nop_();_nop_();_nop_();_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_(); SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_(); SDA=1;_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_(); }} //***********************//*********************** void ack()void ack() {{ SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_(); }} //***********************//***********************

Page 13: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void shift8(char a)void shift8(char a) {{ data uchar i;data uchar i; com_data=a;com_data=a; for(i=0;i<8;i++)for(i=0;i<8;i++) {{ SDA=mos_bit;SDA=mos_bit; SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); com_data=com_data*2;com_data=com_data*2; }} }} uchar rd_24c01(char a)uchar rd_24c01(char a) {{ data uchar i,command;data uchar i,command; SDA=1;_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_(); start();start();

Page 14: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 command=160;command=160; shift8(command);shift8(command); ack();ack(); shift8(a);shift8(a); ack();ack(); start();start(); command=161;command=161; shift8(command);shift8(command); ack();ack(); SDA=1;_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_(); for(i=0;i<8;i++)for(i=0;i<8;i++) {{ com_data=com_data*2;com_data=com_data*2; SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); low_bit=SDA;low_bit=SDA; SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }} stop();stop(); return(com_data);return(com_data); }}

Page 15: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void wr_24c01(char a,char b)void wr_24c01(char a,char b) {{ data uchar command;data uchar command; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=1;_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_(); start();start(); command=160;command=160; shift8(command);shift8(command); ack();ack(); shift8(a);shift8(a); ack();ack(); shift8(b);shift8(b); ack();ack(); stop();stop(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }} //***************//*************** void delay_iic(int n)void delay_iic(int n) {{ int i;int i; for(i=1;i<n;i++){;}for(i=1;i<n;i++){;} }}

Page 16: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例

例例 22具有记忆断电后定时时间的实时时钟具有记忆断电后定时时间的实时时钟 ,,为了为了进行校时和定时进行校时和定时 ,,规定规定 55种工作状态种工作状态 ,,状态状态 00为为正常走时正常走时 ,,状态状态 11为输入定时为输入定时 11的分的分 ;;状态状态 22为为输入定时输入定时 11的时的时 ;;状态状态 33为输入定时为输入定时 22的分的分 ;;状状态态 44为输入定时为输入定时 22的时的时 ;;源程序如下源程序如下 ::

#include<REG51.H>#include<REG51.H> #include <intrins.H>#include <intrins.H> #define uint unsigned int#define uint unsigned int #define uchar unsigned char#define uchar unsigned char uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0xuchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x

66,0x6d,0x7d,0x07,0x7f,0x6f};66,0x6d,0x7d,0x07,0x7f,0x6f};

Page 17: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 uchar code ACT[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};uchar code ACT[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; #define INC_KEY 0xfb#define INC_KEY 0xfb #define DEC_KEY 0xf7#define DEC_KEY 0xf7 #define OK_KEY 0xef#define OK_KEY 0xef #define STATUS_KEY 0xdf #define STATUS_KEY 0xdf #define ON 0 #define ON 0 #define OFF 1 #define OFF 1 sbit SDA=P3^7;sbit SDA=P3^7; sbit SCL=P3^6;sbit SCL=P3^6; sbit OUTPUT=P1^0;sbit OUTPUT=P1^0; /************************************************//************************************************/ uchar status;uchar status; uchar deda,sec,min,hour;uchar deda,sec,min,hour; uchar set1_dat[2],set2_dat[2];uchar set1_dat[2],set2_dat[2]; bit set1_flag,set2_flag;bit set1_flag,set2_flag; /************************************************//************************************************/ uchar key(void);uchar key(void); void pout(void);void pout(void); void delay(uint k);void delay(uint k); bdata char com_data;bdata char com_data; sbit mos_bit=com_data^7;sbit mos_bit=com_data^7; sbit low_bit=com_data^0;sbit low_bit=com_data^0; void delay_iic(int n);void delay_iic(int n); uchar rd_24c01(char a);uchar rd_24c01(char a); void wr_24c01(char a,char b);void wr_24c01(char a,char b);

Page 18: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void initial(void)void initial(void) {uchar rd_val;{uchar rd_val; rd_val=rd_24c01(100);delay_iic(250);rd_val=rd_24c01(100);delay_iic(250); if(rd_val==88)if(rd_val==88) {set1_dat[0]=rd_24c01(80);delay_iic(250);{set1_dat[0]=rd_24c01(80);delay_iic(250); set1_dat[1]=rd_24c01(81);delay_iic(250);set1_dat[1]=rd_24c01(81);delay_iic(250); set2_dat[0]=rd_24c01(90);delay_iic(250);set2_dat[0]=rd_24c01(90);delay_iic(250); set2_dat[1]=rd_24c01(91);delay_iic(250);set2_dat[1]=rd_24c01(91);delay_iic(250); set1_flag=(bit)rd_24c01(70);delay_iic(250);set1_flag=(bit)rd_24c01(70);delay_iic(250); set2_flag=(bit)rd_24c01(71);delay_iic(250);set2_flag=(bit)rd_24c01(71);delay_iic(250); }} TMOD=0x11;TMOD=0x11; TH0=-(50000/256);TH0=-(50000/256); TL0=-(50000%256);TL0=-(50000%256); TH1=-(1000/256);TH1=-(1000/256); TL1=-(1000%256);TL1=-(1000%256); TR0=1;ET0=1;TR1=1;ET1=1;TR0=1;ET0=1;TR1=1;ET1=1; EA=1;EA=1; }}

Page 19: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void main(void)void main(void) {uchar key_val;{uchar key_val; initial();initial(); for(;;)for(;;) {{ key_val=key();key_val=key(); pout();pout(); if(key_val==STATUS_KEY)if(key_val==STATUS_KEY) {status++;{status++; if(status==5)if(status==5) {status=0;{status=0; EA=0;EA=0; wr_24c01(100,88);delay_iic(250); wr_24c01(100,88);delay_iic(250); wr_24c01(80,set1_dat[0]);delay_iic(250); wr_24c01(80,set1_dat[0]);delay_iic(250); wr_24c01(81,set1_dat[1]);delay_iic(250); wr_24c01(81,set1_dat[1]);delay_iic(250); wr_24c01(90,set2_dat[0]);delay_iic(250); wr_24c01(90,set2_dat[0]);delay_iic(250); wr_24c01(70,(uchar)set1_flag);delay_iicwr_24c01(70,(uchar)set1_flag);delay_iic

(250); (250); wr_24c01(71,(uchar)set2_flag);delay_iic(25wr_24c01(71,(uchar)set2_flag);delay_iic(25

0); 0); EA=1;EA=1; }} delay(300);delay(300); }} wr_24c01(91,set2_dat[1]);delay_iic(250); wr_24c01(91,set2_dat[1]);delay_iic(250);

Page 20: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 if(key_val==INC_KEY)if(key_val==INC_KEY) {{ switch(status)switch(status) {{ case 1:if(set1_dat[0]<60)set1_dat[0]++;delay(300);break;case 1:if(set1_dat[0]<60)set1_dat[0]++;delay(300);break; case 2:if(set1_dat[1]<23)set1_dat[1]++;delay(300);break;case 2:if(set1_dat[1]<23)set1_dat[1]++;delay(300);break; case 3:if(set2_dat[0]<60)set2_dat[0]++;delay(300);break;case 3:if(set2_dat[0]<60)set2_dat[0]++;delay(300);break; case 4:if(set2_dat[1]<23)set2_dat[1]++;delay(300);break;case 4:if(set2_dat[1]<23)set2_dat[1]++;delay(300);break; default:break;default:break; }} }} //======================================================================//====================================================================== if(key_val==DEC_KEY)if(key_val==DEC_KEY) {{ switch(status)switch(status) {{ case 1:if(set1_dat[0]>0)set1_dat[0]--;case 1:if(set1_dat[0]>0)set1_dat[0]--; delay(300);break;delay(300);break; case 2:if(set1_dat[1]>0)set1_dat[1]--;case 2:if(set1_dat[1]>0)set1_dat[1]--; delay(300);break;delay(300);break; case 3:if(set2_dat[0]>0)set2_dat[0]--;case 3:if(set2_dat[0]>0)set2_dat[0]--; delay(300);break;delay(300);break; case 4:if(set2_dat[1]>0)set2_dat[1]--;case 4:if(set2_dat[1]>0)set2_dat[1]--; delay(300);break;delay(300);break; default:break;default:break; }} }}

Page 21: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 if(key_val==OK_KEY)if(key_val==OK_KEY) {{ if((status==1)||(status==2)){set1_flag=!set1_flag;delay(300);}if((status==1)||(status==2)){set1_flag=!set1_flag;delay(300);} if((status==3)||(status==4)){set2_flag=!set2_flag;delay(300);}if((status==3)||(status==4)){set2_flag=!set2_flag;delay(300);} }} }} }} /************************************************//************************************************/ uchar key(void)uchar key(void) {{ uchar temp;uchar temp; P3=0xff;P3=0xff; temp=P3;temp=P3; if(temp!=0xff)if(temp!=0xff) {{ delay(30);delay(30); P3=0xff;P3=0xff; temp=P3;temp=P3; }} return (temp);return (temp); }}

Page 22: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void pout(void)void pout(void) {{ if(set1_flag)if(set1_flag) {{ if((min==set1_dat[0])&&(hour==set1_dat[1]))OUTPUT=ON;if((min==set1_dat[0])&&(hour==set1_dat[1]))OUTPUT=ON; }} else OUTPUT=OFF;else OUTPUT=OFF; //----------------------------------------//---------------------------------------- if(set2_flag)if(set2_flag) {{ if((min==set2_dat[0])&&(hour==set2_dat[1]))OUTPUT=OFF;if((min==set2_dat[0])&&(hour==set2_dat[1]))OUTPUT=OFF; }} else OUTPUT=OFF;else OUTPUT=OFF; }} /*************************************************//*************************************************/ void time0_serve(void) interrupt 1void time0_serve(void) interrupt 1 {{ TH0=-(50000/256);TH0=-(50000/256); TL0=-(50000%256);TL0=-(50000%256); deda++;deda++; if(deda>=20){deda=0;sec++;}if(deda>=20){deda=0;sec++;} if(sec>59){sec=0;min++;}if(sec>59){sec=0;min++;} if(min>59){min=0;hour++;}if(min>59){min=0;hour++;} if(hour>23){hour=0;}if(hour>23){hour=0;} }}

Page 23: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void time1_serve(void) interrupt 3void time1_serve(void) interrupt 3 {{ static uchar time_cnt;static uchar time_cnt; static bit bit_flag;static bit bit_flag; TH1=-(1000/256);TH1=-(1000/256); TL1=-(1000%256);TL1=-(1000%256); time_cnt++;time_cnt++; bit_flag=~bit_flag;bit_flag=~bit_flag; //---------------------------------//--------------------------------- if(status==0){if(time_cnt>5)time_cnt=0;}if(status==0){if(time_cnt>5)time_cnt=0;} else {if(time_cnt>29)time_cnt=0;}else {if(time_cnt>29)time_cnt=0;} //---------------------------------//--------------------------------- if(status==0)if(status==0) {{ switch(time_cnt)switch(time_cnt) {{ case 0:P0=SEG7[sec%10];P2=ACT[time_cnt];break;case 0:P0=SEG7[sec%10];P2=ACT[time_cnt];break; case 1:P0=SEG7[sec/10];P2=ACT[time_cnt];break;case 1:P0=SEG7[sec/10];P2=ACT[time_cnt];break; case 2:P0=SEG7[min%10];P2=ACT[time_cnt];break;case 2:P0=SEG7[min%10];P2=ACT[time_cnt];break; case 3:P0=SEG7[min/10];P2=ACT[time_cnt];break;case 3:P0=SEG7[min/10];P2=ACT[time_cnt];break; case 4:P0=SEG7[hour%10];P2=ACT[time_cnt];break;case 4:P0=SEG7[hour%10];P2=ACT[time_cnt];break; case 5:P0=SEG7[hour/10];P2=ACT[time_cnt];break;case 5:P0=SEG7[hour/10];P2=ACT[time_cnt];break; default:break;default:break; }} }}

Page 24: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 if(status==1)if(status==1) {{ switch(time_cnt)switch(time_cnt) {{ case 0:P0=SEG7[status];P2=ACT[time_cnt];break;case 0:P0=SEG7[status];P2=ACT[time_cnt];break; case 1:if(set1_flag)P0=0x01;else P0=0x00;P2=ACT[time_case 1:if(set1_flag)P0=0x01;else P0=0x00;P2=ACT[time_

cnt];break;cnt];break; case 2:P0=SEG7[set1_dat[0]%10];P2=ACT[time_cnt];brecase 2:P0=SEG7[set1_dat[0]%10];P2=ACT[time_cnt];bre

ak;ak; case 3:P0=SEG7[set1_dat[0]/10];P2=ACT[time_cnt];breacase 3:P0=SEG7[set1_dat[0]/10];P2=ACT[time_cnt];brea

k;k; case 4:P0=SEG7[set1_dat[1]%10];P2=ACT[time_cnt];brecase 4:P0=SEG7[set1_dat[1]%10];P2=ACT[time_cnt];bre

ak;ak; case 5:P0=SEG7[set1_dat[1]/10];P2=ACT[time_cnt];breacase 5:P0=SEG7[set1_dat[1]/10];P2=ACT[time_cnt];brea

k;k; default:if(bit_flag){P0=SEG7[set1_dat[0]%10];P2=ACTdefault:if(bit_flag){P0=SEG7[set1_dat[0]%10];P2=ACT

[2];}[2];} else {P0=SEG7[set1_dat[0]/1else {P0=SEG7[set1_dat[0]/1

0];P2=ACT[3];}break;0];P2=ACT[3];}break; }} }}

Page 25: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 if(status==2)if(status==2) {{ switch(time_cnt)switch(time_cnt) {{ case 0:P0=SEG7[status];P2=ACT[time_cnt];break;case 0:P0=SEG7[status];P2=ACT[time_cnt];break; case 1:if(set1_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];break;case 1:if(set1_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];break; case 2:P0=SEG7[set1_dat[0]%10];P2=ACT[time_cnt];break;case 2:P0=SEG7[set1_dat[0]%10];P2=ACT[time_cnt];break; case 3:P0=SEG7[set1_dat[0]/10];P2=ACT[time_cnt];break;case 3:P0=SEG7[set1_dat[0]/10];P2=ACT[time_cnt];break; case 4:P0=SEG7[set1_dat[1]%10];P2=ACT[time_cnt];break;case 4:P0=SEG7[set1_dat[1]%10];P2=ACT[time_cnt];break; case 5:P0=SEG7[set1_dat[1]/10];P2=ACT[time_cnt];break;case 5:P0=SEG7[set1_dat[1]/10];P2=ACT[time_cnt];break; default:if(bit_flag){P0=SEG7[set1_dat[1]%10];P2=ACT[4];}default:if(bit_flag){P0=SEG7[set1_dat[1]%10];P2=ACT[4];} else {P0=SEG7[set1_dat[1]/10];P2=ACT[5];}belse {P0=SEG7[set1_dat[1]/10];P2=ACT[5];}b

reak;reak; }} }} //------------------------------------------//------------------------------------------ if(status==3)if(status==3) {{ switch(time_cnt)switch(time_cnt) {{ case 0:P0=SEG7[status];P2=ACT[time_cnt];break;case 0:P0=SEG7[status];P2=ACT[time_cnt];break; case 1:if(set2_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];break;case 1:if(set2_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];break; case 2:P0=SEG7[set2_dat[0]%10];P2=ACT[time_cnt];break;case 2:P0=SEG7[set2_dat[0]%10];P2=ACT[time_cnt];break; case 3:P0=SEG7[set2_dat[0]/10];P2=ACT[time_cnt];break;case 3:P0=SEG7[set2_dat[0]/10];P2=ACT[time_cnt];break; case 4:P0=SEG7[set2_dat[1]%10];P2=ACT[time_cnt];break;case 4:P0=SEG7[set2_dat[1]%10];P2=ACT[time_cnt];break; case 5:P0=SEG7[set2_dat[0]/10];P2=ACT[time_cnt];break;case 5:P0=SEG7[set2_dat[0]/10];P2=ACT[time_cnt];break; default:if(bit_flag){P0=SEG7[set2_dat[0]%10];P2=ACT[2];}default:if(bit_flag){P0=SEG7[set2_dat[0]%10];P2=ACT[2];} else {P0=SEG7[set2_dat[0]/10];P2=ACT[3];}belse {P0=SEG7[set2_dat[0]/10];P2=ACT[3];}b

reak;reak; }} }}

Page 26: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 if(status==4)if(status==4) {{ switch(time_cnt)switch(time_cnt) {{ case 0:P0=SEG7[status];P2=ACT[time_cnt];break;case 0:P0=SEG7[status];P2=ACT[time_cnt];break; case 1:if(set2_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];brecase 1:if(set2_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];bre

ak;ak; case 2:P0=SEG7[set2_dat[0]%10];P2=ACT[time_cnt];break;case 2:P0=SEG7[set2_dat[0]%10];P2=ACT[time_cnt];break; case 3:P0=SEG7[set2_dat[0]/10];P2=ACT[time_cnt];break;case 3:P0=SEG7[set2_dat[0]/10];P2=ACT[time_cnt];break; case 4:P0=SEG7[set2_dat[1]%10];P2=ACT[time_cnt];break;case 4:P0=SEG7[set2_dat[1]%10];P2=ACT[time_cnt];break; case 5:P0=SEG7[set2_dat[1]/10];P2=ACT[time_cnt];break;case 5:P0=SEG7[set2_dat[1]/10];P2=ACT[time_cnt];break; default:if(bit_flag){P0=SEG7[set2_dat[1]%10];P2=ACT[4];}default:if(bit_flag){P0=SEG7[set2_dat[1]%10];P2=ACT[4];} else {P0=SEG7[set2_dat[1]/10];P2else {P0=SEG7[set2_dat[1]/10];P2

=ACT[5];}break;=ACT[5];}break; }} }} }} /******************************************************//******************************************************/ void delay(uint k)void delay(uint k) {{ uint data i,j;uint data i,j; for(i=0;i<k;i++){for(i=0;i<k;i++){ for(j=0;j<121;j++)for(j=0;j<121;j++) {;}}{;}} }}

Page 27: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void start()//void start()// 启动读写时序启动读写时序 {{ SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }} void stop()//void stop()// 停止操作停止操作 {{ SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }} void ack()//void ack()// 应答应答 {{ SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }} void shift8(char a)void shift8(char a) {{ data uchar i;data uchar i; com_data=a;com_data=a; for(i=0;i<8;i++)for(i=0;i<8;i++) {{ SDA=mos_bit;SDA=mos_bit; SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); com_data=com_data*2;com_data=com_data*2; }} }}

Page 28: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 uchar rd_24c01(char a)uchar rd_24c01(char a) {{ data uchar i,command;data uchar i,command; SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); start();start(); command=160;command=160; shift8(command);shift8(command); ack();ack(); shift8(a);shift8(a); ack();ack(); start();start(); command=161;command=161; shift8(command);shift8(command); ack();ack(); SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); for(i=0;i<8;i++)for(i=0;i<8;i++) {{ com_data=com_data*2;com_data=com_data*2; SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); low_bit=SDA;low_bit=SDA; SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }} stop();stop(); return(com_data);return(com_data); }}

Page 29: 第 20 章 I2C 接口器件 2401 及 C51 编程

AT24CXX系列芯片的应用举例 void wr_24c01(char a,char b)void wr_24c01(char a,char b) {{ data uchar command;data uchar command; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); start();start(); command=160;command=160; shift8(command);shift8(command); ack();ack(); shift8(a);shift8(a); ack();ack(); shift8(b);shift8(b); ack();ack(); stop();stop(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }} //***************//*************** void delay_iic(int n)void delay_iic(int n) {{ int i;int i; for(i=1;i<n;i++){}for(i=1;i<n;i++){} }}