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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機+iic仿真的困惑

查看數: 2209 | 評論數: 5 | 收藏 1
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2021-10-31 11:20

正文摘要:

       各位大神大家好,誰有時間幫我解答一下這個問題,我寫了一個iic的小程序,可為什仿真時iic監視器顯示有數據,而芯片AT24C02C的存儲器里顯示的全是FF,我程序在18號地址寫的是20,是程序 ...

回復

ID:881715 發表于 2021-11-1 17:31
多謝大師們指教
ID:420836 發表于 2021-11-1 08:21
向I2C總線寫入一個字節時,在FOR循環中,每次左移一位,將SCL設置為高電平,必須延遲7微秒,然后將SCL拉低。 并重復下一個數位。
ID:401564 發表于 2021-10-31 21:17
你的應答是錯誤的,SDA=1才是對的,這叫釋放SDA端口
SDA=0了就無法檢測電平狀態了
有電腦,有開發板,不是復雜運算,仿真沒有用,仿真要用在真正需要的地方IIC寫入字節是可以很簡單的,不需要那么復雜

void Write_Byte(unsigned char Byte)                        //寫入器件的應答信號由從機給出
{
        unsigned char i;
        unsigned int k;               
        SCL=0;
        Delay();
        for(i=0;i<8;i++)
                         {
                                if(Byte&0x80)SDA=1;
                                else SDA=0;
                                Delay();
                                SCL=1;
                                Delay();               
                                SCL=0;
                                Byte<<=1;
                        }
        SCL=1;                                                   //給出一個上升沿,用于產生應答信號
        Delay();
        SDA=1;
        while((SDA==1)&(k<1000))         //超時就不再等待應答
                {
                        k++;
                        Delay();
                }                                                 //等待SDA出現低電平,出現低電平就表示器件已經應答
        SCL=0;
}

ID:46065 發表于 2021-10-31 20:39
我們都是延時5US,不知道7US會不會影響,手冊上是4.7和4US
ID:881715 發表于 2021-10-31 11:24
  1. #include<STC12C5A60S2.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define ui unsigned int
  5. sbit sda=P2^1;
  6. sbit scl=P2^0;
  7. uchar c=20;
  8. void delay7us()  //  延時函數
  9. {                                                 
  10.     unsigned char a;
  11.     for(a=2;a>0;a--);
  12. }
  13.    void init()
  14. {sda=1;
  15.   delay7us();
  16.    scl=1;
  17. delay7us();
  18. }        
  19. /*啟動信號函數*/
  20. void start()  //啟動信號函數
  21. { scl=1;         
  22.    sda=1;
  23.    delay7us();
  24.   sda=0;
  25.    delay7us();       
  26. }       
  27. /*寫一個字節的函數*/
  28. void write_iic_byte(uchar dat)       
  29.                               
  30. { uchar i;
  31.    scl=0;  /*主機拉低為的是SDA數據線
  32.                    可以發生變化并為SDA拉高,讓
  33.                    接受設備接收數據做準備*/
  34.         /*發送八位數據*/
  35.    for(i=0;i<8;i++)
  36.     { if(dat&0X80)
  37.              sda=1;/*主機將數據1存入SDA*/
  38.          else
  39.                  sda=0;/*主機將數據0存入SDA
  40.                                 ,也可認為是存入一個
  41.                                 存儲器*/
  42.           scl=1;  /*主機將時鐘數據線拉高*/
  43.            delay7us(); /*延時接收設備在此期間
  44.                                   自動取走*/
  45.            dat=dat<<1;/* 數據左移一位,次高位
  46.                               變成發送數據位*/
  47.                 scl=0;/*時鐘線拉低為更改發送數據
  48.                            位做準備,只有其為低數據線
  49.                            上的數據才會發生改變。*/
  50. }         
  51.      sda=1;/*釋放數據線*/       
  52.   }                        
  53. /*讀一個字節的函數*/
  54. uchar read_iic_byte()
  55. { uchar i,v;/*暫時為空變量,8次后
  56.                              存儲要保存的數據*/
  57.    sda=1;/*主機釋放數據線,這數據
  58.                   狀態以后有發送設備決定*/
  59.    scl=0;/*主機將時鐘信號線拉低,
  60.                    /*SDA線上的數據才會改變*/
  61.    /*從設備發送八位數據*/
  62.    for(i=0;i<8;i++)
  63.         { v=v<<1; /*第一次循環無意義,以后
  64.                           發送用*/
  65.           scl=1;  /*以后發送期間數據穩定*/
  66.          delay7us();/*延時使主機有時間取走
  67.                            數據*/
  68.          if(sda) /*SDA發送從設備里最高位數據
  69.                           1,第一次循環從此發送第一
  70.                           位數據*/
  71.                 v=v|0X01;/*把1傳入變量V的最低位*/
  72.         scl=0;         /*時鐘線拉低發送數據由發送
  73.                            設備自動改變*/

  74.         delay7us();/*延時使時鐘線可靠拉低
  75.                                  ,有充足時間數據被讀走
  76.                                  */
  77.         }
  78.         return v; /*被讀的數據存在V中,
  79.                           作為返回值/*返回*/
  80. }        
  81.           
  82. void stop()//停止信號函數
  83. {scl=1;
  84.   sda=0;
  85.   delay7us();
  86.   sda=1;
  87.   delay7us();
  88. }          
  89.   /*產生和檢測應答信號        */
  90. uchar ack()
  91. {uchar i;
  92.   scl=0;
  93.   sda=0;
  94.   delay7us();       
  95.   scl=1;       
  96.   delay7us();
  97.   while(sda==1)
  98.    { i++;
  99.             if(i>260)
  100.            {
  101.                     stop();
  102.                  return 1;
  103.            }
  104.    }
  105.         return 0;
  106.   }
  107. /* 產生非應答信號*/         
  108. void noack()
  109. {scl=0;
  110.   sda=1;
  111.   delay7us();
  112.   scl=1;
  113.   delay7us();
  114.   scl=0;
  115. }
  116. void main()
  117. {
  118.     {init();
  119.          start();
  120.          write_iic_byte(0XA0);
  121.          ack();
  122.          write_iic_byte(0X18);
  123.           ack();
  124.           write_iic_byte(c);
  125.           ack();
  126.           stop();
  127.                 delay7us();
  128.         }
  129.   while(1);
  130. }
復制代碼

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人亚洲 | 亚洲精品国产电影 | 国产日韩精品久久 | 欧美黄色大片在线观看 | 一区二区视屏 | 男人的天堂一级片 | 欧美成人第一页 | 国产精品一区二区三区久久久 | a级免费黄色片 | 亚洲欧洲精品在线 | 欧美激情一区二区三区 | 日本天堂视频在线观看 | 一区二区av| 国产激情精品一区二区三区 | 午夜在线影院 | 国产精品一区二区av | 天天拍天天操 | 一区二区三区四区不卡 | 国产精品区一区二 | 天堂成人国产精品一区 | 91精品国产综合久久久久久丝袜 | 日韩欧美三区 | 亚洲 欧美 另类 日韩 | 日韩精品一区二区不卡 | 免费中文字幕日韩欧美 | 国产一级视频在线 | 成人免费视频网站在线观看 | 99久久精品免费看国产四区 | 自拍视频网站 | 亚洲日本一区二区三区四区 | www国产精品 | 一区二区免费 | 日韩久久久久 | 亚洲香蕉在线视频 | 涩涩视频大全 | 国产美女特级嫩嫩嫩bbb片 | 免费午夜视频在线观看 | 天天天天天操 | 欧美aaa一级片| 日韩成人在线观看 | 久久久久亚洲精品国产 |