【C语言】BCD码、十进制互相转换

article/2025/10/26 8:41:30

目录

0. 前言:

1. BCD码

2. 算法原理

3. 进制转换

3.1 两位BCD码的转换:

3.2 其他进制转换

3.3 任意进制转二进制

参考资料:


0. 前言:

记录今天用15单片机写DS1302时钟芯片程序的时候遇到的问题

时间显示是这个样的 0 1 2 3 4 5 6 7 8 9 16
9之后突变成16了,没有数据10...11...

why?

读取DS1302时钟芯片的数据是BCD码,需要将BCD码转换成十进制显示

写入数据的时候需要十进制转BCD码

这BCD码,真让人头大


1. BCD码

主要学习什么是BCD码,以及二进制、八进制、十进制、十六进制之间的相互转换

BCD码就是以四位二进制数为一个单位来表示相应的十进制数,因此4位二进制数表示最大的十进制数9(1001),只取十六个数中的十个数。

如下图:

最后一列是BCD码的十进制表示形式,将BCD码按8421法相加即得出最后一栏的数值

图中可以看到0-9位 几个进制的BCD码都是以二进制的正常形式换算,从十开始的BCD码开始不一样了起来。

BCD码:用4位二进制数来表示1位十进制数。   逢九进一

例如:十进制数10的BCD码为0001 0000;
显而易见前四位的 0001 表示的是十进制的十位,0000则就是个位了。十六进制转BCD码也是同理。

例:0001 011(BCD码) 表示13(十进制), 1000 0101(BCD码) 表示85(十进制),0000 1010不合法


2. 算法原理


十进制是逢十进一,而十六进制是逢十六进一,它们之间的每次进位差,所以一个十进制数要转换成BCD码,要先算清多进位的位数,比如,十进制进位了次,每次进位和十六进制进位相比差,所以一共差了,即(BCD)。BCD码转化成十进制码也一样。

static uint8_t BCD2DEC(uint8_t bcd)  
{  return (bcd-(bcd>>4)*6);
}  static uint8_t DEC2BCD(uint8_t dec)  
{  return (dec+(dec/10)*6);
} 

这里不太懂……


3. 进制转换

3.1 两位BCD码的转换:

BCD码转十进制:DEC = BCD / 16 * 10  +  BCD % 16 ;

详解:先将BCD的前一位提出BCD/16,再提出BCD后一位BCD%16。最后将两位数整合转换成十进制。多位BCD码同理。

十进制转BCD码:BCD = DEC / 10 * 16 + DEC % 10 ;同上分别提出高低两位,做BCD转换。

实际应用举例

void DS1302_SetTime(void)
{DS1302_WriteByte(DS1302_WP, 0x00);//解除芯片写保护DS1302_WriteByte(DS1302_YEAR,   DS1302_Time[0]/10*16+DS1302_Time[0]%10);//十进制转BCD码DS1302_WriteByte(DS1302_MONTH,  DS1302_Time[1]/10*16+DS1302_Time[1]%10);	DS1302_WriteByte(DS1302_DATE,   DS1302_Time[2]/10*16+DS1302_Time[2]%10);DS1302_WriteByte(DS1302_HOUR,   DS1302_Time[3]/10*16+DS1302_Time[3]%10);DS1302_WriteByte(DS1302_MINTUE, DS1302_Time[4]/10*16+DS1302_Time[4]%10);DS1302_WriteByte(DS1302_SECOND, DS1302_Time[5]/10*16+DS1302_Time[5]%10);DS1302_WriteByte(DS1302_DAY,    DS1302_Time[6]/10*16+DS1302_Time[6]%10);	//星期DS1302_WriteByte(DS1302_WP, 0x80);//此句WP给0x80,打开芯片写保护
}void DS1302_ReadTime(void) //此函数读取时钟芯片的数据,写到数组DS1302_Time里
{unsigned char Temp;Temp = DS1302_ReadByte(DS1302_YEAR);//读BCD码DS1302_Time[0] = Temp/16*10+Temp%16;	Temp = DS1302_ReadByte(DS1302_MONTH);//月DS1302_Time[1] = Temp/16*10+Temp%16;Temp = DS1302_ReadByte(DS1302_DATE);DS1302_Time[2] = Temp/16*10+Temp%16;Temp = DS1302_ReadByte(DS1302_HOUR);DS1302_Time[3] = Temp/16*10+Temp%16;Temp = DS1302_ReadByte(DS1302_MINTUE);DS1302_Time[4] = Temp/16*10+Temp%16;Temp = DS1302_ReadByte(DS1302_SECOND);DS1302_Time[5] = Temp/16*10+Temp%16;Temp = DS1302_ReadByte(DS1302_DAY);DS1302_Time[6] = Temp/16*10+Temp%16;
}

3.2 其他进制转换

二进制 转 十进制

1110 = 1 * 2^3 + 1 * 2^2 + 1 * 2^1 + 0 * 2^0 

八进制 转 十进制

36=  3 * 8^1 + 6 * 8^0  

十六进制转十进制

0110 = 0 * 16^3 + 1 * 16^2 + 1 * 16^1 + 0 * 16^0 

十六进制转二进制转十进制

0x11 = 0001 0001 >>> 0 * 2^7 .... + 1 * 2^4 + 0 + 1 * 2^0

3.3 任意进制转二进制

//递归
void decToBin(int n)
{int a;a = n%2;n /= 2;if(n==0);elsedecToBin(n);cout<<a;


参考资料:

 BCD码以及各进制之间的相互转换

C语言:十进制、BCD码互换

十进制与BCD码转换的算法


http://chatgpt.dhexx.cn/article/CcSfgwUM.shtml

相关文章

什么是 BCD(二进制编码的十进制)

BCD 是一位十进制数&#xff0c;由代表 0 到 9 的四位二进制数字表示。 当寄存器值以十六进制表示时&#xff0c;可以原样读取为十进制数&#xff0c;这对于处理十进制数的函数来说非常方便。 二进制数的 4 位可以表示为 0 到 15&#xff0c;但只有低 10 位被视为有效数字。 …

十进制转8421_BCD码

目录 一、BCD码简介 二、十进制转8421BCD码转换思路 三、程序编写 四、仿真验证 总结 一、BCD码简介 BCD码&#xff08;Binary-Coded Decimal‎&#xff09;&#xff0c;用4位二进制数来表示1位十进制数中的0~9这10个数码&#xff0c;是一种二进制的数字编码形式&#xff0c;常…

十进制数转换BCD码

有必要仔细阐述这一节&#xff0c;目前就是用在数码管显示&#xff0c;在单片机使用时&#xff0c;我们通常是将十进制数字进行/和%运算&#xff0c;得到每个位置的十进制数字&#xff0c;在这里可能是为了节省使用存储器的量&#xff0c;运用的是加三移位法具体其实就是将每个…

C语言:十进制、BCD码互换

目录 1、复杂版 2、简易版 最近写单片机 RTC 日期、时间配置&#xff0c;需要实现十进制、BCD码互换&#xff0c;将示例Demo分享给各位朋友&#xff1a; BCD是指用二进制来表示十进制数的编码&#xff0c;即&#xff1a;用4位二进制来表示一位十进制数&#xff0c;因此4位二进…

BCD码转化为十进制数

2019独角兽企业重金招聘Python工程师标准>>> 什么是BCD码&#xff1a;用4位二进制数来标识十进制数中的0-9这十个数的编码形式&#xff0c;简称为BCD码。BCD码优点&#xff1a;这种编码形式使二进制和十进制之间的转换能够快捷进行。采用BCD码&#xff0c;既可保存数…

BCD码以及各进制之间的相互转换

目录 前言 一、BCD码 二、进制互转 1、任意进制转十进制&#xff1a;系数X基数 ^ 权值&#xff08;累加&#xff09; 2、任意进制转二进制 前言 主要学习什么是BCD码&#xff0c;以及二进制、八进制、十进制、十六进制之间的相互转换 一、BCD码 BCD码就是以四位二进制数为一…

BCD码与十进制数间转换

一、前言&#xff1a; 这几天在项目协议对接的时候有一部分功能是获取系统时间功能与校时功能。小马哥获取到时间后打印了一下 2020-5-26 20:06:32&#xff0c;一看时间是对的&#xff0c;然后美滋滋的组装协议发送平台测试了。测试的时候发现月、日、时分秒数据都正常&#x…

黑马Python笔记3

输入时&#xff0c;占位符在引号里面&#xff0c;而要接受的变量在引号外面eg:"…%d"%player) expected an indented block&#xff1a;缩进错误。if对缩进有要求&#xff0c;python对缩进要求严格 if表判断 双等号一定要记住&#xff01;&#xff01;&#xff01; i…

2021-03-30 黑马Python学习笔记

操作系统OS&#xff08;Operation System&#xff09; 操作系统作用 1、直接操作硬件 2、把操作硬件的代码封装成系统调用&#xff0c;供其他成员间接操作硬件 没有安装操作系统的计算机被称为裸机 如果想在裸机上运行程序&#xff0c;必须用机器语言书写程序 如果计算机上…

黑马python在线培训

过去的2017年这一年&#xff0c;Python 开发者在全球快速增长&#xff0c;国内小伙伴学习 Python 的热情一路高涨。同时&#xff0c;Python 成为大量开发者推荐的入门编程语言和第二编程语言。2017年12月&#xff0c;Python 在 TIOBE 全球编程语言年度排行榜上升至第四&#xf…

黑马python培训安排

在分享资源之前&#xff0c;大家可以先想清楚未来的职业发展方向。毕竟只有找到未来职业发展方向&#xff0c;才更清楚当下重点学习的内容。 根据上图我们基本上一目了然&#xff0c;找到自己未来要发展的方向。在找到之后可以在各个招聘app上了解一下相关岗位的技能要求是什么…

[学习笔记]黑马程序员python教程

文章目录 思维导图Python基础知识图谱面向对象SQL入门和实战Python高阶技巧 第一阶段第九章&#xff1a;Python异常、模块与包1.9.1异常的捕获1.9.1.1 为什么要捕获异常1.9.1.2 捕获常规的异常1.9.1.3 捕获指定的异常1.9.1.4 捕获多个异常1.9.1.5 捕获全部异常1.9.1.6 异常的el…

黑马python6.0培训视频

关于对Python有一些了解的同学&#xff0c;肯定都会说Python语法简洁适合新手&#xff0c;便于阅读等这些方面。实际上是这样的&#xff0c;很多国内计算机专业都是C语言作为第一门学习的语言&#xff0c;很多国外的却是Python入门。因为Python可以让你在短时间内找到成就感&am…

黑马 Python 数据结构与算法第一章

背景知识 1.数组是一种线性表结构&#xff0c;其用一块连续的内存空间&#xff0c;来存储一组具有相同类型的数据&#xff1b; 2.时间复杂度&#xff0c;也叫做渐进时间复杂度&#xff0c;通常用大O公式书写&#xff0c;表示代码的执行时间随数据规模增长的变化趋势&#xff0c…

黑马程序员 python 数据分析 代码_2020年最新版 5.0程序员 黑马python人工智能数据分析机器学习软件测试全栈开发...

阶段一: 5.0课程资料 收起 第一章: 1-Python基础语法v5.0 第二章: 2-面向对象编程v5.0 第三章: 3-linux命令v5.0 第四章: 4-多任务编程v5.0 第五章: 5-web服务器v5.0 第六章: 6-web前端开发基础v5.0 第七章: 7-MySQL数据库v5.0 第八章: 8-mini-web框架v5.0 第九章: 9-django框架…

黑马python培训视频网盘下载

前几天看到朋友老周发了个朋友圈&#xff0c;我心态立马炸了&#xff1a; 好家伙&#xff01;竟然有钱入手五位数的最新款手机&#xff0c;这也太酸了吧&#xff01; 可他不是整天哭穷么&#xff0c;哪来这么多钱&#xff1f;我的内心充满了疑惑。 趁着昨天他来我家&#xff0c…

上海黑马python培训

过去的2017年这一年&#xff0c;Python 开发者在全球快速增长&#xff0c;国内小伙伴学习 Python 的热情一路高涨。同时&#xff0c;Python 成为大量开发者推荐的入门编程语言和第二编程语言。2017年12月&#xff0c;Python 在 TIOBE 全球编程语言年度排行榜上升至第四&#xf…

黑马Python笔记4

命名的时候宜严格按照要求&#xff0c;不易出现空格宜使用_ 调用函数时&#xff0c;创建新项目的时候选择新窗口&#xff0c;否则出错。 定义函数的格式 def 函数名&#xff08;&#xff09;&#xff1a;函数的命名字母数字下划线 … 调用函数:函数名&#xff08;&#xff09; …

python黑马学习

python的自述 能做什么 1.抢火车票 2.数据分析 3.开发网站 4.开发游戏 发展定位 web全栈开发方向 掌握技术 前端开发 数据库管理 后台框架 职业方向 web全栈开发工程师 数据科学方向 人工智能方向&#xff0c;机器学习 人工智能方向&#xff0c;深度学习 等等…

黑马程序员最新Python教程——第一阶段(1)

黑马程序员最新Python教程——第一阶段&#xff08;1&#xff09; Python导学 第一阶段——第一章01-初识Python02-什么是编程语言03-Python环境安装04-Python环境安装&#xff08;macOS&#xff09;05-Python环境安装&#xff08;Linux&#xff09;06-第一个Python程序-Hello …