久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2494|回復: 0
打印 上一主題 下一主題
收起左側

基于51單片機的I2C通信及從AT24C02讀取保存數據來顯示在4位數碼管上的項目工程

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 51黑電子會員 于 2020-4-25 10:10 編輯
  1. /***Main.C***/
  2. #include <reg52.h>//包含52單片機頭文件
  3. #include "I2C.H"//包含I2C.H頭文件
  4. #define uchar unsigned char//自定義uchar為unsigned char(即無符號字符型數據,數據范圍:0到255。)
  5. #define uint unsigned int//自定義uint為unsigned int(即有符號整數型數據,數據范圍:0到65535。)   
  6. uchar i2cwriteflag;//AT24C02存儲芯片寫入標志位變量
  7. uchar qian,bai,shi,ge;//數值個位變量、數值十位變量、數值百位變量、數值千位變量
  8. uchar valuege,valueshi,valuebai,valueqian;//數值個位數變量、數值十位數變量、數值百位數變量、數值千位數變量
  9. uint count,value;//聲明定時器0中斷次數變量、數值變量
  10. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字0~9。
  11.   //  void Delay100us()    //晶振11.0592MHz,100微妙延時。
  12. //{
  13. //   unsigned char i, j;
  14. //   _nop_();
  15. //   _nop_();
  16. //   i = 2;
  17. //   j = 15;
  18. //   do
  19. // {
  20. //    while (--j);
  21. //   }
  22. //   while (--i);
  23. // }
  24.   void delay(uint z)//延時程序
  25. {
  26.    uint x,y;
  27.    for(x=z;x>0;x--)
  28.     for(y=110;y>0;y--);
  29. }
  30. //  void ShuMaGuanDisplayValue(uint value)//數碼管顯示數值函數
  31. //{  
  32. //   qian=value%10000/1000;//數碼管千位變量
  33. //   bai=value%1000/100;//數碼管百位變量
  34. //   shi=value%100/10;//數碼管十位變量
  35. //   ge=value%10;//數碼管個位變量
  36. //  
  37. //   P2=0xfe;//數碼管千位顯示位
  38. //   P0=table[qian];//數碼管千位數值顯示
  39. //   delay(5);//延時
  40. //
  41. //   P2=0xfd;//數碼管百位顯示位
  42. //   P0=table[bai];//數碼管百位數值顯示
  43. //   delay(5);//延時
  44. //
  45. //
  46. //   P2=0xfb;//數碼管十位顯示位
  47. //   P0=table[shi];//數碼管十位數值顯示
  48. //   delay(5);//延時
  49. //
  50. //   P2=0xf7;//數碼管個位顯示位
  51. //   P0=table[ge];//數碼管個位數值顯示
  52. //   delay(5);//延時

  53. //   weixuan=1;
  54. //   P0=0xfe;//數碼管千位顯示位
  55. //   weixuan=0;
  56. //   duanxuan=1;
  57. //   P0=table[qian];//數碼管千位數值顯示
  58. //   duanxuan=0;
  59. //   P0=0xff;
  60. //   Delay(5);//延時
  61. //
  62. //   weixuan=1;
  63. //   P0=0xfd;//數碼管百位顯示位
  64. //   weixuan=0;
  65. //   duanxuan=1;
  66. //   P0=table[bai];//數碼管百位數值顯示
  67. //   duanxuan=0;
  68. //   P0=0xff;
  69. //   Delay(5);//延時
  70. //  
  71. //   weixuan=1;
  72. //   P0=0xfb;//數碼管十位顯示位
  73. //   weixuan=0;
  74. //   duanxuan=1;
  75. //   P0=table[shi];//數碼管十位數值顯示
  76. //   duanxuan=0;
  77. //   P0=0xff;
  78. //   Delay(5);//延時
  79. //
  80. //   weixuan=1;
  81. //   P0=0xf7;//數碼管個位顯示位
  82. //   weixuan=0;
  83. //   duanxuan=1;
  84. //   P0=table[ge];//數碼管個位數值顯示
  85. //   duanxuan=0;
  86. //   P0=0xff;
  87. //   Delay(5);//延時
  88. // }
  89.   void ShuMaGuanDisplayValue(uchar valuege,valueshi,valuebai,valueqian)//數碼管顯示數值函數
  90. {  
  91.    P2=0xf7;//數碼管個位顯示位
  92.    P0=table[valuege];//數碼管個位數值顯示
  93.    delay(5);//延時

  94.    P2=0xfb;//數碼管十位顯示位
  95.    P0=table[valueshi];//數碼管十位數值顯示
  96.    delay(5);//延時

  97.    P2=0xfd;//數碼管百位顯示位
  98.    P0=table[valuebai];//數碼管百位數值顯示
  99.    delay(5);//延時

  100.    P2=0xfe;//數碼管千位顯示位
  101.    P0=table[valueqian];//數碼管千位數值顯示
  102.    delay(5);//延時
  103.   }  
  104.   void Timer0Init()//定時器0初始化
  105. {
  106.    TMOD=0x01;//設定定時器類型為定時器0,定時器工作模式為模式0。
  107.    TH0=(65536-50000)/256;//TH0裝初值
  108.    TL0=(65536-50000)%256;//TL0裝初值
  109.    EA=1;//開啟定時器總中斷
  110.    ET0=1;//開啟定時器0中斷開關
  111.    TR0=1;//啟動定時器0
  112. }
  113.   void Timer0() interrupt 1//定時器0中斷函數
  114. {
  115.    TH0=(65536-50000)/256;//TH0重新裝值
  116.    TL0=(65536-50000)%256;//TL0重新裝值
  117.    count++;//定時器0中斷次數變量先賦值再加
  118.    if(count==18)//判斷定時器0中斷次數變量是否為18次
  119.   {
  120.     count=0;//定時器0中斷次數變量置0
  121.     i2cwriteflag=1;//AT24C02存儲芯片寫入標志位變量置1
  122.     valuege++;//數值個位數變量先賦值再加
  123.     if(valuege==10)//判斷數值個位數變量是否為10
  124.    {
  125.      valuege=0;//數值個位數變量置0
  126.      valueshi++;//數值十位數變量先賦值再加
  127.      if(valueshi==10)//判斷數值十位數變量是否為10
  128.     {
  129.       valueshi=0;//數值十位數變量置0
  130.       valuebai++;//數值百位數變量先賦值再加
  131.       if(valuebai==10)//判斷數值百位數變量是否為10
  132.      {
  133.        valuebai=0;//數值百位數變量置0
  134.        valueqian++;//數值千位數變量先賦值再加
  135.        if(valueqian==10)//判斷數值千位數變量是否為10
  136.       {
  137.         valueqian=9;//數值千位數變量置9      
  138.        }
  139.       }
  140.      }
  141.     }
  142.     if(valuege==9&&valueshi==9&&valuebai==9&&valueqian==9)//判斷數值個位數變量是否為9與數值十位數變量是否為9與數值百位數變量是否為9與數值千位數變量是否為9
  143.    {
  144.      valuege=0;//數值個位數變量置0
  145.      valueshi=0;//數值十位數變量置0
  146.      valuebai=0;//數值百位數變量置0
  147.      valueqian=0;//數值千位數變量置0
  148.     }
  149.    }
  150.   }
  151.   void main()//主函數
  152. {
  153.    Timer0Init();//定時器0初始化函數
  154.    i2cinit();//I2C初始化信號函數
  155. //   value=i2cread_add(0xa0,0);
  156.    valuege=i2cread_add(0xa0,0);//讀出AT24C02存儲芯片第0地址所寫數值個位數變量
  157.    valueshi=i2cread_add(0xa0,1);//讀出AT24C02存儲芯片第1地址所寫數值十位數變量
  158.    valuebai=i2cread_add(0xa0,2);//讀出AT24C02存儲芯片第2地址所寫數值百位數變量
  159.    valueqian=i2cread_add(0xa0,3);//讀出AT24C02存儲芯片第3地址所寫數值千位數變量
  160.    while(1)//固定循環
  161. {  
  162.     if(i2cwriteflag==1)//判斷AT24C02存儲芯片寫入標志位變量是否為1
  163.   {
  164.      i2cwriteflag=0;//AT24C02存儲芯片寫入標志位變量置0
  165. //   i2cwrite_add(0xa0,0,value);
  166.      i2cwrite_add(0xa0,0,valuege);//往AT24C02存儲芯片第0地址寫入數值個位數變量
  167.      ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
  168.      i2cwrite_add(0xa0,1,valueshi);//往AT24C02存儲芯片第1地址寫入數值十位數變量
  169.      ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
  170.      i2cwrite_add(0xa0,2,valuebai);//往AT24C02存儲芯片第2地址寫入數值百位數變量
  171.      ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
  172.      i2cwrite_add(0xa0,3,valueqian);//往AT24C02存儲芯片第3地址寫入數值千位數變量
  173.      ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
  174.    }
  175. //    ShuMaGuanDisplayValue(value);//數碼管顯示數值
  176.     ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//數碼管顯示數值
  177.   }      
  178. }

  179. /***I2C.C***/
  180. #include "I2C.H"//包含I2C.H頭文件
  181. #define uchar unsigned char//自定義uchar為unsigned char(即無符號字符型數據,數據范圍:0到255。)
  182. #define uint unsigned int//自定義uint為unsigned int(即有符號整數型數據,數據范圍:0到65535。)
  183.   void delay()//延時程序
  184. {
  185.    ;;
  186. }
  187.   void i2cstart()//單片機I2C總線啟動信號函數
  188. {
  189.    SDA=1;//AT24C02芯片串行數據端置高電平
  190.    delay();//延時
  191.    SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
  192.    delay();//延時
  193.    SDA=0;//AT24C02芯片串行數據端置低電平
  194.    delay();//延時
  195. }
  196.   void i2cstop()//單片機I2C總線停止信號函數
  197. {
  198.    SDA=0;//AT24C02芯片串行數據端置低電平
  199.    delay();//延時
  200.    SCL=1;///AT24C02芯片串行時鐘輸入端置高電平
  201.    delay();//延時
  202.    SDA=1;//AT24C02芯片串行數據端置高電平
  203.    delay();//延時
  204. }
  205.   void i2crespons()//單片機I2C應答信號函數
  206. {
  207.    uchar i;//計時變量
  208.    SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
  209.    delay();//延時
  210.    while((SDA==1)&&(i<250)) //加個延時退出,防止沒應答進入死循環。
  211.    i++;//計時變量先賦值再加
  212.    SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
  213.    delay();//延時
  214. }
  215. //  void i2cnorespons()//I2C不應答信號函數
  216. //{
  217. //   SCL=1;
  218. //   delay();
  219. //   SDA=1;
  220. //   SCL=0;
  221. //   delay();
  222. // }
  223.   void i2cinit()//單片機I2C總線初始化信號函數
  224. {
  225.    SDA=1;//AT24C02芯片串行數據端置高電平
  226.    delay();//延時
  227.    SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
  228.    delay();//延時
  229. }
  230.   void i2cwrite_byte(uchar value)//單片機I2C總線向從機寫一個字節信號函數
  231. {
  232.    uchar i,temp;//字節位變量、臨時變量
  233.    temp=value;//數據變量賦給臨時變量
  234.    for(i=0;i<8;i++)//循環8位
  235. {
  236.     temp=temp<<1;//臨時變量左移一位
  237.     SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
  238.     delay();//延時
  239.     SDA=CY;//CY是進位標志
  240.     delay();//延時
  241.     SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
  242.     delay();//延時
  243.    }
  244.    SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
  245.    delay();//延時
  246.    SDA=1;//AT24C02芯片串行數據端置高電平
  247.    delay();//延時
  248. }
  249.   uchar i2cread_byte()//單片機I2C總線接口向從機讀一個字節信號函數
  250. {
  251.    uchar i,k;//字節位變量、臨時變量
  252.    SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
  253.    delay();//延時
  254.    SDA=1;//AT24C02芯片串行數據端置高電平
  255.    delay();//延時
  256.    for(i=0;i<8;i++)//循環8位
  257. {
  258.    SCL=1;//AT24C02芯片串行時鐘輸入端置高電平
  259.    delay();//延時
  260.    k=(k<<1)|SDA;//一個字節
  261.    SCL=0;//AT24C02芯片串行時鐘輸入端置低電平
  262.    delay();//延時
  263.   }
  264.    return k;//返回臨時變量
  265. }
  266.   void i2cwrite_add(uchar salveaddress,uchar address,uint value)//單片機I2C總線接口向某個從機的某個地址寫一個字節數據信號函數
  267. {
  268.    i2cstart();//單片機I2C總線接口開始信號
  269.    i2cwrite_byte(salveaddress);//發送設備地址+寫信號
  270.    i2crespons();//單片機I2C總線接口應答信號
  271.    i2cwrite_byte(address);//發送存儲單元地址
  272.    i2crespons();//單片機I2C總線接口應答信號
  273.    i2cwrite_byte(value);//單片機I2C總線接口往AT24C02芯寫入數據
  274.    i2crespons();//單片機I2C總線接口應答信號
  275.    i2cstop();//單片機I2C總線接口停止信號
  276. }
  277.   uint i2cread_add(uchar salveaddress,uchar address)//單片機I2C總線接口向某個從機的某個地址讀一個字節數據信號函數
  278. {
  279.    uint information;//聲明一個數據變量
  280.    i2cstart();//單片機I2C總線接口開始信號
  281.    i2cwrite_byte(salveaddress);//發送設備地址+寫信號
  282.    i2crespons();//單片機I2C總線接口應答信號
  283.    i2cwrite_byte(address);//發送存儲單元地址
  284.    i2crespons();//單片機I2C總線接口應答信號
  285.    i2cstart();//單片機I2C總線接口開始信號
  286.    i2cwrite_byte(salveaddress+1);//發送設備地址+讀信號
  287.    i2crespons();//單片機I2C總線接口應答信號
  288.    information=i2cread_byte();//單片機I2C總線接口讀取AT24C02芯片所存數據賦給數據變量
  289. //   i2cnorespons();//單片機I2C總線接口不應答信號
  290.    i2cstop();//單片機I2C總線接口停止信號
  291.    return information;//返回數據變量
  292. }

  293. /***I2C.H***/
  294. #ifndef __I2C_H__//防止Main.C頭文件和I2C.C頭文件同時編譯i2c.h文件出現多重定義
  295. #define __I2C_H__//
  296. #include <reg52.h>//包含52單片機頭文件
  297. #define uchar unsigned char//自定義uchar為unsigned char(即無符號字符型數據,數據范圍:0到255。)
  298. #define uint unsigned int//自定義uint為unsigned int(即有符號整數型數據,數據范圍:0到65535。)
  299. sbit SCL=P3^0;//位定義AT24C02芯片串行時鐘輸入端為單片機P3.0端口
  300. sbit SDA=P3^1;//位定義AT24C02芯片串行數據端為單片機P3.1端口
  301. void delay();//延時程序
  302. void i2cstart();//單片機I2C總線啟動信號函數
  303. void i2cstop();//單片機I2C總線停止信號函數
  304. void i2crespons();//單片機I2C總線應答信號函數
  305. //void i2cnorespons();//單片機I2C總線不應答信號函數
  306. void i2cinit();//單片機I2C總線初始化信號函數
  307. void i2cwrite_byte(uchar value);//單片機I2C總線向從機寫一個字節信號函數
  308. uchar i2cread_byte();//單片機I2C總線接口向從機讀一個字節信號函數
  309. void i2cwrite_add(uchar salveaddress,uchar address,uint value);//單片機I2C總線接口向某個從機的某個地址寫一個字節數據信號函數
  310. uint i2cread_add(uchar salveaddress,uchar address);//單片機I2C總線接口向某個從機的某個地址讀一個字節數據信號函數
  311. #endif
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕日韩av | 亚洲精品免费视频 | 午夜影院免费体验区 | 成人免费在线观看 | 国产精品999| 日本精品一区二区在线观看 | 国产美女h视频 | 91视频在线观看 | 久久蜜桃av一区二区天堂 | 国产精品不卡一区 | 精品一级| 天天操夜夜操 | 国产欧美在线 | 久久精品视频在线观看 | 久久精品视频网站 | 欧美精品在线一区 | 综合精品久久久 | 久久国产精品一区二区三区 | 国产乱xxav| 午夜视频在线观看一区二区 | 狠狠婷婷综合久久久久久妖精 | 日韩欧美视频 | 中文字幕1区2区3区 日韩在线视频免费观看 | 久久久久成人精品免费播放动漫 | 国产一区免费 | 久久精品一区二区三区四区 | 欧美激情a∨在线视频播放 成人免费共享视频 | 91精品国产91久久久久福利 | 日韩在线免费电影 | 女女爱爱视频 | 在线国产一区二区 | 欧美精品国产精品 | www亚洲一区 | 精品视频一区二区 | 欧美精品乱码久久久久久按摩 | 成人在线免费观看视频 | 国产欧美日韩综合精品一区二区 | 久久91av | 麻豆精品久久 | 第四色播日韩第一页 | 国产精品久久久久婷婷二区次 |