完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在DS1302中写入数据,需要先写入地址/命令,然后才能写数据
附图上,小时寄存器的7位来选择 12进制还是24进制 当为高时是12小时 低时是24小时 最左侧一栏有读地址和写地址 在写入地址/命令后就可以设定7位 图上小时寄存器7位为1; 但是我按照表格左侧的地址写代码的时候,通过数码管显示的时候还是24小时制的,这和数据手册描述的不一样啊! 为很么会出现这样的情况?
|
|
相关推荐
10个回答
|
|
对于1302的操作分两部分,一部分是控制字,也就是地址及命令字节,另一部分是数据。
比如向小时寄存器写入24小时制的13点,应该是先发送0x84h,这个是写小时寄存器的地址,再发送0x13h,这个是小时的数据13点。 如向小时寄存器写入12小时制的下午1点,应该是先发送0x84h,再发送0xc1h。 读取小时寄存器数据则是先发送0x85h,这个是读小时寄存器的地址,再读取小时寄存器的数据。
最佳答案
|
|
|
|
附图在这
|
|
|
|
表示关注中
|
|
|
|
不是很明白你的问题,首先1302对同一寄存器的读和写地址是不一样的。其次对于小时来说在12小时制时有AM和PM的区别,按上图的内容看,如果是12小时制,那么如果不判断AM和PM,在12点向1点转换的时候,会将1点读为21点。
|
|
|
|
人中狼 发表于 2017-8-14 13:23 我截取代码的一部分 //下面是根据图标的写读寄存器的地址 #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标志。 |
|
|
|
人中狼 发表于 2017-8-14 15:24 抱歉啊,我的图片少了一部分 bit7是最高位啊,我也试了地址变了,数据好像就写不进去了,还有另一张图我也看不懂,控制位最高位(位7)一定是1?和前面说的是不同的控制字吗,但实际程序没有管这个啊 |
|
|
|
人中狼 发表于 2017-8-14 19:30 感谢,我想通了 |
|
|
|
人中狼 发表于 2017-8-14 15:24 我试了0x91,结果显示为了0,第四位应该不是10时吧? 但我也试了0x8b,结果也不行 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
757 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
728 浏览 0 评论
826 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1459 浏览 0 评论
1208 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12057 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 04:35 , Processed in 0.923132 second(s), Total 92, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号