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

news2024/11/26 4:44:29

目录

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)
        ;
    else
        decToBin(n);
    cout<<a;


参考资料:

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

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

十进制与BCD码转换的算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电源浪涌保护器的演化发展与未来创新方向

随着科学信息技术和城市经济的发展&#xff0c;感应雷、电磁脉冲和雷电波浸入所造成的危害大大增加。一般建筑物的外部防雷措施只能预防直击雷&#xff0c;而强大的电磁场产生的感应雷和脉冲电压却能潜入室内危及电路上的设备。如今通讯网络、电脑仪器和各类用电设备越来越精密…

2023VR视频加密解决方案

如今VR技术在各个领域中的使用&#xff0c;使得我们在日常生活中也可以看到它的身影&#xff0c;常见的就是应用到培训、影院和游戏当中&#xff0c;我们都知道VR视频比传统的平面视频能给用户带来更好的体验&#xff0c;而且现在在教育、娱乐等领域VR类视频也越来越多。相比于…

运动基元(二):贝塞尔曲线

贝塞尔曲线是我第一个深入接触并使用于路径规划的运动基元。N阶贝塞尔曲线具有很多优良的特性,例如端点性、N阶可导性、对称性、曲率连续性、凸包性、几何不变性、仿射不变性以及变差缩减性。本章主要介绍贝塞尔曲线用于运动基元时几个特别有用的特性。 一、贝塞尔曲线的定义 …

C++复习笔记4

编译器给一个类默认生成的六个成员函数&#xff1a; 构造函数、析构函数、拷贝构造函数、赋值运算符重载、对象取地址运算符以及常对象取地址运算符。其中析构函数不能重载&#xff0c;默认的拷贝和赋值两个函数存在浅拷贝的问题。 对象取地址运算符重载和常对象取地址运算符…

KD03丨选品种-横截面动量

大家好&#xff0c;今天我们分享可达鸭系列第3篇策略——横截面动量。 想必这种逻辑大家也都熟悉&#xff0c;为了照顾大部分新人朋友&#xff0c;开始还是简单介绍一下该该逻辑理论。 横截面是一种非时序动量逻辑&#xff0c;从统计学感性描述&#xff08;非严谨客观描述&am…

windows安装PaddleSpeech(无需visual studio)

前言 首先啊&#xff0c;狠狠的批评一下paddle&#xff0c;不想看请直接跳到用法&#xff0c;另外我python版本是3.9&#xff0c;所以包找的也都是3.9。 1.分成许多子项目涵盖AI的不同领域&#xff0c;初心是好&#xff0c;安装起来得安装多个环境。 2.官方文档推荐linux安装&…

anaconda详细介绍、安装及使用(python)

anaconda详细介绍、安装及使用1 介绍1.1 简介1.2 特点1.3 版本下载2 Anaconda管理Python包命令3 安装3.1 windows安装4 操作4.1 Conda 操作4.2 Anaconda Navigator 操作4.3 Spyder 操作4.4 Jupyter Notebook 操作5 示例参考1 介绍 1.1 简介 Anaconda是用于科学计算&#xff08…

力扣sql简单篇练习(十四)

力扣sql简单篇练习(十四) 1 银行账户概要|| 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 高于相当于大于的意思 SELECT u.name,t.balance FROM Users u INNER JOIN (SELECT account,sum(amount) balanceFROM TransactionsGROUP BY accountHAVIN…

Kafka入门(四)

下面尝试一下Kafka 的生产者客户端和消费者客户端的实现。 1、客户端简介 生产者就是负责向Kafka发送消息的应用程序&#xff0c;消费者就是拉取Kafka消息的应用程序。 在Kafka的历史版本中&#xff0c;主要的客户端如下&#xff1a; 基于Scala语言编写的客户端&#xff0c;称…

JAVA工具篇--3 maven项目转gradle项目

前言&#xff1a;将已有的Maven 项目转换为Gradle 项目&#xff1b; 1 项目转换&#xff1a; 1.1 winr 打开cmd命令窗口, 然后进入到maven项目根目录后&#xff0c;输入命令: gradle init --info --type pom1.2 选择构建的语言&#xff1a; 输入 1 然后回车&#xff1b; 1.3…

Rust编码的信息窃取恶意软件源代码公布,专家警告已被利用

黑客论坛上发布了一个 用Rust编码的信息窃取恶意软件源代码 &#xff0c;安全分析师警告&#xff0c;该恶意软件已被积极用于攻击。 该恶意软件的开发者称&#xff0c;仅用6个小时就开发完成&#xff0c;相当隐蔽&#xff0c; VirusTotal的检测率约为22% 。 恶意软件开发者在…

canal使用说明:MySQL、Redis实时数据同步

1. canal简介 canal是阿里开源的数据同步工具&#xff0c;基于bin log可以将数据库同步到其他各类数据库中&#xff0c;目标数据库支持mysql,postgresql,oracle,redis,MQ,ES等 canal分成服务端deployer和客户端adapter&#xff0c;我们可以部署多个&#xff0c;同时为了方便管…

AssertionError: 618 columns passed, passed data had 508 columns【已解决】

问题描述 程序中断&#xff0c;报错如下AssertionError: 618 columns passed, passed data had 508 columns Exception has occurred: ValueError 618 columns passed, passed data had 508 columns AssertionError: 618 columns passed, passed data had 508 columnsThe abo…

< CSDN周赛解析:第 27 期 >

CSDN周赛解析&#xff1a;第 27 期&#x1f449; 前言&#x1f449; 第一题&#xff1a; 幸运数字> 解析> 解决方案> 拓展知识&#x1f449; 第二题&#xff1a; 投篮> 解析> 解决方案&#x1f449; 第三题&#xff1a; 通货膨胀-x国货币> 解析> 解决方案…

数字展陈技术,让珍贵馆藏资源走出深闺

这篇文章来自于笔者2017年发表在《档案时空》第12期的一篇文章&#xff0c;原名为《数字展陈技术在档案展览中的应用》。 档案时空 时隔5年&#xff0c;数字视觉技术的发展突飞猛进&#xff0c;特别是这两年元宇宙浪潮席卷全球&#xff0c;VR/AR/MR技术的综合应用给受众带来非一…

【PyTorch】教程:对抗学习实例生成

ADVERSARIAL EXAMPLE GENERATION 研究推动 ML 模型变得更快、更准、更高效。设计和模型的安全性和鲁棒性经常被忽视&#xff0c;尤其是面对那些想愚弄模型故意对抗时。 本教程将提供您对 ML 模型的安全漏洞的认识&#xff0c;并将深入了解对抗性机器学习这一热门话题。在图像…

Java程序设计-ssm企业财务管理系统设计与实现

摘要系统设计系统实现开发环境&#xff1a;摘要 对于企业集来说,财务管理的地位很重要。随着计算机和网络在企业中的广泛应用&#xff0c;企业发展速度在不断加快&#xff0c;在这种市场竞争冲击下企业财务管理系统必须优先发展&#xff0c;这样才能保证在竞争中处于优势地位。…

from文件突然全部变为类cs右击无法显示设计界面

右击也不显示查看设计器 工程文件 .csproj中将 <Compile Include"OperatorWindows\Connection.cs" /> <Compile Include"OperatorWindows\Connection.Designer.cs"> <DependentUpon>Connection.cs</DependentUpon> &…

CV——day74 读论文:关注前景的anchor-free交通场景探测器

FII-CenterNet&#xff1a;关注前景的anchor-free交通场景探测器FII-CenterNetI. INTRODUCTIONII. RELATED WORKC. Detectors Exploiting Segmentation InformationIII. FII-CENTERNET APPROACHA. 前景区域建议网络(Foreground Region Proposal Network)1) 上分支提出前景区域2…

linux称手的终端管理器Zsh(Z shell)-图文安装超详细

linux默认的shell太low了&#xff0c;iTerm2在macOS系统简直堪称终端管理神器&#xff0c;有一款可以平替iTem2的linux开源软件 Zsh&#xff08;Z shell&#xff09; &#xff0c;Zsh 是一个为交互使用而设计的 shell 一&#xff1a;安装Zsh 1.yum安装zsh yum install zsh安装…