国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: 51單片機IIC協議 & EEPROM讀寫程序 [打印本頁]

作者: coolfire    時間: 2021-5-10 00:42
標題: 51單片機IIC協議 & EEPROM讀寫程序
IIC讀寫EEPROM的源碼,經過編譯和燒錄,成功在開發板上實現。一個00~99的計數器,每秒計數一次,具有斷電記憶功能(開機后,從關機前的最新數值繼續計數),軟件模擬IIC協議。
源碼以及開發板上的與本源碼相關的電路部分如下

數碼管

EEPROM模塊以及受影響的DS1302模塊

單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. bit x=0;                //將計時值寫入EEPROM的標志位
  4. sbit SCL=P2^1;
  5. sbit SDA=P2^0;
  6. sbit X=P2^4;                //引腳P2^4為開發板上DS1302模塊的復位引腳
  7. sbit DU=P2^6;                //數碼管模塊段選位
  8. sbit WE=P2^7;                //數碼管模塊位選位

  9. unsigned char num=0;
  10. unsigned char i=0;

  11. unsigned char LEDS[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};                //共陰數碼管的段碼

  12. void LEDS_IO()                //數碼管鎖存
  13. {
  14.         WE=1;
  15.         P0=1;
  16.         WE=0;
  17.         DU=1;
  18.         P0=0;
  19.         DU=0;
  20. }

  21. void Delay5ms()
  22. {
  23.         unsigned char i,j;
  24.         i=9;
  25.         j=244;
  26.         do
  27.         {
  28.                 while(--j);
  29.         }
  30.         while(--i);
  31. }

  32. void IIC_Delay()
  33. {
  34.         _nop_();
  35.         _nop_();
  36. }

  37. void IIC_INIT()                //IIC初始化
  38. {
  39.         X=0;                //DS1302模塊的復位電平為低電平,令DS1302模塊一直處于復位狀態,使其I/O端口(P2^0)不輸出,避免干擾EEPROM模塊的SDA端口(P2^0)
  40.         SDA=1;
  41.         IIC_Delay();
  42.         SCL=1;
  43.         IIC_Delay();
  44. }

  45. void IIC_Start()                //IIC起始信號
  46. {
  47.         SDA=1;
  48.         IIC_Delay();
  49.         SCL=1;
  50.         IIC_Delay();
  51.         SDA=0;
  52.         IIC_Delay();
  53. }

  54. void IIC_Stop()                //IIC停止信號
  55. {
  56.         SDA=0;
  57.         IIC_Delay();
  58.         SCL=1;
  59.         IIC_Delay();
  60.         SDA=1;
  61.         IIC_Delay();
  62. }

  63. void IIC_ACK()                //等待應答信號;“應答”信號:SDA=0;“非應答”信號:SDA=1
  64. {
  65.         unsigned char i;
  66.         SCL=1;
  67.         IIC_Delay();
  68.         while((SDA==1)&&(i<256))                //若超時,則視為“非應答”
  69.         {
  70.                 i++;
  71.         }
  72.         SCL=0;
  73.         IIC_Delay();
  74. }

  75. void IIC_Write(unsigned char DATA)                //IIC發送數據
  76. {
  77.         unsigned char i;
  78.         unsigned char temp;
  79.         temp=DATA;
  80.         for(i=0;i<8;i++)
  81.         {
  82.                 temp=temp<<1;
  83.                 SCL=0;
  84.                 IIC_Delay();
  85.                 SDA=CY;                //IIC數據的發送從高位開始,需要使用左移指令,而C語言的左移和右移指令,CY參與其中(CY并不是只有在進位和借位中用到),左移出來的一位賦給CY
  86.                 IIC_Delay();
  87.                 SCL=1;
  88.                 IIC_Delay();
  89.         }
  90.         SCL=0;                //將SCL置低電平,準備接收應答信號
  91.         IIC_Delay();
  92.         SDA=1;                //釋放SDA,準備接收從器件反饋的應答信號
  93.         IIC_Delay();
  94. }

  95. unsigned char IIC_Read()                //IIC接收數據
  96. {
  97.         unsigned char i;
  98.         unsigned char DATA;
  99.         SCL=0;
  100.         IIC_Delay();
  101.         SDA=1;
  102.         IIC_Delay();
  103.         for(i=0;i<8;i++)
  104.         {
  105.                 SCL=1;
  106.                 IIC_Delay();
  107.                 DATA=(DATA<<1)|SDA;
  108.                 SCL=0;
  109.                 IIC_Delay();
  110.         }
  111.         return DATA;
  112. }

  113. void EEPROM_Write(unsigned char ADDRESS,unsigned char DATA)                //寫入EEPROM
  114. {
  115.         IIC_Start();
  116.         IIC_Write(0xa0);                //發送IIC從器件(EEPROM)地址,并選擇“寫”操作
  117.         IIC_ACK();
  118.         IIC_Write(ADDRESS);                //發送將要寫入的EEPROM的存儲地址
  119.         IIC_ACK();
  120.         IIC_Write(DATA);                //發送寫入EEPROM的數據
  121.         IIC_ACK();
  122.         IIC_Stop();
  123. }

  124. unsigned char EEPROM_Read(unsigned char ADDRESS)                //讀取EEPROM
  125. {
  126.         unsigned char DATA;
  127.         IIC_Start();
  128.         IIC_Write(0xa0);
  129.         IIC_ACK();
  130.         IIC_Write(ADDRESS);
  131.         IIC_ACK();
  132.         IIC_Start();
  133.         IIC_Write(0xa1);                //發送IIC從器件(EEPROM)地址,并選擇“讀”操作
  134.         IIC_ACK();
  135.         DATA=IIC_Read();
  136.         IIC_Stop();
  137.         return DATA;
  138. }

  139. void LEDS_OUTPUT(unsigned char m,unsigned char n)                //數碼管顯示
  140. {
  141.         DU=0;
  142.         P0=LEDS[m];
  143.         DU=1;
  144.         DU=0;
  145.         WE=0;
  146.         P0=0x3e;
  147.         WE=1;
  148.         WE=0;
  149.         Delay5ms();
  150.         DU=0;
  151.         P0=LEDS[n];
  152.         DU=1;
  153.         DU=0;
  154.         WE=0;
  155.         P0=0x3d;
  156.         WE=1;
  157.         WE=0;
  158.         Delay5ms();
  159. }

  160. void main()
  161. {
  162.         IIC_INIT();
  163.         LEDS_IO();
  164.         num=EEPROM_Read(0x00);
  165.         TMOD=0x01;
  166.         TH0=0x4c00;
  167.         TL0=0x4c00;
  168.         TR0=1;
  169.         ET0=1;
  170.         EA=1;
  171.         while(1)
  172.         {
  173.                 LEDS_OUTPUT(num/10,num%10);
  174.                 if(x==1)
  175.                 {
  176.                         x=0;
  177.                         EEPROM_Write(0x00,num);
  178.                 }
  179.         }
  180. }

  181. void T() interrupt 1                //每0.05秒中斷一次
  182. {
  183.         TH0=0x4c00;
  184.         TL0=0x4c00;
  185.         i++;
  186.         if(i==20)                //中斷20次,即1秒
  187.         {
  188.                 i=0;
  189.                 num++;
  190.                 x=1;
  191.                 if(num==100)
  192.                 {
  193.                         num=0;
  194.                 }
  195.         }
  196. }
復制代碼






歡迎光臨 ELEOK (http://m.afoofa.cn/) Powered by Discuz! X5.0