找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3946|回复: 12
收起左侧

求助:1302不能保存时间

[复制链接]
ID:99130 发表于 2017-2-26 19:02 | 显示全部楼层 |阅读模式
5黑币
1302上电显示14.49,然后调至任意时间,比如22.33,然后断电,再上电,显示的时间依旧是14.49,而不是22.33。这个问题怎么解决?我怀疑是程序的问题。都说是初始化的问题,删掉或者屏蔽掉就行,但是没用的,我试过了。
下面是完整程序,希望各位大神帮我解决一下问题。
/**********************************
*  DS1302简单时间显示    *
*   数码管显示     *
***********************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define W P2           //位选
#define D P0         //段选
sbit IO=P1^0;           //数据口
sbit SCLK=P1^1;          //控制数据时钟
sbit RST=P1^2;           //使能端、复位端
/************按键引脚定义***********/
sbit s1=P1^5;         //按键 加
sbit s2=P1^6;         //按键 减
sbit s3=P1^7;         //按键 选择
char knum=0,snum,fnum;
/***********写时分秒地址************/
#define write_shi  0x84
#define write_fen  0x82
#define write_miao 0x80
/***********读时分秒地址************/
#define read_shi  0x85
#define read_fen  0x83
#define read_miao 0x81
bit miao_flag;
char miao_num;
char Dmiao;
char shi,fen,miao;         //读出数据存储变量
uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};  //不带小数点
uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  //带小数点
void delay(uint z)         //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{            //delay(500);大约延时500ms.
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void t0_init()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
}
uchar read_1302(uchar add)      //读函数
{
uchar i,date;
RST=0;           //禁止读写数据
for(i=0;i<8;i++)
{
  RST=1;
  SCLK=0;
  IO=add&0x01;
  add>>=1;
  SCLK=1;
}
for(i=0;i<8;i++)
{
  if(IO)
   date=date|0x80;
  else
   date=date|0x00;
  SCLK=1;
  date>>=1;
  SCLK=0;
}
RST=0;
date=date/16*10+date%16;    //进制转换 16转10进制
IO=0;         //数据读完后,IO口必须为0,不然小时一直显示85
return date;
}
void write_1302(uchar add,uchar dat)  //写函数
{
uchar i;
RST=0;         //禁止读写数据
SCLK=0;   
for(i=0;i<8;i++)       //写地址
{
  RST=1;         //允许读写数据
  SCLK=0;
  IO=add&0x01;  
  add>>=1;
  SCLK=1;
}
for(i=0;i<8;i++)       //写数据
{
  RST=1;        //允许读写数据
  SCLK=0;
  IO=dat&0x01;
  dat>>=1;
  SCLK=1;
}
RST=0;
}
void init_1302()       //初始化函数 设置时间
{
write_1302(0x8e,0x00);     //保护取消,可以进行读写操作
write_1302(write_miao,0x56);
write_1302(write_fen,0x49);
write_1302(write_shi,0x14);
write_1302(0x8e,0x80);     //保护启动,不能进行读写操作
}
void display(uchar shi,uchar fen)     //显示函数
{
if(knum==0)
{
  snum=30;
  fnum=30;
}
if(knum==1)
{
  fnum++;
  snum=30;
}
if(knum==2)
{
  snum++;
  fnum=30;
}

if(snum>=30)
{
  W=0xFE;         //位选
  D=d[shi/10];       //段选
  delay(5);
  D=0Xff;         //消隐
  if(miao_flag)       //小数点闪烁
  {
   W=0xFD;
   D=dd[shi%10];
   delay(5);
   D=0Xff;         //消隐
  }
  else
  {
   W=0xFD;
   D=d[shi%10];
   delay(5);
   D=0Xff;         //消?
  }
     if(snum==60)
   snum=0;
}  
if(fnum>=30)
{
  W=0xFB;
  D=d[fen/10];
  delay(5);
  D=0Xff;         //消隐
  W=0xF7;
  D=d[fen%10];
  delay(5);
  D=0Xff;         //消隐
  if(fnum==60)
   fnum=0;
}
}
void read_sf()
{
miao=read_1302(read_miao);
if(miao!=Dmiao)
{
  Dmiao=miao;
  TR0=1;
  miao_flag=1;
}
fen=read_1302(read_fen);
shi=read_1302(read_shi);
display(shi,fen);
}
void keyscan()           //按键扫描函数
{            
if(s3==0)           //选择按键按下
{
  delay(10);
  if(s3==0)
  {
   while(!s3)
    display(shi,fen); //加上这句,按键按下就不会闪
   knum++;
   if(knum==1)        //分闪烁
   {
     write_1302(0x8e,0x00);  //保护取消
     write_1302(write_miao,0x80);
   }
   if(knum==3)         //时钟启动
   {
    knum=0;
    write_1302(write_miao,0x00);
    write_1302(0x8e,0x80);  //保护启动
   }
  }
}
if(knum==1)        //分钟调节
{
  if(s1==0)       //加
  {
   delay(10);
   if(s1==0)
   {
    while(!s1)
     display(shi,fen); //加上这句,按键按下就不会闪
    fen++;
    if(fen==60)
     fen=0;
    write_1302(write_fen,fen/10*16+fen%10); //写入1302
//    read_sf();     //读出时间,然后显示
   }
  }
  if(s2==0)
  {
   delay(10);
   if(s2==0)
   {
    while(!s2)
     display(shi,fen); //加上这句,按键按下就不会闪
    fen--;
    if(fen==-1)
     fen=59;
    write_1302(write_fen,fen/10*16+fen%10);
    read_sf();
   }
  }
}
if(knum==2)
{
  if(s1==0)
  {
   delay(10);
   if(s1==0)
   {
    while(!s1)
     display(shi,fen); //加上这句,按键按下就不会闪
    shi++;
   
    if(shi==24)
     shi=0;
    write_1302(write_shi,shi/10*16+shi%10);
    read_sf();
   }
  }
  if(s2==0)
  {
   delay(10);
   if(s2==0)
   {
    while(!s2)
       display(shi,fen); //加上这句,按键按下就不会闪
    shi--;
   
    if(shi==-1)
     shi=23;
    write_1302(write_shi,shi/10*16+shi%10);
    read_sf();
   }
  }
}
}
void main()
{
init_1302();
t0_init();
while(1)
{
  read_sf();
  keyscan();
}
}
void t0_timer() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
miao_num++;
if(miao_num==10)
{
  TR0=0;
  miao_num=0;
  miao_flag=0;
}
}

回复

使用道具 举报

ID:165046 发表于 2017-2-26 23:02 | 显示全部楼层
加电池供电了吗!?然后通过程序检查1302是否掉电(在初始化程序中)
回复

使用道具 举报

ID:27916 发表于 2017-2-27 08:43 | 显示全部楼层
大概看了一下,你每次的初始化都是一样的;
不知道你电路是怎么样的,个人认为可以从以下几点看一下
1、硬件,1302是否有备用电源
2、我记得1302有一些地址是可以做标记的,可以每次上电读取这个标记,看是否有初始化,没有初始化就初始化一下1302并且初始化这个标记;如果初始化过这个标记就直接跳到1302的初始化
回复

使用道具 举报

ID:123289 发表于 2017-2-27 12:53 | 显示全部楼层
当是修改后,未保存至“关键”的地方。
回复

使用道具 举报

ID:96682 发表于 2017-2-27 14:44 | 显示全部楼层
LZ,光粘贴源程序没啥用,还要有原理图。
兴许是你修改时间后,忘记按确定键都有可能
回复

使用道具 举报

ID:99130 发表于 2017-2-27 15:15 | 显示全部楼层
zhaok2013 发表于 2017-2-26 23:02
加电池供电了吗!?然后通过程序检查1302是否掉电(在初始化程序中)

加了 问题已解决
回复

使用道具 举报

ID:99130 发表于 2017-2-27 15:16 | 显示全部楼层
wc86110 发表于 2017-2-27 14:44
LZ,光粘贴源程序没啥用,还要有原理图。
兴许是你修改时间后,忘记按确定键都有可能

已解决,
回复

使用道具 举报

ID:99130 发表于 2017-2-27 15:16 | 显示全部楼层
yzwzfyz 发表于 2017-2-27 12:53
当是修改后,未保存至“关键”的地方。

已解决。。。。。。。。。
回复

使用道具 举报

ID:140489 发表于 2017-3-10 13:28 | 显示全部楼层
能分享下你的解决方法吗?
回复

使用道具 举报

ID:155507 发表于 2017-3-10 17:57 | 显示全部楼层
是加电池供电吗?
回复

使用道具 举报

ID:169747 发表于 2017-3-10 21:38 | 显示全部楼层
加了rtc电池是把???
回复

使用道具 举报

ID:99130 发表于 2017-3-11 12:46 | 显示全部楼层
wt410089163 发表于 2017-3-10 21:38
加了rtc电池是把???

额 没懂你的意思 我是程序出了问题 初始化里面定义了每次上电显示的时间 把他屏蔽掉就好了 如果不是这个原因那还是初始化的问题 重复初始化了 每次上电都在初始化当然不能继续走时 把多余的删掉就行了
回复

使用道具 举报

ID:99130 发表于 2017-3-11 12:47 | 显示全部楼层
lids 发表于 2017-3-10 13:28
能分享下你的解决方法吗?

write_1302(write_miao,0x56);
write_1302(write_fen,0x49);
write_1302(write_shi,0x14);
这三句定义了上电的显示时间,多余的 删掉就行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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