微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于DS1302的时钟/日历寄存器的疑问

关于DS1302的时钟/日历寄存器的疑问

时间:10-02 整理:3721RD 点击:
在DS1302中写入数据,需要先写入地址/命令,然后才能写数据
附图上,小时寄存器的7位来选择 12进制还是24进制  当为高时是12小时 低时是24小时 最左侧一栏有读地址和写地址 在写入地址/命令后就可以设定7位
图上小时寄存器7位为1;
但是我按照表格左侧的地址写代码的时候,通过数码管显示的时候还是24小时制的,这和数据手册描述的不一样啊!
为很么会出现这样的情况?

对于1302的操作分两部分,一部分是控制字,也就是地址及命令字节,另一部分是数据。
比如向小时寄存器写入24小时制的13点,应该是先发送0x84h,这个是写小时寄存器的地址,再发送0x13h,这个是小时的数据13点。
如向小时寄存器写入12小时制的下午1点,应该是先发送0x84h,再发送0xc1h。
读取小时寄存器数据则是先发送0x85h,这个是读小时寄存器的地址,再读取小时寄存器的数据。

附图在这


表示关注中

不是很明白你的问题,首先1302对同一寄存器的读和写地址是不一样的。其次对于小时来说在12小时制时有AM和PM的区别,按上图的内容看,如果是12小时制,那么如果不判断AM和PM,在12点向1点转换的时候,会将1点读为21点。

我截取代码的一部分
//下面是根据图标的写读寄存器的地址
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0X81
#define READ_MINUTE 0X83
#define READ_HOUR 0X85
#define PROTECT 0x8e
//下面是主函数   readDS writeDS  //如下 我实际操作的时候只是写入表中地址以及初始时间就可以运行,如果地址就是包含(12小时 /24小时制选择情况的信息的话)代码中地址/命令小时寄存器的写为 0x84 这里的地址就 二进制1000 0100 七位和三位为一  也就是 12小时制 但是我设定的时间还是正常的24小时的 这个疑点(运行情况见gif)
void main()
{
        uchar h,m,s;
        init();
        set_time(WRITE_HOUR,23);
        set_time(WRITE_MINUTE,59);
        set_time(WRITE_SECOND,59);
        while(1)
        {
                h=readDS(READ_HOUR);
                m=readDS(READ_MINUTE);
                s=readDS(READ_SECOND);
                h1=h/10;h2=h%10;
                m1=m/10;m2=m%10;
                s1=s/10;s2=s%10;
                display();
        }
}
//    设置时间函数 readDS writeDS
void set_time(uchar address,uchar val)
{       
        set_protect(0);
        writeDS(address,BtoBCD(val));
}
void writeDS(uchar address,uchar date)
{
        uchar i;
        SCLK=0;
        _nop_();
        RST=1;
        for(i=8;i>0;i--)
        {
                DSIO=address&0x01;
                address>>=1;
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        for(i=8;i>0;i--)
        {
                DSIO =date&0x01;
                date>>=1;
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        RST=0;
}
uchar readDS(uchar address)
{
        uchar i,date,date1;
        SCLK=0;
        _nop_();
        RST=1;
        for(i=8;i>0;i--)
        {
                DSIO=address&0x01;
                address>>=1;
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        for(i=8;i>0;i--)
        {
                date>>=1;
                date1=DSIO;
                date=(date|(date1<<7));
                SCLK=1;
                 _nop_();
                SCLK=0;
                _nop_();
        }
        RST=1;
        return BCDtoB(date);
}


这里set_time(WRITE_HOUR,23);,我认为你是设置了小时为23点,但是这里第7位为0,所以还是24小时制,如果要设置成12小时制,比如上午11点,那么所写入的十六进制格式应该是0x91,试试看,应该是这样。
在12小时制的情况下,读写小时寄存器时都应该要判断和设置AM,PM标志。

抱歉啊,我的图片少了一部分
bit7是最高位啊,我也试了地址变了,数据好像就写不进去了,还有另一张图我也看不懂,控制位最高位(位7)一定是1?和前面说的是不同的控制字吗,但实际程序没有管这个啊



感谢,我想通了

我试了0x91,结果显示为了0,第四位应该不是10时吧? 但我也试了0x8b,结果也不行

已解决

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top