智能仪表多字节二进制数转换BCD码
- 格式:pdf
- 大小:85.20 KB
- 文档页数:2
1.在片内RAM 30H单元有-个8位二进制数,将其转换成压缩BCD码,存于片内RAM 41H(高位)40H(低位)中。
方法:2^8=256,所以8位二进制A<=256,A/100商是百位数,存放到41h单元,余数再除以10,再得商是10位数,高低位互换,) ORG 0100HSTART:MOV A,30H ;取来8位二进制数MOV B,#100DIV AB ;除以100MOV 41H,A ;商是百位数,存放到41h单元MOV A,B ;取回余数MOV B,#10DIV AB ;再除以10SWAP A ;商是10位数,高低位互换ORL A,BMOV 40H,A ;将十位数与个位位数存入40hSJMP $END2.一个字节(8位)BCD码转换为二进制数(方法:先将高半字节乘以10,再加上低半字节)设待转换的BCD码存放于R2中DTOB:MOV A,R2ANL A,#0F0HSWAP AMOV B,#0AHMUL ABMOV R3,AMOV A,R2ANL A,#0FHADD A,R3RET3.二进制数转换为ASCII码设(30H)=4BH,将高4位的ASCII码放在31H单元,低4位的ASCII码放在32H单元,程序具有通用性,向入口参数30H存入任何数,都能将其变成相应的ISCII 码.ORG 0000HLJMP MAINORG 0030HMAIN:MOV SP,#60HMOV 30H,#4BHMOV R2,30HMOV A,R2ANL A,#0FHCJNE A,#0AH,NEQNEQ: JC LOOPADD A,#37HJMP LOOP3LOOP:ADD A,#30HLOOP3:MOV 31H,AMOV A,R2SWAP AANL A,#0FHCJNE A,#0AH,NE1NE1: JC LOOP1ADD A,#37HJMP LOOP4LOOP1:ADD A,#30HLOOP4:MOV 32H,AA1: SJMP A1END4.已知R0的低半个字节为一个四位的二进制数,要求将其转换为ASCAII码后送回R0中。
⼆进制转BCD码应⽤:⽤fpga实现对数码管显⽰,以前通常的⽅法是进⾏整除和取余进⾏运算,但是fpga并不擅长乘法除法运算,所以可以⽤BCD码来转换。
BCD码:通俗的可以理解为⽤四位⼆进制数表⽰⼀位⼗进制数字。
例如,256就可以⽤bcd码表⽰为:0010_1001_0110因此在数码管显⽰中,也就是把256各位分出来,就可以⽤bcd码来表⽰,下⾯说⼀种⼆进制转换bcd码的⽅法。
加3移位法:bcd码中只有0~9⼗进制数,但是在四位⼆进制中是16进制进1,因此在移位过程中要对⼆进制进⾏判断,当在移位之后的状态Qn+1⼤于9,要对Qn加6才可以。
例如1000移位⼤于9加6为0001_0110,对应bcd码中的1我们也可以在移位之前进⾏判断,如果移位之前的Qn数据⼤于4,说明Qn+1会溢出,所以可以+3再进⾏移位,例如1000⼤于4,加3为1011然后再进⾏移位0001_0110,16和刚才结果是⼀样的。
简单的说,判断的⽬的是防⽌下⼀次移位,发⽣数据溢出的情况思路:代码可以总结为三个部分:移位,加⼆进制数,判断(最后⼀次不需要判断)例如15 --- 1111(1)移位 0000_0000 加 0000_0001 判断 0000_0001(2)移位 0000_0010 加 0000_0011 判断 0000_0011(3)移位 0000_0110 加 0000_0111 判断 0000_1010(4)移位 0001_0100 加 0001_0101/*********************************功能:实现对6位⼗进制数以内的bcd码转换time: 2017/4/29vision:1.0*********************************/`define data_in_num 19`define data_bcd_num 23module pro_bcd(clk,rst_n,data_in,data_bcd);input clk;input rst_n;input [`data_in_num :0] data_in;output [`data_bcd_num:0] data_bcd; reg [`data_bcd_num:0] data_bcd_r;reg [1:0] state;reg [5:0] shift_cn if(!rst_n)begindata_bcd_r <= 0;state <= 0;shift_cnt <= 0;endelsecase(state)2'd0:beginshift_cnt <= 0;data_bcd_r <= 0;state <= state + 1;end2'd1:begin //移位if(shift_cnt < `data_in_num + 1)begin data_bcd_r <= data_bcd_r<<1;shift_cnt <= shift_cnt + 1;state <= state + 1;endelse state <= 0;end2'd2:begin //相加data_bcd_r <= data_bcd_r + data_in[`data_in_num + 1 - shift_cnt];state <= state + 1;end2'd3:begin //判断if(data_bcd_r[3:0] > 4 ) //1data_bcd_r <= data_bcd_r + 3;if(data_bcd_r[7:4]>4) //2data_bcd_r[7:4] <= data_bcd_r[7:4] + 3;if(data_bcd_r[11:8]>4) //3data_bcd_r[11:8] <= data_bcd_r[11:8] + 3;if(data_bcd_r[15:12]>4) //4data_bcd_r[15:12] <= data_bcd_r[15:12] + 3;if(data_bcd_r[19:16]>4) //5data_bcd_r[19:16] <= data_bcd_r[19:16] + 3;if(data_bcd_r[`data_bcd_num:20]>4) //6data_bcd_r[`data_bcd_num:20] <= data_bcd_r[`data_bcd_num:20] + 3;state <= 1;enddefault:state <= 0;endcaseassign data_bcd = (state == 3)&&(shift_cnt == `data_in_num + 1) ? data_bcd_r : data_bcd;endmodule。
实验二二进制码转换为BCD码一、实验目的1、掌握数码转换基本方法,加深对数码的理解。
2、用于十进制BCD码显示。
二、实验内容将AX的内容转换为十进制BCD码。
三、实验程序框图四、实验步骤脱机模式:(1)在P.态,按SCAL键,输入2CE0,按EXEC键。
(2)复位RST键,由于AX中给定数为0FFFF,查看BCD码结果保留在4100H~4104H 单元中,故其值应为06、05、05、03、05。
联机模式:(1)在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开8kAsm文件夹,点击S2.ASM 文件,单击“确定”即可装入源文件,再单击工具栏中编译,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“连续运行”或工具图标运行,即开始运行程序。
(2)复位“系统复位”键,由于AX中给定数为0FFFF,查看BCD码结果保留在4100H~4104H单元中,故其值应为06、05、05、03、05。
注:操作过程参照“实验一二进制多位加法运算”。
五、实验程序清单X:\DICE-8086K3微机原理与接口实验箱CDROM\CODE\86kasm\S2.ASM;将AX拆为5个BCD码,并存入Result开始的5个单元DATA SEGMENT AT 0 ;S2.ASM,BIN-->BCDORG 4000HRESULT DB 5 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATAORG 2CE0HSTART PROC NEARMOV AX, DATAMOV DS, AXMOV DX,0000HMOV AX, 65535MOV CX, 10000DIV CXMOV RESULT, AL ; 除以 10000, 得WAN位数MOV AX,DXMOV DX,0000HMOV CX, 1000DIV CXMOV RESULT+1, AL ; 除以 1000, 得QIAN位数MOV AX,DXMOV DX,0000HMOV CX, 100DIV CXMOV RESULT+2, AL ; 除以 100, 得BAI位数MOV AX,DXMOV DX,0000HMOV CX, 10DIV CXMOV RESULT+3, AL ; 除以 10, 得SHI位数MOV RESULT+4, DL ; 得GE位数JMP $CODE ENDSEND START。
二进制转BCD码需要几步?Hi,大家好!我是至芯科技的李老师。
今天讲课的题目比较有意思,它是一个小问题:把二进制变成BCD码需要几步?请大家思考一下。
有同学可能回答需要三步,为什么啊?因为啊,把大象放进冰箱里需要三步,第一步,把冰箱门打开,第二步,把大象放进去,第三步,把冰箱门关上。
类似的,把二进制变成BCD码,也需要三步。
blablablabla ......当然啦,这是开玩笑了。
不过,歪打正着,答案确实是三步。
究竟是怎么回事呢?我们下面细细说来,原理说透之后,我们演示一下具体的Verilog实现过程。
首先,看一下下面这张表格,把二进制(8’hFF)转换为BCD (12’h255)的步骤列表。
什么是二进制转BCD?有什么用?4位二进制是16进制数,而生活中常用的数制是10进制数。
怎么样用计算机来理解、表达生活中的10进制数?这就需要进行16进制数与10进制数的相互转换了。
而BCD码(Binary-Coded Decimal)正是计算机常用的一种表达方式。
它是一种以二进制表示的十进制数码。
比如说,至芯科技ZX-1开发板上的六位数码管显示数字可以是16进制的000000~FFFFFF,但是更为方便的方法是000000~999999。
六位数码管显示六位数字用十六进制,比如说是0F423F,谁也不知道是多少,但是它对应的十进制数999999,大家肯定很熟悉。
很多场合,我们和机器之间沟通用10进制更方便,但计算机是用01编码的。
需要进行人机之间的沟通和转换。
解决的方法就是用二进制的方式来存储、计算数值,但是用10进制的方式来显示这些数值,BCD码就起到了桥梁的作用。
注意,16进制属于二进制的一种形式,希望大家理解这点,包括8进制也是。
当然,道理容易明白。
但究竟机器又是怎样实现二进制和BCD码的转换的呢?注意,转换是双向的,既可以把二进制转换成BCD码,也可以把BCD码转换成二进制数。
可以想象BCD码转成二进制相对比较简单。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity transform2_to_10 isport( RST,CLK:in std_logic;start:in std_logic;binary_operands:in std_logic_vector(7 downto 0);--待转换的二进制数LED_baiwei:out std_logic_vector(3 downto 0);--百位LED_shiwei:out std_logic_vector(3 downto 0);--十位LED_gewei:out std_logic_vector(3 downto 0);--个位out_all:out std_logic_vector(19 downto 0);aa:out std_logic_vector(7 downto 0);cb,cc,ca:out std_logic_vector(3 downto 0);dd:out std_logic_vector(19 downto 0));end ;architecture behave of transform2_to_10 isbeginprocess(RST,CLK,binary_operands)variable operands:std_logic_vector(7 downto 0);--存放输入操作数variable MA:std_logic_vector(3 downto 0);--暂存个位的二进制数variable MB:std_logic_vector(3 downto 0);--暂存十位的二进制数variable MC:std_logic_vector(3 downto 0);--暂存百位的二进制数variable post:std_logic_vector(19 downto 0);--将二进制操作数、个位、十位、百位的二进制数集总variable Q:std_logic_vector(3 downto 0);--计数移位的脉冲数beginif RST='1'then operands:="00000000";MA:="0000";MB:="0000";MC:="0000";post:="00000000000000000000" ;elsif CLK'event and CLK='1'thenif start='1'then operands:=binary_operands;MA:="0000";MB:="0000";MC:="0000";post:=MC&MB&MA&operands(7 downto 0);out_all(7 downto 0)<=post(7 downto 0);--dd:="00000000";elseif Q<=8 thenif Q=8 then Q:="0000";LED_gewei<=MA; LED_shiwei<=MB;LED_baiwei<=MC;else Q:=Q+1;end if;post(19 downto 8):=MC&MB&MA;post(19 downto 0):=post(18 downto 0)&'0'; dd<=post(19 downto 0); --dd 为观测信号aa<=post(7 downto 0);out_all(19 downto 8)<=post(19 downto8);--out_all(19 downto 8)为观测信号MA(3 downto 0):= post(11 downto 8);ca<=post(11 downto 8);--ca观测信号MB(3 downto 0):= post(15 downto 12);cb<=post(15 downto 12);--cb观测信号MC(3 downto 0):= post(19 downto 16);cc<=post(19 downto 16);--cc观测信号if MA>=5 then MA:=MA+3;end if;if MA>=5 then MA:=MA+3;end if;if MB>=5 then MB:=MB+3;end if;if MC>=5 then MC:=MC+3;end if;end if;end if;end if;end process;end ;实现思想:使用俗称的移位加3法则,规则是:1、将该二进制数左移一位;2、对于25位的二进制数,最大8位十进制数,从千万位开始,分别是千万,百万,十万,万,千,百,十,个位,所以如果转换为BCD码,共需要32位二进制序列缓冲,每4位为一组,按上述顺序排列;3、如果移位后,该组的数据如果大于等于5,则对该组数据加3处理;4、左移一位;5、回第三步循环,直到所有数据移位完毕看下表的一个8位二进制转BCD,引申一下即可,原理是一样的Operation | Hundreds| Tens | Units | Binary | HEX | | | | F F |Start | | | | 1 1 1 1 1 1 1 1 |Shift1 | | |1 | 1 1 1 1 1 1 1 |Shift2 | | | 1 1 | 1 1 1 1 1 1 |Shift3 | | | 1 1 1 | 1 1 1 1 1 |Add3 | | | 1 0 1 0 | 1 1 1 1 1 | Shift4 | | 1 | 0 1 0 1 | 1 1 1 1 | Add3 | | 1 | 1 0 0 0 | 1 1 1 1 | Shift5 | | 1 1 | 0 0 0 1 | 1 1 1 | Shift6 | | 1 1 0 | 0 0 1 1 | 1 1 | Add3 | | 1 0 0 1 | 0 0 1 1 | 1 1 | Shift7 | 1 | 0 0 1 0 | 0 1 1 1 | 1 | Add3 | 1 | 0 0 1 0 | 1 0 1 0 | 1 | Shift8 | 1 0 | 0 1 0 1 | 0 1 0 1 | | BCD | 2 | 5 | 5 | |。
二进制到BCD转换实验报告[本站推荐]第一篇:二进制到BCD转换实验报告[本站推荐]二进制到BCD转换实验报告班级姓名学号日期一、实验目的:1.掌握简单的数值转换算法2.基本了解数值的各种表达方法二、实验要求:将给定的一个二进制数,转换成十进制(BCD)码。
三、实验内容:1、给累加器赋值,如#1232、将累加器的内容拆分为三个BCD码,并存入Result开始的三个单元。
四、程序及运行结果截图DATASEGMENT RESULT_1DBRESULT_2DBRESULT_3DBDATAENDSSTACKSEGMENTATACK STADBDUP(0)STACK_TOP DB0 STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOVAX,DATA MOVDS,AX MOVAX,STACK MOVSS,AX LEASP,ATACK_TOP MOVAX,123H MOVCL,100 DIVCL MOVRESULT_1,ALMOVCL,8 SHRAX,CL MOVCL,10 DIVCL MOVRESULT_2,AL MOVRESULT_3,AHADDRESULT_1,30H ADDRESULT_2,30H ADDRESULT_3,30HMOVDL, RESULT_1 MOVAH,02H INT21HMOVAX,4C00H INT21H CODEENDSENDSTART五、实验过程中遇到的主要问题;将 A 拆为三个 BCD 码, 并存入 Result 开始的叁个单元Result equ20horgljmp StartBinT oBCD:movb, #100divabmovResult, a;除以 100, 得百位数mova, bmovb, #10divabmovResult+1, a;余数除以 10, 得十位数movResult+2, b;余数为个位数retStart:movsp, #40hmova, #123call BinT oBCDljmp $end六、实验后的心得体会第二篇:二进制与十进制的转换二进制与十进制的转换2007年07月06日星期五 13:21教学目标:知识目标:知道二进制与十进制之间的转换方法操作目标:能在二进制与十进制之间进行进制转换教学重点:二进制与十进制之间的转换教学难点:二进制与十进制之间的转换教学过程:一、复习引入上一节课已经学习了什么是二进制以及二进制的运算。
BCD与二进制相互转换(含Verilog代码)(一)BCD码转二进制:所谓BCD码,就是用四位的二进制表示十进制,什么意思呢,举例说明。
1:00012:00103:00114:01005:01016:01107:01118:10009:1001123:0001 0010 0011(BCD码)123:0000 0111 1011(二进制码)一。
为什么要转换进制?我们可以用BCD码来表示十进制,比如157,123,用BCD码来表示分别是(0001 0101 0111)(0001 0010 0011),可是BCD码不能够直接进行运算,157+123=280,而括号里面的两个BCD码相加之和显然不是280的二进制。
所以就需要先将BCD码转换成二进制,经过换算之后再转换成BCD码。
(有些人会问,为什么要转来转去呢,因为计算机只识别二进制,而有时我们需要输出BCD码)二。
转换原理首先我们看二进制与十进制的转换,例1001(二进制),转换成十进制是1*2^3+0*2^2+0*2^1+1*2^0=9(十进制)。
n位的二进制转换过程为a(n-1)*2^(n-1)+a(n-2)*2^(n-2)+........+a(0)*2^0转换一下形式。
(((a(n-1)*2+a(n-2))*2+a(n-3))*2........+a(0)通过上面的形式发现,我们可以通过×2+b的方式来实现转换。
而×2在可以通过左移一位来实现,下面来谈谈这个b如上所述,BCD码用四位二进制表示0-9,而四位二进制可以表示数的范围为0-15,每进一位就会丢掉6,那么就要加上6/2=3(左移一位),那么在什么条件下左移呢?那就要看在什么情况下会进制,BCD码是二进制编码的十进制,那么就是逢十进一,10/2=5.因此得到条件,即判断每四位是否大于4,因为5-9进一位溢出。
我们来整理一下,二进制转BCD的方法是通过左移,然后每四位判断是否大于4,满足则加3.利用组合逻辑实现的代码如下:利用时序逻辑实现的代码如下:我们可以根据不同的情况选择不同的实现方式。
二进制转bcd 组合逻辑(原创实用版)目录1.二进制与 BCD 的概述2.二进制转 BCD 的组合逻辑方法3.实例分析4.总结正文一、二进制与 BCD 的概述二进制(Binary)是计算机中最基本的数制系统,它只有两个数码,即 0 和 1,广泛应用于计算机硬件和软件的设计中。
而 BCD(Binary Coded Decimal)即二进制编码十进制,是一种将十进制数转换为二进制数的编码方式,常用于计算机系统中数字信号的表示和处理。
二进制转 BCD,即将二进制数转换为 BCD 数,是在计算机系统中进行数字运算和处理的重要步骤。
组合逻辑是一种实现这一转换的常用方法,它主要通过逻辑门电路来实现二进制数到 BCD 数的转换。
二、二进制转 BCD 的组合逻辑方法二进制转 BCD 的组合逻辑方法主要包括以下两种:1.编码器方法:编码器是一种将多个输入信号转换为一个输出信号的组合逻辑电路。
在二进制转 BCD 的转换中,我们可以使用编码器将二进制数的每一位转换为 BCD 数的对应位。
例如,使用一个 4 位二进制数(2^3=8)来表示一个 BCD 数,即将 4 位二进制数转换为 3 位 BCD 数。
这样,我们可以通过编码器将 4 位二进制数转换为 3 位 BCD 数。
2.中间状态法:中间状态法是指在转换过程中,先将二进制数转换为十进制数,然后再将十进制数转换为 BCD 数。
这种方法需要使用更多的逻辑门电路,但是在一些特定情况下,如二进制数长度较短时,转换效果更佳。
三、实例分析假设有一个 4 位二进制数 1101,我们需要将其转换为 BCD 数。
1.使用编码器方法:首先,我们需要使用一个 4 位编码器,将二进制数的每一位转换为 BCD 数的对应位。
经过转换,得到的 BCD 数为1111。
2.使用中间状态法:首先,将二进制数 1101 转换为十进制数 13。
然后,使用一个 3 位编码器,将十进制数 13 转换为 BCD 数 1111。
一、实验目的(1)进一步熟练掌握8086汇编语言编译调试工具和环境的操作;(2)掌握完整8086汇编的程序设计编写方法;(3)掌握简单的数值码制转换方法;(4)掌握键盘输出的DOS功能调用方法。
二、实验要求:将AX中的一个二进制数(对应的十进制数范围是0-65535),转换成压缩性BCD码表示的十进制,并从屏幕输出转换结果。
要求用减法实现,并比较与除法方法进行运行速度比较。
三、实验及报告要求:3.1、简要说明算法,并画出正确的程序流程图;3.2、给出完整正确的源程序代码,要求给每一句伪指令或指令加上注释;3.3、分别在DOS和Windows下编译、连接源程序生成可执行文件并调试,比较两个环境下生成的机器码的长度、寄存器内容、计算结果的异同。
3.4、如何观察转换过程中标志寄存器中各标志位的结果?如何观察转换结果的变化?试改变被转换数值,对结果与编制为的变化加以说明和解释。
3.5、写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的主要依据。
3.6、实验总结中要求结合实验中的经验、教训或体会对汇编语言格式、调试方法和微机原理学习方法作出总结。
四、程序流程图减法。
即五位数先循环减10000,直到不够减了,做减法的次数就是万分位的结果;将不够减之前一次的余数恢复,再循环减去1000,直到不够减了,做减法的次数就是千分位的结果;以此类推,最后恢复的正余数就是个位的结果.除法。
即五位数先除以10000,得到的商存放万位数的变量上;再将余数除以1000,得到的商存放千位数的变量上;之后将余数除以100,得到的商存放百分位的变量上;以此类推,最后的余数存放在个位的变量上。
A 、减法结束 将余数保存到个位数 恢复正余数 恢复余数计数器清零 Y 将数减去100 计数值加1 将计数器的值保存到百分位 够减否 N 输入二进制数 Y将数减去10000计数值加1 将计数器的值保存到万分位恢复余数 够减否 计数器清零零 N计数器清零 Y 将数减去1000 计数值加1 将计数器的值保存到千分位 恢复余数够减否 计数器清零 N Y 将数减去10 计数值加1 将计数器的值保存到十分位 够减否 NB、除法五、源程序代码A、减法源程序DATA SEGMENT ; 数据段RESULT_1 DB 0RESULT_2 DB 0RESULT_3 DB 0RESULT_4 DB 0RESULT_5 DB 0DATA ENDSSTACK SEGMENT STACK ; 堆栈段STA DB 64 DUP(0);开辟100单元作为堆栈空间STACK_TOP DB 0STACK ENDSCODE SEGMENT ; 代码段ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK START:MOV AX, DATAMOV DS, AX ; 设置数据段MOV AX, STACKMOV SS, AX ; 设置堆栈段LEA SP, STACK_TOP ; 设置栈顶指针MOV AX,25468MOV CL, 0; 计数器清零NEXT1: SUB AX, 10000; 减10000JC OVER1; 有借位说明不够减INC CL ; 否则够减,计数器加1JMP NEXT1; 无条件跳转OVER1: ADD AX,10000; 最后恢复不够减时AL的余数MOV BX,AXMOV RESULT_1,CLADD CL,30HMOV AH,02MOV DL,CLINT 21HMOV CL,0MOV AX,BXNEXT2: SUB AX, 1000; 减1000JC OVER2; 有借位说明不够减INC CL ; 否则够减,计数器加1JMP NEXT2; 无条件跳转OVER2: ADD AX,1000; 最后恢复不够减时AL的余数MOV BX,AXMOV RESULT_2,CLADD CL,30HMOV AH,02MOV DL,CLINT 21HMOV CL,0MOV AX,BXNEXT3: SUB AX, 100; 减100JC OVER3 ; 有借位说明不够减INC CL ; 否则够减,计数器加1JMP NEXT3 ; 无条件跳转OVER3: ADD AX,100; 最后恢复不够减时AL的余数MOV BX,AXMOV RESULT_3,CLADD CL,30HMOV AH,02MOV DL,CLINT 21HMOV CL,0MOV AX,BXMOV CL, 0; 计数器清零NEXT4: SUB AL, 10; 减10JC OVER4; 有借位说明不够减INC CL ; 否则够减,计数器加1JMP NEXT4; 无条件跳转OVER4: ADD AL,10; 最后恢复不够减时AL的余数MOV BL,ALMOV RESULT_4,CLADD CL,30HMOV AH,02MOV DL,CLINT 21HMOV CL,0MOV AX,BXMOV RESULT_5,ALADD AL,30HMOV AH,02MOV DL,ALINT 21HMOV AX,4C00H ; 返回DOS(两句)INT 21H ;CODE ENDSEND START ; 最后一行要按回车键B、除法源程序DATA SEGMENT ; 数据段RESULT_1 DB 1 ; 结果1为低八位,初始量为’1’RESULT_2 DB 1 ; 结果1为低八位RESULT_3 DB 1 ; 结果1为低八位RESULT_4 DB 1 ; 结果1为低八位RESULT_5 DB 1 ; 结果1为低八位DATA ENDS ; 结束数据段STACK SEGMENT STACK ; 堆栈段STA DB 64 DUP(0) ;堆栈段初始化STACK_TOP DB 0 ;栈顶初始化STACK ENDS ;结束堆栈段CODE SEGMENT ; 代码段ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK START: ;假定为指令MOV AX, DATA ;把具体DATA送至寄存器中MOV DS, AX ; 设置数据段MOV AX, STACK ; 把STACK送至寄存器中MOV SS, AX ; 设置堆栈段LEA SP, STACK_TOP ; 设置栈顶指针MOV AX,32345 ;赋予立即数32345给AXMOV DX,0 ;余数清零MOV CX, 10000 ;赋予立即数10000给CXDIV CX ;除于CX中的立即数MOV RESULT_1, AL ; 除以10000, 得万位数MOV AX, DX ;将DX中的余数给AXMOV DX,0 ;余数清零MOV CX, 1000 ;赋予立即数1000给CXDIV CX ;除以1000MOV RESULT_2, AL ; 除以1000, 得千位数MOV AX, DX ;将DX中的余数给AXMOV DX,0 ;余数清零MOV CL, 100 ;赋予立即数100给CLDIV CL ;除以100 ;MOV RESULT_3, AL ;除以100, 得百位数MOV AL, AH ; 将AH中的余数给ALMOV AH, 0 ;余数清零MOV CL, 10 ; 赋予立即数10给CLDIV CL ;除以10MOV RESULT_4, AL ; 余数除以10, 得十位数MOV RESULT_5, AH ; 余数为个位数MOV CX,05H ;循环5次MOV AH,02H ;显示符LEA DI, RESULT_1 ;将结果1的偏移量给DI LP: MOV DL,BYTE PTR[DI] ;将[SI]中的字节内容给DL ADD DL,30H ;DL中的内容加30,显示数字INT 21H ;DOS INT 21 功能调用INC DI ;每显示一个字符,DI加1LOOP LP ;LP循环MOV AX,4C00H ; 返回DOS(两句)INT 21HCODE ENDS ;代码段结束END START ; 最后一行要按回车键六、实验结果6.1分别在DOS和Windows 下编译、连接源程序生成可执行文件并调试,比较两个环境下生成的机器码的长度、寄存器内容、计算结果的异同。
二进制转化为8421bcd码
二进制转化为8421BCD码是一种常见的数码编码方式,它可以将二进制数转化为BCD码,方便在数字电路中进行处理和显示。
BCD码是二进制编码的一种特殊形式,它将每个十进制数位表示成4位二进制码。
8421BCD码是一种常用的BCD码,其中每个十进制数位分别用8、4、2、1四个二进制码组成,称为8421码。
将一个二进制数转化为8421BCD码的方法如下:
首先将二进制数每4位分组,不足4位的在前面补0,如1101转化为0001 1101。
然后将每个4位二进制数转化为对应的8421码,例如0001转化为8421码为0001,1101转化为8421码为1000。
最后将所有的8421码按照十进制数位的顺序排列,得到的即为该二进制数的8421BCD码。
例如,将二进制数1101转化为8421BCD码的过程如下:
1101 → 0001 1101 → 8421码为0001 1000 → 8421BCD码为0001 1000,即十进制数13的8421BCD码为0001 0011。
- 1 -。
汇编程序设计—二进制码转换为BCD码
一、算法原理
BCD(Binary Coded Decimal)码是把十进制数据以二进制的方式进
行编码,每四位二进制数字表示一个十进制的数字,比如数字“7”用二
进制表示为“0111”,把“0111”放在一起就是十进制数“7”的BCD码。
1)对任意两个BCD码,可以按位相加,得到结果,其运算规则如下:(1)如果两个BCD码都是规范的BCD码,其相加结果也是BCD码;
(2)如果两个BCD码的相加结果不是正确的BCD码,则可以在最高
位1的位置添加1,使之成为BCD码,另一个BCD位置上也添加1,然后
最低位置上的1被移位,最终结果也是BCD码。
2)工程实现
该BCD码转换程序主要由二进制转换为BCD码的过程组成,根据算法
原理,实现程序如下:
1.首先把输入的二进制码按4位1组进行分组,得到分组后的二进制数,如果分组后的高位不足4位,则用0补足,得到规范的二进制码;
2.对二进制码进行转换,将2进制码转换成BCD码,得到相应的BCD 码;
3.对于每组BCD码,检查它是否是正确的BCD码,如果不是则需要添
加1;
4.最后将BCD码拼接起来,就是最终的BCD码结果。
二、汇编代码
MOV AL, offset BinaryCode ; 把二进制码移到AL中MOVCL,4;CL设置为4。
verilog实现二进制与bcd码的转换算法Verilog 实现二进制与 BCD 码的转换算法首先,我们来了解一下二进制和 BCD 码的基本概念。
二进制是一种以 2 为基数的记数法,通常用 0 和 1 来表示数字。
例如,数字 5 在二进制中表示为 101。
而 BCD 码则是用 4 位二进制数来表示一个十进制数字,从 0 到 9 的十进制数字分别对应 0000 到 1001 的 BCD 码。
接下来,我们先看如何将二进制转换为 BCD 码。
一种常见的方法是采用逐位转换的方式。
假设我们有一个 8 位的二进制数要转换为BCD 码。
第一步,我们将二进制数从右往左每 4 位分为一组。
如果最左边的一组不足 4 位,则在前面补 0 使其成为 4 位。
第二步,对于每一组 4 位的二进制数,将其转换为对应的十进制数字。
这可以通过查找二进制与十进制的对应关系表来实现。
第三步,将得到的每一位十进制数字转换为对应的 BCD 码。
```verilogmodule binary_to_bcd(input 7:0 binary_in,output reg 11:0 bcd_out);always @() begininteger i;bcd_out = 12'b0;for (i = 7; i >= 0; i = i 1) beginif (bcd_out3:0 >= 5)bcd_out3:0 = bcd_out3:0 + 3;if (bcd_out7:4 >= 5)bcd_out7:4 = bcd_out7:4 + 3;if (bcd_out11:8 >= 5)bcd_out11:8 = bcd_out11:8 + 3;bcd_out ={bcd_out10:0, binary_ini};endendendmodule```在这个模块中,我们使用一个循环来逐位处理输入的二进制数。
每次循环时,我们检查当前的 4 位 BCD 码是否需要进位调整,如果需要则加上 3。
实验二二进制BCD码转换一、实验目的1.掌握简单的数值转换算法2.基本了解数值的各种表达方法二、实验说明单片机中的数值有各种表达方式,这是单片机的基础。
掌握各种数制之间的转换是一种基本功。
我们将给定的一字节二进制数,转换成二十进制(BCD)码。
将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123。
三、实验内容及步骤1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。
2.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH2.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA) (在MEMORY#1中输入D:30H 回车),点击暂停按钮,观察地址30H、31H、32H的数据变化,30H更新为01,31H更新为02,32H更新为03。
用键盘输入改变地址30H、31H、32H的值,点击复位按钮后,可再次运行程序,观察其实验效果。
修改源程序中给累加器A的赋值,重复实验,观察实验效果。
3.打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。
四、流程图及源程序(见光盘中的程序文件夹)1.源程序RESULT EQU 30HORG 0000HLJMP STARTBINTOBCD:MOV B,#100DIV ABMOV RESULT,A ;除以100得百位数MOV A,BMOV B,#10DIV ABMOV RESULT+1,A ;余数除以10得十位数MOV RESULT+2,B ;余数为个位数RETSTART:MOV SP,#40HMOV A,#123CALL BINTOBCDLJMP $END2.流程图给出要转换的二进制数将数除以100,得百位数保存百位数将余数再除以10,得十位数保存十位数余数为个位数,将其保存结束。
二进制转B C D码-CAL-FENGHAI.-(YICAI)-Company One1二进制转换成十进制 BCD码(加3移位法底下还附带了BCD码转二进制码转化的VHDL程序算法"二进制数调整BCD码的方法是将二进制码左移8次,每次移位后都检查低四位LSD+3是否大于7,如是则加3,否则不加,高4位MSD作同样处理"一、为什么左移8次原寄存器是存二进制数的,新寄存器是存十进制数的,当然要左移8次,把数据全部移进去。
但这里要注意两件事,第一,如果只安排一个字节作十进制寄存器,原数据要小于64H(即100)。
第二,由于新寄存器是十进制的,要随时调整。
二、检查半字节+3 是否大于 7,是,则 +3在 51 系列里有十进制调节指令(半字节大于 9,则加 6,应该不难理解),PIC 里没有,只好采取变通的方法。
检查半字节+3 是否大于 7,也就是检查半字节是否大于 4。
因为,如果大于 4(比如5、6),下一步左移就要溢出了,所以加 3,等于左移后的加 6,起到十进制调节的作用。
那为什么要绕个圈子去检测半字节+3 是否大于 7 呢?这样程序编起来会简练一些。
一个例子假如有一个八位二进制数255,我把他转255的十进制数0 1111 1111 原数1 0000 0001 ;左移一次2 0000 0011 ; 左移二次3 0000 0111 ;左移三次,检查低四位+3>7?3.1 0000 1010 ;大于7,加3进行调整4 0001 0101 ;左移四次, 检查低四位+3>7?4.1 0001 1000 ;大于7,加3进行调整5 0011 0001 ;左移五次6 0110 0011 ;左移六次,检查高四位+3>7?6.1 1001 0011 ;大于7,加3进行调整7 1 0010 0111 ;左移七次,检查低四位+3>7?7.1 1 0010 1010 ;大于7,加3进行调整8 10 0101 0101 ;左移八次(得到BCD码255Library ieee; --16位二进制转BCD码(0到9999)Use ieee.std_logic_unsigned.all;Use ieee.std_logic_1164.all;Entity B_BCD isPort ( clk,ena:in std_logic;a: in std_logic_vector(15 downto 0);q: out std_logic_vector(15 downto 0));end B_BCD;architecture behav of B_BCD isbeginprocess(clk,a)variable i: std_logic_vector(4 downto 0);variable in_a,out_a :std_logic_vector(15 downto 0);beginif ena='0'thenin_a:=a; i:="00000"; out_a:="0000000000000000";elsif clk'event and clk='1' thenif i="10000" then out_a:=out_a;else out_a:=out_a(14 downto 0)&in_a(15);in_a:=in_a(14 downto 0)&'0';i:=i+1;if i<"10000" thenif out_a( 3 downto 0)>4 then out_a( 3 downto 0):=out_a( 3 downto 0)+3;end if;if out_a( 7 downto 4)>4 then out_a( 7 downto 4):=out_a( 7 downto 4)+3;end if;if out_a(11 downto 8)>4 then out_a(11 downto 8):=out_a(11 downto 8)+3; end if;if out_a(15 downto 12)>4 then out_a(15 downto 12):=out_a(15 downto 12)+3;end if;end if;end if;end if ;q<=out_a;end process;end behav;以下为(0到99)BCD码转二进制码Library ieee; --(0到99)BCD码转二进制码Use ieee.std_logic_unsigned.all;Use ieee.std_logic_1164.all;Entity BCD_B isPort ( a: in std_logic_vector(7 downto 0);q: out std_logic_vector(7 downto 0));end BCD_B;architecture behav of BCD_B issignal a1,a2,a3,a4,cq: std_logic_vector(7 downto 0); beginprocess(a)begina1<="0000"&a(3 downto 0);a2<="0000"&a(7 downto 4);a3<=a2(6 downto 0)&'0';a4<=a2(4 downto 0)&"000";cq<=a4+a3+a1;q<=cq;end process;end behav;。
两个字节的二进制数转换成BCD码;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。
;那么可以写成:;n=[b15~b0];把16位数分解成高8位、低8位来写,也是常见的形式:;n=[b15~b8]*256+[b7~b0];那么,写成下列形式,也就可以理解了:;n=[b15~b12]*4096+[b11~b0];式中高4位[b15~b12]取值范围为0~15,代表了4096的个数;;上式可以变形为:;n=[b15~b12]*4000+{[b15~b12]*(100-4)+[b11~b0]};用x代表[b15~b12],有:;n=x*4000+{x*(100-4)+[b11~b0]};即:;n=4*x(千位)+x(百位)+[b11~b0]-4*x;写到这里,就可以看出一点BCD码变换的意思来了。
;上式中后面的位:[b11~b0]-4*x,如果小于256,那就太简单了,马上就可以去按照常规转换BCD了。
;如果数值较大,就要把[b11~b7]看成128的个数y;在百位中加上y、在十位加上3*y、并在[b6~b0]中减去2*y。
;那么就有:;n=4*x(千位)+x(百位)+[b11~b0]-4*x;n=4*x(千位)+(x+y)(百位)+3*y(十位)+[b6~b0]-2*y;由此,就可以明确由高9位[b15~b7]变换出来十进制的各个位的数值,可能大于9,到最后整理一下即可。
;剩下的低7位[b6~b0],已经是单字节数据,变换成BCD码那就十分简单了。
从最后的表达式中可以看出,高9位变换的计算方法极为简单,只是使用左移、加减等指令即可,基本上不涉及多字节的运算。
编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。
做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。
感兴趣的网友可以留言,写出自己编写的程序。
最佳答案:两个字节的二进制数转换成BCD码,必须编写程序来解决。
智能仪表多字节二进制数转换BCD码
作者:湖南大学电气与信息工程系邓勇刘琪来源:《电子产品世界》
摘要:多字节无符号二进制数转BCD码在以单片机为核心的智能仪表中应用很普遍。
本文介绍一种新的转换方法,并给出三字节二进制数转BCD码的源程序,该程序执行时间仅为原来的1.3%,效率提高显著。
关键词:多字节二进制整数 BCD码转换
一、引言
在以MCS-51单片机为核心的智能仪表系统中,常遇到二进制整数转换为BCD码的情况。
国内许多单片机书籍都对此进行了介绍并给出了子程序,但效率不高。
本文参考文献作者剖析了二进制整数转BCD码的子程序,分析了程序效率低的原因,给出了改进后的源程序,效率有所提高。
以3字节
的二进制整数为例,程序
执行时间由2.856ms减小到
2.410ms。
还有没有其它的
办法进一步大幅度减少转
换设计时间?本文介绍一
种新的程序设计思路,给
出的源程序将3字节二进
制整数转BCD码执行时间
仅为0.374ms。
二、改进思路
由进制数转BCD码的原理可知,这一转换的实现的过程是(以3字节为例):首先把结果单元(这里是4个字节)清零,然后将待转换的二进制数的最高位移入进位位C,把结果单元的值进行乘2加C运算的值又作为结果单元的值,循环24次后得出转换的BCD码。
如果能完全避开效率运行的时间。
这可用下例来说明:
设结果单元某时的值为3456H,分别存放在R1、R2中,用如下的程序来完成结果单元乘2加(设C的当前值为1):
MOV A,R1
ADDC A,ACC
DA A
MOV R1,A
MOV A,R2
ADDC A,ACC
DA A
MOV R2,A
程序中使用ADDC A,ACC指令完成乘2加C的工作,经过执行上面的程序,进位位C 的值为0,R1、R2单元中的内容分别为69H、13H,该值即为结果单元的值。
这样就使程序避免了循环而又实现了结果单元乘2加C的功能。
这个例子的结果单元为2字节,随着进一步的运算,结果单元会变为3字节并最终变为4字节(以二进制数是3字节为例)。
只要在程序中加以适当的控制,则可避免过多的运算,从而使转换的速度加快。
三、源程序
程序名:FBCD
程序功能:将三字节二进制数转换为BCD码。
程序入口:20H,21H,22H,
存放被转换的三字节二进制数。
程序出口为R1,R2,R3,R4,存放转换的BCD码的结果(见程序清单)。
四、结语
为了尽可能地减少转换时间,使用了一些小技巧。
例如:在程序开始转换二进制数前3位时,考虑到这3位在进行乘2加C的操作时不会有进位位,则使用3条RL A,完成了前3位的转换。
该程序完成3字节二进制无符号整数转BCD码所需时间仅为374微秒,转换时间缩短为原来的13%,效率提高是显著的。
另外,该程序比较灵活,程序中标注(****)处,已完成了2字节二进制整数转三字节的BCD码,程序执二字节二进制数转BCD码所需时间仅为194微秒,使用一条MOV R1,A指令,则转换结果按由高到低的次序依次存放在R1,R2,R3中。
当然,很容易在此程序基础之上,实现4字节或更高字节无符号二进制整数向BCD码的转换。