精华内容
下载资源
问答
  • 在高速发展的现代社会,计算机浩浩荡荡地成为了人们生活中不可缺少的一部分,帮助人们解决通信,联络,互动等各方面的问题。今天我就给大家讲讲与计算机有关的“进制转换”问题。
  • 基于单片机(AT89C51)的进制转换及进制计算器.rar
  • 单片机进制转换

    2008-05-03 04:58:42
    十/二进制,十/八进制,十/十六进制转换
  • 描述单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统...本文主要详解单片机进制及其转换以及单...

    描述

    单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。本文主要详解单片机的进制及其转换以及单片机中进制转换知识,具体的跟随小编来详细的了解一下。

    单片机的进制转换关系

    二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,如:8位二进制数:“00110101” ;c语言中表示为 0b00110101;

    十进制数是我们日常使用的计数方式,如245,21,23453。

    十六进制:逢16进1,用0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F表示,对应十进制数是:0,1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15。c语言中十六进制数前加“0x”表示,例如:十六进制:0x35 转换为二进制数为:00110101。

    2fa394575d3740afb05bed46ce9248ad.png

    单片机中进制转换知识

    1、如何把一个四字节的十六进制数转换为十进制数,十六进制数的格式低位在前,假设第一个字节位hex_buf[0],hex_buf[1],hex_buf[2],hex_buf[3]。

    方法:

    uint64 add_sum =0;

    sum += hex_buf[0];

    sum += hex_buf[1]《《8;

    sum += hex_buf[2]《《16;

    sum += hex_buf[3]《《24;

    即可得到四个字节十六进制数的十进制数。

    2、如何把一个十进制数转换为一个十六进制数。

    比如:123456789

    首先确认这个数需要用几个字节的十六进制数表示,比如一个字节可以表示的最大数ff也就255,两个字节0xff ff 也就是65535,三个字节可以表示的最大数0xff ff ff也就是‭16777215

    四个字节可表示的最大数是0xff ff ff ff也就是‬‭4294967295‬。由此可知123456789需要四个字节的十六进制数表示。则我们可以把123456789右移三个字节后与0xff相与即得到最高字节数,同理把123456789右移16位后与0xff相与得到第二个字节的十六进制数,同理把123456789右移8位与0xff相与得到第三个字节的十六进制数,最后再把123456789直接与0xff相与得到最后一字节的16进制数。

    df2a2ebbe3c5081db579b0c12331b099.png

    单片机的进制及其转换

    1、二进制数、十六进制数转换为十进制数(按权求和)

    二进制数、十六进制数转换为十进制数的规律是相同的。把二进制数(或十六进制数)按位权形式展开多项式和的形式,求其最后的和,就是其对应的|进制数 简称“按权求和”。例如:把(1001.01)2 二进制计算。

    解:(1001.01) 2 =8*1+4*0+2*0+ 1*1+0* (1/2)+1*(1/4)=8+0+0+1+0+0.25 =9. 25把(38A. 11)16转换为十进制数

    解:(.38A. 11)16 =3X16的2.次方+8X16的1次方+10X16的0次方+1X16的-1次方+1X16的-2.次方=768+128+10+0.0625+0.0039 =906. 0664

    2、十进制数转换为二进制数,十六进制数(除2/16取会法)

    整数转换。一个十进制整数转换为二进制整数通常采用除二取余法,即用2连续除十进制数,直到商为0,逆序排列余数即可得到-一简称除二取余法。例:将25转换为二进制数

    解:25六2=12余数1 12:2=6余数0 6+2=3余数0 3-2=1余数1 1=2=0余数1所以25=(11001)2

    同理,把十进制数转换为十六进制数时,将基数2转换成16就可以了。

    例:将25转换为十六进制数 解: 25号16=1 余数9 1=16=0余数1 所以25=(19)16

    3、二进制数与十六进制数之间的转换

    由吁4位二进制数恰好有16个组合状态,即1位十六进制数与4位二进制数是一一对应的。 所以,十六进制数与=二进制数的转换是十分简单的。

    (1)十六进制数转换成二进制数,只要将每一- ~位十六进制数用对应的4位二进制数替代即可一一简称位分四位。例:将(4AFSB)16转换为二进制数。解:4AF8B

    0100 1010 1111 1000 1011

    所以(4AF8B) 16=(1001010111110001011)2

    (2)二进制数转换为十六进制数,从低位向高位每四位一组,依次写出每组4位二进制数所对应的十六进制数一一简称四位合一位。

    例:将二进制数(0001 1101 0110)2 转换为十六进制数。解: 0001 1101 01101D6

    所以(111010110)2= (1D6) 16

    转换时注意最后一组不足4位时必须加0补齐4位

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • 基于单片机(AT89C51)的进制转换及进制计算器 闲来无事,用手头51单片机做个进制计算器 成品功能:能实现十进制带负数、带小数点的加减乘除,不同进制之间的转换,同一进制之间的加减乘。 材料 AT89C51开发板要带4x...

    基于单片机(AT89C51)的进制转换及进制计算器

    闲来无事,用手头51单片机做个进制计算器

    成品功能:能实现十进制带负数、带小数点的加减乘除,不同进制之间的转换,同一进制之间的加减乘。


    材料

    • AT89C51开发板要带4x4矩阵按键,再带8个独立按键才够用
    • 用LCD18650显示
    • 杜邦线
    • 用keil4进行开发

    开始制作。

    制作过程

    思考过程

    首先要考虑的就是按键数量了:

    1. 十进制的加减乘除带符号和小数需要:0~9十个按键 + 加减乘除四个按键 + 加小数点符号两个按键 = 共16个按键。
    2. 不同进制之间转换需要:0~F十六个按键 + 2 8 10 16进制四个按键 = 共20个按键
    3. 进制之间加减乘需要:0~F十六个按键 + 2 8 10 16进制四个按键+ 加减乘三个按键 = 共23个按键
      这些还不算上回撤键和模式选择等按键。所以设计的时候必须考虑好按键。

    我就得出来如下方案:

    1. 用独立按键做为模式选择:三个按键,选择模式之后不能返回,如果要返回可以用复位键。这样几个功能之间相互不联系,没有影响,按键就够用了。
    2. 然后十进制的加减乘除带符号和小数:用4x4按键做出来键盘既789+ 456- 123* 退格0=/ 用两个独立按键做小数点和符号按键。
    3. 不同进制之间转换:4x4按键做0~F既0123 4567 89AB CDEF,独立按键四个做进制选择既 2 8 10 16进制。
    4. 进制之间加减乘 :4x4按键做0~F既0123 4567 89AB CDEF,独立按键四个做进制选择既 2 8 10 16进制,独立按键四个做加减乘。

    硬件部分

    直接放图硬件链接
    如图所示连接P1接矩阵按键,P3接独立按键。

    十进制的加减乘除带符号和小数

    这里矩阵按键和独立按键怎么测值就不说了。

    整数部分的加减乘除

    1. 将输入的数字连接起来,比如输入5、6,要连接成五十六,方法就是输入5存起来,再输入6,将存起来的数乘10再加上6存起来既五十加六,再输入7,再将存起来的数乘10再加上7存起来既五百六十加七。这样就将数字串起来了。
    2. 按符号之前和按符号之后分别存到不同的变量中。
    3. 当你按下等号之后,再去区别按下的符号是什么,让两次存的数做运算。

    代码如下:

    if(fuhao==1)//加
    {
    	sprintf(Disp,"%-6.3f",a_l+b_l);	//将结果存在数组中方便显示
    									//spintf将右边的字符串到左边数组中
    									//%-6.3f为占位符既(1)表示靠左6位保留三位小数的浮点数
    	lcdwrd_string(Disp,6);	//显示					
    }
    if(fuhao==2)//减
    {
    	sprintf(Disp,"%-6.3f",a_l-b_l);
    	lcdwrd_string(Disp,6);						
    }
    if(fuhao==3)//乘
    {
    	sprintf(Disp,"%-9.4f",a_l*b_l);
    	lcdwrd_string(Disp,9);						
    }
    if(fuhao==4)//除
    {
    	sprintf(Disp,"%-9.4f",a_l/b_l);
    	lcdwrd_string(Disp,9);						
    }
    

    这里直接显示运算结果,就避免了运算过程中产生的小数(两数相除)等数据类型问题。

    负数问题

    1. 负数问题分情况来分析
    2. 如果两个数相加,都是负号的话结果也有负号,都没有负号的话结果也没有负号;一正一负的话哪个数大结结果的符号就是哪个。
    3. 两个数相减类似两个数相加。
    4. 两个数相乘,看有奇数个还是偶数个负号,奇数个的话结果是负数,偶数个的话结果是正数。
    5. 两数相除类似两数相乘。

    小数问题

    有小数点的话,我解决的方法是按完小数点之后记录小数点之后有几位,计算结果之前,让存起来的数乘0.1的多少次方。比如输入的3.1415,小数点之后有四位,存起来的数就是31415再四个0.1。

    代码如下:

    if(fhao_a==1){a_l = a*pow(0.1,a_wei)*(-1);}	 //将结果保存到double精度的数中
    											 //有几位小数的话要乘0.1的几次方
    											 //负数的话要成-1
    else {a_l = a*pow(0.1,a_wei);}						
    if(fhao_b==1){b_l = b*pow(0.1,b_wei)*(-1);}
    else {b_l = b*pow(0.1,b_wei);}
    

    部分效果如图。
    加法
    乘法
    这样十进制的加减乘除带符号和小数的问题就基本解决完了。

    进制转换

    思想

    1. 先将输入的数转换成十进制存起来。
    2. 然后再按照要求输出不同进制的数。
    3. 不同进制转10进制按权取数,比如:八进制的76,既6x8^0 +7x8^1 = 62。
      例如二进制的代码:fhao_a = fhao_a*2 + k;
    4. 10进制转不同进制除进制取余,比如:十进制62转八进制,62除8=7余数6,7除8=0余7,结果反过来写就是76。
      例如二进制的代码:
      while(biao!=0) //一位一位显示
      {
      lcdwrd(0x30+biao%2);
      biao=biao/2;
      }
    5. http://c.biancheng.net/view/142.html 可以参考这个网址。
    6. 显示要将数倒过来显示,正好可以从右向左。
      部分效果如图:
      八进制转十六进制
      八进制转十六进制
      八进制转二进制
      在这里插入图片描述
      十六进制转十进制
      在这里插入图片描述
      这样进制转换问题就基本解决完了。

    同一进制之间加减乘

    为啥不做除呐,因为按键不够。一除就会出现小数,没想明白怎么表示。

    思想还是以十进制保存,然后再做运算,再转化为相应进制的数输出。按键不够用所以没法做不同进制之间的运算。

    效果如图所示:
    十六进制减
    在这里插入图片描述
    二进制加
    在这里插入图片描述

    最后附上完整的项目文件。自行下载。
    https://download.csdn.net/download/weixin_42320020/16593760

    这个项目到这里就算完了。
    还有很多不足的地方,希望大佬可以指正。也希望和爱好者交流学习。


    大家有想法可以私信或者留言,博主有时间会帮大家做一些项目。

    禁止转载!!!
    QQ:2039723308
    VX:Shiboven

    展开全文
  • 51单片机实现2、8、10、16进制转换
  • 定时器/计数器的应用,时间初值的计算。 色环电阻的读取。 波特率的计算。 字模的提取。
  • 本文主要讲了单片机进制转十进制程序代码,希望对你的学习有所帮助。
  • 单片机入门之三种进制转换

    千次阅读 2021-05-26 02:59:11
    单片机使用的两大进制表示形式:十进制和十六进制。(这里使用十进制的数据)(这里使用十六进制的数据)十进制一般用于运算,表示形式就是直接写,例如上面的1701。十六进制一般用于配置单片机的寄存器,表示形式是在...

    单片机使用的两大进制表示形式:十进制和十六进制。

    21c4295e20342d92130270b449877d1d.gif

    (这里使用十进制的数据)

    de3ee8d246c885db0aec15e5fcaeaa73.gif

    (这里使用十六进制的数据)

    十进制一般用于运算,表示形式就是直接写,例如上面的1701。

    十六进制一般用于配置单片机的寄存器,表示形式是在数字前面加0x,例如上面的0xC0 0XD0。也就是说,当你看单片机程序遇到0x开头的数据,就是表示十六进制数据。

    单片机的寄存器有8位、16位和32位,也就是1个字节、2个字节和4个字节。既然设计到位,那肯定需要二进制的表示。二进制表示数据,非0即1,寄存器中的每一位,也是非0即1,根据寄存器的不同,它的每一位代表的功能不同,例如,把某个寄存器的某个位写1,就开启中断,写0,就关闭中断。看到这里,你就明白些了吧,原来就是这样控制单片机的寄存器。

    就像上面说的,配置寄存器,我们一般用十六进制,那么这个十六进制怎么和二进制换算呢?这里就需要用到BCD码了。

    BCD码就是8421,它是按照二进制的位置表示的,8421是代表4个位,一个字节8个位,就需要2个8421。如下图所示:

    0ff9cd5be0477c4486f428e91f5a2edf.gif

    第一行表示BCD码,第二行表示一个字节,也就是一个8位的寄存器。

    如何用BCD码把二进制写成十六进制?

    例如一个二进制数据如下:

    5b9ff533ec52b2b787fbcb6ed97021df.gif

    如上图,二进制码是:10001010,转换成十六进制是0x8A。

    这个是怎么得到的?

    看左边的四个位,把有1的上边的8421加起来,上图中,左边四个位只有8下面有1,所以和就是8。

    看右边的四个位,把有1的上边的8421加起来,上图中,右边四个位的8和2下面是1,所以把8+2就等于10,十六进制的10就是A。

    所以上面的10001010转换成十六进制是0x8A。

    再来一个例子,二进制01101100转换成十六进制是0x6C。(这个你自己按照前面的方法算一下,如果算出来和我的结果一样,那恭喜你,你学会了)

    十六进制基础:

    73186402f14e704d3cc50943f25c51ae.gif

    另外,学单片机会经常使用WINDOWS自带的“计算器”,进行进制的转换。

    a2abc24dea832388287a704fe20709c3.gif

    我已经把这篇文章做成PDF了,你可以下载到你的电脑永久保存了:

    单片机入门之进制转换(点击下载或者右键另存为下载)

    展开全文
  • 本文主要讲了单片机16进制转10进制数,下面一起来学习一下
  • 这是个不错的资源,希望和大家一起分享分享
  • 单片机进制转换知识

    千次阅读 2016-12-07 15:53:02
    1.如何把一个四字节的十六进制转换为十进制数,十六进制数的格式低位在前,假设第一个字节位hex_buf[0],hex_buf[1],hex_buf[2],hex_buf[3]。 方法: uint64 add_sum =0; sum += hex_buf[0]; sum += hex_buf...

    1.如何把一个四字节的十六进制数转换为十进制数,十六进制数的格式低位在前,假设第一个字节位hex_buf[0],hex_buf[1],hex_buf[2],hex_buf[3]。

    方法:


    uint64 add_sum =0;


    sum += hex_buf[0];

    sum += hex_buf[1]<<8;

    sum += hex_buf[2]<<16;

    sum += hex_buf[3]<<24;

    即可得到四个字节十六进制数的十进制数。


    2.如何把一个十进制数转换为一个十六进制数。

    比如:123456789

    首先确认这个数需要用几个字节的十六进制数表示,比如一个字节可以表示的最大数ff也就255,两个字节0xff ff 也就是65535,三个字节可以表示的最大数0xff ff ff也就是‭16777215

    四个字节可表示的最大数是0xff ff ff ff也就是‬‭4294967295‬。由此可知123456789需要四个字节的十六进制数表示。则我们可以把123456789右移三个字节后与0xff相与即得到最高字节数,同理把123456789右移16位后与0xff相与得到第二个字节的十六进制数,同理把123456789右移8位与0xff相与得到第三个字节的十六进制数,最后再把123456789直接与0xff相与得到最后一字节的16进制数。

    展开全文
  • 单片机开发工具集 在单片机开发过程中,经常会需要配置寄存器的情况,
  • 51单片机整数二一十进制转换的快速算法、电子技术,开发板制作交流
  • 单片机中数码管的十六进制转换

    千次阅读 2021-06-03 11:04:43
    这就不得不说起共阴极与共阳极的概念 这里为了方便我先放上共阴极与共阳极的两个数码管显示十六进制编码的对照表 共阳极对照表 数字 十六进制编码 数字 十六进制编码 0 0x03 8 0x01 1 0x9f 9 0x09 2 0x25 A 0x11 3 ...
  • 单片机问题: 数组 a = {11 22 33 44}; 如何组合成:0x11223344 并转换成10进制数。 平台无法使用多个0x来表示16进制数,请见谅!
  • 进制转换程序设计 微机原理 汇编 课程设计 1、程序实现二进制、十进制、十六进制之间的转换 2、在命令提示下输入相应进制数,回车后进行转换 3、输入错误时应声响报警并拒绝输入
  • 一、十进制转换为二进制 十进制转二进制,可分为整数转二进制,和小数转二进制 整数转二进制 采用"除2取余,逆序排列"法: 1.首先用2整除一个十进制整数,得到一个商和余数 2.然后再用2去除得到的商,又会得到一个商...
  • 在学习51单片机的过程中,无论是让发光管亮还是数码管亮,都会用到很平常的十六进制0x表示,这个exe就简单解决这个问题,将低电平0高电平1表示的8位二进制代码转换位十六进制,方便快捷
  • 单片机常用辅助开发工具大集合(包括定时器,串口,进制转换,LCD编码等十几个小工具)
  • 满意答案sunzhaoming2013.07.06采纳率:41%等级:12已帮助:8866人//*********************************************************************/// 函数名称:void Htod(ulong L)// 将int型二进制数 L 转换为单字节...
  • 比如说进制转换,在开发板上做依次点亮LED灯时,就要对端口进行操作。然后利用一些函数和循环实现依次闪烁。可电脑并不会识别二进制,必须化为十六进制。例如,1111 1101 对应的十六进制是多少?如果用手算,能算...
  • 浮点数与十六进制互相转换,可提供编程人员方便。工控编程用外效多
  • C++任意进制转换

    2014-12-04 09:54:46
    我的其他资源都是免费的,是对于c语言初学者的帮助比较大的,其中有单片机,ARM,数据结构,window编程,MFC编程,自己编写的小游戏。
  • 进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,如:8位二进制数:“00110101”;c语言中表示为 0b00110101;十进制数是我们日常使用的计数方式,如245,21...
  • 2. 由于本作品做的是单字节有符号数的十六进制、十进制、二进制之间的相互转换,所以可以进行正负数之间的相互转换。 3. 在输入状态下,如果输错了一位,可以将此位删除,重新输入。 4. 可以实现三种进制之间的无限...
  • 32位浮点数转换十六进制数,一个四字节十六进制数可按四种顺序转换成32位浮点数,方便串口通讯时的数据正误预判。
  • 初学单片机的几个简单程序,如2进制转换为10进制的汇编程序,(汇编程序)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,628
精华内容 5,051
关键字:

单片机进制转换