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

標題: 注釋非常詳細的51單片機IIC源程序 [打印本頁]

作者: 昵稱yyy    時間: 2018-9-21 17:55
標題: 注釋非常詳細的51單片機IIC源程序
自己寫的IIC程序,因為初學,還是有借鑒的地方,但是所有程序均為手打,每一行都有詳細的注釋



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

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


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

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

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



作者: qweer    時間: 2018-10-5 23:56
收藏學習一下
作者: Rhysking    時間: 2018-10-28 21:30
請問樓主這個測試過可以用的嗎

作者: xiaodongenter    時間: 2018-10-29 02:20
樓主辛苦了,收藏了
作者: 劉拉沙    時間: 2019-1-17 19:58
學習一下
作者: 昵稱yyy    時間: 2019-3-19 10:29
Rhysking 發表于 2018-10-28 21:30
請問樓主這個測試過可以用的嗎

可以,我用的就是這個
作者: amwu_1984    時間: 2019-9-17 10:09
收藏學習一下
作者: 51hei降    時間: 2020-2-21 10:51
這個對新手很友好
作者: cdiyy    時間: 2020-2-24 08:51
感謝分享,學習了
作者: LIMUMU    時間: 2020-4-20 10:20
非常感謝樓主分享這個。
作者: LIMUMU    時間: 2020-4-21 10:38
感謝分享
謝謝樓主
作者: liaoxj    時間: 2020-5-18 07:12
親測好用,就用它
作者: fong2    時間: 2020-5-27 10:16
謝謝分享
作者: 917106794    時間: 2020-6-16 08:43
樓主怎么返回一個32位的一個數據,我這個IIC的數據類型是32位的,現在數據是8位的uchar型的
作者: hzd530    時間: 2020-6-16 10:17
程序注釋清晰,感謝大俠分享!
作者: lgl12345    時間: 2021-4-2 13:15
為什么寫入設備地址要+1
作者: pchy1288    時間: 2022-4-15 09:10
lgl12345 發表于 2021-4-2 13:15
為什么寫入設備地址要+1

讀寫位
作者: hyytx123    時間: 2023-4-3 19:09
收藏學習一下




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 亚洲国产精品福利 | 视频在线日韩 | 国产精品极品美女在线观看免费 | 日韩一区二区三区av | 国产精品夜色一区二区三区 | 99re视频在线 | 一区二区中文 | 国产一级视频免费播放 | 精久久久 | 天堂色网 | 四虎免费视频 | 精品日韩一区二区 | 日本精品一区二区三区在线观看视频 | 国产精品国产精品国产专区不卡 | 国产日韩一区二区三免费 | 国产欧美一区二区精品忘忧草 | 日韩视频一区在线观看 | 欧州一区二区三区 | 97日日碰人人模人人澡分享吧 | 精品欧美一区二区三区精品久久 | 日韩精品一区二区三区在线观看 | 91视频在线看| 国产精品99免费视频 | 北条麻妃99精品青青久久 | 亚洲美女视频 | 成人精品一区二区 | 国产精品久久久久久久久久尿 | 亚洲天堂一区二区 | 伊人导航 | 在线视频一区二区三区 | 免费看91| 免费视频一区 | 久久久久久国产 | 亚洲 精品 综合 精品 自拍 | 日韩在线一区视频 | 日韩成人在线一区 | 亚洲一区免费在线 | 亚洲精品中文字幕在线观看 | 91资源在线 | 亚洲精品乱 |