普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 3314|回复: 1

求大神帮助!关于AT24C02的一些问题

 关闭 [复制链接]

1

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2017-8-12 21:18:46 | 显示全部楼层 |阅读模式
要求功能:利用定时器产生一个0~99秒变化的秒表,并显示在数码管上,每过一秒将这个变化的数字写入板上AT24C02内部。当关闭实验板电源,并再次打开实验板电源时,单片机先从AT24C02中将原来写入的数读出来,接着此数继续变化并显示在数码管上。
程序如下:
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit SCL=P2^1;
sbit SDA=P2^0;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code array[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 array1[4];
u8 num=0;
void delay(u8 b)
{
    while(b--);
}
void delay10us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);
}


void start()
{
    SDA=1;
        delay10us();
        SCL=1;
        delay10us();
        SDA=0;
        delay10us();
}
void stop()
{
    SDA=0;
        delay10us();
        SCL=1;
        delay10us();
        SDA=1;
        delay10us();
}
void respons()
{
   u8 c;
   SCL=1;
   delay10us();
   while(SDA)
   {
      c++;
          if(c>200)
          {                 
            SCL=0;
            delay10us();
          }
   }
   SCL=0;
   delay10us();
}
void I2Cwritebyte(u8 date)
{
    u8 i;
        for(i=0;i<8;i++)
        {
           SDA=date>>7;
           date=date<<1;
           delay10us();
           SCL=1;
           delay10us();
           SCL=0;
           delay10us();
        }
        SDA=1;
        delay10us();
        SCL=1;
        delay10us();
        respons();  
}

u8 I2Creadbyte()
{
   u8 dat,i;
   SDA=1;
   delay10us();
   for(i=0;i<8;i++)
   {
      SCL=1;
      dat<<=1;
          dat|=SDA;
          delay10us();
          SCL=0;
          delay10us();
   }
   return dat;
}

void AT24C02Write(u8 addr,u8 dat)
{
    start();
    I2Cwritebyte(0xa0);
        I2Cwritebyte(addr);
        I2Cwritebyte(dat);
        stop();
}

u8 AT24C02Read(u8 addr)
{
    u8 num;
    start();
        I2Cwritebyte(0xa0);
        I2Cwritebyte(addr);
        start();
        I2Cwritebyte(0xa1);
        num=I2Creadbyte();
        stop();
        return num;
}

void keypros()
{
    if(k1==0)
        {
           delay(100);
           if(k1==0)
           {
              AT24C02Write(1,num);
           }
           while(!k1);
        }
        if(k2==0)
        {
           delay(100);
           if(k2==0)
           {
              num=AT24C02Read(1);
           }
           while(!k2);
        }
        if(k3==0)
        {
           delay(100);
           if(k3==0)
           {
              num++;
                  if(num>255)
                  num=0;
           }
           while(!k3);
        }
        if(k4==0)
        {
           delay(100);
           if(k4==0)
           {
              num=0;
           }
           while(!k4);
        }
}

void numpros()
{   

           array1[0]=array[num%1000%100%10];
        array1[1]=array[num%1000%100/10];
        array1[2]=array[num%1000/100];
        array1[3]=array[num/1000];
}

void digpros()
{
     u8 i;
         for(i=0;i<4;i++)
         {
            switch(i)
                  {
                     case(0)SA=0;LSB=0;LSC=0;break;
                     case(1)SA=1;LSB=0;LSC=0;break;
                     case(2)SA=0;LSB=1;LSC=0;break;
                     case(3)SA=1;LSB=1;LSC=0;break;
                   }
         }
         P0=array1[i];
         delay(1000);
         P0=0x00;
}
void main()
{
    while(1)
        {
            keypros();
                numpros();
                digpros();

        }
}


我的板子上的现象是数码管只是从0~99,不过掉电后不会保存数据,又从0开始了。请问哪里有问题?
回复

使用道具 举报

42

主题

563

帖子

1907

积分

金牌会员

Rank: 6Rank: 6

积分
1907
发表于 2017-8-14 12:05:47 | 显示全部楼层
程序没有毛病,你试着断电后,先读出来;而不是写入
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-24 15:38 , Processed in 0.082291 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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