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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4202|回復: 5
打印 上一主題 下一主題
收起左側

怎么用51單片機寫一個I2C從機的代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:786910 發表于 2021-2-2 15:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
網上的I2C都是主機多然而從機的代碼很少而且用軟件模擬的更少希望有人發一些有用的資料學習一下
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

板凳
ID:871393 發表于 2021-2-3 12:03 | 只看該作者
給你個思路吧 從機想要接收 就需要知道主機的時鐘線 把時鐘線接到外部中斷 進入中斷后讀取數據線 最后把數組組成一個字節
回復

使用道具 舉報

地板
ID:592807 發表于 2021-2-3 13:26 | 只看該作者
77599585 發表于 2021-2-3 12:03
給你個思路吧 從機想要接收 就需要知道主機的時鐘線 把時鐘線接到外部中斷 進入中斷后讀取數據線 最后把數 ...

時鐘線時跳變的,最好有個片選CS,將CS腳接到中斷可能更好
回復

使用道具 舉報

5#
ID:155507 發表于 2021-2-3 17:38 | 只看該作者
網上找來的,可能會有所幫助吧

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

  14. /****************************************************************/
  15. bit iic_stop_decide()            //IIC 結束判斷
  16. {
  17.         while(SCL==0);               //結束不滿足條件
  18.         if((SCL==1)&&(0==SDA))       //結束
  19.         {
  20.                 while(SDA==0);           //等待到數據開始高跳變
  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);        //當時鐘為低時,數據無效,等待
  38.                 if(SDA==1)
  39.                 rdata++;
  40.                 while(SCL==1);        //防止在一個高電平時讀8次
  41.         }
  42.         return (rdata);
  43. }
  44. /****************************************************************/
  45. bit iic_ack_decide()
  46. {
  47.         bit ack_flag;         //局部變量
  48.         SDA=0;                ////8位發送完畢,釋放數據線SDA,準備接收應答位
  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. }


復制代碼

  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  ;等待起始信號
  20.     CALL I2C_RXBYTE     ;接收地址數據
  21.     CLR C
  22.     CALL I2C_TXACK      ;回應ACK
  23.     SETB C              ;讀/寫 IDATA[80H - FFH]
  24.     RRC A               ;讀/寫位->C
  25.     MOV R0,A            ;地址送入R0
  26.     JC READDATA         ;C=1(讀) C=0(寫)
  27. WRITEDATA:
  28.     CALL I2C_RXBYTE     ;接收數據
  29.     MOV @R0,A           ;寫入IDATA
  30.     INC R0              ;地址+1
  31.     CLR C
  32.     CALL I2C_TXACK      ;回應ACK
  33.     CALL I2C_WAITSTOP   ;等待停止信號
  34.     JMP RESET
  35.    
  36. READDATA:
  37.     MOV A,@R0
  38.     INC R0
  39.     CALL I2C_TXBYTE     ;發送IDATA數據
  40.     CALL I2C_RXACK      ;接收ACK
  41.     CALL I2C_WAITSTOP   ;等待停止信號
  42.     JMP RESET

  43. ;----------------------------
  44. ;等待起始信號
  45. ;----------------------------
  46. I2C_WAITSTART:
  47.     JNB SCL,$       ;等待時鐘->高
  48.     JB SDA,$        ;等待數據線下降沿
  49.     JB SCL,$        ;等待時鐘->低
  50.     RET

  51. ;----------------------------
  52. ;等待結束信號
  53. ;----------------------------
  54. I2C_WAITSTOP:
  55.     JNB SCL,$       ;等待時鐘->高
  56.     JNB SDA,$       ;等待數據線上升沿
  57.     RET

  58. ;----------------------------
  59. ;發送ACK/NAK信號
  60. ;----------------------------
  61. I2C_TXACK:
  62.     MOV SDA,C       ;送ACK數據
  63.     JNB SCL,$       ;等待時鐘->高
  64.     JB SCL,$        ;等待時鐘->低
  65.     SETB SDA        ;發送完成
  66.     RET

  67. ;----------------------------
  68. ;接收ACK/NAK信號
  69. ;----------------------------
  70. I2C_RXACK:
  71.     SETB SDA        ;準備讀數據
  72.     JNB SCL,$       ;等待時鐘->高
  73.     MOV C,SDA       ;讀取ACK信號
  74.     JB SCL,$        ;等待時鐘->低
  75.     RET

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

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

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

  101.         END
復制代碼

回復

使用道具 舉報

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

我現在的項目就是一個主單片機控制一個從的51單片機領導要求用I2C通信我要做的就是那個從的單片機
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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