文档库 最新最全的文档下载
当前位置:文档库 › verilog实现任意位二进制转换BCD

verilog实现任意位二进制转换BCD

verilog实现任意位二进制转换BCD
verilog实现任意位二进制转换BCD

verilog实现任意位二进制转换BCD

作者:kb129 来源:kb129 点击数:1372 更新时间:2014年06月08日【字体:大中小】

一直感觉这是个很简单的问题,直到突然自己连BCD都不太清楚的时候,才发现这没有看起来那么简单,这里介绍里任意位二进制转为BCD的verilog代码,这个转换方法也可以用在C上面,此为原创,转载请注明,谢谢。

基础知识:

BCD:BCD码又称为8421码,

意义:之所以有时候需要将binary转换为BCD,一般是用在本科的实验中,为了将binary显示在数码管中,当然还有很多应用,只是目前我还没有用到。

转换算法:左移加3法

移位加3法的具体原理,在网上感觉也没有人能够说的清楚,以后找到书籍再说吧。下面解释下左移加三算法。这里以8bit二进制数FF做例子。

该算法的操作为上图。下面对上图的操作进行详细的解释:

由于8bit的二进制最大为FF,转换为十进制为255。所以需要使用三个BCD码来表示所有的8bit二进制数。上图的hundreds表示百位的BCD,tens表示十位的BCD,Units表示个位的BCD。算法的操作为

一直将binary数据左移,移出的数据按顺序存在hundreds,tens,Units。例如上面的shift1,shift2,shift3操作后,Units变为了0111,至于为何在shift3后进行add3操作,是因为在算法中每一次左移,都要对hundreds,tens和Units进行判断,如果hundreds,tens和Units里面的值大于或等于5,就将hundreds,tens 和Units自加3.所以shift3后,Units里面为0111,表示为7,此时不能左移,而是对Units加三操作,所以Units的值从0111变为了1010.值得注意的是,只要hundreds,tens和Units中任意一个的值大于或等于5(0101),就要先进行一次自加三的操作,然后才能继续左移,后面的操作同上。

注意2:n位的binary就需要进行n次左移

注意3:最后一次左移不需要进行add3操作

注意4 : 亲自推导16位的,和24位的binary转换,结果正确,所以该算法适用于任意位binary

to BCD,当然这种论断没有足够的理论依据。

verilog代码:

说明:对于8bit及以下的binary,可以使用case语句实现移位加三算法。由于这里说明的是任意位的二进制数,转为BCD,所以我的代码中设计了一个状态机,来控制移位,加三和结束操作。由于代码编写时间仓促,其中或许有些bug。

//name: 二进制转BCD

//data: 2014-04-17 at kb129

//info: as 2**8=255 change to BCD then this need 3 times of “8421”

module b_to_bcd(

clk,

rst_n,

binary,

state_en,

BCD

);

parameter b_length = 8;

parameter bcd_len = 12;

parameter idle = 5'b00001;

parameter shift = 5'b00010;

parameter wait_judge = 5'b00100;

parameter judge = 5'b01000;

parameter add_3 = 5'b10000;

input clk;

input rst_n;

input [b_length-1:0] binary;

input state_en;

output reg [bcd_len-1:0] BCD;

reg [b_length-1:0] reg_binary;

reg [3:0] bcd_b, bcd_t, bcd_h;

reg [3:0] shift_time;

reg [5:0] c_state, n_state;

reg add3_en;

reg change_done;

//this is a three section kind of state code style

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

c_state <= idle;

else

c_state <= n_state;

end

//the second section

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

c_state <= idle;

else

case(n_state)

idle:begin

if((binary!=0)&&(state_en==1'b1)&&(change_done==0'b0))

n_state <= shift;

else

n_state <= idle;

end

shift: n_state <= wait_judge;

wait_judge: begin

if(change_done==1'b1)

n_state <= idle;

else

n_state <= judge;

end

judge:begin

if(add3_en)

n_state <= add_3;

else

n_state <= shift;

end

add_3:begin

n_state <= shift;

end

default: n_state <= idle;

endcase

end

//the third section

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

shift_time <= 4'b0;

change_done <= 1'b0;

add3_en <= 1'b0;

end

else

case(n_state)

idle:begin

shift_time <= b_length;

reg_binary <= binary;

bcd_h <= 4'b0;

bcd_t <= 4'b0;

bcd_b <= 4'b0;

end

shift:begin

{bcd_h,bcd_t,bcd_b,reg_binary} <= {bcd_h,bcd_t,bcd_b,reg_binary}<<1;

shift_time <= shift_time-1;

if(shift_time==1) change_done <= 1'b1;

else change_done <= 1'b0;

end

wait_judge:begin

if((bcd_h>=4'd5)||(bcd_t>=4'd5)||(bcd_b>=4'd5))

add3_en <= 1;

else

add3_en <= 0;

if(change_done==1) BCD <= {bcd_h,bcd_t,bcd_b};

end

judge: add3_en <= 0;

add_3: begin

if(bcd_h>=4'd5) bcd_h <= bcd_h + 4'b0011; else bcd_h <= bcd_h;

if(bcd_t>=4'd5) bcd_t <= bcd_t + 4'b0011; else bcd_t <= bcd_t;

if(bcd_b>=4'd5) bcd_b <= bcd_b + 4'b0011; else bcd_b <= bcd_b;

end

default: begin

change_done <= 1'b0;

add3_en <= 1'b0;

end

endcase

end

endmodule

代码的仿真:这里对上面的代码进行了仿真,仿真结果显示上面代码可以实现8bitbinary的BCD转换。testbench:

module filter_tb;

reg clk;

reg rst_n;

reg state_en;

reg [7:0] binary;

wire [11:0] BCD;

initial

begin

clk=0;

rst_n=0;

state_en = 0;

#100 binary = 8'h3f;

#150 rst_n=1;

#200 state_en =1;

end

always #10 clk=~clk;

b_to_bcd u_b_to_bcd

(

.clk(clk),

.rst_n(rst_n),

.binary(binary),

.state_en(state_en),

.BCD(BCD)

);

endmodule

仿真结果:二进制的3f=十进制的63

利用verilog将二进制码转换为十进制BCD码

时间2014-02-20 10:54:17 CSDN博客

原文https://www.wendangku.net/doc/c64440759.html,/li200503028/article/details/19507061

主题软件开发

小序:

先说一个 bear 的亲身体会,bear 在做一些 fpga 小设计时经常会用到数据显示功能,比如数字时钟,数字频率计,温度计,跑表等等,往往我们会选用

led 数码管来做显示,因为它驱动起来比 lcd 液晶要简单的很多,我们知道fpga 中寄存器在定义和储存的数据都是采用二进制的格式,而 fpga 输出给数码

管做显示的数据必须是十进制的格式,之前 bear 经常会选择把一个寄存器的个位和十位分开定义,比如在做数字时钟时,就会吧时,分,秒的各位和十位

都分别定义成一个变量,无疑这种方法会增加代码的复杂度,所以考虑需要一个专门把二进制的数据转换成十进制 BCD码的模块,在网上有一些,但是好

像都不太完整,所以bear花了一下午写了一个,亲测效果不错,希望对朋友们有所帮助,下面开始正文。

首先给出二进制码转换为十进制BCD码的几个步骤(以8bit二进制码为例):

1.将二进制码左移一位(或者乘2)

2.找到左移后的码所对应的个,十,百位。

3.判断在个位和百位的码是否大于5,如果是则该段码加3。

4.继续重复以上三步直到移位8次后停止。

下面是一个例子,将 1111_1111 转换为 BCD码,如果8bit数据最终移位得到18bit 数据,那么个位,十位,百位分别对应12~9,16~13,18~17

位。

下面给出CODE:

`timescale 1ns / 1ps

module bin_dec(clk,bin,rst_n,one,ten,hun,count,shift_reg );

input [7:0] bin;

input clk,rst_n;

output [3:0] one,ten;

output [3:0] count;

output [1:0] hun;

output [17:0]shift_reg;

reg [3:0] one,ten;

reg [1:0] hun;

reg [3:0] count;

reg [17:0]shift_reg=18'b000000000000000000;

////////////////////// 计数部分 //////////////////////// always @ ( posedge clk or negedge rst_n )

begin

if( !rst_n )

count<=0;

else if (count<=8)

count<=count+1;

else

count<=9;

end

////////////////////// 二进制转换为十进制 /////////////////

always @ (posedge clk or negedge rst_n )

begin

if (!rst_n)

shift_reg=0;

else if (count==0)

shift_reg={10'b0000000000,bin};

else if ( count<=8) //实现8次移位操作

begin

if(shift_reg[11:8]>=5) //判断个位是否>5,如果是则+3

begin

if(shift_reg[15:12]>=5) //判断十位是否>5,如果是则+3

begin

shift_reg[15:12]=shift_reg[15:12]+2'b11;

shift_reg[11:8]=shift_reg[11:8]+2'b11;

shift_reg=shift_reg<<1; //对个位和十位操作结束后,整体左移

end

else

begin

shift_reg[15:12]=shift_reg[15:12];

shift_reg[11:8]=shift_reg[11:8]+2'b11;

shift_reg=shift_reg<<1;

end

end

else

begin

if(shift_reg[15:12]>=5)

begin

shift_reg[15:12]=shift_reg[15:12]+2'b11;

shift_reg[11:8]=shift_reg[11:8];

shift_reg=shift_reg<<1;

end

else

begin

shift_reg[15:12]=shift_reg[15:12];

shift_reg[11:8]=shift_reg[11:8];

shift_reg=shift_reg<<1;

end

end

end

end

/////////////////输出赋值//////////////////////////

always @ ( posedge clk or negedge rst_n )

begin

if ( !rst_n )

begin

one<=0;

ten<=0;

hun<=0;

end

else if (count==9) //此时8次移位全部完成,将对应的值分别赋给个,十,百位 begin

one<=shift_reg[11:8];

ten<=shift_reg[15:12];

hun<=shift_reg[17:16];

end

end

以下是仿真结果,bin为输入的二进制码,为了便于对比,仿真时也化成十进制显示了,one,ten,hun分别对应BCD码的个,十,百位。

基本思路是把二进制按4位一组分开,把每一组对应的二进制数转换成bcd码表,最后把所有位进行bcd码相加,第一个4位的码表也可以省略,第二个4位对于关系是

4'h0: 10'h000;

4'h1: 10'h016;

4'h2: 10'h032;

4'h3: 10'h048;

4'h4: 10'h064;

4'h5: 10'h080;

4'h6: 10'h096;

4'h7: 10'h112;

4'h8: 10'h128;

4'h9: 10'h144;

4'ha: 10'h160;

4'hb: 10'h176;

4'hc: 10'h192;

4'hd: 10'h208;

4'he: 10'h224;

4'hf: 10'h240;

第3组对于你来说只有3位

4'h0: 14'h0000;

4'h1: 14'h0256;

4'h2: 14'h0512;

4'h3: 14'h0768;

4'h4: 14'h1024;

4'h5: 14'h1280;

4'h6: 14'h1536;

4'h7: 14'h1792;

把11位二进制查表得出的3个数进行bcd码相加

这里把每个结果按同级单个bcd码相加,也就是>9对结果加6,>19对结果加12,>29对结果加18类推,当然高一级的bcd码要加上低一级的进位,也就是高出4位的部分,最后把结果拼接给你一个16位有符号的例子

module bcd(clk,

hex,

dec);

input clk;

input [16:0] hex;

output [19:0] dec;

wire [15:0] rrhex;

reg [3:0] rhex[3:0];

reg [17:0] rhexd;

reg [13:0] rhexc;

reg [9:0] rhexb;

reg [3:0] rhexa;

reg [5:0] resa,resb,resc,resd;

reg [3:0] rese;

assign rrhex = hex[16] ? ~hex[15:0]+1'b1 : hex[15:0]; //去符号

assign dec = {rese,resd[3:0],resc[3:0],resb[3:0],resa[3:0]};

always@(posedge clk) //第一级寄存器

begin

rhex[3] <= rrhex[15:12];

rhex[2] <= rrhex[11:8];

rhex[1] <= rrhex[7:4];

rhex[0] <= rrhex[3:0];

end

always@(posedge clk) //第二级寄存器,千begin

case(rhex[3])

4'h0: rhexd <= 18'h00000;

4'h1: rhexd <= 18'h04096;

4'h2: rhexd <= 18'h08192;

4'h3: rhexd <= 18'h12288;

4'h4: rhexd <= 18'h16384;

4'h5: rhexd <= 18'h20480;

4'h6: rhexd <= 18'h24576;

4'h7: rhexd <= 18'h28672;

default: rhexd <= 10'h00000;

endcase

end

always@(posedge clk)

begin

case(rhex[2])

4'h0: rhexc <= 14'h0000;

4'h1: rhexc <= 14'h0256;

4'h2: rhexc <= 14'h0512;

4'h3: rhexc <= 14'h0768;

4'h4: rhexc <= 14'h1024;

4'h5: rhexc <= 14'h1280;

4'h6: rhexc <= 14'h1536;

4'h7: rhexc <= 14'h1792;

4'h8: rhexc <= 14'h2048;

4'h9: rhexc <= 14'h2304;

4'ha: rhexc <= 14'h2560;

4'hb: rhexc <= 14'h2816;

4'hc: rhexc <= 14'h3072;

4'hd: rhexc <= 14'h3328;

4'he: rhexc <= 14'h3584;

4'hf: rhexc <= 14'h3840;

default: rhexc <= 14'h0000;

endcase

end

always@(posedge clk)

begin

case(rhex[1])

4'h0: rhexb <= 10'h000;

4'h1: rhexb <= 10'h016;

4'h2: rhexb <= 10'h032;

4'h3: rhexb <= 10'h048;

4'h4: rhexb <= 10'h064;

4'h5: rhexb <= 10'h080;

4'h6: rhexb <= 10'h096;

4'h7: rhexb <= 10'h112;

4'h8: rhexb <= 10'h128;

4'h9: rhexb <= 10'h144;

4'ha: rhexb <= 10'h160;

4'hb: rhexb <= 10'h176;

4'hc: rhexb <= 10'h192;

4'hd: rhexb <= 10'h208;

4'he: rhexb <= 10'h224;

4'hf: rhexb <= 10'h240;

default: rhexb <= 10'h000;

endcase

end

always@(posedge clk)

begin

rhexa <= rhex[0];

end

always@(posedge clk)

begin

resa = addbcd4(rhexa[3:0],rhexb[3:0],rhexc[3:0], rhexd[3:0]);

resb = addbcd4(resa[5:4], rhexb[7:4],rhexc[7:4], rhexd[7:4]);

resc = addbcd4(resb[5:4], rhexb[9:8],rhexc[11:8], rhexd[11:8]);

resd = addbcd4(resc[5:4], 4'h0, rhexc[13:12],rhexd[15:12]);

rese = resd[5:4] + rhexd[17:16];

end

function [5:0] addbcd4;

input [3:0] add1,add2,add3,add4;

begin

addbcd4 = add1 + add2 + add3 + add4;

if(addbcd4 > 6'h1d) //>29 最低有一个可能出现0xf,但由二进制转换而来的数在这里不会出现大于40的情况

addbcd4 = addbcd4 + 5'h12;

else if(addbcd4 > 5'h13) //>19

addbcd4 = addbcd4 + 4'hc;

else if(addbcd4 > 4'h9) //>9

addbcd4 = addbcd4 + 4'h6;

end

endfunction

利用

之前写的代码在转换完之后没有对count清零,所以在仿真时候需要用rst_n清零,感谢博友onlytime417的提示,经过修改之后可以对不同的输入值连续转换,而不需要rst_n 的复位,下面是修改后的代码以及仿真结果,(该转换模块已经在实际项目中应用)。

CODE:

`timescale 1ns / 1ps

module bin_dec(clk,bin,rst_n,one,ten,hun,count,shift_reg

);

input [7:0] bin;

input clk,rst_n;

output [3:0] one,ten;

output [3:0] count;

output [1:0] hun;

output [17:0]shift_reg;

reg [3:0] one,ten;

reg [1:0] hun;

reg [3:0] count;

reg [17:0]shift_reg=18'b000000000000000000;

////////////////////// 计数部分////////////////////////

always @ ( posedge clk or negedge rst_n )

begin

count<=0;

else if (count==9)

count<=0;

else

count<=count+1;

end

////////////////////// 二进制转换为十进制/////////////////

always @ (posedge clk or negedge rst_n )

begin

if (!rst_n)

shift_reg=0;

else if (count==0)

shift_reg={10'b0000000000,bin};

else if ( count<=8) //实现8次移位操作

begin

if(shift_reg[11:8]>=5) //判断个位是否>5,如果是则+3 begin

if(shift_reg[15:12]>=5) //判断十位是否>5,如果是则+3 begin

shift_reg[15:12]=shift_reg[15:12]+2'b11;

shift_reg[11:8]=shift_reg[11:8]+2'b11;

shift_reg=shift_reg<<1; //对个位和十位操作结束后,整体左移

end

else

begin

shift_reg[15:12]=shift_reg[15:12];

shift_reg[11:8]=shift_reg[11:8]+2'b11;

shift_reg=shift_reg<<1;

end

end

else

begin

if(shift_reg[15:12]>=5)

begin

shift_reg[15:12]=shift_reg[15:12]+2'b11;

shift_reg[11:8]=shift_reg[11:8];

shift_reg=shift_reg<<1;

end

else

begin

shift_reg[15:12]=shift_reg[15:12];

shift_reg[11:8]=shift_reg[11:8];

shift_reg=shift_reg<<1;

end

end

end

end

/////////////////输出赋值//////////////////////////

always @ ( posedge clk or negedge rst_n )

begin

if ( !rst_n )

begin

one<=0;

ten<=0;

hun<=0;

end

else if (count==9) //此时8次移位全部完成,将对应的值分别赋给个,十,百位

begin

one<=shift_reg[11:8];

ten<=shift_reg[15:12];

hun<=shift_reg[17:16];

end

end

endmodule

以下是仿真结果,bin为输入的二进制码,为了便于对比,仿真时也化成十进制显示了,one,ten,hun分别对应BCD码的个,十,百位。修改前的仿真结果:

修改后的仿真结果:

二进制转换成十进制BCD码(加3移位法) 2010-07-05 15:53:35

分类:

"二进制数调整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码255)

附上Verilog代码:

//17位二进制数转BCD码(基本思想是逢十进1)

module BIN_BCD_4 (CLK, A, BW, BQ, BB, BS, BG);

input CLK;

input [16:0]A; //二进制输入数据

output [3:0]BW, BQ, BB, BS, BG;//BCD数据输出寄存器

reg [3:0]BW, BQ, BB, BS, BG;

integer I;

reg [19:0]TEMP;

reg [16:0]C;

always @ (posedge CLK)

begin

C=A;

TEMP=0;

for (I=1; I<17; I=I+1)

begin

{TEMP, C}={TEMP[18:0], C, 1'b0};//左移一位

if (TEMP[3:0]>4'b0100)

begin

TEMP[3:0]=TEMP[3:0]+3; // >4则加3

end

if (TEMP[7:4]>4'b0100)

begin

TEMP[7:4]=TEMP[7:4]+3;

end

if (TEMP[11:8]>4'b0100)

begin

TEMP[11:8]=TEMP[11:8]+3;

end

if (TEMP[15:12]>4'b0100)

begin

TEMP[15:12]=TEMP[15:12]+3;

end

if (TEMP[19:16]>4'b0100)

begin

TEMP[19:16]=TEMP[19:16]+3;

end

{BW, BQ, BB, BS, BG}={TEMP[18:0], A[0]};

end

end

endmodule

二进制转BCD码

二进制转换成十进制 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码255 Library ieee; --16位二进制转BCD码(0到9999) Use ieee.std_logic_unsigned.all; Use ieee.std_logic_1164.all; Entity B_BCD is Port ( 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 is begin process(clk,a) variable i: std_logic_vector(4 downto 0); variable in_a,out_a :std_logic_vector(15 downto 0); begin if ena='0'then in_a:=a; i:="00000"; out_a:="0000000000000000"; elsif clk'event and clk='1' then if 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" then if 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;

二进制转换成BCD码 实验报告

一、实验目的 (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,得到的商存放百分位的变量上;以此类推,最后的余数存放在个位的变量上。

单片机实验4 子程序设计-- BCD码转换为二进制

实验4. 子程序设计----BCD 码转换为二进制 单字节可存放两位压缩BCD 码(0—99) 为0 —9) 单字节BCD 码转换为二进制子程序 入口:(R0)= 压缩BCD 码的地址 出口:(A)= 转换结果 DSFR::MOV A,@R0 ANL A,#0F0H ;取十位数 SWAP A ;变为标准BCD 码 MOV B,#10 MUL AB ;(A)=D1×10 MOV R7,A ;D1× 10暂存 R7 MOV A,@R0 ANL A,#0FH ;取个位 ADD A,R7 ;A=D1×10+D0 RET 1、实验内容: 子程序设计要点: 1) 子程序一般为多次返复使用的程序段,一般应说明入口条件,DSFR 子程序的 入口条件是:被转换为二进制的单字节BCD 码为间接寻址,间接寻址寄存器为R0。要调用DFSR 子程序必需先将压缩BCD 码的存放地址赋与R0。而出口条件是指最后结果在哪儿存放。本子程序转换结果在ACC 内。 2) 主程序调用子程序,在调试时一般要先调试子程序、再调试主程序。

2、实验步骤 1)打开PV32编程序。汇编正确进入调试界面。否则修改程序重新汇编直到通过。 2)打开DATD窗口给20H、21H、R6、R7赋值 3)单步调试DSFR子程序观察并记禄寄存器、内存的变化。判断程序是否正确。若发现 问题重返编辑界面,修改、存盘、汇编。返回调试界面调试通过。 4) 设断点调试主程序观察并记禄寄存器、内存的变化。判断程序是否正确。若发现问 题重返编辑界面,修改、存盘、汇编。返回调试界面调试通过。 3.实验报告 1.写出主程序流程图、子程序流程图、程序清单 2.根据记渌数据给程序加注解 3.调试心得

二进制码转换为BCD码实验报告

实验二二进制码转换为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-->BCD ORG 4000H RESULT DB 5 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA ORG 2CE0H START PROC NEAR MOV AX, DATA MOV DS, AX MOV DX,0000H MOV AX, 65535 MOV CX, 10000 DIV CX MOV RESULT, AL ; 除以 10000, 得WAN位数 MOV AX,DX MOV DX,0000H MOV CX, 1000 DIV CX MOV RESULT+1, AL ; 除以 1000, 得QIAN位数 MOV AX,DX MOV DX,0000H MOV CX, 100 DIV CX MOV RESULT+2, AL ; 除以 100, 得BAI位数 MOV AX,DX MOV DX,0000H MOV CX, 10 DIV CX MOV RESULT+3, AL ; 除以 10, 得SHI位数 MOV RESULT+4, DL ; 得GE位数 JMP $ CODE ENDS END START

二进制数到BCD码的转换

得分教师签名批改日期课程编号1801770001 深圳大学实验报告课程名称:微机原理及应用 实验名称:二进制数到BCD码的转换 学院:物理科学与技术学院 指导教师: 报告人:组号: 学号实验地点K302 实验时间:2014 年10 月22 日 提交时间:2014.11.12

一、实验要求: 将AX中的一个二进制数(对应的十进制数范围是0-65535),转换成压缩性BCD码表示的十进制,并从屏幕输出转换结果。要求用减法实现,并比较与除法方法进行运行速度比较。 二、实验目的: (1)进一步熟练掌握8086汇编语言编译调试工具和环境的操作; (2)掌握完整8086汇编的程序设计编写方法; (3)掌握简单的数值码制转换方法; (4)掌握键盘输出的DOS功能调用方法。 三、实验说明: 计算机中的数值有各种表达方式,这是计算机的基础。掌握各种数制、码制之间的转换是一种基本功;利用DOS功能调用实现在屏幕上显示字符或数字的方法是本课程的基本要求之一。 四、除法方法: 1、算法说明:三位数先除以100,得到的商就是百分位的结果;将之前一次的余数除以10,得到的商就是十分位的结果;剩下来的余数就是个位的结果。 2、程序流程图: 图1 除法程序流程图 3、程序: DATA SEGMENT ; 数据段 RESULT_1 DB 1

RESULT_2 DB 1 RESULT_3 DB 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 MOV DS, AX ; 设置数据段 MOV AX, STACK MOV SS, AX ; 设置堆栈段 LEA SP, STACK_TOP ; 设置栈顶指针 ;--------------------------------------- ; 程序的中间部分 MOV AX, 467 MOV CL, 100 DIV CL MOV RESULT_1, AL ; 除以 100, 得百位数 MOV AL, AH MOV AH, 0 MOV CL, 10 DIV CL MOV RESULT_2, AL ; 余数除以 10, 得十位数 MOV RESULT_3, AH ; 余数为个位数 ;------------------------------------------ ; 程序结束必须要有的两条指令 MOV AX, 4C00H ; INT 21H ; ;------------------------------------------ CODE ENDS

实验二二进制码转换为bcd码实验报告终审稿)

实验二二进制码转换为 B C D码实验报告 公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]

实验二二进制码转换为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文件夹,点击文件,单击“确定”即可装入源文件,再单击工具栏中编译,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“连续运行”或工具图标运行,即开始运行程序。 (2)复位“系统复位”键,由于AX中给定数为0FFFF,查看BCD码结果保留在4100H~4104H单元中,故其值应为06、05、05、03、05。 注:操作过程参照“实验一二进制多位加法运算”。 五、实验程序清单 X:\DICE-8086K3微机原理与接口实验箱CDROM\CODE\86kasm\ ;将AX拆为5个BCD码,并存入Result开始的5个单元 DATA SEGMENT AT 0 ;,BIN-->BCD ORG 4000H RESULT DB 5 DUP() DATA ENDS CODE SEGMENT

(实验二)二进制码转换为BCD码实验报告

实验二二进制码转换为 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-->BCD ORG 4000H RESULT DB 5 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA ORG 2CE0H START PROC NEAR MOV AX, DATA MOV DS, AX MOV DX,0000H MOV AX, 65535 MOV CX, 10000 DIV CX MOV RESULT, AL;除以 10000,得 WAN位数 MOV AX,DX MOV DX,0000H MOV CX, 1000 DIV CX MOV RESULT+1, AL;除以 1000,得 QIAN位数 MOV AX,DX MOV DX,0000H MOV CX, 100 DIV CX MOV RESULT+2, AL;除以 100,得 BAI 位数 MOV AX,DX MOV DX,0000H MOV CX, 10 DIV CX MOV RESULT+3, AL;除以 10,得 SHI 位数 MOV RESULT+4, DL;得 GE位数 JMP $ CODE ENDS END START

智能仪表多字节二进制数转换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码的转换。

16位二进制转BCD码

二进制转换成十进制 BCD码(加3移位法) 算法 "二进制数调整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码255 Library ieee; --16位二进制转BCD码(0到9999) Use ieee.std_logic_unsigned.all; Use ieee.std_logic_1164.all; Entity B_BCD is Port ( 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 is begin process(clk,a) variable i: std_logic_vector(4 downto 0); variable in_a,out_a :std_logic_vector(15 downto 0); begin if ena='0'then in_a:=a; i:="00000"; out_a:="0000000000000000"; elsif clk'event and clk='1' then if 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" then if 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

二进制码转换为十进制(BCD)码

二进制码转换为十进制(BCD)码 转换原理 对于一个8位二进制码bn-1bn-2……b1b0,,其在十进制编码方式下的值为 把上式写出套乘的形式: 式中的每项乘2,相当于将寄存器中的二进制码左移1位,这就意味着利用移位寄存器可以完成二进制与8421BCD的转换。[2] 在移位的过程中,当现态Sn<5时,次态不变。当现态Sn=5、6、7时,左移一次,其次态Sn+1将会超过9,对于一个BCD码来说,这样的状态属于禁用状态。而当Sn=8、9时,左移1位,则会向高1位的BCD码输入一个进位的信号 ,由于二进制和BCD码权不一致,当发生进位时,虽然码元只是左移1位,但次态Sn+1将减少6。基于上面这两种情况,在B/BCD转换时需要对转换结果加以校正。校正过程如下:当Sn>=5时,我们让Sn先加上3,然后再左移1位,次态 Sn+1=2(Sn+3)=2Sn+6,正好补偿由于进位而减少的数值,并且向后一个变换单元送入一个进位信号,这个方法叫“加3移位法”。 注意:现态和次态都是指BCD码,即用4位二进制表示的1位BCD码。我们对Sn=8、9时举个例子:BCD码的1000(8)乘以2为0001_0110(16),但是左移后变为0001_0000,减少了6。所以需要加上6,这里的方法是加3左移一位,相当于加上6。 转换方法 首先,先了解二进制与BCD码的位数对应关系,比如一个8位二进制码,可以表示的最大十进制数为255,转换成BCD码为 0010_0101_0101,共需12位,其中每4位组成一个BCD单元,有三个BCD单元,分别表示百位(hundreds)、十位(tens)和个位(units)。n位二进制码转换成D位BCD码的n~D 对应关系表见表1。 表1 n~D对应关系

BCD编码

BCD码简介 什么是BCD码? 在PLC数据转换中经常接触到BCD码,那么什么是BCD码,什么是压缩的BCD 码?二者又有什么区别呢? 在数字系统中,各种数据要转换为二进制代码才能进行处理,而人们习惯于使用十进制数,所以在数字系统的输入输出中仍采用十进制数,这样就产生了用四位二进制数表示一位十进制数的方法,这种用于表示十进制数的二进制代码称为二-十进制代码(Binary Coded Decimal),简称为BCD码。它具有二进制数的形式以满足数字系统的要求,又具有十进制的特点(只有十种有效状态)。在某些情况下,计算机也可以对这种形式的数直接进行运算。常见的BCD码表示有以下几种。 8421BCD编码 这是一种使用最广的BCD码,是一种有权码,其各位的权分别是(从最有效高位开始到最低有效位)8,4,2,1。 例写出十进数563.97D对应的8421BCD码。 563.97D=0101 0110 0011 . 1001 01118421BCD 例写出8421BCD码1101001.010118421BCD对应的十进制数。 1101001.010118421BCD=0110 1001 . 0101 10008421BCD=69.58D 在使用8421BCD码时一定要注意其有效的编码仅十个,即:0000~1001。四位二进制数的其余六个编码1010,1011,1100,1101,1110,1111不是有效编码。 2421BCD编码 2421BCD码也是一种有权码,其从高位到低位的权分别为2,4,2,1,其也可以用四位二进制数来表示一位十进制数。其编码规则如下表。 余3码 余3码也是一种BCD码,但它是无权码,但由于每一个码对应的8421BCD码之间相差3,故称为余3码,其一般使用较少,故正须作一般性了解,具体的编码如下表。

汇编程序设计—二进制码转换为BCD码

二进制码转换为BCD码 一、实验目的 1、掌握数码转换基本方法,加深对数码的理解。 2、掌握顺序结构程序设计的基本方法。 二、实验内容 将AX的内容转换为十进制BCD码。 AX中给定数为0FFFF,将其转化为BCD码,结果保留在名字为result开始的数据区中,此数据区段地址为0、且偏移地址从4100H开始。值分别为06、05、05、03、05。

三、实验程序框图

四、源程序 DA TA SEGMENT A T 0 ORG 4100H RESULT DB 5 (0) DA TA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA MOV AX,DA TA MOV DS,AX MOV AX,0FFFFH ;0FFFFH送至AX MOV BX,10000 ;10000送至BX DIV BX ;AX/BX,商存于AL,余数存于DX MOV RESULT,AL ;将万位数存入RESULT中 MOV AX,DX ;余数存入AX中 MOV DX,0 ;DX清零 MOV BX,1000 DIV BX MOV RESULT+1,AL ;将千位数存入RESULT+1中 MOV AX,DX MOV DX,0 MOV BX,100 DIV BX MOV RESULT+2,AL ;将百位数存入RESULT+2中

MOV AX,DX MOV DX,0 MOV BX,10 DIV BX MOV RESULT+3,AL ;将十位数存入RESULT+3中MOV RESULT+4,DL ;将个位数存入RESULT+4中 MOV AH,4CH INT 21H CODE ENDS END START

BCD码怎么转换成标准二进制形式

BCD码怎么转换成标准二进制形式? 二进制编码的十进制数,简称BCD码(Binarycoded Decimal). 这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8,9 这十个数符。最常用的BCD码称为8421BCD码,8.4.2.1 分别是4位二进数的位取值。点击此处将给出十进制数和8421BCD编码的对应关系表。 1、BCD码与十进制数的转换 BCD码与十进制数的转换.关系直观,相互转换也很简单,将十进制数75.4转换为BCD码如: 75.4=(0111 (0101.0100)BCD 若将BCD码1000 0101.0101转换为十进制数如: (1000 0101.0101)BCD=85.5 注意:同一个8位二进制代码表示的数,当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数时,数值是不相同的。 例如:00011000,当把它视为二进制数时,其值为24;但作为2位BCD码时,其值为18。 又例如00011100,如将其视为二进制数,其值为28,但不能当成BCD码,因为在8421BCD码中,它是个非法编码 . 2、BCD码的格式 计算机中的BCD码,经常使用的有两种格式,即分离BCD码,组合BCD码。 所谓分离BCD码,即用一个字节的低四位编码表示十进制数的一位,例如数82的存放格式为: _ _ _1 0 0 0 _ _ _ _0 0 1 0 其中_表示无关值。 组合BCD码,是将两位十进制数,存放在一个字节中,例82的存放格式是1000 0010 3、BCD码的加减运算 由于编码是将每个十进制数用一组4位二进制数来表示,因此,若将这种BCD码直接交计算机去运算,由于 计算机总是把数当作二进制数来运算,所以结果可能会出错。例:用BCD码求38+49。 解决的办法是对二进制加法运算的结果采用"加6修正,这种修正称为BCD调整。即将二进制加法运算的结果修正为BCD码加法运算的结果,两个两位BCD数相加时,对二进制加法运算结果采用修正规则进行修正。修正规则: (1)如果任何两个对应位BCD数相加的结果向高一位无进位,若

双字节二进制转换为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位变换的计算方法极为简单,只是使用左移、加减等指令即可,基本上不涉及多字节的运算。 编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。 做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。 感兴趣的网友可以留言,写出自己编写的程序。 51单片机把4位16进制数转成10进制数的方法 2位16进制转10进制,用除以10求商跟余数的方法,即可。 4位16进制数呢?DIV指令只可以对2位16进制数进行除法运算啊,求高手解答。 例如把TH1 TL1的数值转成十进制, 分别存入R4 R3 R2 R1 R0。 我要的是汇编的方法,C语言还没学到。 悬赏分:30 - 解决时间:2010-2-10 22:47 ;------------------------------------------------------------------ 最佳答案:两个字节的二进制数转换成BCD码,必须编写程序来解决。

bcd码的转换

bcd码也叫8421码就是将十进制的数以8421的形式展开成二进制,大家知道十进制是0~9十个数组成,着十个数每个数都有自己的8421码: 0=0000 1=0001 2=0010 3=0011 4=0100 5=0101 6=0110 7=0111 8=1000 9=1001 举个例子: 321的8421码就是 3 2 1 0011 0010 0001 二进制编码的十进制数,简称BCD码(Binarycoded Decimal). 这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8,9 这十个数符。最常用的BCD码称为8421BCD 码,8.4.2.1 分别是4位二进数的位取值。右图为十进制数和8421BCD编码的对应关系表: 1、BCD码与十进制数的转换 BCD码与十进制数的转换.关系直观,相互转换也很简单,将十进制数75.4转换为BCD码如: 75.4=(0111 (0101.0100)BCD 若将BCD码1000 0101.0101转换为十进制数如: (1000 0101.0101)BCD=85.5 注意:同一个8位二进制代码表示的数,当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数时,数值是不相同的。 例如:00011000,当把它视为二进制数时,其值为24;但作为2位BCD码时,其值为18。 又例如00011100,如将其视为二进制数,其值为28,但不能当成BCD码,因为在8421BCD码中,它是个非法编码. 2、BCD码的格式 计算机中的BCD码,经常使用的有两种格式,即分离BCD码,组合BCD 码。 所谓分离BCD码,即用一个字节的低四位编码表示十进制数的一位,例如

(实验三)BCD码转换为二进制码实验报告

实验三BCD码转换为二进制码 一、实验目的 1、掌握BCD码到二进制码的转换方法。 2、用于BCD码转入信号处理。 二、实验内容 对于内存中给定的几个十进制BCD码数转换为二进制数。 三、实验程序框图 四、实验步骤 脱机模式: ⑴在P.态下,按SCAL键,然后在内存单元4000H~4006H中依次写入四个十进制数(12、 34、56、78)的BCD码,即输入01、02、03、04、05、06、07,按MON键,返回P状态。 ⑵在P.态下,输入2D40,按EXEC键。 ⑶复位RST键,查看结果在4100~4107中,其内容应为:0C,00,22,00,38,00,4E,00。 联机模式: (1)在内存单元4000H~4006H中依次写入四个十进制数(12、34、56、78)的BCD码,即输入01、02、03、04、05、06、07,按MON键,返回P状态。 (2)在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”

或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开8kAsm文件夹,点击S3.ASM 文件,单击“确定”即可装入源文件,再单击工具栏中编译,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“连续运行”或工具图标运行,即开始运行程序。 (3)按“系统复位”键,查看结果在4100~4107中,其内容应为:0C,00,22,00,38,00,4E,00。 五、实验程序清单 X:\DICE-8086K3微机原理与接口实验箱CDROM\CODE\86kasm\S3.ASM CODE SEGMENT ;S3.ASM ,BCD 码转换为2 进制码ASSUME CS:CODE ORG 2D40H START: MOV CX,0004H ;输入数据长度。[4000]:01,02.. MOV DI,4000H ;结果存放在 [4100]: 0C,00,. CON1: MOV AL,[DI] ADD AL,AL ;*2 MOV BL,AL ADD AL,AL ;*2 ADD AL,AL ;*2 ADD AL,BL ;*10 INC DI MOV AH,00 ADD AL,[DI] ;BCD码个位,十位相加 MOV [DI+0FFH],AX ;存结果 INC DI ;结果地址加1 LOOP CON1 ;CX不为零继续 JMP $ CODE ENDS END START

实验三 二进制码转换成BCD码

班级:通信122班姓名:张盼学号:122235 同组人:何柳 实验三二进制码转换成BCD码 一、实验目的 1、设计并实现一个4位二进制码转换成BCD码的转换器。 2、巩固使用ISE软件进行可编程器件开发的过程,掌握实验箱的使用方法。 3、掌握ISE辅助工具iMPACT软件的使用,完成FPGA的配置过程。 二、实验步骤: 1、启动ISE集成开发环境,创建工程并输入设计源文件。 2、通过仿真验证设计的正确性,并锁定引脚,完成设计实现过程。 3、根据第二步引脚锁定情况在实验箱上连线,将输入信号连接到拨动开关,输出信号连接到发光二极管。 4、连接实验箱电源线,并用下载线(USB接口线)将实验箱与计算机相连。 5、打开实验箱电源开关。 6、利用iMPACT进行程序下载。 7、在实验箱上验证4位二进制码转换成BCD码的转换器的功能。改变拨码开关的状态,观察实验结果。 三、实验原理 对于不同代码之间的转换,有用硬件实现的,也有用软件实现的。对于硬件实现,可以用一般的组合逻辑电路实现,也可以用译码器、编码器或只读存储器来实现。 四位二进制码转换为BCD码的真值表见表1。本试验根据此真值表设计一个组合电路,完成四位二进制码转换为BCD码的功能,并在实验箱上验证电路的正确性。 表1 四位二进制码转换为BCD码的真值表 输入信号(二进制码)输出信号(BCD码) D3 D2 D1 D0 B4 B3 B2 B1 B0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 四、源程序

单片机实验二进制BCD码转换

实验二二进制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 30H ORG 0000H LJMP START BINTOBCD: MOV B,#100 DIV AB MOV RESULT,A ;除以100得百位数 MOV A,B MOV B,#10 DIV AB MOV RESULT+1,A ;余数除以10得十位数 MOV RESULT+2,B ;余数为个位数 RET START: MOV SP,#40H MOV A,#123 CALL BINTOBCD LJMP $ END

相关文档
相关文档 最新文档