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

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

QQ登錄

只需一步,快速開始

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

單片機(jī)+iic仿真的困惑

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:881715 發(fā)表于 2021-10-31 11:20 來自觸屏版 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
       各位大神大家好,誰有時(shí)間幫我解答一下這個(gè)問題,我寫了一個(gè)iic的小程序,可為什仿真時(shí)iic監(jiān)視器顯示有數(shù)據(jù),而芯片AT24C02C的存儲(chǔ)器里顯示的全是FF,我程序在18號(hào)地址寫的是20,是程序的事嗎
  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()  //  延時(shí)函數(shù)
  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. /*啟動(dòng)信號(hào)函數(shù)*/
  20. void start()  //啟動(dòng)信號(hào)函數(shù)
  21. { scl=1;         
  22.    sda=1;
  23.    delay7us();
  24.   sda=0;
  25.    delay7us();        
  26. }        
  27. /*寫一個(gè)字節(jié)的函數(shù)*/
  28. void write_iic_byte(uchar dat)        
  29.                               
  30. { uchar i;
  31.    scl=0;  /*主機(jī)拉低為的是SDA數(shù)據(jù)線
  32.                    可以發(fā)生變化并為SDA拉高,讓
  33.                    接受設(shè)備接收數(shù)據(jù)做準(zhǔn)備*/
  34.         /*發(fā)送八位數(shù)據(jù)*/
  35.    for(i=0;i<8;i++)
  36.     { if(dat&0X80)
  37.              sda=1;/*主機(jī)將數(shù)據(jù)1存入SDA*/
  38.          else
  39.                  sda=0;/*主機(jī)將數(shù)據(jù)0存入SDA
  40.                                 ,也可認(rèn)為是存入一個(gè)
  41.                                 存儲(chǔ)器*/
  42.           scl=1;  /*主機(jī)將時(shí)鐘數(shù)據(jù)線拉高*/
  43.            delay7us(); /*延時(shí)接收設(shè)備在此期間
  44.                                   自動(dòng)取走*/
  45.            dat=dat<<1;/* 數(shù)據(jù)左移一位,次高位
  46.                               變成發(fā)送數(shù)據(jù)位*/
  47.                 scl=0;/*時(shí)鐘線拉低為更改發(fā)送數(shù)據(jù)
  48.                            位做準(zhǔn)備,只有其為低數(shù)據(jù)線
  49.                            上的數(shù)據(jù)才會(huì)發(fā)生改變。*/
  50. }         
  51.      sda=1;/*釋放數(shù)據(jù)線*/        
  52.   }                        
  53. /*讀一個(gè)字節(jié)的函數(shù)*/
  54. uchar read_iic_byte()
  55. { uchar i,v;/*暫時(shí)為空變量,8次后
  56.                              存儲(chǔ)要保存的數(shù)據(jù)*/
  57.    sda=1;/*主機(jī)釋放數(shù)據(jù)線,這數(shù)據(jù)
  58.                   狀態(tài)以后有發(fā)送設(shè)備決定*/
  59.    scl=0;/*主機(jī)將時(shí)鐘信號(hào)線拉低,
  60.                    /*SDA線上的數(shù)據(jù)才會(huì)改變*/
  61.    /*從設(shè)備發(fā)送八位數(shù)據(jù)*/
  62.    for(i=0;i<8;i++)
  63.         { v=v<<1; /*第一次循環(huán)無意義,以后
  64.                           發(fā)送用*/
  65.           scl=1;  /*以后發(fā)送期間數(shù)據(jù)穩(wěn)定*/
  66.          delay7us();/*延時(shí)使主機(jī)有時(shí)間取走
  67.                            數(shù)據(jù)*/
  68.          if(sda) /*SDA發(fā)送從設(shè)備里最高位數(shù)據(jù)
  69.                           1,第一次循環(huán)從此發(fā)送第一
  70.                           位數(shù)據(jù)*/
  71.                 v=v|0X01;/*把1傳入變量V的最低位*/
  72.         scl=0;         /*時(shí)鐘線拉低發(fā)送數(shù)據(jù)由發(fā)送
  73.                            設(shè)備自動(dòng)改變*/

  74.         delay7us();/*延時(shí)使時(shí)鐘線可靠拉低
  75.                                  ,有充足時(shí)間數(shù)據(jù)被讀走
  76.                                  */
  77.         }
  78.         return v; /*被讀的數(shù)據(jù)存在V中,
  79.                           作為返回值/*返回*/
  80. }         
  81.            
  82. void stop()//停止信號(hào)函數(shù)
  83. {scl=1;
  84.   sda=0;
  85.   delay7us();
  86.   sda=1;
  87.   delay7us();
  88. }           
  89.   /*產(chǎn)生和檢測應(yīng)答信號(hào)        */
  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. /* 產(chǎn)生非應(yīng)答信號(hào)*/         
  108. void noack()
  109. {scl=0;
  110.   sda=1;
  111.   delay7us();
  112.   scl=1;
  113.   delay7us();
  114.   scl=0;
  115. }
  116. void main()
  117. {         do
  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(0);
  130.   while(1);
  131. }
復(fù)制代碼

IMG_20211031_110437.jpg (632.98 KB, 下載次數(shù): 39)

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

使用道具 舉報(bào)

沙發(fā)
ID:881715 發(fā)表于 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()  //  延時(shí)函數(shù)
  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. /*啟動(dòng)信號(hào)函數(shù)*/
  20. void start()  //啟動(dòng)信號(hào)函數(shù)
  21. { scl=1;         
  22.    sda=1;
  23.    delay7us();
  24.   sda=0;
  25.    delay7us();       
  26. }       
  27. /*寫一個(gè)字節(jié)的函數(shù)*/
  28. void write_iic_byte(uchar dat)       
  29.                               
  30. { uchar i;
  31.    scl=0;  /*主機(jī)拉低為的是SDA數(shù)據(jù)線
  32.                    可以發(fā)生變化并為SDA拉高,讓
  33.                    接受設(shè)備接收數(shù)據(jù)做準(zhǔn)備*/
  34.         /*發(fā)送八位數(shù)據(jù)*/
  35.    for(i=0;i<8;i++)
  36.     { if(dat&0X80)
  37.              sda=1;/*主機(jī)將數(shù)據(jù)1存入SDA*/
  38.          else
  39.                  sda=0;/*主機(jī)將數(shù)據(jù)0存入SDA
  40.                                 ,也可認(rèn)為是存入一個(gè)
  41.                                 存儲(chǔ)器*/
  42.           scl=1;  /*主機(jī)將時(shí)鐘數(shù)據(jù)線拉高*/
  43.            delay7us(); /*延時(shí)接收設(shè)備在此期間
  44.                                   自動(dòng)取走*/
  45.            dat=dat<<1;/* 數(shù)據(jù)左移一位,次高位
  46.                               變成發(fā)送數(shù)據(jù)位*/
  47.                 scl=0;/*時(shí)鐘線拉低為更改發(fā)送數(shù)據(jù)
  48.                            位做準(zhǔn)備,只有其為低數(shù)據(jù)線
  49.                            上的數(shù)據(jù)才會(huì)發(fā)生改變。*/
  50. }         
  51.      sda=1;/*釋放數(shù)據(jù)線*/       
  52.   }                        
  53. /*讀一個(gè)字節(jié)的函數(shù)*/
  54. uchar read_iic_byte()
  55. { uchar i,v;/*暫時(shí)為空變量,8次后
  56.                              存儲(chǔ)要保存的數(shù)據(jù)*/
  57.    sda=1;/*主機(jī)釋放數(shù)據(jù)線,這數(shù)據(jù)
  58.                   狀態(tài)以后有發(fā)送設(shè)備決定*/
  59.    scl=0;/*主機(jī)將時(shí)鐘信號(hào)線拉低,
  60.                    /*SDA線上的數(shù)據(jù)才會(huì)改變*/
  61.    /*從設(shè)備發(fā)送八位數(shù)據(jù)*/
  62.    for(i=0;i<8;i++)
  63.         { v=v<<1; /*第一次循環(huán)無意義,以后
  64.                           發(fā)送用*/
  65.           scl=1;  /*以后發(fā)送期間數(shù)據(jù)穩(wěn)定*/
  66.          delay7us();/*延時(shí)使主機(jī)有時(shí)間取走
  67.                            數(shù)據(jù)*/
  68.          if(sda) /*SDA發(fā)送從設(shè)備里最高位數(shù)據(jù)
  69.                           1,第一次循環(huán)從此發(fā)送第一
  70.                           位數(shù)據(jù)*/
  71.                 v=v|0X01;/*把1傳入變量V的最低位*/
  72.         scl=0;         /*時(shí)鐘線拉低發(fā)送數(shù)據(jù)由發(fā)送
  73.                            設(shè)備自動(dòng)改變*/

  74.         delay7us();/*延時(shí)使時(shí)鐘線可靠拉低
  75.                                  ,有充足時(shí)間數(shù)據(jù)被讀走
  76.                                  */
  77.         }
  78.         return v; /*被讀的數(shù)據(jù)存在V中,
  79.                           作為返回值/*返回*/
  80. }        
  81.           
  82. void stop()//停止信號(hào)函數(shù)
  83. {scl=1;
  84.   sda=0;
  85.   delay7us();
  86.   sda=1;
  87.   delay7us();
  88. }          
  89.   /*產(chǎn)生和檢測應(yīng)答信號(hào)        */
  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. /* 產(chǎn)生非應(yīng)答信號(hào)*/         
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:46065 發(fā)表于 2021-10-31 20:39 | 只看該作者
我們都是延時(shí)5US,不知道7US會(huì)不會(huì)影響,手冊(cè)上是4.7和4US
回復(fù)

使用道具 舉報(bào)

地板
ID:401564 發(fā)表于 2021-10-31 21:17 | 只看該作者
你的應(yīng)答是錯(cuò)誤的,SDA=1才是對(duì)的,這叫釋放SDA端口
SDA=0了就無法檢測電平狀態(tài)了
有電腦,有開發(fā)板,不是復(fù)雜運(yùn)算,仿真沒有用,仿真要用在真正需要的地方IIC寫入字節(jié)是可以很簡單的,不需要那么復(fù)雜

void Write_Byte(unsigned char Byte)                        //寫入器件的應(yīng)答信號(hào)由從機(jī)給出
{
        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;                                                   //給出一個(gè)上升沿,用于產(chǎn)生應(yīng)答信號(hào)
        Delay();
        SDA=1;
        while((SDA==1)&(k<1000))         //超時(shí)就不再等待應(yīng)答
                {
                        k++;
                        Delay();
                }                                                 //等待SDA出現(xiàn)低電平,出現(xiàn)低電平就表示器件已經(jīng)應(yīng)答
        SCL=0;
}

回復(fù)

使用道具 舉報(bào)

5#
ID:420836 發(fā)表于 2021-11-1 08:21 | 只看該作者
向I2C總線寫入一個(gè)字節(jié)時(shí),在FOR循環(huán)中,每次左移一位,將SCL設(shè)置為高電平,必須延遲7微秒,然后將SCL拉低。 并重復(fù)下一個(gè)數(shù)位。
回復(fù)

使用道具 舉報(bào)

6#
ID:881715 發(fā)表于 2021-11-1 17:31 來自觸屏版 | 只看該作者
多謝大師們指教
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天堂一区| 亚洲天堂二区 | 日韩久久久久久 | 欧美成人精品在线 | 久久宗合色| 日本一道本视频 | www.青娱乐| 成人在线看片 | 国产成人精品999在线观看 | 久草视频网站 | 在线免费黄色小视频 | 国产一区精品在线 | 在线观看特色大片免费网站 | 影音先锋欧美资源 | 成人性视频免费网站 | 污免费网站| 日韩精品一区二区三区四区 | 一级做a爰片性色毛片视频停止 | 一区二区中文 | 91九色porny首页最多播放 | 欧美二区在线 | 成在线人视频免费视频 | 国产精品永久在线观看 | 精品久久电影 | 国产 日韩 欧美 制服 另类 | 毛片在线视频 | 国产精品一区二区福利视频 | 一级特黄在线 | 国产高清精品在线 | 日韩中文字幕av | 久久久久久久久久久一区二区 | 四虎影院在线免费观看 | 91爱啪啪 | 精久久 | 国产精品久久久久久吹潮日韩动画 | 很黄很污的网站 | 久草免费在线视频 | 久久高清免费视频 | 久久久久国产一区二区三区四区 | 综合色影院 | 中文字幕av在线一二三区 |