这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » DS1302时钟初始化时间进制问题

共12条 1/2 1 2 跳转至

DS1302时钟初始化时间进制问题

菜鸟
2013-12-08 22:21:46     打赏

之前一直有在问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  但这样结果是开发板上电初始化的一瞬间数码管显示是正确的,但是接下来就不正确 了,秒开始乱跳,越到后来都乱跳了,想问下为什么不能用十进制去初始化?

 

 

 


院士
2013-12-08 22:42:18     打赏
2楼

是不是取后4位的意思啊~~

我还真没有仔细看过DS1302的数据手册


高工
2013-12-09 05:41:47     打赏
3楼
DS1302的寄存器存放的数据位为BCD码。

高工
2013-12-09 05:45:33     打赏
4楼
你改的是程序的显示部分,不是初始化部分。

专家
2013-12-11 20:48:20     打赏
5楼

就一个I2C控制时序即可


助工
2013-12-13 08:47:40     打赏
6楼
我没去看你的程序 从你的文字上说应该是你显示最开始调用的是 初始化的数值   如你写 12点30分12秒  你按10进制写进去肯定没错  但程序会转为16进制写到时钟芯片里去, 但时钟芯片默认的是BCD码 和你写进去的数值不匹配,就会出问题, 

高工
2013-12-14 07:11:22     打赏
7楼
BCD码是四位二进制码, 也就是将十进制的数字转化为二进制, 但是和普通的转化有一点不同, 每一个十进制的数字0-9都对应着一个四位的二进制码,对应关系如下: 十进制0 对应 二进制0000 ;十进制1 对应二进制0001 ....... 9 1001 接下来的10就有两个上述的码来表示 10 表示为00010000 也就是BCD码是遇见1001就产生进位,不象普通的二进制码,到1111才产生进位10000。

助工
2013-12-15 17:38:10     打赏
8楼
楼上把我懒得打的字都打出来了 赞一个

助工
2013-12-15 17:38:13     打赏
9楼
楼上把我懒得打的字都打出来了 赞一个

高工
2013-12-15 20:37:19     打赏
10楼
请问12点你按10进制写进去,怎么写?请把这一句写出来。

共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]