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

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

QQ登錄

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

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

I2C通訊軟件模擬 老是報(bào)錯(cuò)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:377512 發(fā)表于 2018-7-22 19:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define AT24C02_ADDR 0xa0;

  6. /*I2C IO口定義*/
  7. sbit SDA = P2^0;
  8. sbit SCL = P2^1;

  9. /*5us延時(shí)*/
  10. void delay_5us()
  11. {
  12.   _nop_();
  13. }

  14. /*1ms延時(shí)*/
  15. void delay(uint z)
  16. {
  17.     uint x,y;
  18.     for(x = z; x > 0; x-- )
  19.           for(y = 114; y > 0; y-- )
  20.           ;
  21. }

  22. /*I2C初始化*/
  23. void I2C_init()
  24. {
  25.     SCL = 1;
  26.         _nop_();
  27.         SDA = 1;
  28.         _nop_();
  29. }

  30. /*I2C開(kāi)始信號(hào)*/
  31. void I2C_Start()
  32. {
  33.   SCL = 1;
  34.   _nop_();
  35.   SDA = 1;
  36.   delay_5us();
  37.   SDA = 0;
  38.   delay_5us();
  39. }

  40. /*I2C停止信號(hào)*/
  41. void I2C_Stop()
  42. {
  43.    SDA = 0;
  44.    _nop_();
  45.    SCL = 1;
  46.    delay_5us();
  47.    SDA = 1;
  48.    delay_5us();
  49. }

  50. /*主機(jī)發(fā)送應(yīng)答*/
  51. void Master_ACK(bit i) //bit i 控制應(yīng)答或者非應(yīng)答
  52. {
  53.            SCL = 0;
  54.          _nop_();
  55.          if(i)
  56.          {
  57.            SDA = 0;
  58.          }
  59.          else
  60.          {
  61.            SDA = 1;
  62.          }
  63.          _nop_();
  64.          SCL = 1;  
  65.          delay_5us();
  66.          SCL = 0;
  67.          _nop_();
  68.          SDA = 1;
  69.          _nop_();
  70. }

  71. /*檢測(cè)從機(jī)應(yīng)答*/
  72. bit Test_ACK()
  73. {
  74.   SCL = 1;
  75.   delay_5us();
  76.   if(SDA)
  77.   {
  78.     SCL = 0;
  79.         _nop_();
  80.         I2C_Stop();
  81.         return(0);//從機(jī)無(wú)應(yīng)答返回0
  82.   }
  83.   else
  84.   {
  85.     SCL = 0;
  86.         _nop_();
  87.         return(1);//從機(jī)應(yīng)答返回1
  88.   }
  89. }

  90. /*發(fā)送一個(gè)字節(jié)*/
  91. void I2C_send_byte(uchar byte)
  92. {
  93.    uchar i;
  94.    for(i = 0; i < 8; i++)
  95.     {
  96.             SCL = 0;
  97.                 _nop_();
  98.                 if(byte & 0x80)//表達(dá)式成立 說(shuō)明byte最高位為1
  99.                 {
  100.                     SDA = 1;
  101.                         _nop_();
  102.                 }
  103.                 else
  104.                 {
  105.                    SDA = 0;
  106.                    _nop_();
  107.                 }
  108.                 SCL = 1;
  109.                 _nop_();
  110.                 byte <<= 1;
  111.         }
  112.         SCL = 0;//拉低時(shí)鐘總線(xiàn) 允許從機(jī)的應(yīng)答信號(hào)
  113.         _nop_();
  114.         SDA = 1;//主機(jī)釋放數(shù)據(jù)總線(xiàn) 讓從機(jī)控制
  115.     _nop_();
  116. }

  117. /*接收一個(gè)字節(jié)*/
  118. uchar I2C_read_byte()
  119. {
  120.     uchar dat,i;
  121.         SCL = 0;//拉低時(shí)鐘總線(xiàn) 允許從機(jī)控制SDA
  122.         _nop_();
  123.         SDA = 1;//釋放數(shù)據(jù)總線(xiàn)
  124.         _nop_();
  125.     for (i = 0 ; i < 8 ; i++)
  126.         {
  127.              SCL = 1;//拉高時(shí)鐘總線(xiàn) 允許主機(jī)讀數(shù)據(jù)
  128.                  _nop_();
  129.                  if(SDA)
  130.                  {
  131.                     dat |= 0x01;
  132.                  }
  133.                  else
  134.                  {
  135.                     dat &= 0xfe;
  136.                  }
  137.                  _nop_();
  138.                  SCL = 0;//允許主機(jī)發(fā)送應(yīng)答
  139.                  _nop_();
  140.                  if(i < 7)
  141.                  {
  142.                     dat =dat << 1;
  143.                  }
  144.         }
  145.         return(dat);
  146. }
  147. /*I2C發(fā)送數(shù)據(jù)*/
  148. bit I2C_TransmitData(uchar ADDR,DAT)
  149. {
  150.      I2C_Start();
  151.            I2C_send_byte(AT24C02_ADDR+0);

  152.          if(!Test_ACK())
  153.          {
  154.            return(0);//停止傳送
  155.      }
  156.          I2C_send_byte(ADDR);
  157.      if(!Test_ACK())
  158.          {
  159.            return(0);//停止傳送
  160.      }
  161.          I2C_send_byte(DAT);
  162.          if(!Test_ACK())
  163.          {
  164.            return(0);//停止傳送
  165.      }
  166.          I2C_Stop();
  167.          return(1);//傳送完成
  168. }
  169. /*I2C接收數(shù)據(jù)*/
  170. uchar I2C_ReceiveData(uchar ADDR)
  171. {
  172.         uchar DAT;
  173.         I2C_Start();
  174.         I2C_send_byte(AT24C02_ADDR+0);
  175.         if(!Test_ACK())
  176.          {
  177.            return(0);//停止傳送
  178.      }
  179.          I2C_send_byte(ADDR);
  180.          if(!Test_ACK())
  181.          {
  182.            return(0);//停止傳送
  183.      }
  184.         Master_ACK(0);        //主機(jī)非應(yīng)答
  185.         I2C_Start();
  186.         I2C_send_byte(AT24C02_ADDR+1);
  187.          if(!Test_ACK())
  188.          {
  189.            return(0);//停止傳送
  190.      }
  191.          DAT = I2C_read_byte();
  192.          Master_ACK(0);
  193.          I2C_Stop();
  194.          return(DAT);

  195. }
  196. void main()
  197. {
  198.            I2C_init();
  199.         if(!I2c_TransmitDATA(255,0xfe))
  200.         {
  201.            P1 = 0;//數(shù)據(jù)傳送失敗
  202.         }
  203.         delay(5);
  204.         P1 = I2C_ReceiveData(255);
  205.         while(1);
  206. }
復(fù)制代碼

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

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2018-7-23 06:29 | 只看該作者
1.  #define AT24C02_ADDR 0xa0; 多了一個(gè)分號(hào)。
2. bit I2C_TransmitData(uchar ADDR,DAT)  與 if(!I2c_TransmitDATA(255,0xfe)) 的函數(shù)名大小寫(xiě)不一致。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:377512 發(fā)表于 2018-7-23 07:53 來(lái)自手機(jī) | 只看該作者
大佬 是怎么發(fā)現(xiàn)的 我怎么發(fā)現(xiàn)不了
回復(fù)

使用道具 舉報(bào)

地板
ID:375092 發(fā)表于 2018-7-28 10:22 | 只看該作者
你的bit I2C_TransmitData(uchar ADDR,DAT)這個(gè)函數(shù)DAT不能直接寫(xiě),加了分號(hào)之后還需要加uchar,應(yīng)該寫(xiě)成bit I2C_TransmitData(uchar ADDR,uchar DAT)

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久草综合在线视频 | 男人天堂色 | 国产精品久久二区 | 国产午夜精品一区二区三区 | 男人的天堂亚洲 | 国产精品精品视频一区二区三区 | 污片在线免费观看 | 三级免费网 | 欧美在线成人影院 | 亚洲天堂久久 | 国产精品网页 | 久久久久久久久久久久久9999 | 欧美福利影院 | 欧美精品区 | 国产精品一区在线 | 色视频网站 | 日韩视频免费看 | 午夜精品影院 | 亚洲免费高清 | 亚洲欧美中文字幕在线观看 | 一级黄在线观看 | 日韩国产中文字幕 | 久久精品成人 | 99国产精品一区二区三区 | 婷婷狠狠| 久久精品综合 | 韩日一区二区 | 欧美精品一区在线 | 久久国产精品久久久久 | 国产黄色精品在线观看 | 成年人免费在线视频 | 免费一区在线观看 | 久久久久久久久中文字幕 | 羞羞的视频免费在线观看 | 欧美三级视频 | 国产精品久久久久久久免费大片 | 国产区视频在线观看 | 国产一级免费视频 | 在线视频第一页 | 国内精品久久久久久影视8 最新黄色在线观看 | 成人亚洲精品 |