二进制转换成BCD码 实验报告
EDA实验报告实验二:二进制码转换成BCD码
实验二二进制转换成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码.。
(实验二)二进制码转换为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-->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转换实验报告[本站推荐]
二进制到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教学目标:知识目标:知道二进制与十进制之间的转换方法操作目标:能在二进制与十进制之间进行进制转换教学重点:二进制与十进制之间的转换教学难点:二进制与十进制之间的转换教学过程:一、复习引入上一节课已经学习了什么是二进制以及二进制的运算。
FPGA二进制转bcd的设计和验证
二进制数转BCD码器的设计和验证FPGA/SOPC课程设计报告书课题名称:二进制转BCD码器的设计和验证姓名:学号:院系:专业:指导教师:时间:课程设计项目成绩评定表设计项目成绩评定表课程设计报告书目录设计报告书目录一、设计的任务要求 (1)二、设计的原则和技巧 (1)2.1、系统面积与速度折中(Area & speed tradeoff) (1)2.2、硬件可实现(Feasibility) (1)2.3、层次化设计(Hierarchical Design) (2)2.4、同步设计(Synchronization) (2)三、FPGA的三种建模方式 (2)3.1、数据流建模 (2)3.2、行为建模 (3)3.2、结构化建模 (3)四、选择器件 (3)五、功能模块 (3)六、时序仿真图 (6)七、心得体会 (6)八、参考文献 (6)一、设计的任务要求1、实现二进制数到8421BCD码的转换。
2、能进行二进制转8421BCD码器的验证。
3、熟悉8421BCD码的编码规则。
二、设计的原则和技巧2.1、系统面积与速度折中(Area & speed tradeoff)✧面积和速度是芯片设计中一对相互制约、影响成本和性能的指标,贯穿FPGA设计的始终。
在FPGA设计中,面积是指一个设计消耗的FPGA内部逻辑资源的数量,可以用消耗的触发器和查找表的个数或者是等效逻辑门数来衡量;✧速度是指一个设计在FPGA上稳定运行时所能达到的最高频率,由设计时序状态决定。
与设计满足的时钟周期、CLOCK SETUP TIME、CLOCK HOLD TIME和CLOCK-TO-OUTPUT DELAY等众多时序特征量密切相关。
✧关于面积和速度的折中,应在满足设计时序和工作频率要求的前提下,占用最小的芯片面积;或者在所规定的面积下,使得设计的时序余量最大,能够在更高的频率上稳定运行。
通常,在资源足够的情况下,更多是选择速度的最优,这也是FPGA的特点。
单片机二进制BCD码转换实验程序流程图
二进制BCD码转换一、实验目的1.掌握简单的数值转换算法2.基本了解数值的各种表达方法二、实验说明单片机中的数值有各种表达方式,这是单片机的基础。
掌握各种数制之间的转换是一种基本功。
我们将给定的一字节二进制数,转换成二十进制(BCD)码。
将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123。
三、实验内容及步骤1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。
2.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH2.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA) (在MEMORY#3中输入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.流程图。
汇编程序设计—二进制码转换为BCD码
汇编程序设计—二进制码转换为BCD码首先,我们需要了解什么是BCD码。
BCD码(二进制编码表达式)是一种用4位二进制数字表示一个十进制数的编码方式。
它的范围是0到9,每个数字使用4位二进制进行表示,因此一个BCD码的范围是0000到1001以下是一个示例汇编程序设计,它将输入的二进制码转换为BCD码,并将结果保存在内存中。
```assemblyorg 100hsection .dataoutput resb 4 ; 输出的BCD码section .textstart:mov ax, input ; 将输入的二进制码加载到寄存器AXmov cx, 4 ; 设置循环次数为4, 一个BCD码使用4位二进制表示convert:rol ax, 1 ; 将二进制码左移1位add dl, 30h ; 将二进制码转换为对应的ASCII码,并保存在寄存器DLmov [output+cx-1], dl ; 将结果保存在内存中loop convert ; 循环exit:mov ah, 4Ch ; 设置退出系统调用功能号int 21h ; 调用系统中断```上述汇编程序设计的主要思路是,使用循环将输入的二进制码逐位转换为BCD码,并将结果保存在内存中。
在每次循环迭代中,我们使用`rol`指令将二进制码左移1位,并通过`and`指令提取最后4位二进制码。
接下来,我们通过`add`指令将二进制码转换为对应的ASCII码,并将结果保存在寄存器DL中。
最后,我们将结果存储在内存中,并通过`loop`指令继续处理下一个二进制位。
以上是一个简单的示例汇编程序设计,它将二进制码转换为BCD码。
你可以根据自己的需求进行修改和扩展。
编写和调试汇编程序需要一定的经验和知识,建议你阅读相关的汇编编程文档和教程,以便更好地理解和掌握汇编程序设计。
汇编语言8位二进制转bcd码
汇编语言8位二进制转bcd码
将8位二进制数转换为BCD码(Binary Coded Decimal)需要将每个二进制数转换为其对应的十进制数,然后将十进制数转换为BCD码。
首先,将8位二进制数分为两组,每组4位。
然后将每组4位二进制数转换为对应的十进制数。
例如,如果我们有一个8位二进制数1101 1010,将其分为1101和1010两组。
对于第一组1101:
1 2^3 + 1 2^
2 + 0 2^1 + 1 2^0 = 13。
对于第二组1010:
1 2^3 + 0 2^
2 + 1 2^1 + 0 2^0 = 10。
现在我们得到了两个十进制数13和10。
接下来将这两个十进制数分别转换为BCD码。
对于十进制数13,将其转换为BCD码:
13 = 0001 0011。
对于十进制数10,将其转换为BCD码:
10 = 0001 0000。
因此,将二进制数1101 1010转换为BCD码后得到0001 0011 0001 0000。
这样,我们就完成了将8位二进制数转换为BCD码的过程。
希望这个回答能够帮到你!如果还有其他问题,欢迎继续提问。
单片机实验报告_二进制到BCD转换
单片机实验报告成员:学号:实验时间:实验1 二进制到BCD转换一、实验目的学习星研Star16L仿真器系统的基本操作,熟悉EL-Ⅱ型通用接口板实验电路,掌握简单的数值转换算法。
二、实验仪器和设备PC机、星研Star16L仿真器系统+仿真头PODPH51(DIP)、EL-Ⅱ型通用接口板实验电路。
三、实验内容1)将给定的一个单字节二进制数(存放在R2中),转换成非压缩的二—十进制(BCD)码,并存放到R3R4R5中。
2)将给定的一个双字节二进制数(存放在R2R3中),转换成压缩的二—十进制(BCD)码,并存放到R4R5R6中。
四、参考程序清单及框图1)单字节二进制到非压缩BCD;NAME T1_1_BCDORG 0000HLJMP BCD1ORG 0100HBCD1: MOV A, R2 ;二进制数送AMOV B, #100 ;100作为除数送入BDIV ABMOV R3, A ;百位数送R3,余数在B中MOV A, #10 ;分离十位和个位数XCH A, B ;余数送A,除数10在B中DIV AB ;分离出十位在A, 个位在B中MOV R4, A ;十位送R3MOV A, BMOV R5, A ;个位送R4NOPLJMP BCD1END2)双字节二进制到压缩BCD;NAME T1_2_BCDORG 0000HLJMP BCD2ORG 0150H BCD2: CLR AMOV R4, AMOV R5, AMOV R6, AMOV R7, #16 LOOP: CLR CMOV A, R3RLC AMOV R3, AMOV A, R2RLC AMOV R2, AMOV A, R6ADDC A, R6DA AMOV R6, AMOV A, R5ADDC A, R5DA AMOV R5, AMOV A, R4ADDC A, R4DA AMOV R4, ADJNZ R7, LOOPLJMP BCD2END参考程序框图:Array单字节二进制数转换成非压缩BCD码框图五、思考题如何验证程序的正确性?答:输入数据,查看得出的结果是否与理论上的结果一致。
二进制转BCD码
⼆进制转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 码实验 一、实验目的(1)掌握keil 软件的程序编辑、编译、调试过程; (2)学习二进制与BCD 码转换程序的编写。
二、实验内容将123对应二进制数转换为十进制数百位、十位、个位BCD 码,依次存放在RAM 的30H 、31H 、32H 单元。
三、实验步骤1、创建文件:运行uvision ,点击File ->New …选项。
再点击File ->Save 选项保存文件*.asm ;2、创建工程:点击Project ->New Project …选项创建一个新的工程;选择CPU ;3、添加已创建的文件:选择“Source Group 1”点击鼠标右键,点击 “Add Files to Group ‘Source Group 1’”。
4、编译链接工程:1)点击Project ->Options for target ‘Target 1’ 选项。
点击Output 标签,Create HEX File 复选框打钩;Trial1_BCD.ASMRESULT EQU 30H ORG 0000H LJMP S1 ORG 0100H S1: MOV SP,#40H MOV A,#123 MOV B,#100DIV AB ;A,商;B,余数 MOV RESULT,A MOV A,B MOV B,#10 DIV ABMOV RESULT+1,A MOV RESULT+2,B LJMP $ END图1-1 主程序流程图2)点击Project->Build target …;5、检错、纠错;6、调试工程:1)点击Debug->Start/Stop Debug Session进入/退出调试状态。
2)运行程序后,观察RAM 30~32H单元存放的数据:View->Memory Window->Address:d:30H(RAM);c:0100H(ROM);四、实验结果五、思考题1、用C51编写源程序,实现本实验要求的功能。
51单片机实验-实验一 二进制到BCD转换
实验一二进制到BCD转换一、实验内容将存放在R2中的一个单字节二进制数,转换成非压缩的二—十进制(BCD)码,并存放到R3R4R5中。
二、实验仪器和设备PC机、星研Star16L仿真器系统+仿真头PODPH51(DIP)、EL-Ⅱ型通用接口板实验电路。
三、实验过程及结果①使用星研仿真软件建立新工程文件1)进入星研仿真软件2)系统基本参数设置\辅助\仿真器\选择Star16L,且取消模拟调试器\辅助\通信\USB2)建立项目文件\项目\新建项目文件\输入项目文件名后,进入项目文件设置选项其中:仿真头选择:PODPH51(DIP);CPU选择:8051类;其它选项一般选择默认值。
(也可以在建立项目文件后,在\项目\设置项目文件\选项下修改仿真头和CPU的设置)3)新建源文件\文件\新建\新建文件\选择项目文件,然后设置文件后缀为.ASM(汇编语言)②基本程序ORG 0000H ;设置起始地址BCD1:MOV R2,# 00100000B ;给R2赋初值,二进制数0010 0000BMOV A,R2 ;将R2单元里的数值,也就是00100000B送入累加器A中MOV B,#100 ;100作为除数送入BDIV AB ;A单元中的数除以B单元中的数MOV R3,A ;百位数送R3,余数在B中MOV A,#10 ;分离十位和个位数XCH A,B ;余数送A,除数10留在B中DIV AB ;分离出十位在A, 个位在B中MOV R4,A ;十位送R4MOV A,BMOV R5,A ;个位送R5NOPSJMP $END运算结果:二进制数00100000B换算成非压缩BCD码应该为32,则R3单元里的数值应该为0,R4单元里的数值应该为3,R5单元里的数值应该为2。
运行结果:R3为0,R4中为3,R5中为2,与运算结果相同,实验程序正确。
③将基本程序进行修改,添加子程序后验证ORG 0000H ;设置初始地址START:MOV R2,#00100000B ;给R2赋初值00100000BLCALL BCD ;调用子程序BCDSJMP $BCD: ;子程序BCDMOV A,R2 ;将R2单元里的数值,也就是00100000B送入累加器A中MOV B,#100 ;100作为除数送入BDIV AB ;A单元中的数除以B单元中的数MOV R3,A ;百位数送R3,余数在B中MOV A,#10 ;分离十位和个位数XCH A,B ;余数送A,除数10留在B中DIV AB ;分离出十位在A, 个位在B中MOV R4,A ;十位送R4MOV A,BMOV R5,A ;个位送R5RET ;返回主程序END运行结果:R3为0,R4中为3,R5中为2,与上面基本程序的运行结果相同,所以改编后的实验程序是正确的。
二进制转化bcd
二进制码转BCD码在单片机里面,如:显示个温度值,这时,要取一个数的个位、十位、百位,可以用/和 %(求商和求余)来解决。
但是,在FPGA里面用求商和求余将会非常消耗资源,这样就必须用到二进制转BCD码了,这里介绍一种简单的加3移位算法。
注:B代表二进制,D代表十进制,0x代表十六进制,BCD为BCD 码,下同。
1、加3移位法以二进制数(0000_101 Xn)B=(10+Xn)D为例,串行输入三位后,(0101)B=5(D)左移一位后:(0000_101Xn)B=(10+Xn)D如果(0000_101Xn)B直接输出显示为:当Xn=0时,0000_1010=0x0A。
此为错误的BCD码。
采用加3移位法,修正移位结果:串行输入三位后,结果大于4(0101)B=5(D)加3:(0101)B+(0011)B=(1000)B --十进制表示:5+3=8 再左移一位后:(1000Xn)B=(0001_000Xn)BCD对应十进制显示:1 Xn每四位BCD码对应一位十进制数,即:(10+Xn)D,转换成功注:Xn为下一位串行输入的二进制数。
2、设计思路这里一共需要四个模块:计数器、移位器、加法器、寄存器输出。
分别设计好之后,用状态机控制它们,就完成了。
3、仿真结果注:图中clk为时钟,en为高电平使能,rst为高电平复位,data_in为输入的12位二进制码,以十进制的形式显示在时序图;qout为输出的16位BCD码,以十六进制的形式显示在时序图,17个时钟上升沿可完成转换任务。
4、综合结果5、难点分析要搞懂这个加3移位算法,必须要按照8位二进制(11101011)转BCD过程图,自己手动推导一下,才容易理解。
此算法的难点在于,需要把输入的二进制数,按照每四个bit来划分为一个单元(所以输入的二进制数,位宽必须是4的倍数),然后,每个单元都要同时判断是否大于4,大于就要加3,否则不加.理解了这个算法之后,那么BCD转二进制就非常容易了,减3移位即可,减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,得到的商存放百分位的变量上;以此类推,最后的余数存放在个位的变量上。
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 下编译、连接源程序生成可执行文件并调试,比较两个环境下生成的机器码的长度、寄存器内容、计算结果的异同。
汇编实验报告--二进制到BCD码转换
实验二:二进制到BCD码转换学生姓名:何茂杰学号:2010305104 专业班级:计算机本科一班指导老师:文远熔实验日期:实验成绩:一、实验目的1.掌握无条件转移指令、条件转移指令;2.掌握利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法;3.掌握直接向视频RAM送ASCII码进行屏幕显示的方法;4.掌握屏幕字符显示程序编写与调试。
二、实验内容将存放在BIN的一个16位无符号数转换为BCD码,结果的万、千,百、十、个位依次存放在BCD+0、BCD+1、BCD+2、BCD+3、BCD+4单元内三、实验环境PC微机DOS操作系统或Windows 操作系统四、实验要求对操作数的寻址、转换方法至少要由两种以上。
五、主要实验步骤及结果1.直接向VRAM送ASCII码显示字符(1)用A命令在100H处键入下列程序MOV AX,B000MOV DS,AXXOR AL,ALXOR BX,BXMOV CX,100LOP:MOV [BX],ALINC BXINC ALPUSH CXMOV CX,8DELY:PUSH CXMOV CX,0J:LOOP JPOP CXLOOP DELYPOP CXLOOP LOPINT 20(2)用N命令和W命令将此程序存入文件中。
(一定要先存入!)(3)用G命令运行此程序,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT 21H 2号功能调用有何不同?控制字符区在该程序中没有显示,在上一个程序中显示为笑脸等符号。
(4)自编程序:将存放在BIN的一个16位无符号数转换为BCD码反汇编;-U10013A3:0100 BB0010 MOV BX,100013A3:0103 8B07 MOV AX,[BX]13A3:0105 BB0000 MOV BX,000013A3:0108 BA0000 MOV DX,000013A3:010B BB0A00 MOV BX,000A13A3:010E F7F3 DIV BX13A3:0110 A21310 MOV [1013],AL13A3:0113 89161410 MOV [1014],DX13A3:0117 BB6400 MOV BX,006413A3:011A F7F3 DIV BX13A3:011C A21210 MOV [1012],AL13A3:011F 89D0 MOV AX,DX执行情况:-t=100AX=0000 BX=1000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13A3 ES=13A3 SS=13A3 CS=13A3 IP=0103 NV UP EI PL NZ NA PO NC 13A3:01038B07 MOV AX,[BX] DS:1000=0000六、思考题利用INT 21H 显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同?答:利用INT 21H显示时,07H-0DH的控制符会用笑脸之类的符号显示;直接向VRAM 送ACSII码时,07H-0DH的控制符不显示。
八位二进制——BCD码转换器
实验报告:8位二进制-BCD码转换器姓名:学号:指导教师:一.实验目的了解二进制-BCD码转换器实现原理,掌握移位加3算法,熟悉Verilog编程中模块复用模式。
二.实验任务1.掌握用移位加三算法实现二进制-BCD码转换器的设计;2.设计Verilog实验程序;3.生成比特流文件,将文件下载到开发板中进行硬件验证。
三.实验设备1.计算机(安装Xilinx ISE 10.1软件平台);2.NEXYS2 FPGA开发板一套(带USB-MIniUSB下载线)四.实验原理设计任意数目输入的二进制-BCD码转换器的方法就是采用移位加三算法(Shift and Add 3 Algorithm)。
此方法包含以下4个步骤:1)把二进制左移1位;2)如果共移了8位,那么BCD数就在百位、十位和个位列;3)如果在BCD列中,任何一个二进制数是5或者比5更大,那么就在BCD列的数值加上3;4)回到步骤1)。
其工作过程如图1所示:图1. 一个8位的二进制数转换成BCD码的步骤五.实验内容在Xilinx ISE 10.1上完成8位二进制-BCD码转换器设计,输入设计文件,仿真后,生成二进制码流文件下载到FPGA开发板上进行验证;1)依照实验1的方式,在Xilinx ISE 10.1中新建一个工程example02;2)在工程管理区任意位置单击鼠标右键,在弹出的快捷菜单中选择“New Source”命令,弹出新建源代码对话框,这里我们选择“Verilog Module”类型,输入Verilog文件名“binbcd8.v”,完整代码如下:module binbcd8(input [7:0] b,output reg [9:0] p);reg [17:0] z;integer i;always @(*)beginfor (i=0;i<=17;i=i+1)z[i]=0;z[10:3]=b;repeat(5) //重复5次beginif (z[11:8]>4)z[11:8]=z[11:8]+3;if (z[15:12]>4)z[15:12]=z[15:12]+3;z[17:1]=z[16:0];endp=z[17:8];endendmodule3)设计相应的7段显示管程序,将相应的十进制数在开发板的显示管上显示出来。
二进制转BCD码
二进制转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码转换实验程序流程图
二进制BCD码转换一、实验目的1.掌握简单的数值转换算法2.基本了解数值的各种表达方法二、实验说明单片机中的数值有各种表达方式,这是单片机的基础。
掌握各种数制之间的转换是一种基本功。
我们将给定的一字节二进制数,转换成二十进制(BCD)码。
将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123。
三、实验内容及步骤1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。
2.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH2.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA) (在MEMORY#3中输入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.流程图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的(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 下编译、连接源程序生成可执行文件并调试,比较两个环境下生成的机器码的长度、寄存器内容、计算结果的异同。
A 、减法1、Windows下的调试结果2、DOS 下的调试结果3、比较机器码的长度、寄存器内容、计算结果的异同Windows DOS寄存器内容CS F400 1419 IP 0204 0000 SS 0711 1414 SP 003A 0042 BP 0000 0000 SI 0000 0000 DI 0005 0000 DS 0710 1403 ES0700 1403 计算结果1742617426B 、除法1、Windows下的调试结果2、DOS下的调试结果3、比较机器码的长度、寄存器内容、计算结果的异同Windows DOS寄存器内容CS F400 1419 IP 0204 0000 SS 0711 1414 SP 003A 0042 BP 0000 0000 SI 0000 0000 DI 0005 0000 DS 0710 1403 ES070014036.2、如何观察转换过程中标志寄存器中各标志位的结果?如何观察转换结果的变化?试改变被转换数值,对结果与编制为的变化加以说明和解释。
A 、减法4412H 改成3012H1、DOS2、WindowsB 、除法4412H 改成3012H1、DOS2、Windows计算结果 17426 17426C、标志寄存器NV 无溢出UP 串操作指令为自动增量指令EI 允许中断请求PL 符号为正NZ 运算结果不为零NA 辅助进位无进位PO 1的个数为奇数NC 无进位七、实验总结与体会本次实验,是运用减法和除法来进行二进制转换成BCD码。
在实验前应做好充分的预习,画好流程图并编好程序,可以的话还是在实验前运行一下,若有问题可及时问老师。
而在编写程序中,应及时学会运用循环指令,注意算法,且要注意添加显示符,否则无法显示你的运算结果。
在本次试验中,因为没有很注重预习,导致实验时程序出现了差错。
课后进行了补充和修改,在DOS和EMU8086环境下能较为顺利的完成了实验内容。
八、思考题如何让你的程序自适应地处理高位为‘0’时不输出或输出空格呢?分配一个标志,在该标志不为零时,输出值是零就不输出或输出空格,标志为零时无论何值都要输出。
如果是从高位开始输出,那么只要先置标志,在输出一个非零数字或者当做到个位数的时候,把这个标志清零。