1 / 29

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

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

sierra
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第20章I2C接口器件2401及C51编程 1、2401的性能特点和引脚分布 2、AT24CXX系列的内部结构 3、2401的工作原理

  2. AT24CXX的性能特点和引脚分布 • AT24CXX系列内存是Atmel公司生产的高集成度串行EEPROM,可进行电擦除,提供的接口形式是I2C,其封装和引脚功能如下所示:

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

  4. AT24CXX系列EEPROM的内部结构 • AT24CXX系列EEPROM的内部结构如下图所示:

  5. AT24CXX系列EEPROM芯片的寻址 • AT24CXX系列EEPROM芯片的寻址方式如下图所示:

  6. AT24CXX系列芯片的工作方式 • 一、写操作方式 • 分为字节写、页写,字节写和页写的操作工作方式时序分别如下图所示:

  7. AT24CXX系列芯片的工作方式 • 一、读操作方式 • 分为读当前地址内容、读随机地址内容和读顺序地址内容,其操作时序分别如下图所示:

  8. AT24CXX系列芯片的应用举例 • 例1读写AT24C01,使用按键S1、S2取得一个0~255之间的数值(在数码管低3位上显示),按下S3键后,将该数据写入AT24C01的10号单元中,按下S4键则从AT24C01中读出该操作数并进行显示,源程序如下: • #include <REG51.H> • #include <intrins.H> • #define uchar unsigned char • #define uint unsigned int • uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

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

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

  11. AT24CXX系列芯片的应用举例 • void time0(void) interrupt 1 • { • uchar dis_val; • TH0=-(1000/256); • TL0=-(1000%256); • dis_val=x; • if(++cnt>2)cnt=0; • switch (cnt) • { • case 0:P0=SEG7[dis_val%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; • default:break; • } • }

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

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

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

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

  16. AT24CXX系列芯片的应用举例 • 例2具有记忆断电后定时时间的实时时钟,为了进行校时和定时,规定5种工作状态,状态0为正常走时,状态1为输入定时1的分;状态2为输入定时1的时;状态3为输入定时2的分;状态4为输入定时2的时;源程序如下: • #include<REG51.H> • #include <intrins.H> • #define uint unsigned int • #define uchar unsigned char • uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

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

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

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

  20. AT24CXX系列芯片的应用举例 • if(key_val==INC_KEY) • { • switch(status) • { • 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 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; • default:break; • } • } • //====================================================================== • if(key_val==DEC_KEY) • { • switch(status) • { • case 1:if(set1_dat[0]>0)set1_dat[0]--; delay(300);break; • case 2:if(set1_dat[1]>0)set1_dat[1]--; delay(300);break; • case 3:if(set2_dat[0]>0)set2_dat[0]--; delay(300);break; • case 4:if(set2_dat[1]>0)set2_dat[1]--; delay(300);break; • default:break; • } • }

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

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

  23. AT24CXX系列芯片的应用举例 • void time1_serve(void) interrupt 3 • { • static uchar time_cnt; • static bit bit_flag; • TH1=-(1000/256); • TL1=-(1000%256); • time_cnt++; • bit_flag=~bit_flag; • //--------------------------------- • if(status==0){if(time_cnt>5)time_cnt=0;} • else {if(time_cnt>29)time_cnt=0;} • //--------------------------------- • if(status==0) • { • switch(time_cnt) • { • case 0: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 3:P0=SEG7[min/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; • default:break; • } • }

  24. AT24CXX系列芯片的应用举例 • if(status==1) • { • switch(time_cnt) • { • 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 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 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; • default:if(bit_flag){P0=SEG7[set1_dat[0]%10];P2=ACT[2];} • else {P0=SEG7[set1_dat[0]/10];P2=ACT[3];}break; • } • }

  25. AT24CXX系列芯片的应用举例 • if(status==2) • { • switch(time_cnt) • { • 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 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 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; • default:if(bit_flag){P0=SEG7[set1_dat[1]%10];P2=ACT[4];} • else {P0=SEG7[set1_dat[1]/10];P2=ACT[5];}break; • } • } • //------------------------------------------ • if(status==3) • { • switch(time_cnt) • { • 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 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 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; • default:if(bit_flag){P0=SEG7[set2_dat[0]%10];P2=ACT[2];} • else {P0=SEG7[set2_dat[0]/10];P2=ACT[3];}break; • } • }

  26. AT24CXX系列芯片的应用举例 • if(status==4) • { • switch(time_cnt) • { • 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 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 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; • default:if(bit_flag){P0=SEG7[set2_dat[1]%10];P2=ACT[4];} • else {P0=SEG7[set2_dat[1]/10];P2=ACT[5];}break; • } • } • } • /******************************************************/ • void delay(uint k) • { • uint data i,j; • for(i=0;i<k;i++){ • for(j=0;j<121;j++) • {;}} • }

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

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

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

More Related