找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于IIC总线(EEPROM)时钟数据保存问题

[复制链接]
跳转到指定楼层
楼主
ID:356940 发表于 2018-7-19 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想实现一个结合EEPROM芯片实现一个时钟程序,理想状态是掉电后时分秒还是按照原来的数据自增一,但是实际是只是保存了秒,掉电后重启秒正常以掉电前数据自增一,时和分保存的却是固定的数字,掉电后重启恢复原来的时和分数据,现象是:如掉电前04:02:12 ,掉电后重启04:01:12 ,无论分加到几,掉电后重启都会恢复为01,请帮我看看我的程序哪里不对?程序如下:
/*部分EEPROM读写程序已经写入I2C头文件中*/
#include<I2C.h>//自写的头文件,内部包含
#include<reg52.h>
#define uchar unsigned char//宏定义
#define uint unsigned int
bit fa=0,da=0,ga=0;          //触发写入EEPROM
sbit LSA=P2^2;                 //138译码器,用于扩展8位数码管
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code pcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar hour=0,min=0,s=55;
void delay(uint i) //延时函数
{
        while(i--);       
}
void display()        //数码管显示
{

            LSA=0;LSB=0;LSC=0; //显示第0位
                        P0=pcode[hour/10];
                        delay(200);
            LSA=1;LSB=0;LSC=0; //显示第1位
                        P0=pcode[hour%10];
                        delay(200);
            LSA=0;LSB=1;LSC=0; //显示第2位
                        P0=pcode[10];
                        delay(200);
                    LSA=1;LSB=1;LSC=0; //显示第3位
                        P0=pcode[min/10];
                        delay(200);
                        LSA=0;LSB=0;LSC=1; //显示第4位
                        P0=pcode[min%10];
                        delay(200);
                        LSA=1;LSB=0;LSC=1; //显示第5位
                        P0=pcode[10];
                        delay(200);
                        LSA=0;LSB=1;LSC=1; //显示第6位
                        P0=pcode[s/10];
                        delay(200);
                        LSA=1;LSB=1;LSC=1; //显示第7位
                        P0=pcode[s%10];
                        delay(200);
}
void init()                 //定时器中断初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
}
void main()
{  

   init();
   s=I2Cread(1);                                 //将读取的第一个地址的数据赋值给秒
   min=I2Cread(2);                                 //将读取的第二个地址的数据赋值给分
   hour=I2Cread(3);                                 //将读取的第三个地址的数据赋值给时
   while(1)
   {
     if(s==60)
         {
           s=0;
           min++;
           if(min==60)
           {
                min=0;
                hour++;
                if(hour==24)
           {
             hour=0;
           }
           }
          
          
         }
         
         display();
         if(fa==1)                                                //中断之后触发fa置1
         {
          fa=0;                                                   //将fa清零
          I2Cwrite(1,s);                           //将秒写入EEPROM第一个地址
          
         }                                                           
         if(da==1)                                           //同上
         {
          da=0;
          I2Cwrite(2,min);
          
         }
         if(ga==1)
         {
          ga=0;
          I2Cwrite(3,hour);
         }
         
   }


}

void Time_T0() interrupt 1                 //定时器中断实现一秒周期
{
  uchar i;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;

  i++;
  if(i==20)
  {
   i=0;
   s++;
   fa=1;
   da=1;
   ga=1;
  }
}





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

使用道具 举报

沙发
ID:370114 发表于 2018-7-19 11:25 | 只看该作者
建议贴出i2c.h里面的文件,因为本文中并没有见到I2Cread和I2Cwrite的函数,

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:356940 发表于 2018-7-21 08:31 | 只看该作者
/*I2C头文件*/
#include<I2C.h>

void delay10us(void)   //10us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);
}
void start_singal()
{
          SDA=1;
        delay10us();
        SCL=1;
        delay10us();
        SDA=0;
        delay10us();
        SCL=0;
        delay10us();
}
void stop_singal()
{
          SDA=0;
        delay10us();
        SCL=1;
        delay10us();
        SDA=1;
        delay10us();
}

unsigned char send_byte(unsigned char dat) //发送字节数据(包括了应答)
{
  unsigned char i=0,b;
  for(i=0;i<8;i++)
  {
   SDA=dat>>7;
   dat<<=1;
   delay10us();
   SCL=1;
   delay10us();
   SCL=0;
   delay10us();
  }
  SDA=1;
  delay10us();
  SCL=1;
  while(SDA)
  {
    b++;
        if(b>200)
        {
         SCL=0;
         delay10us();
         return 0;
        }
  }
  SCL=0;
  delay10us();
  return 1;
}
unsigned char read_byte()
{
  unsigned char i=0,dat=0;
  SDA=1;
  delay10us();
  for(i=0;i<8;i++)
  {
    SCL=1;
        delay10us();
        dat=dat<<1;
        dat|=SDA;
        delay10us();
        SCL=0;
        delay10us();
  }
  return dat;


}

void I2Cwrite(unsigned char addr,unsigned char dat)
{
   start_singal();
   send_byte(0xa0);
   send_byte(addr);
   send_byte(dat);
   stop_singal();
}

unsigned char I2Cread(unsigned char addr)
{
   unsigned char num;
   start_singal();
   send_byte(0xa0);
   send_byte(addr);
   start_singal();
   send_byte(0xa1);
   num=read_byte();
   stop_singal();
   return num;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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