找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2755|回复: 3
打印 上一主题 下一主题
收起左侧

为什么我AT24C02一直显示255

[复制链接]
跳转到指定楼层
楼主
ID:900102 发表于 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)  //发送数据
{
    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读取字节
{
    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转换
        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();                                                //收回参数
        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();
        }





}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:607298 发表于 2021-4-7 09:42 | 只看该作者
EEPROM没有写数据,一般都是0xFF(255)
回复

使用道具 举报

板凳
ID:900102 发表于 2021-4-7 16:06 | 只看该作者
lightday 发表于 2021-4-7 09:42
EEPROM没有写数据,一般都是0xFF(255)

但是用pcf8591芯片的滑动变阻器会出现一个一直乱跳的数值
回复

使用道具 举报

地板
ID:883031 发表于 2021-4-7 16:29 | 只看该作者
估计是数据没写进去。查一下程序在读写IIC时的时序是否正确,这个很重要。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表