打印
[51单片机]

DS1302时间初始化

[复制链接]
1655|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yexinsuso|  楼主 | 2013-12-8 22:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, AD, RS, ST, se
之前一直有在问DS1302的问题,这几天又想到一个问题。先上整个程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DU=P2^6;
sbit WE=P2^7;
sbit IO=P2^0;
sbit CLK=P2^1;
sbit RST=P2^4;
uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管断码表
uchar second,minute,hour;
void delay(void)
{
uchar i,j;
for(j=1;j>0;j--)
  for(i=110;i>0;i--) ;
}
void input(uchar byte)//写一个字节
{
   uchar i;
  for(i=8;i>0;i--)
  {
      IO=byte&0x01;
      CLK=1;
      CLK=0;
      byte>>=1;
}
}
uchar output(void)//读一个字节
{
     uchar i,dat=0;
    for(i=8;i>0;i--)
    {
      dat>>=1;
      if(IO)dat|=0x80;
      CLK=1;
      CLK=0;
    }
     return (dat);
  }
void write(uchar addr,uchar dat)//在特定地址写数据
{
    CLK=0;
    RST=0;
    RST=1;
    input(addr);
    input(dat);
    CLK=1;
    RST=0;
}
uchar read(uchar addr)//从特定地址读数据
{
    uchar dat;
    RST=0;
    CLK=0;
    RST=1;
    input(addr);
    dat=output();
    CLK=1;
    RST=0;
    return(dat);
}
void init()//初始化时间,我想显示12点30分0秒
{
   write(0x8e,0x00);//写保护
   write(0x80,0x00);//秒 钟从0开始
   write(0x82,0x30);//分钟设为30
   write(0x84,0x12);//时钟设为12
}
void read_time()//读时间
{
     second=read(0x81);
     minute=read(0x83);
     hour=read(0x85);
}
void display()//显示程序
{
      WE=1;
      P0=0xfe;
      WE=0;
       DU=1;
       P0=tab[hour/16];//时钟十位
       DU=0;
      delay();
      WE=1;
      P0=0xfd;
      WE=0;
      DU=1;
     P0=tab[hour%16];//时钟各位
     DU=0;
     delay();
      WE=1;
      P0=0xfb;
      WE=0;
      DU=1;
      P0=tab[minute/16];
      DU=0;
     delay();
     WE=1;
     P0=0xf7;
     WE=0;
    DU=1;
    P0=tab[minute%16];
    DU=0;
    delay();
    WE=1;
    P0=0xef;
    WE=0;
    DU=1;
    P0=tab[second/16];
    DU=0;
    delay();
    WE=1;
    P0=0xdf;
    WE=0;
    DU=1;
    P0=tab[second%16];
    DU=0;
    delay();
}
main()
{
     init();
while(1)
  {
     read_time();
      display();
  }
}  
问题是这样的,我想显示12点30分0秒,原本的程序是在相应的寄存器用16进制初始化,比如0x00,0x30,0x12。但我一开始不知道问什么16进制也可以写成10进制的形式“12:30:00“,毕竟10进制好理解些,我就尝试把对应的寄存器用十进制去初始化,然后在显示程序display中分别改成hour/10  hour%10    minute/10 minute%10   second/10  second%10  但这样结果是开发板上电初始化的一瞬间数码管显示是正确的,但是接下来就不正确 了,秒开始乱跳,越到后来都乱跳了,想问下为什么不能用十进制去初始化?

相关帖子

沙发
xhloes大龙| | 2013-12-9 09:48 | 只看该作者
本帖最后由 xhloes大龙 于 2013-12-9 09:52 编辑

时间是以BCD码存在里面的 ,不知道是不是这个问题。(本人菜鸟,答错了勿喷,谢谢)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

26

帖子

0

粉丝