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

2019-07-15 09:53发布

在DS1302中写入数据,需要先写入地址/命令,然后才能写数据
附图上,小时寄存器的7位来选择 12进制还是24进制  当为高时是12小时 低时是24小时 最左侧一栏有读地址和写地址 在写入地址/命令后就可以设定7位
图上小时寄存器7位为1;
但是我按照表格左侧的地址写代码的时候,通过数码管显示的时候还是24小时制的,这和数据手册描述的不一样啊!
为很么会出现这样的情况?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
lzlrsddz
1楼-- · 2019-07-15 23:50
 精彩回答 2  元偷偷看……
人中狼
2楼-- · 2019-07-16 04:13
不是很明白你的问题,首先1302对同一寄存器的读和写地址是不一样的。其次对于小时来说在12小时制时有AM和PM的区别,按上图的内容看,如果是12小时制,那么如果不判断AM和PM,在12点向1点转换的时候,会将1点读为21点。
Distant123
3楼-- · 2019-07-16 07:52
人中狼 发表于 2017-8-14 13:23
不是很明白你的问题,首先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);
}
V70814-145140.gif
人中狼
4楼-- · 2019-07-16 11:13
这里set_time(WRITE_HOUR,23);,我认为你是设置了小时为23点,但是这里第7位为0,所以还是24小时制,如果要设置成12小时制,比如上午11点,那么所写入的十六进制格式应该是0x91,试试看,应该是这样。
在12小时制的情况下,读写小时寄存器时都应该要判断和设置AM,PM标志。
Distant123
5楼-- · 2019-07-16 11:43
人中狼 发表于 2017-8-14 15:24
这里set_time(WRITE_HOUR,23);,我认为你是设置了小时为23点,但是这里第7位为0,所以还是24小时制,如果要设置成12小时制,比如上午11点,那么所写入的十六进制格式应该是0x91,试试看,应该是这样。
在12小时制的情况下,读写小时寄存器时都应该要判断和设置AM,PM标志。 ...

抱歉啊,我的图片少了一部分
bit7是最高位啊,我也试了地址变了,数据好像就写不进去了,还有另一张图我也看不懂,控制位最高位(位7)一定是1?和前面说的是不同的控制字吗,但实际程序没有管这个啊
12.png
无标题.png
Distant123
6楼-- · 2019-07-16 15:48
 精彩回答 2  元偷偷看……

一周热门 更多>