#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次 }