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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

I2C通訊軟件模擬 老是報錯

[復制鏈接]
跳轉到指定樓層
樓主
ID:377512 發表于 2018-7-22 19:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  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延時*/
  10. void delay_5us()
  11. {
  12.   _nop_();
  13. }

  14. /*1ms延時*/
  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開始信號*/
  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停止信號*/
  41. void I2C_Stop()
  42. {
  43.    SDA = 0;
  44.    _nop_();
  45.    SCL = 1;
  46.    delay_5us();
  47.    SDA = 1;
  48.    delay_5us();
  49. }

  50. /*主機發送應答*/
  51. void Master_ACK(bit i) //bit i 控制應答或者非應答
  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. /*檢測從機應答*/
  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);//從機無應答返回0
  82.   }
  83.   else
  84.   {
  85.     SCL = 0;
  86.         _nop_();
  87.         return(1);//從機應答返回1
  88.   }
  89. }

  90. /*發送一個字節*/
  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)//表達式成立 說明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;//拉低時鐘總線 允許從機的應答信號
  113.         _nop_();
  114.         SDA = 1;//主機釋放數據總線 讓從機控制
  115.     _nop_();
  116. }

  117. /*接收一個字節*/
  118. uchar I2C_read_byte()
  119. {
  120.     uchar dat,i;
  121.         SCL = 0;//拉低時鐘總線 允許從機控制SDA
  122.         _nop_();
  123.         SDA = 1;//釋放數據總線
  124.         _nop_();
  125.     for (i = 0 ; i < 8 ; i++)
  126.         {
  127.              SCL = 1;//拉高時鐘總線 允許主機讀數據
  128.                  _nop_();
  129.                  if(SDA)
  130.                  {
  131.                     dat |= 0x01;
  132.                  }
  133.                  else
  134.                  {
  135.                     dat &= 0xfe;
  136.                  }
  137.                  _nop_();
  138.                  SCL = 0;//允許主機發送應答
  139.                  _nop_();
  140.                  if(i < 7)
  141.                  {
  142.                     dat =dat << 1;
  143.                  }
  144.         }
  145.         return(dat);
  146. }
  147. /*I2C發送數據*/
  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接收數據*/
  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);        //主機非應答
  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;//數據傳送失敗
  202.         }
  203.         delay(5);
  204.         P1 = I2C_ReceiveData(255);
  205.         while(1);
  206. }
復制代碼

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

使用道具 舉報

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:377512 發表于 2018-7-23 07:53 來自手機 | 只看該作者
大佬 是怎么發現的 我怎么發現不了
回復

使用道具 舉報

地板
ID:375092 發表于 2018-7-28 10:22 | 只看該作者
你的bit I2C_TransmitData(uchar ADDR,DAT)這個函數DAT不能直接寫,加了分號之后還需要加uchar,應該寫成bit I2C_TransmitData(uchar ADDR,uchar DAT)

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产精品免费免费搜索 | 天天躁日日躁狠狠躁白人 | 请别相信他免费喜剧电影在线观看 | 91精品在线播放 | 在线电影日韩 | 一区二区三区日 | 天天澡天天狠天天天做 | 国产高清精品一区 | 欧美日韩专区 | 国产精品久久久久久久久久久久久 | 91久久久久久 | 国产视频三级 | 97精品国产 | 国产免费国产 | 婷婷色国产偷v国产偷v小说 | 永久av| 午夜播放器在线观看 | 久久成人精品一区二区三区 | 国内精品视频在线观看 | 黑人巨大精品欧美一区二区免费 | 色综合99 | 亚洲永久免费观看 | 国产三区在线观看视频 | 亚洲国产成人精品女人久久久 | 国产一区久久 | 亚洲精品美女视频 | 欧美日韩国产精品一区二区 | av在线视 | 99久久精品免费 | 婷婷综合久久 | 成人影院免费视频 | 男人亚洲天堂 | 精品免费国产视频 | www.天天干.com | 亚洲第一网站 | www日本在线播放 | 日韩欧美在线观看 | 国产人成精品一区二区三 | 在线观看a视频 | 国产一极毛片 | 国产精品国产成人国产三级 |