二进制到BCD的转换
- 格式:doc
- 大小:1.05 MB
- 文档页数:3
实验二二进制转换成BCD码
一、实验目的
设计并实现一个4位二进制码转换成BCD码的转换器。
二、实验仪器
SOPC实验箱、Quartus II软件
三、实验原理
对于不同代码之间的转换,有用硬件实现的,也有用软件实现的。
对于硬件实现,可以用一般的组合逻辑电路实现,也可以用译码器、编码器或只读存储器来实现。
本实验的原理见表3-1所示。
四、实验内容
1、启动Quartus II 建立一个空白工程,然后命名。
2、新建VHDL源程序文件并命名,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
3、新建仿真文件,对各模块设计进行仿真,验证设计结果。
打印仿真结果。
五、实验步骤
1.各模块程序:
1)用文本输入法实现秒的计时,程序如下:
module BCD(D,B);
output [4:0] B;
input [3:0] D;
reg [4:0] B;
always@ (D)
begin
if(D<4'b1010) begin B[3:0]=D[3:0];B[4]=1'b0;end
else begin B[3:0]=D[3:0]-4'b1010;B[4]=1'b1;end
end
endmodule
2.建立工作库文件夹,输入设计项目原理图或vorilog代码并存盘。
3.生成RTL图。
4.进行波形仿真,仿真后波形如下:
六、实验结果与现象验证
输入任何一个十六进制数产生了与二进制码转换成BCD码的转换真值表相对于的BCD码.。
利用verilog将二进制码转换为十进制BCD码下面我自己加了注释小序:先说一个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位。
之前写的代码在转换完之后没有对count清零,所以在仿真时候需要用rst_n清零,感谢博友onlytime417的提示,经过修改之后可以对不同的输入值连续转换,而不需要rst_n的复位,下面是修改后的代码以及仿真结果,(该转换模块已经在实际项目中应用)。
CODE: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;//全部位数,包括hun,ten,one,bin////////////////////// 计数部分////////////////////////always @ ( posedge clk or negedge rst_n )beginif( !rst_n )count<=0;else if (count==9)count<=0;elsecount<=count+1;end////////////////////// 二进制转换为十进制///////////////////判断四种情况,1:个位和十位都大于52:只有一个大于53:都不大于5always @ (posedge clk or negedge rst_n )beginif (!rst_n)shift_reg=0;else if (count==0)shift_reg={10'b0000000000,bin};else if ( count<=8) //实现8次移位操作if(shift_reg[11:8]>=5) //判断个位是否>5,如果是则+3 beginif(shift_reg[15:12]>=5) //判断十位是否>5,如果是则+3 beginshift_reg[15:12]=shift_reg[15:12]+2'b11;shift_reg[11:8]=shift_reg[11:8]+2'b11;shift_reg=shift_reg<<1; //对个位和十位操作结束后,整体左移endelsebeginshift_reg[15:12]=shift_reg[15:12];shift_reg[11:8]=shift_reg[11:8]+2'b11;//个位加3shift_reg=shift_reg<<1;endendelsebeginif(shift_reg[15:12]>=5) //十位>=5beginshift_reg[15:12]=shift_reg[15:12]+2'b11;shift_reg[11:8]=shift_reg[11:8];shift_reg=shift_reg<<1;endelsebeginshift_reg[15:12]=shift_reg[15:12];shift_reg[11:8]=shift_reg[11:8];shift_reg=shift_reg<<1;endendendend/////////////////输出赋值//////////////////////////always @ ( posedge clk or negedge rst_n )if ( !rst_n )beginone<=0;ten<=0;hun<=0;endelse if (count==9) //此时8次移位全部完成,将对应的值分别赋给个,十,百位beginone<=shift_reg[11:8];ten<=shift_reg[15:12];hun<=shift_reg[17:16];endendendmodule。
题目:深度探讨汇编语言下16位二进制转BCD码的实现方法在计算机科学与技术领域中,汇编语言是一种底层的编程语言,适用于对硬件进行直接控制和优化。
而16位二进制转BCD码正是其中一个常见的应用场景。
在本文中,我们将深入探讨在8086汇编语言下实现16位二进制转BCD码的方法,并分析其原理和实现步骤。
1. 汇编语言简介汇编语言是一种低级语言,与机器语言一一对应,因此可以直接操作计算机硬件。
相比高级语言,如C语言和Java,汇编语言执行效率更高,并且能够精确地控制硬件资源。
在8086汇编语言中,我们可以直接操作寄存器和内存,实现对16位二进制数据的处理。
2. 16位二进制转BCD码的原理BCD码是一种二进制编码方式,用4位二进制数表示一位十进制数。
16位二进制数转BCD码的核心思想就是将每一位二进制数转换为对应的BCD码。
在8086汇编语言中,我们可以通过多次除以10和取余数来完成这一转换过程,具体步骤如下:1) 将16位二进制数存放在两个8位寄存器中;2) 用除法指令将两个8位寄存器中的内容转换为对应的BCD码;3) 将转换后的BCD码存放在指定的内存单元中。
3. 实现方法及步骤下面我们将详细介绍实现16位二进制转BCD码的具体步骤,以帮助读者更好地理解和掌握这一转换方法。
步骤1:准备工作在开始之前,我们需要先准备好16位二进制数和相应的寄存器、内存单元等资源。
在8086汇编语言中,我们可以使用DW(定义字)指令定义16位二进制数,使用MOV(将数据从一个位置转移到另一个位置)指令将数据加载到寄存器中。
步骤2:除法运算接下来,我们需要使用DIV(无符号数除法)指令将16位二进制数转换为BCD码。
通过多次除以10和取余数的运算,我们可以得到每一位二进制数对应的BCD码。
步骤3:存储结果我们将转换后的BCD码存放在指定的内存单元中,以便后续的处理和使用。
4. 总结及个人观点总体来说,在8086汇编语言下实现16位二进制转BCD码的过程相对复杂,需要进行多次除法运算和数据转移。
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 码作者:佚名来源:不详录入:Admin更新时间:2008-7-26 20:09:41点击数:2【字体:】本例为单字节二进制数(0X20)转换为非压缩BCD 码,存在0X25,0X24,0X23 中,0X25 为百位,0X23 为个位。
main: MOV a,@0xa4 ;赋值MOV 0x20,aMOV 0x21,aMOV 0x22,aMOV a,@0x0 ;0x23,0x24,0x25 单元清0MOV 0x23,aMOV 0x24,aMOV 0x25,aMOV a,@0x64 ;对100 的个数计数MOV 0x26,aMOV a,@0x25 ;百位存在0x25 中MOV 0x04,acall a0 ;调计数子程MOV a,@0x0a ;对10 的个数计数MOV 0x26,adec 0x04 ;个位存在0x24 中call a0MOV a,0x22 ;除去百位,十位,余下的即个位,存入0x23MOV 0x23,aself: jmp selfa0: ;计数子程MOV a,0x26sub 0x22,ajbs 0x03,2jmp a1inc 0x00 ;无余数则对应位加1MOV a,@0x0 ;0x21 与0x22 在返回时应保持相同MOV 0x21,areta1: jbs 0x03,0 ;小于则跳a2jmp a2inc 0x00 ;大于则计数值加1MOV a,0x22MOV 0x21,a ;将0x22 保存到0x21 中jmp a0 ;跳回a0 继续计数a2: MOV a,0x21 ;0x21 中保存的减之前的数据,此时恢复到0x22 MOV 0x22,areteop本例为单字节二进制数(0X20)转换为非压缩BCD 码,存在0X25,0X24,0X23 中,0X25 为百位,0X23 为个位。
main: MOV a,@0xa4 ;赋值MOV 0x20,aMOV 0x21,aMOV 0x22,aMOV a,@0x0 ;0x23,0x24,0x25 单元清0MOV 0x23,aMOV 0x24,aMOV 0x25,aMOV a,@0x64 ;对100 的个数计数MOV 0x26,aMOV a,@0x25 ;百位存在0x25 中MOV 0x04,acall a0 ;调计数子程MOV a,@0x0a ;对10 的个数计数MOV 0x26,adec 0x04 ;个位存在0x24 中call a0MOV a,0x22 ;除去百位,十位,余下的即个位,存入0x23 MOV 0x23,aself: jmp selfa0: ;计数子程MOV a,0x26sub 0x22,ajbs 0x03,2jmp a1inc 0x00 ;无余数则对应位加1MOV a,@0x0 ;0x21 与0x22 在返回时应保持相同MOV 0x21,areta1: jbs 0x03,0 ;小于则跳a2jmp a2inc 0x00 ;大于则计数值加1MOV a,0x22MOV 0x21,a ;将0x22 保存到0x21 中jmp a0 ;跳回a0 继续计数a2: MOV a,0x21 ;0x21 中保存的减之前的数据,此时恢复到0x22 MOV 0x22,areteop。
⼆进制转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码中的16。
我们也可以在移位之前进⾏判断,如果移位之前的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_cnt;always @(posedge clk or negedge rst_n)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)begindata_bcd_r <= data_bcd_r<<1;shift_cnt <= shift_cnt + 1;state <= state + 1;endelsestate <= 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)码.将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123.EKO7sEcVR7b5E2RGbCAP三、实验内容及步骤1、启动计算机,打开伟福仿真软件,进入仿真环境.首先进行仿真器的设置,选择使用伟福软件模拟器.2、打开TH2.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA>,点击暂停按钮,观察地址30H、31H、32H的数据变化,30H更新为01,31H更新为02,32H更新为03.用键盘输入改变地址30H、31H、32H的值,点击复位按钮后,可再次运行程序,观察其实验效果.修改源程序中给累加器A的赋值,重复实验,观察实验效果.EKO7sEcVR7p1EanqFDPw3、打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解.EKO7sEcVR7DXDiTa9E3d四、流程图及源程序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.流程图一、实验目的12二、实验说明.若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序.EKO7sEcVR75PCzVD7HxA三、实验内容及步骤1、启动计算机,打开伟福仿真软件,进入仿真环境.首先进行仿真器的设置,选择使用伟福软件模拟器.2、打开TH4.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA>,点击暂停按钮,观察地址30H、31H、32H、33H的数据变化,30H更新为0,31H更新为1,32H更新为2,33H更新为 3.用键盘输入改变地址30H、31H、32H、33H的值,点击复位按钮后,可再次运行程序,观察其实验效果.修改源程序中给30H~33H的赋值,重复实验,观察实验效果.EKO7sEcVR7jLBHrnAILg3、打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解.EKO7sEcVR7xHAQX74J0X四、流程图及源程序1、流程图2.源程序ORG 0LJMP STARTFUNC0: MOV 30H,RETFUNC1: MOV 31H,#1RETFUNC2: MOV 32H,#2RETFUNC3: MOV 33H,#3RETFUNCENTER:ADD A,ACC ;AJMP为二字节指令,调用号×2MOV DPTR,#FUNCTABJMP @A+DPTRFUNCTAB:AJMP FUNC0AJMP FUNC1AJMP FUNC2AJMP FUNC3START:MOV A,#0CALL FUNCENTERMOV A,#1CALL FUNCENTERMOV A,#2CALL FUNCENTERMOV A,#3CALL FUNCENTERLJMP $END第二部分硬件基础实验实验七 P1口输入、输出实验一、实验目的1、学习P1口的使用方法2、学习延时子程序的编写和使用二、实验说明P1口是准双向口,它作为输出口时与一般的双向口使用方法相同.由准双向口结构可知当P1口用为输入口时,必须先对它置“1”.若不先对它置“1”,读入的数据是不正确的.EKO7sEcVR7LDAYtRyKfE三、实验内容及步骤实验(一>:用P1口做输出口,接八位逻辑电平显示,程序功能使发光二极管从右到左轮流循环点亮.1、使用单片机最小应用系统1模块.关闭该模块电源,用扁平数据线连接单片机P1口与八位逻辑电平显示模块.EKO7sEcVR7Zzz6ZB2Ltk2、安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,打开仿真器电源.EKO7sEcVR7dvzfvkwMI13、启动计算机,打开伟福仿真软件,进入仿真环境.首先进行仿真器的设置,选择仿真器型号、仿真头型号、CPU类型.选择通信端口,点击测试串行口,通信成功既可退出设置,进行仿真.EKO7sEcVR7rqyn14ZNXI4、打开TH7A.ASM源程序,进行编译.编译无误后,点击全速执行按钮运行程序,观察发光二极管显示情况.发光二极管单只从右到左轮流循环点亮.EKO7sEcVR7EmxvxOtOco5、把源程序编译成OBJ文件,再烧录到89C51芯片中.实验(二>:用P1.0、P1.1作输入接两个拨断开关,P1.2、P1.3作输出接两个发光二极管.程序读取开关状态,并在发光二极管上显示出来.EKO7sEcVR7SixE2yXPq51、用导线连接P1.0、P1.1到两个拨断开关,P1.2、P1.3到两个发光二极管.2、打开TH7B.ASM源程序,编译无误后,全速运行程序,拨动拨断开关,观察发光二极管的亮灭情况.向上拨为点亮,向下拨为熄灭.EKO7sEcVR76ewMyirQFL3、把源程序编译成OBJ文件,再烧录到89C51芯片中.四、流程图及源程序1.流程图<一)实验一ORG 0 Loop: mov a, #0FEhmov r2,#8Output: mov P1,arl aAcall Delaydjnz r2,OutputLjmp LoopDelay: mov r6,#0mov r7,#0DelayLoop: ;延时程序 djnz r6,DelayLoopdjnz r7,DelayLoopretend<二)实验二KeyLeft BIT P1.0 ;定义KeyRight BIT P1.1Ledleft BIT P1.2LedRight BIT P1.3ORG 0SETB KeyLeft ;欲读先置一SETB KeyRightLoop: Mov c,keyleftMov LEDLeft,cMOV C,KeyRightMov LEDRIGHt,cLJMP LoopEND五、思考题<1)对于本实验延时子程序Delay: MOV R6,0MOV R7, 0DelayLoop:DJNZ R6,DelayLoopDJNZ R7,DelayLoopRET本模块使用12MHz晶振,粗略计算此程序的执行时间为多少?六、电路图实验十 8255输入、输出实验一、实验目的1、了解8255芯片结构及接口方式2、掌握8255输入、输出的编程方法 二、实验说明了解用到的芯片引脚及功能:8255是可编程的并行输入/输出接口芯片,通用性强且使用灵活.8255按功能可分为三个部分,即:总线接口电路,口电路和控制逻辑电路.EKO7sEcVR7y6v3ALoS891、口电路:8255共有三个八位口,其中A口和B口是单纯的数据口,供数据I/O口使用.2、总线接口电路:它用于实现8255和单片机芯片的信号连接.(1>CS——片选信号.(2>RD——读信号.(3>WR——写信号.(4>A0、A1——端口选择信号.8255共有四个可寻址的端口,用二位编码可以实现.3、控制逻辑电路:它是控制寄存器,用于存放各口的工作方式控制字.本实验是利用8255可编程并行口芯片,实现数据的输入、输出.可编程通用接口芯片8255A有三个八位的并行的I/O口,它有三种工作方式.本实验采用的方式为0:PA口输出,PB口输入.工作方式0是一种基本的输入输出方式.在这种方式下,三个端口都可以由程序设置为输入或输出,其基本功能可概括如下:EKO7sEcVR7M2ub6vSTnP1、可具有两个八位端口<A、B)和两个4位端口<C口的上半部分和下半部).2、数据输出时可以锁存,输入时不需锁存.本实验中,8255的端口地址由单片机的P2.0、P2.1和P2.7决定.控制口的地址为7FFFH;A口的地址为7CFFH;B口的地址为7DFFH;C口的地址为7CFFH.EKO7sEcVR70YujCfmUCw三、内容及步骤本实验分两种情况来进行:(一> PA口作为输出口. (二> PA 口作为输出口,PB口作为输入口.(一>PA口作为输出口,接8位发光二极管,程序功能使发光二极管单只从右到左轮流循环点亮.1、单片机最小应用系统1的 P0口接8255的D0~D7口,8255的PA0~PA7接八位逻辑电平显示,单片机最小应用系统1的P2.0、P2.1、P2.7、RD、WR分别接8255的A0、A1、CS、RD、WR,RESET接上复位电路.EKO7sEcVR7eUts8ZQVRd2、安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,打开仿真器电源.EKO7sEcVR7sQsAEJkW5T3、启动计算机,打开伟福仿真软件,进入仿真环境.选择仿真器型号、仿真头型号、CPU 类型;选择通信端口,测试串行口.EKO7sEcVR7GMsIasNXkA4、打开TH10A.ASM 源程序,编译无误后,全速运行程序.发光二极管单只从右到左轮流循环点亮.5、可把源程序编译成OBJ 文件,烧录到89C51芯片中. (二>PA 口作为输出口,PB 口作为输入口,PA 口读入键信号送八位逻辑电平显示模块显示.1、8255的PA0~PA7接八位逻辑电平显示,PB0~PB7口接查询式键盘模块,单片机最小应用系统1的P2.0、P2.1、P2.7、RD 、WR 分别接8255的A0、A1、CS 、RD 、WR ,RESET 接上复位电路.EKO7sEcVR7TIrRGchYzg2、打开TH10B.ASM 源程序,编译无误后,全速运行程序.按查询式键盘各键,观察发光二极管的亮灭情况,发光二极管与按键相对应,按下为点亮,松开为熄灭.EKO7sEcVR77EqZcWLZNX3、可把源程序编译成OBJ 文件,烧录到89C51芯片中. 四、流程图及源程序EKO7sEcVR7lzq7IGf02E源程序如下:<一)PA口输出:org 0hporta equ 7CFFh ;A口Portb equ 7DFFh ;B口Portc equ 7EFFh ;C口caddr equ 7FFFh ;控制字地址 mov a,#80h ;方式0mov dptr, #caddrmovx @dptr, aLoop: mov a, #0FEhmov r2, #8Output:mov dptr, #portamovx @dptr, acall Delayrl adjnz r2, Outputljmp LoopDelay: mov r6, #0mov r7, #0DelayLoop:djnz r6, DelayLoopdjnz r7, DelayLoopretend<二)PA口输出,PB口输入ORG 0PortA equ 7CFFh ;A口PortB equ 7DFFh ;B口PortC equ 7EFFh ;C口CAddr equ 7FFFh ;控制字地址SJMP STARTSTART:org 30hmov a, #82h ;方式0,PA,PC输出,PB输入mov dptr, #caddrmovx @dptr, amov dptr, #PortBmovx a, @dptr ;读入B口mov dptr, #PortAmovx @dptr, a ;输出到A口call delaySjmp STARTend五、思考题试用8255PA口作为输出口,PB作为输入口,PC作为输入口完成8255的输入、输出实验<其中PA口LED数码显示,PB接拨断开关,PC接查询式键盘实验模块).EKO7sEcVR7zvpgeqJ1hk六、电路图实验十二 5LED静态串行显示一、实验目的1、掌握数字、字符转换成显示段码的软件译码方法2、静态显示的原理和相关程序的编写 二、实验电路1、静态显示,电路中图所示.显示器由5个LED 数码管组成.输入只有两个信号,它们是串行数据线DIN 和移位信号CLK.5个串/并移位寄存器芯片74LS164首尾相连.每片的并行输出作为LED 数码管的段码.EKO7sEcVR7NrpoJac3v174LS164的引脚图如图所示;74LS164为8位串入并出移位寄存器,1、2为 串行输入端,Q0~Q7为并行输出端,CLK 为移位时钟脉冲,上升沿移入一位;MR 为清零端,低电平时并行输出为零.EKO7sEcVR71nowfTG4KI 三、实验内容及步骤单片机的P3.0作数据串行输出,P3.1作移位脉冲输出,可参考实验十一串行数转换并行数.1、使用单片机最小应用系统1模块,用导线连接RXD 、TXD 到串行静态显示模块的DIN 、CLK 端.2、安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,打开仿真器电源.EKO7sEcVR7fjnFLDa5Zo74LS1643、启动计算机,打开伟福仿真软件,进入仿真环境.选择仿真器型号、仿真头型号、CPU类型;选择通信端口,测试串行口.EKO7sEcVR7tfnNhnE6e54、打开TH12.ASM源程序,编译无误后,全速运行程序.5LED 显示“89C51”.程序停止运行时,显示不变,说明静态显示模块具有数据锁存功能.EKO7sEcVR7HbmVN777sL5、可把源程序编译成OBJ文件,烧录到89C51芯片中.四、流程图及源程序1、流程图2、源程序;置存储区首址;置缓冲区首址;置串行输出口;置时钟输出口ORG 0MOV 30H, #8 ;存入显示数据MOV 31H, #9MOV 32H, #CMOV 33H, #5MOV 34H, #1DISP: MOV R0, #DBUF0MOV R1, #TEMPMOV R2, #5DP10: MOV DPTR, #SEGTAB ;表头地址MOV A, @R0MOVC A, @A+DPTR ;查表指令MOV @R1, AINC R0INC R1DJNZ R2, DP10MOV R0, #TEMP ;段码地址指针MOV R1, #5 ;段码字节数DP12: MOV R2, #8 ;输出子程序 MOV A, @R0 ;取段码DP13: RLC A ;段码左移MOV DIN, C ;输出一位段码CLR CLK ;发送移位脉冲一位SETB CLKDJNZ R2, DP13INC R0DJNZ R1, DP12SJMP $SEGTAB:DB 3FH,06H,5BH,4FH,66H,6DH ;0,1,2,3,4,5EKO7sEcVR7V7l4jRB8HsDB 7DH,07H,7FH,6FH,77H,7CH ;6,7,8,9,A,BDB 58H,5EH,7BH,71H,00H,40H ;C,D,E,F,,-DELAY: MOV R4, #03H ;延时子程序AA1: MOV R5, #0FFHAA: DJNZ R5, AADJNZ R4, AA1RETEND五、电路图实验十四查询式键盘一、实验目的1、掌握键盘和显示器的接口方法和编程方法2、掌握键盘和八段码显示器的工作原理3、静态显示的原理和相关程序的编写二、实验说明本实验提供了8个按钮的小键盘,落如果有键盘按下,则相应输出为低,如果没有键按下,则输出为高.通过这样可以判断按下什么键.在有键按下后,要有一定的延时,防止键盘抖动.EKO7sEcVR783lcPA59W9三、实验步骤及内容1、用一根扁平数据线插头连接查询式键盘实验模块与八位逻辑电平显示模块,无键按下时,键盘输出全为“1”发光二极管全部熄灭,有键按下,对应发光二极管点亮.此种电路的程序要判断是否有2个或2个以上的键盘同时按下,以免键盘分析错误.阵列式键盘的编程同样也有这样的问题要注意.EKO7sEcVR7mZkklkzaaP2、一根扁平8线插头连接查询式键盘实验模块与扫描显示实验模块.无键按下时,LED数码显示八段全部熄灭,有键按下时,则对应LED段点亮.EKO7sEcVR7AVktR43bpw3、使用静态串行显示模块显示键值.单片机最小应用系统1的 P1口接查询式键盘输出口,RXD接静态数码显示DIN,TXD接CLK.EKO7sEcVR7ORjBnOwcEd4、安装好伟福仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头.EKO7sEcVR72MiJTy0dTT5、启动计算机,打开伟福仿真软件,进入仿真环境.选择仿真器型号、仿真头型号、CPU 类型;选择通信端口,测试串行口.EKO7sEcVR7gIiSpiue7A6、打开TH14.ASM 源程序,编译无误后运行程序,在键盘上按下某个键,观察数显是否与按键值一致,键值从左至右为0~7.EKO7sEcVR7uEh0U1Yfmh7、可把源程序编译成OBJ 文件,烧录到89C51芯片中. 五、流程图及源程序1、流程图EKO7sEcVR7IAg9qLsgBX2KEY : MOV P1,存器置“1”EKO7sEcVR7WwghWvVhPE 主程序框MOV A,P1 ;读取键盘状况CJNE A, #0FFH,K00 ;有键按下AJMP KEY ;无键按下K00: ACALL DELAY ;延时去抖动MOV A,P1CJNE A,#0FFH,K01 ;确有键按下AJMP KEYK01: MOV R3, #8 ;8个键MOV R2,#0 ;键码MOV B,A ;暂存键值MOV DPTR,#K0TABK02: MOV A,R2MOVC A,@A+DPTR ;从键值表中取键值CJNE A,B,K04 ;键值比较K03: MOV A,P1 ;相等CJNE A #0FFH,K03 ;等键释放ACALL DELAY ;延时去抖动MOV A,R2 ;得键码RETK04: INC R2 ;不相等,到继续访问键值表DJNZ R3,K02MOV A,#0FFH ;键值不在键值中,即多键同时按下AJMP KEYK0TAB:DB 0FEH,0FDH,0FBH, 0F7H ;键值表DB 0EFH,0DFH,0BFH, 07FHDISP: MOV DBUF,AMOV DBUF+1,#16MOV DBUF+2,#16MOV DBUF+3,#16MOV DBUF+4,#16MOV R0, #DBUFMOV R1, #TEMPMOV R2, #5DP10: MOV DPTR,#SEGTABMOV A, @R0MOVC A, @A+DPTRMOV @R1, AINC R0INC R1DJNZ R2, DP10MOV R0, #TEMPMOV R1, #5DP12: MOV R2, #8MOV A, @R0DP13: RLC AMOV 0B0H,CCLR 0B1HSETB 0B1HDJNZ R2, DP13INC R0DJNZ R1, DP12RETSEGTAB: DB 3FH,06H,5BH,4FH,66H,6DH DB 7DH,07H,7FH,6FH,77H,7CH DB 58H, 5EH,79H,71H,00H,40H DELAY: MOV R4, #02HAA1: MOV R5,#0F8HAA: DJNZ R5,AADJNZ R4,AA1RETEND五、思考题1、程序如何确保每按一次键,只处理一次.六、原理图途。
二进制转bcd 组合逻辑二进制转BCD(Binary Coded Decimal)是一种将二进制数转换为BCD码的组合逻辑。
BCD码是一种表示十进制数的二进制编码方式,它使用4位二进制数来表示一个十进制数的一位。
在BCD码中,0到9的十进制数分别用0000到1001的四位二进制数表示。
在二进制转BCD的组合逻辑中,首先需要将输入的二进制数进行拆分,每个二进制位对应一个BCD位。
例如,一个8位的二进制数将被拆分成两个4位的BCD数。
然后,对每个BCD数进行转换,将其转换为对应的十进制数。
转换的方法是通过查表或使用逻辑门实现的。
对于一个4位的BCD 数,可以使用一个16行的查找表来进行转换。
表中的每一行对应一个BCD数,使用4个输出线分别表示0到9的十进制数。
通过输入BCD数对应的行号,即可得到对应的十进制数。
这个查找表可以使用ROM(只读存储器)或逻辑门电路来实现。
另一种实现二进制转BCD的方法是使用逻辑门电路。
通过逻辑门的组合,可以将一个4位的二进制数转换为对应的BCD数。
例如,对于一个4位的二进制数ABCD,其中A、B、C和D分别表示最高位到最低位,可以使用以下逻辑门电路实现转换:- 第一位BCD数的个位:个位BCD数为A + B + D;- 第二位BCD数的十位:十位BCD数为A + B + C;- 第三位BCD数的百位:百位BCD数为A + C + D;- 第四位BCD数的千位:千位BCD数为B + C + D。
通过这样的逻辑门组合,可以将一个4位的二进制数转换为对应的BCD数。
在实际应用中,二进制转BCD常常用于数字显示电路和计算机中的BCD码转换。
例如,在数字显示器中,需要将二进制数转换为BCD 码,然后通过数码管等显示设备将其显示出来。
而在计算机中,BCD 码也常常用于表示和处理十进制数。
总结起来,二进制转BCD的组合逻辑是将二进制数转换为BCD码的方法。
通过查表或使用逻辑门电路,可以将二进制数转换为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 B00 0 0 0 0 0 0 0 00 0 0 1 0 0 0 0 10 0 1 0 0 0 0 1 00 0 1 1 0 0 0 1 10 1 0 0 0 0 1 0 00 1 0 1 0 0 1 0 10 1 1 0 0 0 1 1 00 1 1 1 0 0 1 1 11 0 0 0 0 1 0 0 01 0 0 1 0 1 0 0 11 0 1 0 1 0 0 0 01 0 1 1 1 0 0 0 11 1 0 0 1 0 0 1 01 1 0 1 1 0 0 1 11 1 1 0 1 0 1 0 01 1 1 1 1 0 1 0 1四、源程序library IEEE;use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity two_bcd isPort ( din : in STD_LOGIC_VECTOR (3 downto 0);bout : out STD_LOGIC_VECTOR (4 downto 0)); end two_bcd;architecture Behavioral of two_bcd isbeginprocess(din) begincase din iswhen "0000" =>bout<= "00000"; when "0001" =>bout<= "00001"; when "0010" =>bout<= "00010"; when "0011" =>bout<= "00011"; when "0100" =>bout<= "00100"; when "0101" =>bout<= "00101"; when "0110" =>bout<= "00110"; when "0111" =>bout<= "00111"; when "1000" =>bout<= "01000"; when "1001" =>bout<= "01001"; when "1010" =>bout<= "10000"; when "1011" =>bout<= "10001"; when "1100" =>bout<= "10010"; when "1101" =>bout<= "10011"; when "1110" =>bout<= "10100"; when others =>bout<= "10101"; end case; end process; end Behavioral;五、管脚适配ISE 软件实验箱端口名称 芯片引脚号IO 类型 编号D3 N17 IN 3号实验箱D2 H18 IN D1 L14 IN D0L13INB4 F9 OUTB3 E9 OUTB2 D11 OUTB1 C11 OUTB0 F11 OUT六、实验心得本次实验是第一次使用实验箱,程序的编写上没有什么难度,主要是熟悉实验箱的过程。
微机应用系统设计学生实验报告
课程名称实验名称
实验教室实验日期班级
学生姓名实验成绩任课教师(签名)
实验目的了解如何将二进制数转换成BCD码,掌握简单的数制转换算法。
将二进制到BCD转换程序写成子程序,了解主程序调用子程序的过程。
实验内容
将累加器ACC内容拆为三个BCD码,存入内部数据缓冲区20H开始的三个存储单元中。
实验仪器设备1. PC机一台;
2. 单片机教学实验系统一套。
包括Dais-52PH+ 实验箱一个和Dais—MCS51仿真软件一套。
程
序流程
图、电
路图
源程序清单ORG 0000H
LJMP START
ORG 0030H
START:
MOV A,#123 ;将需要转换的二进制定为123 LCALL BinToBCD
SJMP $
BinToBCD:
MOV B,#100
开始
给出要转换二进制
将数除以100,得百
保存百位数
将余数再除以10,得十位
保存十位数
余数为个位数,保存个
结束
DIV AB ;将A与100相除,商存于A中,余数存于B中MOV 20H,A ;将商存于20H中,获得百位上的数据
MOV A,B ;余数存于A中
MOV B,#10
DIV AB
MOV 21H,A ;计算出十位中的数放置于21H中
MOV 22H,B ;余数即为个数,存于22H中,完成二进制转换RET
END
结果记录及分析调试时,输入地址D:20H. 20H、21H、22H内容分别是01,02,03. 当将断点定在DIV AB 处时
结果为:
收获感想
通过本次实验,我学习到为了完成将二进制转换到BCD码是要将二进制数先除以100,得BCD码百位,再将余数除以10,得BCD码十位,余数为个位从而完成目的。
再进一步在本实验基础上将二进制转换成ASCII码,清楚了二进制与ASCII码之间有30H的关系。
思考:(1)如何将二进制码转换成ASCII码?
答:由于本实验已将二进制转换成BCD码,在此基础上需分段处理成4位二进制有效形式,再加上30H。
(2)程序调用过程中,如果需要保护某些寄存器的内容,应如何处理?具体怎么实现?
答:利用堆栈完成保护寄存器指令的内容;具体指令利用PUSH、POP语句。
例如:
ORG 0000H
LJMP START
ORG 0030H
START:
MOV A,#123 ;将需要转换的二进制定为123
LCALL BinToBCD
SJMP $
BinToBCD:
MOV B,#100
DIV AB ;将A与100相除,商存于A中,余数存于B中
PUSH B ;保护寄存器B中的数据
PUSH A ;保护寄存器A中的数据
POP A ;弹出A数据
MOV 20H,A ;将商存于20H中,获得百位上的数据
POP B ;弹出B中数据
MOV A,B ;将余数存于A中
MOV B,#10
DIV AB
MOV 21H,A ;将计算出十位中的数放置于21H中
MOV 22H,B ;余数即为个数,存于22H中,完成二进制转换
RET
END
(3)子程序中如果没有RET语言,会出现什么问题?
答:程序无法返回,但对实验结果没有影响。