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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 码农 于 2019-4-18 10:19 编辑 7 }! J6 k2 j# N8 }8 ]5 o  w; j2 j
6 g2 S3 g6 ]% e# z! P9 ?9 A* q
DS1302真是麻烦啊,里面的bcd转换我看的头都大了4 k4 ^4 X) b: a" b% p

! j! q* j2 C; ~/ V正常不是把用户输出的十进制数据转为BCD码才能被DS1302识别吗<blockquote>/*------------------------------------------------
1 o/ {3 f; `: j8 i2 N, ]7 G3 y$ _) [4 P0 c
0 D% F. ~0 c/ Y9 K9 j, T0 b5 D
前面数组定义是5 k) K# x: s" `# A8 f
unsigned char time_buf1[8] = {20,15,11,6,20,59,00,5};//空年月日时分秒周4 [  h# Z) b& b6 p- Z5 ^2 s+ d- R
unsigned char time_buf[8] ;
: T" r) A, v1 v* d% ^+ b麻烦大家看一下这个函数吧,这个函数的功能应该就是把十进制的时间改为二进制然后写入DS1302  c* ?& t8 I( N& }$ T+ L/ T
所以注释的BCD码处理应该指的就是十进制转bcd码,可是安装这个算法完全算不出来BCD码,我们取i=1吧,那么就是% b6 |0 A( O: U. L1 ?! Y
                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码啊,还是我里面什么想错了?

, r# L2 Z4 D7 ]" i; C& E: q& @% k5 q0 T! v9 U# A

该用户从未签到

2#
发表于 2019-4-18 10:28 | 只看该作者
其实你程序应该是对的:15H = 21,所以15H转换为BCD码就是21H.$ f) M! U9 O) W3 @7 r( h1 `
) _$ |# \3 n4 O' l! X6 c0 B

, y* z0 L0 I& D+ I% F# K例如:11H要转换为BCD码,结果应该为11H = 17(十进制) ->17H(BCD码);
  {& k- d; A6 V9 f4 H所以,可以这么算:11H/10 =1;11H%10 = 7; BCD码等于1*16+7=17H。
5 u8 O' Z* C& U+ d/ T程序应该为7 B& i& G4 ?) x, I8 o. o, S: {
unsigned char Hex2BCD(unsigned char hex)
  o7 o$ V# i3 ~# y2 L( j/ t/ ]{' D2 T; ?% d# F
        unsigned char res;9 p1 H, i5 J9 K% `0 X9 X
        res = hex/10*16+hex%10;* {. G+ m$ D' P
        ruturn res;
* B( ?% [8 ~0 r# D" C6 X}

点评

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

该用户从未签到

3#
 楼主| 发表于 2019-4-18 10:34 | 只看该作者
helendcany 发表于 2019-4-18 10:28! f0 p4 p4 F! J& X5 W; V
其实你程序应该是对的:15H = 21,所以15H转换为BCD码就是21H.

4 y7 c2 u6 Y( a7 D: W- q+ P4 ]- SBCD码不是一个四位的二进制数字吗?17H是怎么表示BCD码?而且这个BCD码处理后是要串行输出的,单单17H是怎样串行输出的呢?一口气问了两句,还望解答
: q  E, J; b! X/ d

点评

附注:压缩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
* H1 Z) e( a. ]+ Q) pBCD码不是一个四位的二进制数字吗?17H是怎么表示BCD码?而且这个BCD码处理后是要串行输出的,单单17H是 ...

" m+ o8 i' i( F$ f' N2 a附注:压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001表示0~9.例如00001000B表示十进制数8.
- m1 f) Y6 ^) S; F$ r/ H- y

点评

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

该用户从未签到

5#
 楼主| 发表于 2019-4-18 11:22 | 只看该作者
helendcany 发表于 2019-4-18 11:138 O& c6 g5 {& z4 l6 C
附注:压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数 ...
% ~7 g# L2 ]: A) d; \
还是不明白计算出来的17H是怎么进行串口输出的,难道还要转一遍,把1和7再转成高四位和低四位二进制数字吗。不过明白了17H就是压缩BCD码了,只是那个算BCD码的算法是根据什么式子变得?我知道它是分别把个位和十位提出来,为什么最后个位还要加上十位乘16呢
9 E$ ~8 H$ Z: V2 T# M4 e

点评

若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
0 F7 Y0 ^; i* z2 o还是不明白计算出来的17H是怎么进行串口输出的,难道还要转一遍,把1和7再转成高四位和低四位二进制数字 ...
. x9 a  s/ @1 X* l7 U/ m7 r
若DS1302输出的是BCD码,你要转成为十进制,则9 _2 l- D# ]0 }" ]: H, K- H) r
unsigned char res BCD2HEX(unsigned char bcd)5 R) t1 u5 @  H) d# f) _
{; _5 V8 s3 w1 L! M
     unsigned char res;
. W2 J2 r, v1 |0 o  H" D  s% U& b     res = bcd/16 *10 +bcd%16;
9 w+ q' T* Q! }& [6 I$ b5 c     return res;% m( P# L' a  M" u* _: s% B$ w2 t
};7 ]; u. g0 T$ O: `
例如:BCD码17H,则它代表的是十进数17,而十进数17 = 11H;
9 c8 k# C( U: _  k( I' O/ E计算过程为:分离出17H的高四位(为1),低四为(为7),再1*10 +7 = 17 =11H
) G; S( I7 _6 M9 ]

点评

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

该用户从未签到

8#
发表于 2019-4-19 09:52 | 只看该作者
helendcany 发表于 2019-4-18 11:34
3 w2 i+ F# p$ r若DS1302输出的是BCD码,你要转成为十进制,则7 j. b6 D: ^# n( f4 z; @5 o
unsigned char res BCD2HEX(unsigned char bcd)
  v5 G) d' ^9 W& r5 Z( p  |( U: A. `{
4 Q; D/ \$ x2 y  y0 z  O! ^( R
说的太好了。# a' {7 m. I* Q# p( G/ P5 Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-23 03:19 , Processed in 0.093750 second(s), 31 queries , Gzip On.

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

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

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