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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3190|回復: 9
收起左側

51單片機,用到了I2C總線,AT24C02儲存部分 程序錯誤

[復制鏈接]
ID:973696 發表于 2021-10-21 10:38 | 顯示全部樓層 |閱讀模式
10黑幣
跟著視頻做的,感覺沒有問題,找了好久也找出來錯到哪,語法沒有問題,麻煩大家幫我看一下,謝謝大家了

12-1 AT24C02數據存儲.rar

45.6 KB, 下載次數: 11

keil程序

回復

使用道具 舉報

ID:401564 發表于 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;
}
//=================================================================================================*/
回復

使用道具 舉報

ID:863432 發表于 2021-10-21 12:10 | 顯示全部樓層
    1、 你好,你的問題還是建議自己查找下。不過可以給你一個現成的可用的例子。
    2、例子的單片機是基于STC8H3K64S4主芯片編寫的,見下圖。(板子是艾克姆的開發板)
外部EEPROM存儲器讀寫實驗連接圖.jpg

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






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

40.69 KB, 下載次數: 6

回復

使用道具 舉報

ID:956918 發表于 2021-10-21 15:48 | 顯示全部樓層
24C02擦寫數據時需要大概5ms的延時,
回復

使用道具 舉報

ID:973696 發表于 2021-10-21 19:02 | 顯示全部樓層
Y_G_G 發表于 2021-10-21 11:13
IIC要有延時的,你在所有的時鐘和數據后面加上一個空操作或者延時
你的程序都是沒有延時的
你參考一下

我再看看,謝謝了
回復

使用道具 舉報

ID:973696 發表于 2021-10-21 19:03 | 顯示全部樓層
正是河豚 發表于 2021-10-21 12:10
1、 你好,你的問題還是建議自己查找下。不過可以給你一個現成的可用的例子。
    2、例子的單片機是 ...

我板子上這兩個是直接連好的
回復

使用道具 舉報

ID:973696 發表于 2021-10-21 19:05 | 顯示全部樓層
378601462 發表于 2021-10-21 15:48
24C02擦寫數據時需要大概5ms的延時,

好像不是延時的問題,就是讀寫函數可能哪里有錯誤,還沒找到
回復

使用道具 舉報

ID:624769 發表于 2021-10-21 19:39 | 顯示全部樓層
dll001 發表于 2021-10-21 19:05
好像不是延時的問題,就是讀寫函數可能哪里有錯誤,還沒找到

I2C的速度都是很慢的,一般用8951+12M晶振的話,CLK可以不延時,但是速度更快的單片機CLK這里必須要若干個NOP來延時的。尤其是讀的時候,延時不夠,根本讀不到東西。
回復

使用道具 舉報

ID:401564 發表于 2021-10-21 22:59 | 顯示全部樓層
dll001 發表于 2021-10-21 19:05
好像不是延時的問題,就是讀寫函數可能哪里有錯誤,還沒找到

有問題,但不限于延時
明白不,延時肯定是有問題的,可能其它地方也有問題,但延時問題不解決,你永遠搞不定,除非你單片機能慢到IIC可以識別的速度
回復

使用道具 舉報

ID:971289 發表于 2021-10-22 21:46 | 顯示全部樓層
時序是不是不對,延時錯誤?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www国产成人免费观看视频,深夜成人网 | 久久久久国产一区二区三区四区 | 青青青伊人 | 国产精品无码专区在线观看 | 91tv在线观看 | 91视视频在线观看入口直接观看 | 欧洲一区二区在线 | 欧美黄色一区 | 日本黄色影片在线观看 | 国产精品免费大片 | 成人做爰9片免费看网站 | 91久久精品日日躁夜夜躁国产 | 欧美激情 一区 | 一级片免费在线观看 | 欧美在线日韩 | 祝你幸福电影在线观看 | 国产精品不卡一区 | 国产人成精品一区二区三 | 不卡在线视频 | 欧美成人一区二区三区片免费 | 成人免费视频观看视频 | 久久久久欧美 | 欧美全黄 | 国产精品久久久99 | 日韩成人免费 | 日韩一区二区在线视频 | 91久久电影| 国产亚洲成av人片在线观看桃 | 国产91精品在线 | 国产成人免费视频网站高清观看视频 | 久久夜夜 | 久久91精品国产一区二区 | 国产小网站 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 日韩在线观看一区 | 欧美日韩综合一区 | 91精品久久久久久久久中文字幕 | 黄色成人在线观看 | 国产成人一区二区三区 | 先锋av资源在线 | 国产在线一区二区 |