#include <reg52.h> #define uint unsigned int //定义unsigned int 为uint #define uchar unsigned char //定义unsigned char 为uchar #define uchar unsigned char //定义unsigned char 为uchar #define uint unsigned int //定义unsigned int 为uint sbit sda=P3^3;//定义I2C数据线 sbit scl=P3^2;//定义I2C时钟线 void delay2()//延迟6us函数 {;;;} void start()//I2C开始时钟函数 { sda=1; delay2();//延迟6us是时序要求。 scl=1; delay2(); sda=0; delay2(); } void stop()//I2C结束时钟函数 { sda=0; delay2();//延迟6us是时序要求。 scl=1; delay2(); sda=1; delay2(); } void respons()//应答函数 { uchar i;//定义变量I scl=1; delay2(); while((sda==1)&&(i<250))i++;//没有收到应答信号在等 //过一段时间后还是没收到自动跳出该语句.相与。 scl=0; delay2(); } void init()//初始化函数。 { scl=1; sda=1; } void write_byte(uchar date)//写一字节函数。 { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1;//TEMP左移一位! scl=0; delay2(); sda=CY;//送走最高位,依次把八位送完。 scl=1;//保持数据稳定。 delay2(); } scl=0; delay2(); sda=1;//总线释放。 delay2(); } uchar read_byte()//读一字节函数。带返回值的函数 { uchar i,j,k; scl=0; delay2(); sda=1;//总线释放。 delay2(); for(i=0;i<8;i++) { scl=1; delay2(); j=sda; k=(k<<1)|j;//k左移一位最低位变成了0,再与J相或,J就送到K最低位。 scl=0;//置低以便下次读数据。 delay2(); } return k; } void write_add(uchar address,uchar date) { start();//I2C开始时钟函数 write_byte(0xa0);//at24c02的固定地址A,1010,AO-A3都接地都为0。 respons();//写完后调用应答函数 write_byte(address);//确定从at24c02的第address位置写数据。 respons();//写完后调用应答函数 write_byte(date);//在芯片第address位置写date. respons();//写完后调用应答函数 stop();//I2C结束时钟函数 } uchar read_add(uchar address) { uchar date; start();//I2C开始时钟函数 write_byte(0xa0);//开始读。 respons();//读完后调用应答函数 write_byte(address);//确定从at24c02的第address位置读数据。 respons();//读完后调用应答函数 start();//I2C开始时钟函数 write_byte(0xa1);//读数据 respons();//读完后调用应答函数 date=read_byte();//送到P1口显示。 stop();//I2C结束时钟函数 return date; } uint intnum,aa,ee,dd,cc; sbit D1=P3^4;//位定义 sbit D2=P3^5;//位定义 sbit D3=P3^7;//位定义 sbit D4=P1^6;//位定义 sbit D5=P1^7;//位定义 void delay (uint z); void main () { P1=0xff; dd=0; D2=0; D3=0; delay (2200); //aa=5; //ee=11000; while(1) { uchar f,k; f=2; init();//写直址,最后低位应为0。 delay (1); k=read_add(f);//送到P1口显示。//从23地址读数据 aa=k; ee=aa*2200; if(D4==0) { delay (100); if(D4==1) { aa++; delay (1); init();//写直址,最后低位应为0。 write_add(2,aa);//23为at24c02内部储存地址,0xaa为写到23地址的数据。 delay (1); k=read_add(2);//送到P1口显示。//从23地址读数据 aa=k; stop(); if(aa==8) { aa=7; } } } if(aa>1) { if(D5==0) { delay (100); if(D5==1) { aa--; delay (1); init();//写直址,最后低位应为0。 write_add(2,aa);//23为at24c02内部储存地址,0xaa为写到23地址的数据。 delay (1); k=read_add(2);//送到P1口显示。//从23地址读数据 aa=k; stop(); //ee=aa*2200; if(aa==1) { aa=2; } } } } if(dd==0) { if(D1==0) { delay (5000); if(D1==0) { D2=0; D3=1; dd=1; delay (ee); D2=0; D3=0; } } } if(dd==1) { if(D1==1) { delay (5000); if(D1==1) { D2=1; D3=0; dd=0; delay (ee); D2=0; D3=0; } } } } } void delay(uint z)//代参数无返回值 { uint x,y; for (x=300;x>0;x--) for (y=z;y>0;y--);//100*2000次 }