找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3731|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

怎么用51單片機(jī)寫(xiě)一個(gè)I2C從機(jī)的代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:786910 發(fā)表于 2021-2-2 15:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
網(wǎng)上的I2C都是主機(jī)多然而從機(jī)的代碼很少而且用軟件模擬的更少希望有人發(fā)一些有用的資料學(xué)習(xí)一下
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:320306 發(fā)表于 2021-2-3 09:43 | 只看該作者
大部分單片機(jī)都是主機(jī)吧,什么情況下單片機(jī)會(huì)作為從機(jī)使用呢?
回復(fù)

使用道具 舉報(bào)

板凳
ID:871393 發(fā)表于 2021-2-3 12:03 | 只看該作者
給你個(gè)思路吧 從機(jī)想要接收 就需要知道主機(jī)的時(shí)鐘線(xiàn) 把時(shí)鐘線(xiàn)接到外部中斷 進(jìn)入中斷后讀取數(shù)據(jù)線(xiàn) 最后把數(shù)組組成一個(gè)字節(jié)
回復(fù)

使用道具 舉報(bào)

地板
ID:592807 發(fā)表于 2021-2-3 13:26 | 只看該作者
77599585 發(fā)表于 2021-2-3 12:03
給你個(gè)思路吧 從機(jī)想要接收 就需要知道主機(jī)的時(shí)鐘線(xiàn) 把時(shí)鐘線(xiàn)接到外部中斷 進(jìn)入中斷后讀取數(shù)據(jù)線(xiàn) 最后把數(shù) ...

時(shí)鐘線(xiàn)時(shí)跳變的,最好有個(gè)片選CS,將CS腳接到中斷可能更好
回復(fù)

使用道具 舉報(bào)

5#
ID:155507 發(fā)表于 2021-2-3 17:38 | 只看該作者
網(wǎng)上找來(lái)的,可能會(huì)有所幫助吧

  1. /****************************************************************/
  2. bit iic_start_decide()    //IIC 開(kāi)始判斷
  3. {
  4.         while(SCL==0);                   //開(kāi)始不滿(mǎn)足條件
  5.         while((SCL==1)&&(SDA==1));       //開(kāi)始條件
  6.         if((SCL==1)&&(SDA==0))           //開(kāi)始
  7.         {
  8.                 while(SCL==1);               //等待到時(shí)鐘開(kāi)始低跳變
  9.                 return 1;
  10.         }
  11.         else
  12.         return 0;
  13. }

  14. /****************************************************************/
  15. bit iic_stop_decide()            //IIC 結(jié)束判斷
  16. {
  17.         while(SCL==0);               //結(jié)束不滿(mǎn)足條件
  18.         if((SCL==1)&&(0==SDA))       //結(jié)束
  19.         {
  20.                 while(SDA==0);           //等待到數(shù)據(jù)開(kāi)始高跳變
  21.                 return 1;
  22.         }
  23.         else
  24.         {
  25.                 return 0;
  26.         }
  27. }
  28. /****************************************************************/
  29. uchar iic_receive()
  30. {
  31.         uchar i;
  32.         uchar rdata='0';

  33.         SDA=1;
  34.         for(i=0;i<8;i++)
  35.         {
  36.                 rdata<<=1;
  37.                 while(SCL==0);        //當(dāng)時(shí)鐘為低時(shí),數(shù)據(jù)無(wú)效,等待
  38.                 if(SDA==1)
  39.                 rdata++;
  40.                 while(SCL==1);        //防止在一個(gè)高電平時(shí)讀8次
  41.         }
  42.         return (rdata);
  43. }
  44. /****************************************************************/
  45. bit iic_ack_decide()
  46. {
  47.         bit ack_flag;         //局部變量
  48.         SDA=0;                ////8位發(fā)送完畢,釋放數(shù)據(jù)線(xiàn)SDA,準(zhǔn)備接收應(yīng)答位
  49.         while(SCL==0);        //等待SCL變高電平
  50.         //ack_flag=0;
  51.         while(SCL==1);        //等待SCL變高電平
  52.         SDA=1;
  53.         ack_flag=1;
  54.         return(ack_flag);
  55. }


復(fù)制代碼

  1. ;/*------------------------------------------------------------------*/
  2. ;/* --- STC MCU International Limited -------------------------------*/
  3. ;/* --- STC 1T Series MCU Simulate I2C Slave Demo -------------------*/
  4. ;/* --- Mobile: (86)13922805190 -------------------------------------*/
  5. ;/* --- Fax: 86-755-82944243 ----------------------------------------*/
  6. ;/* --- Tel: 86-755-82948412 ----------------------------------------*/
  7. ;/* --- Web: www.STCMCU.com -----------------------------------------*/
  8. ;/* If you want to use the program or the program referenced in the  */
  9. ;/* article, please specify in which data and procedures from STC    */
  10. ;/*------------------------------------------------------------------*/

  11. SCL BIT P1.0
  12. SDA BIT P1.1

  13. ;----------------------------

  14.         ORG 0

  15. RESET:
  16.     SETB SCL
  17.     SETB SDA
  18.    
  19.     CALL I2C_WAITSTART  ;等待起始信號(hào)
  20.     CALL I2C_RXBYTE     ;接收地址數(shù)據(jù)
  21.     CLR C
  22.     CALL I2C_TXACK      ;回應(yīng)ACK
  23.     SETB C              ;讀/寫(xiě) IDATA[80H - FFH]
  24.     RRC A               ;讀/寫(xiě)位->C
  25.     MOV R0,A            ;地址送入R0
  26.     JC READDATA         ;C=1(讀) C=0(寫(xiě))
  27. WRITEDATA:
  28.     CALL I2C_RXBYTE     ;接收數(shù)據(jù)
  29.     MOV @R0,A           ;寫(xiě)入IDATA
  30.     INC R0              ;地址+1
  31.     CLR C
  32.     CALL I2C_TXACK      ;回應(yīng)ACK
  33.     CALL I2C_WAITSTOP   ;等待停止信號(hào)
  34.     JMP RESET
  35.    
  36. READDATA:
  37.     MOV A,@R0
  38.     INC R0
  39.     CALL I2C_TXBYTE     ;發(fā)送IDATA數(shù)據(jù)
  40.     CALL I2C_RXACK      ;接收ACK
  41.     CALL I2C_WAITSTOP   ;等待停止信號(hào)
  42.     JMP RESET

  43. ;----------------------------
  44. ;等待起始信號(hào)
  45. ;----------------------------
  46. I2C_WAITSTART:
  47.     JNB SCL,$       ;等待時(shí)鐘->高
  48.     JB SDA,$        ;等待數(shù)據(jù)線(xiàn)下降沿
  49.     JB SCL,$        ;等待時(shí)鐘->低
  50.     RET

  51. ;----------------------------
  52. ;等待結(jié)束信號(hào)
  53. ;----------------------------
  54. I2C_WAITSTOP:
  55.     JNB SCL,$       ;等待時(shí)鐘->高
  56.     JNB SDA,$       ;等待數(shù)據(jù)線(xiàn)上升沿
  57.     RET

  58. ;----------------------------
  59. ;發(fā)送ACK/NAK信號(hào)
  60. ;----------------------------
  61. I2C_TXACK:
  62.     MOV SDA,C       ;送ACK數(shù)據(jù)
  63.     JNB SCL,$       ;等待時(shí)鐘->高
  64.     JB SCL,$        ;等待時(shí)鐘->低
  65.     SETB SDA        ;發(fā)送完成
  66.     RET

  67. ;----------------------------
  68. ;接收ACK/NAK信號(hào)
  69. ;----------------------------
  70. I2C_RXACK:
  71.     SETB SDA        ;準(zhǔn)備讀數(shù)據(jù)
  72.     JNB SCL,$       ;等待時(shí)鐘->高
  73.     MOV C,SDA       ;讀取ACK信號(hào)
  74.     JB SCL,$        ;等待時(shí)鐘->低
  75.     RET

  76. ;----------------------------
  77. ;接收一字節(jié)數(shù)據(jù)
  78. ;----------------------------
  79. I2C_RXBYTE:
  80.     MOV R7,#8       ;8位計(jì)數(shù)
  81. RXNEXT:
  82.     JNB SCL,$       ;等待時(shí)鐘->高
  83.     MOV C,SDA       ;讀取數(shù)據(jù)口
  84.     RLC A           ;保存數(shù)據(jù)
  85.     JB SCL,$        ;等待時(shí)鐘->低
  86.     DJNZ R7,RXNEXT  ;收下一位
  87.     RET

  88. ;----------------------------
  89. ;發(fā)送一字節(jié)數(shù)據(jù)
  90. ;----------------------------
  91. I2C_TXBYTE:
  92.     MOV R7,#8       ;8位計(jì)數(shù)
  93. TXNEXT:
  94.     RLC A           ;移出數(shù)據(jù)位
  95.     MOV SDA,C       ;數(shù)據(jù)送數(shù)據(jù)口
  96.     JNB SCL,$       ;等待時(shí)鐘->高
  97.     JB SCL,$        ;等待時(shí)鐘->低
  98.     DJNZ R7,TXNEXT  ;送下一位
  99.     RET

  100. ;----------------------------

  101.         END
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

6#
ID:786910 發(fā)表于 2021-2-9 21:07 | 只看該作者
zsyzdx 發(fā)表于 2021-2-3 09:43
大部分單片機(jī)都是主機(jī)吧,什么情況下單片機(jī)會(huì)作為從機(jī)使用呢?

我現(xiàn)在的項(xiàng)目就是一個(gè)主單片機(jī)控制一個(gè)從的51單片機(jī)領(lǐng)導(dǎo)要求用I2C通信我要做的就是那個(gè)從的單片機(jī)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表