本帖最后由 51黑電子會員 于 2020-4-25 10:10 編輯
- /***Main.C***/
- #include <reg52.h>//包含52單片機頭文件
- #include "I2C.H"//包含I2C.H頭文件
- #define uchar unsigned char//自定義uchar為unsigned char(即無符號字符型數據,數據范圍:0到255。)
- #define uint unsigned int//自定義uint為unsigned int(即有符號整數型數據,數據范圍:0到65535。)
- uchar i2cwriteflag;//AT24C02存儲芯片寫入標志位變量
- uchar qian,bai,shi,ge;//數值個位變量、數值十位變量、數值百位變量、數值千位變量
- uchar valuege,valueshi,valuebai,valueqian;//數值個位數變量、數值十位數變量、數值百位數變量、數值千位數變量
- uint count,value;//聲明定時器0中斷次數變量、數值變量
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字0~9。
- // void Delay100us() //晶振11.0592MHz,100微妙延時。
- //{
- // unsigned char i, j;
- // _nop_();
- // _nop_();
- // i = 2;
- // j = 15;
- // do
- // {
- // while (--j);
- // }
- // while (--i);
- // }
- void delay(uint z)//延時程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- // void ShuMaGuanDisplayValue(uint value)//數碼管顯示數值函數
- //{
- // qian=value%10000/1000;//數碼管千位變量
- // bai=value%1000/100;//數碼管百位變量
- // shi=value%100/10;//數碼管十位變量
- // ge=value%10;//數碼管個位變量
- //
- // P2=0xfe;//數碼管千位顯示位
- // P0=table[qian];//數碼管千位數值顯示
- // delay(5);//延時
- //
- // P2=0xfd;//數碼管百位顯示位
- // P0=table[bai];//數碼管百位數值顯示
- // delay(5);//延時
- //
- //
- // P2=0xfb;//數碼管十位顯示位
- // P0=table[shi];//數碼管十位數值顯示
- // delay(5);//延時
- //
- // P2=0xf7;//數碼管個位顯示位
- // P0=table[ge];//數碼管個位數值顯示
- // delay(5);//延時
- // weixuan=1;
- // P0=0xfe;//數碼管千位顯示位
- // weixuan=0;
- // duanxuan=1;
- // P0=table[qian];//數碼管千位數值顯示
- // duanxuan=0;
- // P0=0xff;
- // Delay(5);//延時
- //
- // weixuan=1;
- // P0=0xfd;//數碼管百位顯示位
- // weixuan=0;
- // duanxuan=1;
- // P0=table[bai];//數碼管百位數值顯示
- // duanxuan=0;
- // P0=0xff;
- // Delay(5);//延時
- //
- // weixuan=1;
- // P0=0xfb;//數碼管十位顯示位
- // weixuan=0;
- // duanxuan=1;
- // P0=table[shi];//數碼管十位數值顯示
- // duanxuan=0;
- // P0=0xff;
- // Delay(5);//延時
- //
- // weixuan=1;
- // P0=0xf7;//數碼管個位顯示位
- // weixuan=0;
- // duanxuan=1;
- // P0=table[ge];//數碼管個位數值顯示
- // duanxuan=0;
- // P0=0xff;
- // Delay(5);//延時
- // }
- void ShuMaGuanDisplayValue(uchar valuege,valueshi,valuebai,valueqian)//數碼管顯示數值函數
- {
- P2=0xf7;//數碼管個位顯示位
- P0=table[valuege];//數碼管個位數值顯示
- delay(5);//延時
- P2=0xfb;//數碼管十位顯示位
- P0=table[valueshi];//數碼管十位數值顯示
- delay(5);//延時
- P2=0xfd;//數碼管百位顯示位
- P0=table[valuebai];//數碼管百位數值顯示
- delay(5);//延時
- P2=0xfe;//數碼管千位顯示位
- P0=table[valueqian];//數碼管千位數值顯示
- delay(5);//延時
- }
- void Timer0Init()//定時器0初始化
- {
- TMOD=0x01;//設定定時器類型為定時器0,定時器工作模式為模式0。
- TH0=(65536-50000)/256;//TH0裝初值
- TL0=(65536-50000)%256;//TL0裝初值
- EA=1;//開啟定時器總中斷
- ET0=1;//開啟定時器0中斷開關
- TR0=1;//啟動定時器0
- }
- void Timer0() interrupt 1//定時器0中斷函數
- {
- TH0=(65536-50000)/256;//TH0重新裝值
- TL0=(65536-50000)%256;//TL0重新裝值
- count++;//定時器0中斷次數變量先賦值再加
- if(count==18)//判斷定時器0中斷次數變量是否為18次
- {
- count=0;//定時器0中斷次數變量置0
- i2cwriteflag=1;//AT24C02存儲芯片寫入標志位變量置1
- valuege++;//數值個位數變量先賦值再加
- if(valuege==10)//判斷數值個位數變量是否為10
- {
- valuege=0;//數值個位數變量置0
- valueshi++;//數值十位數變量先賦值再加
- if(valueshi==10)//判斷數值十位數變量是否為10
- {
- valueshi=0;//數值十位數變量置0
- valuebai++;//數值百位數變量先賦值再加
- if(valuebai==10)//判斷數值百位數變量是否為10
- {
- valuebai=0;//數值百位數變量置0
- valueqian++;//數值千位數變量先賦值再加
- if(valueqian==10)//判斷數值千位數變量是否為10
- {
- valueqian=9;//數值千位數變量置9
- }
- }
- }
- }
- if(valuege==9&&valueshi==9&&valuebai==9&&valueqian==9)//判斷數值個位數變量是否為9與數值十位數變量是否為9與數值百位數變量是否為9與數值千位數變量是否為9
- {
- valuege=0;//數值個位數變量置0
- valueshi=0;//數值十位數變量置0
- valuebai=0;//數值百位數變量置0
- valueqian=0;//數值千位數變量置0
- }
- }
- }
- void main()//主函數
- {
- Timer0Init();//定時器0初始化函數
- i2cinit();//I2C初始化信號函數
- // value=i2cread_add(0xa0,0);
- valuege=i2cread_add(0xa0,0);//讀出AT24C02存儲芯片第0地址所寫數值個位數變量
- valueshi=i2cread_add(0xa0,1);//讀出AT24C02存儲芯片第1地址所寫數值十位數變量
- valuebai=i2cread_add(0xa0,2);//讀出AT24C02存儲芯片第2地址所寫數值百位數變量
- valueqian=i2cread_add(0xa0,3);//讀出AT24C02存儲芯片第3地址所寫數值千位數變量
- while(1)//固定循環
- {
- if(i2cwriteflag==1)//判斷AT24C02存儲芯片寫入標志位變量是否為1
- {
- i2cwriteflag=0;//AT24C02存儲芯片寫入標志位變量置0
- // i2cwrite_add(0xa0,0,value);
- i2cwrite_add(0xa0,0,valuege);//往AT24C02存儲芯片第0地址寫入數值個位數變量
- ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
- i2cwrite_add(0xa0,1,valueshi);//往AT24C02存儲芯片第1地址寫入數值十位數變量
- ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
- i2cwrite_add(0xa0,2,valuebai);//往AT24C02存儲芯片第2地址寫入數值百位數變量
- ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
- i2cwrite_add(0xa0,3,valueqian);//往AT24C02存儲芯片第3地址寫入數值千位數變量
- ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
- }
- // ShuMaGuanDisplayValue(value);//數碼管顯示數值
- ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
- }
- }
- /***I2C.C***/
- #include "I2C.H"//包含I2C.H頭文件
- #define uchar unsigned char//自定義uchar為unsigned char(即無符號字符型數據,數據范圍:0到255。)
- #define uint unsigned int//自定義uint為unsigned int(即有符號整數型數據,數據范圍:0到65535。)
- void delay()//延時程序
- {
- ;;
- }
- void i2cstart()//單片機I2C總線啟動信號函數
- {
- SDA=1;//AT24C02芯片串行數據端置高電平
- delay();//延時
- SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
- delay();//延時
- SDA=0;//AT24C02芯片串行數據端置低電平
- delay();//延時
- }
- void i2cstop()//單片機I2C總線停止信號函數
- {
- SDA=0;//AT24C02芯片串行數據端置低電平
- delay();//延時
- SCL=1;///AT24C02芯片串行時鐘輸入端置高電平
- delay();//延時
- SDA=1;//AT24C02芯片串行數據端置高電平
- delay();//延時
- }
- void i2crespons()//單片機I2C應答信號函數
- {
- uchar i;//計時變量
- SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
- delay();//延時
- while((SDA==1)&&(i<250)) //加個延時退出,防止沒應答進入死循環。
- i++;//計時變量先賦值再加
- SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
- delay();//延時
- }
- // void i2cnorespons()//I2C不應答信號函數
- //{
- // SCL=1;
- // delay();
- // SDA=1;
- // SCL=0;
- // delay();
- // }
- void i2cinit()//單片機I2C總線初始化信號函數
- {
- SDA=1;//AT24C02芯片串行數據端置高電平
- delay();//延時
- SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
- delay();//延時
- }
- void i2cwrite_byte(uchar value)//單片機I2C總線向從機寫一個字節信號函數
- {
- uchar i,temp;//字節位變量、臨時變量
- temp=value;//數據變量賦給臨時變量
- for(i=0;i<8;i++)//循環8位
- {
- temp=temp<<1;//臨時變量左移一位
- SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
- delay();//延時
- SDA=CY;//CY是進位標志
- delay();//延時
- SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
- delay();//延時
- }
- SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
- delay();//延時
- SDA=1;//AT24C02芯片串行數據端置高電平
- delay();//延時
- }
- uchar i2cread_byte()//單片機I2C總線接口向從機讀一個字節信號函數
- {
- uchar i,k;//字節位變量、臨時變量
- SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
- delay();//延時
- SDA=1;//AT24C02芯片串行數據端置高電平
- delay();//延時
- for(i=0;i<8;i++)//循環8位
- {
- SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
- delay();//延時
- k=(k<<1)|SDA;//一個字節
- SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
- delay();//延時
- }
- return k;//返回臨時變量
- }
- void i2cwrite_add(uchar salveaddress,uchar address,uint value)//單片機I2C總線接口向某個從機的某個地址寫一個字節數據信號函數
- {
- i2cstart();//單片機I2C總線接口開始信號
- i2cwrite_byte(salveaddress);//發送設備地址+寫信號
- i2crespons();//單片機I2C總線接口應答信號
- i2cwrite_byte(address);//發送存儲單元地址
- i2crespons();//單片機I2C總線接口應答信號
- i2cwrite_byte(value);//單片機I2C總線接口往AT24C02芯寫入數據
- i2crespons();//單片機I2C總線接口應答信號
- i2cstop();//單片機I2C總線接口停止信號
- }
- uint i2cread_add(uchar salveaddress,uchar address)//單片機I2C總線接口向某個從機的某個地址讀一個字節數據信號函數
- {
- uint information;//聲明一個數據變量
- i2cstart();//單片機I2C總線接口開始信號
- i2cwrite_byte(salveaddress);//發送設備地址+寫信號
- i2crespons();//單片機I2C總線接口應答信號
- i2cwrite_byte(address);//發送存儲單元地址
- i2crespons();//單片機I2C總線接口應答信號
- i2cstart();//單片機I2C總線接口開始信號
- i2cwrite_byte(salveaddress+1);//發送設備地址+讀信號
- i2crespons();//單片機I2C總線接口應答信號
- information=i2cread_byte();//單片機I2C總線接口讀取AT24C02芯片所存數據賦給數據變量
- // i2cnorespons();//單片機I2C總線接口不應答信號
- i2cstop();//單片機I2C總線接口停止信號
- return information;//返回數據變量
- }
- /***I2C.H***/
- #ifndef __I2C_H__//防止Main.C頭文件和I2C.C頭文件同時編譯i2c.h文件出現多重定義
- #define __I2C_H__//
- #include <reg52.h>//包含52單片機頭文件
- #define uchar unsigned char//自定義uchar為unsigned char(即無符號字符型數據,數據范圍:0到255。)
- #define uint unsigned int//自定義uint為unsigned int(即有符號整數型數據,數據范圍:0到65535。)
- sbit SCL=P3^0;//位定義AT24C02芯片串行時鐘輸入端為單片機P3.0端口
- sbit SDA=P3^1;//位定義AT24C02芯片串行數據端為單片機P3.1端口
- void delay();//延時程序
- void i2cstart();//單片機I2C總線啟動信號函數
- void i2cstop();//單片機I2C總線停止信號函數
- void i2crespons();//單片機I2C總線應答信號函數
- //void i2cnorespons();//單片機I2C總線不應答信號函數
- void i2cinit();//單片機I2C總線初始化信號函數
- void i2cwrite_byte(uchar value);//單片機I2C總線向從機寫一個字節信號函數
- uchar i2cread_byte();//單片機I2C總線接口向從機讀一個字節信號函數
- void i2cwrite_add(uchar salveaddress,uchar address,uint value);//單片機I2C總線接口向某個從機的某個地址寫一個字節數據信號函數
- uint i2cread_add(uchar salveaddress,uchar address);//單片機I2C總線接口向某個從機的某個地址讀一個字節數據信號函數
- #endif
復制代碼
1680900-20200219212257853-1961729998.png (63.41 KB, 下載次數: 56)
下載附件
2020-4-25 09:55 上傳
|