找回密码
 注册
关于网站域名变更的通知
查看: 1133|回复: 8
打印 上一主题 下一主题

DS1302真是麻烦啊,里面的bcd转换我看的头都大了

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-18 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 码农 于 2019-4-18 10:19 编辑
( b7 r) y. {& m, d0 O- v# h* k
5 J6 e# w7 V: _( X$ WDS1302真是麻烦啊,里面的bcd转换我看的头都大了
2 z. s8 L! @9 i% m+ O9 J" T9 U: A$ T6 q
正常不是把用户输出的十进制数据转为BCD码才能被DS1302识别吗<blockquote>/*------------------------------------------------7 y5 ]/ B7 C0 h' r7 j% s) i

2 S2 u; z6 H" k- j% g) \/ W3 a2 B% l; T- c" ^& X; N
前面数组定义是  T& F2 M! p$ K. p% X( K- w# \
unsigned char time_buf1[8] = {20,15,11,6,20,59,00,5};//空年月日时分秒周
3 `: L, [+ v1 `  B0 \. uunsigned char time_buf[8] ; 8 {$ s' R: ?5 r
麻烦大家看一下这个函数吧,这个函数的功能应该就是把十进制的时间改为二进制然后写入DS1302
& T2 D4 G% A8 K1 k所以注释的BCD码处理应该指的就是十进制转bcd码,可是安装这个算法完全算不出来BCD码,我们取i=1吧,那么就是
! Z% Q2 g1 G- I9 V0 A  u
                tmp=time_buf1[1]/10;                            //15/10=1=tmp
                time_buf[1]=time_buf1[1]%10;             //15%10=5=time_buf[1]
                time_buf[1]=time_buf[1]+tmp*16;       //5+1*16=21=time_buf[1]
这个21很明显绝不是BCD码啊,还是我里面什么想错了?

% \. q3 Q( k, f$ }( `$ G. M. C  E) ?+ y2 n) C' w: r  s

该用户从未签到

2#
发表于 2019-4-18 10:28 | 只看该作者
其实你程序应该是对的:15H = 21,所以15H转换为BCD码就是21H.
' l! a, \% A2 E$ ]3 X! t; o. P1 o6 s- U, J. Y( u( G# e+ u- d, F

( V- r6 @$ ^7 F; i, _8 L- a+ Q- R例如:11H要转换为BCD码,结果应该为11H = 17(十进制) ->17H(BCD码);4 u& s. I9 r. D* A) @& D' [
所以,可以这么算:11H/10 =1;11H%10 = 7; BCD码等于1*16+7=17H。
. E5 f) S9 m5 F$ j- R' z程序应该为9 c* T' S. ^) Y4 Z1 P; A$ ^. Q
unsigned char Hex2BCD(unsigned char hex)
5 W* o$ T2 Z8 P, u+ v! r  Y  f{
9 F* W1 K( T6 l9 P* S1 G        unsigned char res;
9 Z9 J7 W8 I9 v- [        res = hex/10*16+hex%10;, C9 y, [/ F  }
        ruturn res;
8 g- M+ D; B3 t: S9 A}

点评

BCD码不是一个四位的二进制数字吗?17H是怎么表示BCD码?而且这个BCD码处理后是要串行输出的,单单17H是怎样串行输出的呢?一口气问了两句,还望解答  详情 回复 发表于 2019-4-18 10:34

该用户从未签到

3#
 楼主| 发表于 2019-4-18 10:34 | 只看该作者
helendcany 发表于 2019-4-18 10:286 k0 ^( N$ n  `# N2 O2 O) O
其实你程序应该是对的:15H = 21,所以15H转换为BCD码就是21H.

5 j- g' l5 e! FBCD码不是一个四位的二进制数字吗?17H是怎么表示BCD码?而且这个BCD码处理后是要串行输出的,单单17H是怎样串行输出的呢?一口气问了两句,还望解答
" ]# O0 I- L" L( X

点评

附注:压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001  详情 回复 发表于 2019-4-18 11:13

该用户从未签到

4#
发表于 2019-4-18 11:13 | 只看该作者
码农 发表于 2019-4-18 10:34
" C; U! |2 E. A' KBCD码不是一个四位的二进制数字吗?17H是怎么表示BCD码?而且这个BCD码处理后是要串行输出的,单单17H是 ...

5 m; f: y; O8 e4 E0 {附注:压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001表示0~9.例如00001000B表示十进制数8.9 b+ j/ G/ v1 _" L1 N; b4 m

点评

还是不明白计算出来的17H是怎么进行串口输出的,难道还要转一遍,把1和7再转成高四位和低四位二进制数字吗。不过明白了17H就是压缩BCD码了,只是那个算BCD码的算法是根据什么式子变得?我知道它是分别把个位和十位提  详情 回复 发表于 2019-4-18 11:22

该用户从未签到

5#
 楼主| 发表于 2019-4-18 11:22 | 只看该作者
helendcany 发表于 2019-4-18 11:134 A* Z- m: f, y2 ?2 a! L7 P6 ~, A9 k
附注:压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数 ...

: a. m0 ^' ^, V还是不明白计算出来的17H是怎么进行串口输出的,难道还要转一遍,把1和7再转成高四位和低四位二进制数字吗。不过明白了17H就是压缩BCD码了,只是那个算BCD码的算法是根据什么式子变得?我知道它是分别把个位和十位提出来,为什么最后个位还要加上十位乘16呢
: q: J$ M# a# c" B4 k# o9 x

点评

若DS1302输出的是BCD码,你要转成为十进制,则 unsigned char res BCD2HEX(unsigned char bcd) { unsigned char res; res = bcd/16 *10 +bcd%16; return res; }; 例如:BCD码17H,则它代表的是  详情 回复 发表于 2019-4-18 11:34

该用户从未签到

6#
发表于 2019-4-18 11:34 | 只看该作者
码农 发表于 2019-4-18 11:22
1 }- i8 m7 S& ^6 @5 t. C还是不明白计算出来的17H是怎么进行串口输出的,难道还要转一遍,把1和7再转成高四位和低四位二进制数字 ...
0 J, d( A" D1 P5 u8 {+ b
若DS1302输出的是BCD码,你要转成为十进制,则
0 Q* P5 L4 b7 c3 s/ j/ H, a0 {unsigned char res BCD2HEX(unsigned char bcd)
# M# X$ F; Q* V{
7 U/ s# c5 a" H) q* i+ e. y     unsigned char res;% Z" V( B& b; t. E9 p) Q$ i3 {
     res = bcd/16 *10 +bcd%16;
0 \3 [0 _! j& y2 {7 N+ q% S     return res;
5 j2 \3 v5 |/ X/ {+ \- J- X2 S};
# ?6 b5 z' C5 a  a3 \) a例如:BCD码17H,则它代表的是十进数17,而十进数17 = 11H;
- G- R9 G* h( V$ C! \! s( C2 v! N计算过程为:分离出17H的高四位(为1),低四为(为7),再1*10 +7 = 17 =11H: O8 ]$ h% Z: E: n

点评

说的太好了。  详情 回复 发表于 2019-4-19 09:52

该用户从未签到

8#
发表于 2019-4-19 09:52 | 只看该作者
helendcany 发表于 2019-4-18 11:34
# d  {  ~+ v- A- k若DS1302输出的是BCD码,你要转成为十进制,则. E/ l6 n# @' ?# O7 p, u( n* a8 n  a
unsigned char res BCD2HEX(unsigned char bcd)" C; h9 h6 I5 P2 e; [- S
{
( J4 \4 L( N: X1 T9 Y: I& }+ E5 I4 i
说的太好了。
+ N% j# t* g5 b* ?! g, n; S
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-24 01:17 , Processed in 0.125000 second(s), 31 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表