找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3685|回復: 3
收起左側(cè)

為什么我AT24C02一直顯示255

[復制鏈接]
ID:900102 發(fā)表于 2021-4-6 16:35 | 顯示全部樓層 |閱讀模式
#include<stc15f2k60s2.h>
#include<intrins.h>

#define uchar unsigned char
uchar TAB[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xaa,0xff};
uchar YI,ER,SAN,SI,WU,LIU,QI,BA;
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
sbit SCL=P2^0;
sbit SDA=P2^1;
void IIC_Delay(unsigned char i);
void IIC_Stop(void);

void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
}
void IIC_Delay(unsigned char i)  //IIC通信延時程序
{
    do{_nop_();}
    while(i--);        
}
void IIC_Start(void)     //iic啟動程序
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;       
}

void IIC_Stop(void)                                                        //iic停止
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}
void IIC_SendAck(bit ackbit)                        //iic響應
{
    SCL = 0;
    SDA = ackbit;                                          // 0:應答,1:非應答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0;
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}
bit IIC_WaitAck(void)                                                //iic等待應答
{
    bit ackbit;
       
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}
void IIC_SendByte(unsigned char byt)  //發(fā)送數(shù)據(jù)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

unsigned char IIC_RecByte(void)        //iic讀取字節(jié)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
            SCL = 1;
        IIC_Delay(DELAY_TIME);
        da <<= 1;
        if(SDA) da |= 1;
        SCL = 0;
        IIC_Delay(DELAY_TIME);
    }
    return da;   
}


void iicwrite(uchar add,uchar dat)
{
        IIC_Start();
//        IIC_SendByte(0xa0);         //啟動寫模式
        IIC_SendByte(0x90);   //AD轉(zhuǎn)換
        IIC_SendAck(IIC_WaitAck());
       
        IIC_SendByte(add);
        IIC_SendAck(IIC_WaitAck());
        IIC_SendByte(dat);
        IIC_SendAck(IIC_WaitAck());
        IIC_Stop();
}

uchar iicread(uchar add)
{
        uchar temp;
        IIC_Start();
        //IIC_SendByte(0xa0);
        IIC_SendByte(0x90);
        IIC_SendAck(IIC_WaitAck());
       
        IIC_SendByte(add);
        IIC_Stop();
       
        IIC_Start();
        IIC_SendByte(0xa1);            //啟動讀模式
        //IIC_SendByte(0x91);
        IIC_SendAck(IIC_WaitAck());
        temp=IIC_RecByte();                                                //收回參數(shù)
        IIC_Stop();
        return temp;
       

}


void allinit()
{
        P2=0X80;
        P0=0XFF;
       
        P2=0XA0;
        P0=0X00;
       
        P2=0XC0;
        P0=0XFF;
        P2=0XF0;
        P0=0XFF;


}


void display1()
{
        P2=0XC0;
        P0=0X01;
        P2=0XFF;
        P0=TAB[YI];
        Delay1ms();
       
        P2=0XC0;
        P0=0X02;
        P2=0XFF;
        P0=TAB[ER];
        Delay1ms();

}
void display2()
{
        P2=0XC0;
        P0=0X04;
        P2=0XFF;
        P0=TAB[SAN];
        Delay1ms();
       
        P2=0XC0;
        P0=0X08;
        P2=0XFF;
        P0=TAB[SI];
        Delay1ms();

}
void display3()
{
        P2=0XC0;
        P0=0X10;
        P2=0XFF;
        P0=TAB[WU];
        Delay1ms();
       
        P2=0XC0;
        P0=0X20;
        P2=0XFF;
        P0=TAB[LIU];
        Delay1ms();

}
void display4()
{
        P2=0XC0;
        P0=0X40;
        P2=0XFF;
        P0=TAB[QI];
        Delay1ms();
       
        P2=0XC0;
        P0=0X80;
        P2=0XFF;
        P0=TAB[BA];
        Delay1ms();

}





void main()
{
        uchar num;
        allinit();
       
        YI=11,ER=11;SAN=11;SI=11;WU=11;LIU=0;QI=0;BA=0;
iicwrite(0x00,0);   
        num=iicread(0x00);
        //iicwrite(0x00,num+1);  //AT24C02
       
       
        while(1)
        {
                num=iicread(0x03);
                LIU=num/100;QI=num%100/10;BA=num%10;
                display1();
                display2();
                display3();
                display4();
        }





}

回復

使用道具 舉報

ID:607298 發(fā)表于 2021-4-7 09:42 | 顯示全部樓層
EEPROM沒有寫數(shù)據(jù),一般都是0xFF(255)
回復

使用道具 舉報

ID:900102 發(fā)表于 2021-4-7 16:06 | 顯示全部樓層
lightday 發(fā)表于 2021-4-7 09:42
EEPROM沒有寫數(shù)據(jù),一般都是0xFF(255)

但是用pcf8591芯片的滑動變阻器會出現(xiàn)一個一直亂跳的數(shù)值
回復

使用道具 舉報

ID:883031 發(fā)表于 2021-4-7 16:29 | 顯示全部樓層
估計是數(shù)據(jù)沒寫進去。查一下程序在讀寫IIC時的時序是否正確,這個很重要。
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表