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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4767|回復: 0
打印 上一主題 下一主題
收起左側(cè)

單片機模擬I2C總線通信Proteus仿真源程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:702788 發(fā)表于 2020-3-6 14:45 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
書上關(guān)于89c52連接24C02,利用I2C總線通信實現(xiàn)秒表斷電或復位后從新開機仍能將上次數(shù)據(jù)讀取出來繼續(xù)計時,書上關(guān)于I2C總線通信部分的代碼用proteus模擬無法成功,我從網(wǎng)上找到的一個I2C_51.C和.H文件進行了改寫,實現(xiàn)了Proteus模擬。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. /*************************************
  2.     單片機模擬I2C總線C語言代碼
  3. *************************************/
  4. //#include<string.h>
  5. #include<reg52.h>
  6. #include "I2C_51.h"


  7. /********** Function Definition 函數(shù)定義 ***************/
  8. void delay(uint t) /*延時函數(shù)*/
  9. {
  10.         while(t!=0)
  11.         t--;
  12. }

  13. /*初始化I2C總線*****************************************/
  14. void i2c_init()
  15. {
  16.         scl=1;
  17.         delay(DELAY_TIME);
  18.         sda=1;
  19.         delay(DELAY_TIME);
  20. }

  21. /*啟動I2C總線的函數(shù),當scl為高電平時使sda產(chǎn)生一個負跳變*/
  22. void i2c_start()
  23. {
  24.         sda=1;
  25.         scl=1;
  26.         delay(DELAY_TIME);
  27.         sda=0;
  28.         delay(DELAY_TIME);
  29.         scl=0;
  30.         delay(DELAY_TIME);
  31. }

  32. /*終止I2C總線,當scl為高電平時使sda產(chǎn)生一個正跳變******/
  33. void i2c_stop()  
  34. {
  35.         scl=0;
  36.         sda=0;
  37.         scl=1;
  38.         delay(DELAY_TIME);
  39.         sda=1;
  40.         delay(DELAY_TIME);
  41.         scl=0;
  42.         delay(DELAY_TIME);
  43. }

  44. /*發(fā)送0,在scl為高電平時使sda信號為低*****************/
  45. void send_0() /* SEND ACK */
  46. {
  47.         sda=0;
  48.         scl=1;
  49.         delay(DELAY_TIME);
  50.         scl=0;
  51.         delay(DELAY_TIME);
  52. }

  53. /*發(fā)送1,在scl為高電平時使sda信號為高****************/
  54. void send_1()
  55. {
  56.         sda=1;
  57.         scl=1;
  58.         delay(DELAY_TIME);
  59.         scl=0;
  60.         delay(DELAY_TIME);
  61. }

  62. /*發(fā)送完一個字節(jié)后檢驗設備的應答信號****************/
  63. bit check_acknowledge()
  64. {
  65.         sda=1;
  66.         scl=1;
  67.         delay(DELAY_TIME/2);
  68.         F0=sda;
  69.         delay(DELAY_TIME/2);
  70.         scl=0;
  71.         delay(DELAY_TIME);
  72.         if(F0==1)
  73.         return FALSE;
  74.         return TRUE;
  75. }

  76. /*向I2C總線寫一個字節(jié)*******************************/
  77. void write_i2c_byte(char b)
  78. {
  79.         char i;
  80.         for(i=8;i!=0;i--){   //for(i=0;i<8;i++)
  81.                 if(b&0x80)
  82.                         send_1();
  83.                 else
  84.                         send_0();
  85.                 b<<=1;
  86.                 /*if((b<<i)&0x80)  //原來寫法
  87.                         SEND_1();
  88.                 else
  89.                         SEND_0();*/
  90.         }
  91. }

  92. /*從I2C總線讀一個字節(jié)******************************/
  93. char read_i2c_byte()
  94. {
  95.         char b=0,i;
  96.         for(i=0;i<8;i++)
  97.         {
  98.                 sda=1;     /*釋放總線*/
  99.                 scl=1;     /*接受數(shù)據(jù)*/
  100.                 delay(10);
  101.                 F0=sda;
  102.                 delay(10);
  103.                 scl=0;
  104.                 if(F0==1)
  105.                 {
  106.                         b=b<<1;
  107.                         b=b|0x01;
  108.                 }
  109.                 else
  110.                    b=b<<1;
  111.         }
  112.         return b;
  113. }

  114. /***************write one byte***********************************************************
  115. 功能:將ch寫到地址add處                                                                                                                                        *
  116. 輸入:地址add,待寫字節(jié)數(shù)據(jù)ch                                                                                                                        *
  117. 輸出:無                                                                                                                                                                *
  118. ****************************************************************************************/
  119. void write_byte(uchar add, uchar ch)
  120. {
  121.         i2c_start();                                                                        //start
  122.         write_i2c_byte(0xa0);                           //control byte:1010+A2+A1+A0+1(write)/0(read)
  123.         while(!check_acknowledge());                    
  124.         write_i2c_byte(add);                            //address
  125.         while(!check_acknowledge());                    
  126.         write_i2c_byte(ch);                             //data
  127.         while(!check_acknowledge());                    
  128.         i2c_stop();                                                                            //stop
  129. }

  130. /***************Read one byte************************************************************
  131. 功能:從地址ch處讀取一字節(jié)數(shù)據(jù)                                                                                                                        *
  132. 輸入:地址add                                                                                                                                                        *
  133. 輸出:從地址add處讀得的一字節(jié)數(shù)據(jù)                                                                                                                *
  134. ****************************************************************************************/
  135. char read_byte(uchar add)
  136. {
  137.         char b;
  138.         i2c_start();                                     //start
  139.         write_i2c_byte(0xa0);                            //control byte
  140.         while(!check_acknowledge());
  141.         write_i2c_byte(add);                             //address
  142.         while(!check_acknowledge());
  143.         i2c_start();                                                                                           //start
  144.         write_i2c_byte(0xa1);                            //data
  145.         while(!check_acknowledge());
  146.         b=read_i2c_byte();                                          //N0 Acknowledge
  147. //        i2c_stop();                                                                                                //stop        有該停止信號proteus要報錯
  148.         return b;
  149. }

  150. /***************write string***************************************************************
  151. 功能:以add為起始地址連續(xù)寫入字符串p                                                                                                            *
  152. 輸入:地址,待寫字符串                                                                                                                                          *
  153. 輸出:無                                                                                                                                                                  *
  154. 注意:字符串p的長度不需小于一頁數(shù)據(jù)(24c02c的一頁為16byte)。                                                          *
  155.       數(shù)據(jù)字節(jié)臨時存儲在片內(nèi)頁緩沖器中。在主器件發(fā)送停止條件之后,這些數(shù)據(jù)將被寫入存儲器。*
  156.       每接收一個字,內(nèi)部地址計數(shù)器加一。如果在停止條件產(chǎn)生前,主器件有超出一頁的數(shù)據(jù)要發(fā)送,
  157.           地址計數(shù)器將會翻轉(zhuǎn),先前寫入的數(shù)據(jù)將被覆蓋。                                                                                  *
  158. ******************************************************************************************/
  159. /*void write_string(uchar add, uchar *p)
  160. {
  161.         /*224C02C(2kbit),strlen(p)should<=16bit*/
  162.         /*uchar i;
  163.         i2c_start();
  164.         write_i2c_byte(0xa0);
  165.         while(!check_acknowledge());
  166.         write_i2c_byte(add);
  167.         while(!check_acknowledge());
  168.         for(i=strlen(p);i!=0;i--)
  169.         {
  170.                 write_i2c_byte(*p);
  171.                 while(!check_acknowledge());
  172.                 p++;
  173.         }
  174.         i2c_stop();        
  175. }*/

  176. /***************read string*************************************************************************
  177. 功能:以add為起始地址連續(xù)讀len長字節(jié)數(shù)據(jù),并通過*P返回                                                                                           *
  178. 輸入:地址add,讀取長度len                                                                                                                                                   *
  179. 輸出:字符串*p                                                                                                                                                                           *
  180. 說明:連續(xù)讀操作的起動過程和隨機讀操作相同,只是在 24XX發(fā)送完第一個數(shù)據(jù)字節(jié)后,主器件發(fā)出確認信號,*
  181.         而在隨機讀操作中發(fā)送的是停止條件。確認信號指示 24XX 器件發(fā)送下一個連續(xù)地址的數(shù)據(jù)字節(jié)(圖 8-4)。
  182.         在24器件向主器件發(fā)送完最后一個字節(jié)后,主器件不會 產(chǎn)生確認信號,而是產(chǎn)生停止條件。                           *
  183. ***************************************************************************************************/
  184. /*void read_string(uchar add, uchar *p, uchar len)
  185. {
  186.         i2c_start();                                         //start
  187.         write_i2c_byte(0xa0);
  188.         while(!check_acknowledge());                                                   //control byte,
  189.         write_i2c_byte(add);
  190.     while(!check_acknowledge());                                                    //address
  191.         i2c_start();                                                                               //start
  192.         write_i2c_byte(0xa1);
  193.         while(!check_acknowledge());                             //data
  194.         while(len--)
  195.         {
  196.                 *p=read_i2c_byte();
  197.                 sda=0;                                           //MCU發(fā)確認信號,使器件發(fā)送下一個連續(xù)地址的數(shù)據(jù)字節(jié)                                       
  198.                 scl=1;
  199.                 delay(DELAY_TIME);
  200.                 scl=0;
  201.                 delay(DELAY_TIME);
  202.                 p++;
  203.         }                                                    //讀完最后一個字節(jié)不確認,停止結(jié)束
  204.         i2c_stop();                                                                                     //stop        
  205. }*/
復制代碼

所有資料51hei提供下載:
新建文件夾.rar (301.46 KB, 下載次數(shù): 48)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品亚洲综合 | www.788.com色淫免费 | 久久久久久久久久久丰满 | 91成人在线视频 | 五月天综合网 | 色爱综合网 | 精品中文字幕一区二区 | 高清国产一区二区 | 涩涩视频网站在线观看 | 欧美日韩高清 | 午夜精品久久久久久久久久久久久 | 成人精品国产一区二区4080 | 99精品久久久 | 红桃视频一区二区三区免费 | 国产伦一区二区三区 | 一级毛片视频 | 久久精品国产一区二区三区不卡 | 888久久久 | 一区二区国产精品 | 国产精品久久 | 久久99国产精品 | 99在线精品视频 | 国产美女自拍视频 | 一级黄色片美国 | 欧美一级黄带 | 免费观看成人鲁鲁鲁鲁鲁视频 | 四虎影音| 成人99| 精品不卡 | 四虎在线播放 | 91黄色免费看 | 亚洲一区二区三区四区av | 国产成人亚洲精品自产在线 | 欧美亚洲国产一区 | 精品久久中文 | 中文字幕二区三区 | 国产在线精品一区二区 | 国产专区在线 | 日韩精品一区二区三区中文字幕 | 国产成人高清 | 色婷婷一区 |