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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14303|回復: 7
收起左側

51單片機模擬I2c接口 原理與程序

  [復制鏈接]
ID:290266 發表于 2018-3-24 19:18 | 顯示全部樓層 |閱讀模式
1、I2c啟動 1.png

    由上圖可知SDA在SCL為高電平時由高變為低表示啟動I2c,注意時間。


2、I2c關閉 2.png

    由上圖可知SDA在SCL為高電平時由低變為高表示啟動I2c,注意時間。

3、數據0 3.png

    由上圖可知SDA在SCL為高電平時拉低表示0,注意時間。



4、數據1 4.png

    由上圖可知SDA在SCL為高電平時拉高表示0,注意時間。

5、I2c寫數據(數據由51到設備) 5.jpg
由上圖可以看書寫數據的步驟為:1)啟動I2c;
2)寫入設備地址(七位設備地址加一位讀寫命令,最后1為讀,0為寫);
3)等待應答(由設備發出,讀數據時由51給應答),這一步可以和第二部寫在一個函數中;
4)寫入數據要存放的地址;
5)等待應答;
6)寫入數據;
7)等待應答;
8)關閉I2c。
若將等待應答與寫數據放在一個函數中可簡化為:1)啟動I2c;
2)寫入設備地址

3)寫入數據要存放的地址;

4)寫入數據;

5)關閉I2c。

6、I2c讀數據(51從設備中讀取數據) 6.jpg

由上圖可以看書寫數據的步驟為:1)啟動I2c;
2)寫入設備地址;

3)寫入要讀取數據存放的地址;

4)啟動I2c;

5)寫入設備地址(第八位為1,表示讀數據);
6)讀數據;
7)給設備發送應答信號;
8)關閉I2c;

7、對應的51程序
  1. #include <STC12C5A60S2.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4.         
  5. sbit SCL=P2^1;
  6. sbit SDA=P2^0;
  7. uchar code duan[]=
  8. {
  9.         0xfc,0x60,0xda,
  10.         0xf2,0x66,0xb6,
  11.         0xbe,0xe0,0xfe,0xf6
  12. };

  13. void delay(uint time)
  14. {
  15.         uint i,j;
  16.         for(i=0;i<time;i++)
  17.                 for(j=0;j<10;j++);
  18. }

  19. void I2c_start()
  20. {
  21.         SDA=1;
  22.         delay(1);
  23.         SCL=1;
  24.         delay(1);           
  25.         SDA=0;
  26.         delay(1);      
  27.         SCL=0;
  28.         delay(1);
  29. }


  30. void I2c_stop()
  31. {
  32.         SDA=0;
  33.         delay(1);
  34.         SCL=1;
  35.         delay(1);      
  36.         SDA=1;
  37.         delay(1);
  38. }

  39. //·¢Ëíack
  40. void I2c_sendAck(bit ack)
  41. {
  42.     SDA = ack;      
  43.     SCL = 1;      
  44.     delay(1);   
  45.     SCL = 0;
  46.                 delay(1);
  47.                
  48. }

  49. //»ñè¡ack
  50. bit I2c_getAck(void)
  51. {
  52.     bit ack;        
  53.     SDA = 1;        
  54.     SCL = 1;        
  55.     delay(1);   
  56.     ack = SDA;      
  57.     SCL = 0;
  58.     return ack;
  59. }

  60. uchar I2c_read()
  61. {
  62.         uchar i,dat=0;
  63.         SDA=1;
  64.         delay(1);
  65.         for(i=0;i<8;i++)
  66.         {
  67.                 SCL=1;
  68.                 delay(1);
  69.                 dat<<=1;
  70.                 dat|=SDA;
  71.                 delay(1);
  72.                 SCL=0;
  73.         }
  74.         return dat;
  75. }

  76. void I2c_write(uchar dat)
  77. {
  78.         uchar i;
  79.         for(i=0;i<8;i++)
  80.         {
  81.                 SDA=dat>>7;
  82.                 dat<<=1;
  83.                 delay(1);
  84.                 SCL=1;
  85.                 delay(1);
  86.                 SCL=0;
  87.                 delay(1);
  88.         }
  89.         I2c_getAck();
  90. }

  91. void I2c_toDevice(uchar deviceAdd,uchar datAdd,uchar dat)
  92. {
  93.         I2c_start();
  94.         I2c_write(deviceAdd);
  95.         I2c_write(datAdd);
  96.         I2c_write(dat);
  97.         I2c_stop();
  98. }
  99. uchar I2c_fromDevice(uchar deviceAdd,uchar datAdd  )
  100. {
  101.         uchar dat;
  102.         I2c_start();
  103.         I2c_write(deviceAdd);
  104.         I2c_write(datAdd);
  105.         I2c_start();
  106.         I2c_write(deviceAdd+1);
  107.         dat=I2c_read();
  108.         I2c_sendAck(1);
  109.         I2c_stop();
  110.         return dat;
  111. }

  112. void main()
  113. {
  114.         uchar num;
  115.         I2c_toDevice(0xa0,3,7);
  116.         delay(130);
  117.         num=I2c_fromDevice(0xa0,3);
  118.         while(1)
  119.         {
  120.                 P0=0x00;
  121.                 P1=duan[num];
  122.                 delay(10);
  123.                 P1=0x00;
  124.         }

  125. }
復制代碼

8、注意事項
1)關閉I2c和啟動I2c之間要有1ms間隔,給IO口準備時間,否則亂碼。
2)關于應答,當寫數據時由設備應答,讀數據時MCU應答。
3)讀數據時啟動兩次I2c。


回復

使用道具 舉報

ID:74784 發表于 2018-3-24 22:14 | 顯示全部樓層
有匯編代碼嗎?
回復

使用道具 舉報

ID:138443 發表于 2018-3-24 22:39 | 顯示全部樓層
不錯,支持樓主,支持51hei
回復

使用道具 舉報

ID:296886 發表于 2018-3-25 21:38 | 顯示全部樓層
挺好的啊
回復

使用道具 舉報

ID:200295 發表于 2021-4-14 17:52 | 顯示全部樓層
剛好用到,謝謝樓主分享。
回復

使用道具 舉報

ID:940533 發表于 2021-9-4 15:16 | 顯示全部樓層
應用代碼中void I2c_start()和void I2c_stop(),程序變的可運行,好評
回復

使用道具 舉報

ID:161164 發表于 2021-9-7 15:29 | 顯示全部樓層
試了整天,Protues 里的I2C Debugger 都是收到A0 FF FF
看了其他文章才知道,等ACK時要先把SDA 置0
bit I2c_getAck(void)
{
    bit ack;        
    SDA = 0;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        
    SCL = 1;        
    delay(1);   
    ack = SDA;      
    SCL = 0;
    return ack;
}
回復

使用道具 舉報

ID:997051 發表于 2024-4-6 02:53 | 顯示全部樓層
//·¢Ëíack
void I2c_sendAck(bit ack)
{
    SDA = ack;      
    SCL = 1;      
    delay(1);   
    SCL = 0;


//»ñè¡ack
bit I2c_getAck(void)
{
    bit ack;        
    SDA = 1;        
    SCL = 1;   

什么意思?!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品久久久久久久99 | 亚洲色图插插插 | 成人精品一区二区三区四区 | 久久国产精品视频 | 国产做爰 | 国产精品日韩在线观看 | 丝袜天堂 | 久久精品色欧美aⅴ一区二区 | 日韩在线看片 | 亚洲国产精品自拍 | 欧美综合久久 | 久久久网| 一级一级毛片免费看 | 丝袜久久 | 欧美色综合 | 国产一级淫片a直接免费看 免费a网站 | 中文字幕第十页 | 免费观看www | 美女拍拍拍网站 | 欧美日韩一区二区三区四区 | 黄网站在线观看 | 日韩精品在线播放 | 成人免费视频网站在线看 | 国产精品久久久久久吹潮日韩动画 | av大全在线 | 看真人视频一级毛片 | 九色在线观看 | 黄 色 毛片免费 | 成人在线观看免费 | 在线观看黄色电影 | 国产精品一区二区视频 | 日韩免费av | 国产情侣在线看 | 午夜视频在线 | 91久久久久久久久久久久久 | 亚洲九九精品 | 天天爽网站 | 天天碰夜夜操 | 国产一级一级毛片 | 欧产日产国产精品99 | 国产精品久久久久久久久久久免费看 |