找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12196|回復: 17
打印 上一主題 下一主題
收起左側(cè)

注釋非常詳細的51單片機IIC源程序

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:369907 發(fā)表于 2018-9-21 17:55 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
自己寫的IIC程序,因為初學,還是有借鑒的地方,但是所有程序均為手打,每一行都有詳細的注釋



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

  3. sbit IIC_SDA=P2^6;        //聲明IIC總線的數(shù)據(jù)線接在單片機的P2.6端口。
  4. sbit IIC_SCL=P2^7;        //聲明IIC總線的時鐘線接在單片機的P2.5端口。


  5. //void delay(unsigned int t)
  6. //{//延時函數(shù)
  7. //    while(t){t--;};                    //延時循環(huán)計數(shù)
  8. //}
  9. //-------------------------------------------------------------------
  10. void delay_IIC(void)   
  11. {//IIC總線限速延時函數(shù)。
  12. //該函數(shù)是空函數(shù),延時4個機器周期。
  13.         ;
  14.         ;
  15. }
  16. //-------------------------------------------------------------------
  17. void IIC_Init(void)
  18. {//IIC總線初始化函數(shù)
  19.     IIC_SDA=1;//釋放IIC總線的數(shù)據(jù)線。
  20.     IIC_SCL=1;//釋放IIC總線的時鐘線。
  21. }
  22. //-------------------------------------------------------------------
  23. void IIC_start(void)
  24. {//IIC總線產(chǎn)生起始信號函數(shù)  
  25.    IIC_SDA=1;//拉高數(shù)據(jù)線
  26.          IIC_SCL=1;//拉高時鐘線
  27.          delay_IIC();
  28.          IIC_SDA=0;//在時鐘線為高電平時,拉低數(shù)據(jù)線,產(chǎn)生起始信號。
  29.          delay_IIC();
  30.    IIC_SCL=0;//拉低時鐘線
  31. }
  32. //-------------------------------------------------------------------
  33. void IIC_stop(void)
  34. {//IIC總線產(chǎn)生停止信號函數(shù)
  35.     IIC_SDA=0;//拉低數(shù)據(jù)線
  36.     delay_IIC();
  37.     IIC_SCL=1;//拉高時鐘線。
  38.     delay_IIC();
  39.     IIC_SDA=1;//時鐘時線為高電平時,拉高數(shù)據(jù)線,產(chǎn)生停止信號。
  40.     delay_IIC();
  41. }
  42. //-------------------------------------------------------------------
  43. bit IIC_Tack(void)
  44. {//接收應答信號函數(shù)
  45.     bit ack;//定義一個位變量,來暫存應答狀態(tài)。
  46.     IIC_SDA=1;//釋放數(shù)據(jù)總線,準備接收應答信號。
  47.     delay_IIC();
  48.     IIC_SCL=1;//拉高時鐘線。
  49.     delay_IIC();
  50.     ack=IIC_SDA;//讀取應答信號的狀態(tài)。
  51.     delay_IIC();
  52.     IIC_SCL=0;//拉低時鐘線。
  53.     delay_IIC();
  54.     return ack;//返回應答信號的狀態(tài),0表示應答,1表示非應答。
  55. }
  56. //-------------------------------------------------------------------
  57. void IIC_write_byte(unsigned char Data)
  58. {//向IIC總線寫入一個字節(jié)的數(shù)據(jù)函數(shù)
  59.         unsigned char i;
  60.          for(i=0;i<8;i++)//有8位數(shù)據(jù)
  61.         {
  62.                         IIC_SDA=Data&0x80;//寫最高位的數(shù)據(jù)
  63.                         delay_IIC();
  64.                         IIC_SCL=1; //拉高時鐘線,將數(shù)寫入到設(shè)備中。
  65.                         delay_IIC();
  66.                         IIC_SCL=0;//拉低時鐘線,允許改變數(shù)據(jù)線的狀態(tài)
  67.                         delay_IIC();
  68.                         Data=Data<<1;//數(shù)據(jù)左移一位,把次高位放在最高位,為寫入次高位做準備
  69.         }
  70. }
  71. //-------------------------------------------------------------------
  72. unsigned char IIC_read_byte()
  73. {//從IIC總線讀取一個字節(jié)的數(shù)據(jù)函數(shù)
  74.     unsigned char i;
  75.     unsigned char Data;       //定義一個緩沖寄存器。
  76.     for(i=0;i<8;i++)//有8位數(shù)據(jù)
  77.     {
  78.         IIC_SCL=1;//拉高時鐘線,為讀取下一位數(shù)據(jù)做準備。
  79.         delay_IIC();
  80.         Data=Data<<1;//將緩沖字節(jié)的數(shù)據(jù)左移一位,準備讀取數(shù)據(jù)。
  81.         delay_IIC();
  82.         
  83.         if(IIC_SDA)//如果數(shù)據(jù)線為高平電平。
  84.             Data=Data|0x1;//則給緩沖字節(jié)的最低位寫1。
  85.         IIC_SCL=0;//拉低時鐘線,為讀取下一位數(shù)據(jù)做準備。
  86.         delay_IIC();
  87.     }
  88.     return Data;//返回讀取的一個字節(jié)數(shù)據(jù)。
  89. }
  90. void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data)
  91. {//向任意地址寫入一個字節(jié)數(shù)據(jù)函數(shù)
  92.     IIC_start();//產(chǎn)生起始信號
  93.     IIC_write_byte(Daddr);//寫入設(shè)備地址(寫)
  94.     IIC_Tack();//等待設(shè)備的應答
  95.     IIC_write_byte(Waddr);//寫入要操作的單元地址。
  96.     IIC_Tack();//等待設(shè)備的應答。
  97.     IIC_write_byte(Data);//寫入數(shù)據(jù)。
  98.     IIC_Tack();//等待設(shè)備的應答。
  99.     IIC_stop();//產(chǎn)生停止符號。
  100. }
  101. //-------------------------------------------------------------------
  102. unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr)
  103. {//從任意地址讀取一個字節(jié)數(shù)據(jù)函數(shù)
  104.     unsigned char Data;//定義一個緩沖寄存器。

  105.     IIC_start();//產(chǎn)生起始信號
  106.     IIC_write_byte(Daddr);//寫入設(shè)備地址(寫)
  107.     IIC_Tack();//等待設(shè)備的應答
  108.     IIC_write_byte(Waddr);//寫入要操作的單元地址。
  109.     IIC_Tack();//等待設(shè)備的應答。
  110.    
  111.     IIC_start();//產(chǎn)生起始信號
  112.     IIC_write_byte(Daddr+1);//寫入設(shè)備地址(讀)。
  113.     IIC_Tack();//等待設(shè)備的應答。
  114.     Data=IIC_read_byte();//寫入數(shù)據(jù)。
  115.     IIC_stop();//產(chǎn)生停止符號。
  116.     //-------------------返回讀取的數(shù)據(jù)--------------------
  117.     return Data;//返回讀取的一個字節(jié)數(shù)據(jù)。
  118. }
復制代碼

所有資料51hei提供下載:
IIC.rar (1.48 KB, 下載次數(shù): 317)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:242300 發(fā)表于 2018-10-5 23:56 | 只看該作者
收藏學習一下
回復

使用道具 舉報

板凳
ID:162431 發(fā)表于 2018-10-28 21:30 | 只看該作者
請問樓主這個測試過可以用的嗎
回復

使用道具 舉報

地板
ID:417004 發(fā)表于 2018-10-29 02:20 來自觸屏版 | 只看該作者
樓主辛苦了,收藏了
回復

使用道具 舉報

5#
ID:469847 發(fā)表于 2019-1-17 19:58 | 只看該作者
學習一下
回復

使用道具 舉報

6#
ID:369907 發(fā)表于 2019-3-19 10:29 | 只看該作者
Rhysking 發(fā)表于 2018-10-28 21:30
請問樓主這個測試過可以用的嗎

可以,我用的就是這個
回復

使用道具 舉報

7#
ID:612010 發(fā)表于 2019-9-17 10:09 | 只看該作者
收藏學習一下
回復

使用道具 舉報

8#
ID:682679 發(fā)表于 2020-2-21 10:51 | 只看該作者
這個對新手很友好
回復

使用道具 舉報

9#
ID:607312 發(fā)表于 2020-2-24 08:51 | 只看該作者
感謝分享,學習了
回復

使用道具 舉報

10#
ID:733307 發(fā)表于 2020-4-20 10:20 | 只看該作者
非常感謝樓主分享這個。
回復

使用道具 舉報

11#
ID:733307 發(fā)表于 2020-4-21 10:38 | 只看該作者
感謝分享
謝謝樓主
回復

使用道具 舉報

12#
ID:752705 發(fā)表于 2020-5-18 07:12 | 只看該作者
親測好用,就用它
回復

使用道具 舉報

13#
ID:52653 發(fā)表于 2020-5-27 10:16 來自觸屏版 | 只看該作者
謝謝分享
回復

使用道具 舉報

14#
ID:94642 發(fā)表于 2020-6-16 08:43 | 只看該作者
樓主怎么返回一個32位的一個數(shù)據(jù),我這個IIC的數(shù)據(jù)類型是32位的,現(xiàn)在數(shù)據(jù)是8位的uchar型的
回復

使用道具 舉報

15#
ID:307544 發(fā)表于 2020-6-16 10:17 | 只看該作者
程序注釋清晰,感謝大俠分享!
回復

使用道具 舉報

16#
ID:817725 發(fā)表于 2021-4-2 13:15 | 只看該作者
為什么寫入設(shè)備地址要+1
回復

使用道具 舉報

17#
ID:336232 發(fā)表于 2022-4-15 09:10 | 只看該作者
lgl12345 發(fā)表于 2021-4-2 13:15
為什么寫入設(shè)備地址要+1

讀寫位
回復

使用道具 舉報

18#
ID:1069725 發(fā)表于 2023-4-3 19:09 | 只看該作者
收藏學習一下
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表