欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機,用到了I2C總線,AT24C02儲存部分 程序錯誤 [打印本頁]

作者: dll001    時間: 2021-10-21 10:38
標題: 51單片機,用到了I2C總線,AT24C02儲存部分 程序錯誤
跟著視頻做的,感覺沒有問題,找了好久也找出來錯到哪,語法沒有問題,麻煩大家幫我看一下,謝謝大家了

12-1 AT24C02數據存儲.rar

45.6 KB, 下載次數: 11

keil程序


作者: Y_G_G    時間: 2021-10-21 11:13
IIC要有延時的,你在所有的時鐘和數據后面加上一個空操作或者延時
你的程序都是沒有延時的
你參考一下
/*IIC讀寫函數*/
#include "IIC.H"
//=================================================================================================
void Delay()                 //用于IIC延時,CY有變化,根據不同單片機的時鐘可以適當調整延時時長
{
unsigned char i;
for(i=0;i<1;i++);
}
//=================================================================================================
void Delay_ms(unsigned int a)                //@24.000MHz,1mS延時函數,這個代碼從STC下載器復制來
{
        unsigned char i, j;
        for(a;a>0;a--)
            {
                i = 32;
                j = 40;
                do
                {
                        while (--j);
                }         while (--i);
          }
}
//=================================================================================================
void IIC_Start()           //IIC啟動信號
{
        SCL=0;
        Delay();           //延時1mS
        SDA=1;
        Delay();
        SCL=1;
        Delay();
        SDA=0;
        Delay();
        SCL=0;
}
//=================================================================================================
void IIC_Stop()                         //IIC停止信號
{
        SCL=0;
        Delay();           //延時1mS
        SDA=0;
        Delay();
        SCL=1;
        Delay();
        SDA=1;
        Delay();
}
//=================================================================================================
void IIC_Ask()           //IIC應答信號
{
        SCL=0;
        Delay();           //延時
        SDA=0;
        Delay();
        SCL=1;
        Delay();
        SCL=0;
        Delay();
}
//=================================================================================================
void IIC_Nask()           //IIC不應答信號
{
        SCL=0;
        Delay();           //延時
        SDA=1;
        Delay();
        SCL=1;
        Delay();
        SCL=0;
        Delay();
}
//=================================================================================================
void Write_Byte(unsigned char byte)                        //寫入器件的應答信號由從機給出
{
         unsigned char i,temp;
        unsigned int k;
         temp=byte;                
        SCL=0;
        Delay();
                 for(i=0;i<8;i++)
                         {
                        if(temp&0x80)SDA=1;
                        else SDA=0;
                        Delay();
                        SCL=1;
                        Delay();               
                        SCL=0;
                        Delay();
                        temp=temp<<1;
                        }
        SCL=1;                   //給出一個上升沿,用于產生應答信號
        Delay();
        SDA=1;
        while((SDA==1)&&(k<1000))
                {
                k++;
                Delay();
                } //等待SDA出現低電平,出現低電平就表示器件已經應答
        SCL=1;
        SDA=0;
        Delay();
}
//=================================================================================================
unsigned char Read_Byte()                                                  //讀取的應答信號由單片機給出
{
        unsigned char i,k;
        SCL=0;
        Delay();
        SDA=1;                  //置位SDA等于釋放SDA端口.讓內部可以讀取到這個端口的電平狀態
        Delay();
        for(i=0;i<8;i++)
                {                 
                SCL=0;
                Delay();         
                SCL=1;
                k=(k<<1)|SDA;
                Delay();
                }
        return k;
}
//=================================================================================================*/
作者: 正是河豚    時間: 2021-10-21 12:10
    1、 你好,你的問題還是建議自己查找下。不過可以給你一個現成的可用的例子。
    2、例子的單片機是基于STC8H3K64S4主芯片編寫的,見下圖。(板子是艾克姆的開發板)


    3、不知道你的硬件是怎樣的,一定注意I2C總線是一定要加上拉的。
    4、如果單片機型號不完全一致,注意頭文件修改下,提供的例子是模擬I2C的,更有利于你移植。一定注意延時函數要保證準確。(不同單片機運行速度不一樣,延時函數是不一樣的)






實驗2-11-1:外部EEPROM存儲器讀寫單字節實驗(模擬I2C).rar

40.69 KB, 下載次數: 6


作者: 378601462    時間: 2021-10-21 15:48
24C02擦寫數據時需要大概5ms的延時,
作者: dll001    時間: 2021-10-21 19:02
Y_G_G 發表于 2021-10-21 11:13
IIC要有延時的,你在所有的時鐘和數據后面加上一個空操作或者延時
你的程序都是沒有延時的
你參考一下

我再看看,謝謝了
作者: dll001    時間: 2021-10-21 19:03
正是河豚 發表于 2021-10-21 12:10
1、 你好,你的問題還是建議自己查找下。不過可以給你一個現成的可用的例子。
    2、例子的單片機是 ...

我板子上這兩個是直接連好的
作者: dll001    時間: 2021-10-21 19:05
378601462 發表于 2021-10-21 15:48
24C02擦寫數據時需要大概5ms的延時,

好像不是延時的問題,就是讀寫函數可能哪里有錯誤,還沒找到
作者: 188610329    時間: 2021-10-21 19:39
dll001 發表于 2021-10-21 19:05
好像不是延時的問題,就是讀寫函數可能哪里有錯誤,還沒找到

I2C的速度都是很慢的,一般用8951+12M晶振的話,CLK可以不延時,但是速度更快的單片機CLK這里必須要若干個NOP來延時的。尤其是讀的時候,延時不夠,根本讀不到東西。
作者: Y_G_G    時間: 2021-10-21 22:59
dll001 發表于 2021-10-21 19:05
好像不是延時的問題,就是讀寫函數可能哪里有錯誤,還沒找到

有問題,但不限于延時
明白不,延時肯定是有問題的,可能其它地方也有問題,但延時問題不解決,你永遠搞不定,除非你單片機能慢到IIC可以識別的速度
作者: 電工小明    時間: 2021-10-22 21:46
時序是不是不對,延時錯誤?




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1