欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機模擬I2c接口 原理與程序 [打印本頁]

作者: 51hei小明    時間: 2018-3-24 19:18
標題: 51單片機模擬I2c接口 原理與程序
1、I2c啟動

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


2、I2c關閉

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

3、數據0

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



4、數據1

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

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

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

4)寫入數據;

5)關閉I2c。

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

由上圖可以看書寫數據的步驟為: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。



作者: lxa0    時間: 2018-3-24 22:14
有匯編代碼嗎?
作者: lizhendong    時間: 2018-3-24 22:39
不錯,支持樓主,支持51hei
作者: 秋水長天    時間: 2018-3-25 21:38
挺好的啊
作者: 李sz    時間: 2021-4-14 17:52
剛好用到,謝謝樓主分享。
作者: fdsfdsfs    時間: 2021-9-4 15:16
應用代碼中void I2c_start()和void I2c_stop(),程序變的可運行,好評
作者: lkc8210    時間: 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;
}
作者: 無名氏1957    時間: 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;   

什么意思?!




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1