8086计算器仿真_第1页
8086计算器仿真_第2页
8086计算器仿真_第3页
8086计算器仿真_第4页
8086计算器仿真_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上实验报告一、设计任务:利用微机原理所学的8086微处理器相关知识为核心,利用Proteus仿真软件,设计一个关于计算器的仿真电路并编写汇编代码。根据8086的结构和其寻址方式、输入输出、I/O口读写等技术,使用汇编语言的基本语法、伪指令,结合Proteus软件SAMPLES中8086 Demo Board示例的理解分析,自行设计。二、需求分析:(1)用8086作为核心处理器;(2)用8255芯片连接主机与外设;(3)用74273锁存器对数据进行锁存;(4)用数码管显示器来显示输入的数字以及输出的结果;(5)由于需要输入数字及运算符所以要用到键盘;(6)用蜂鸣器在按下按

2、键的同时发出声响;(7)连接整个电路要用到导线以及总线将相应的引脚相连接。三、总体方案(选择与论证)1.方案的选择:基于技术成熟的Proteus软件,以Proteus软件SAMPLES中8086 Demo Board示例为蓝本并充分分析理解,在此基础上提出自己的设计方案。将例子中电路结构优化精简,舍弃不必要的芯片,并用汇编来实现全部功能。即计算器能够进行4位数的加、减、乘、除运算。 在此基础上,为使设计的计算器更具有实用性,我们通过循环调用的方式加入了对幂运算的功能。与此同时,为优化人机界面,使计算器更为美观和实用,我们加入软件自带的封装好的矩阵键盘和蜂鸣器。这就使得整个设计更加紧凑。蜂鸣器实

3、现了每按下一次按键就发出一次声响的功能以使按键检测更加直观,实际的计算器无差别。此计算器拥有计数的功能,分自动计数和手动计数两种。自动计数即为一个简单的计时器,用户可按需要定时,当到预定时间时,计算器会发声音提示用户。手动计数有加1和减1两种,当用户需要计数某些场合中尤为适用。2.方案的论证:8086通过74273锁存器与8255A相连,使8086能够读外部数据和给外部芯片写数据。8255A的A口设置为输出,B口和C口设置为输入,将8255A分别和4*5矩阵、数码管、蜂鸣器相连接。8086不断循环扫描键盘使键盘输入的数据能够读入8086,同时,8086通过8255A,将数据输入给数码管把相应的

4、值显示出来,将高电平送到蜂鸣器的正极输入端使其发出预定的声音。本方案在设计上无错误,应用界面友好的Proteus软件来设计在理论可实现。在大一时学习了C语言,对于程序设计有一定的基础。本学期还学习了汇编程序设计,结合C语言,对汇编程序的设计有一定的经验。此外,小组中有3人曾参加工院的本科生科技创新项目,对单片机的编程熟练,并有一定的工程实践经验。本小组成员团结性强,学习能力好。能够相互协调克服困难。本实验应用的软件技术成熟,在网上有很多成熟的设计可供借鉴。图1图2四、硬件设计整个设计如图所示,8086通过地址总线与74273相连实现数据锁存的功能,再通过8255A与外设接口相连接,通过其A、B

5、、C口实现对其它设备进行控制。这些设备包括:输入键盘,蜂鸣器,4位数码管,幂运算按钮,计数按钮。五、软件设计本实验的程序部分,其流程图如下:开始 检测按键运算键?等于键?清除键?键?数字键?检测第二个按键输出结果清0结束六、具体代码实现由于代码较多,因此放在最后的附录。七、调试与测试第一步:对实现基本加、减、乘、除运算的测试。分别进行四种基本运算:1.计算25+37的结果依次按下2、5、+、3、7、=,在显示器上显示出结果:63。加法运算正确。2.计算27-9的结果依次按下2、7、-、9、=,在显示器上显示出结果:18。减法运算正确。3.计算15*2的结果依次按下1、5、*、2、=,在显示器上

6、显示出结果:30。乘法运算正确。4.计算568的结果依次按下5、6、8、=,在显示器上显示出结果:7。除法运算正确。第二步:对实现每按一次按键蜂鸣器发一次预定声音功能的测试。执行后,按下按键蜂鸣器出声则此功能可以正常实现。第三步:对实现幂运算的功能进行测试计算的结果依次按下8、3,在显示器上显示出结果:524。幂运算正确。第四步:对计数功能进行测试使整个电路开始工作,按下自动计数开始的按钮,计数开始,到8结束,蜂鸣器发声提示时间到。此功能执行成功。第五步:手动计数加1和减1的功能测试按下手动加1按钮,数码管上显示的值加1,按下手动减1按钮,数码管上显示的值减1。功能执行正常。八、关键技术1.本

7、实验利用子程序思想将整个程序模块化,使得程序清晰明了,并且调用方便,移植性好,升级简单;2.运用矩阵键盘扫描和键值比较确保每一个键都能够被8086及时检测到并正确识别;3.用大循环将整个程序反复执行,保证程序按设计执行,不会出现跑飞的情况;4.正确设置8255A工作方式,是8086读取键盘值和送数至数码管高效正确执行。 九、实际完成功能通过硬件电路的搭接和汇编程序的设计,我们设计出的计算器可以正确的完成以下功能:1. 对加、减、乘、除的基本运算。通过键盘输入并显示要计算的数字和执行的运算,通过数码显示器显示计算结果;2. 实现每次按下按钮时蜂鸣器都能发出声响。表明已有按键按下,可以根据声响的次

8、数来判断输入数字的个数和是否误输的情况,有效避免和降低了用户错误的发生;3. 实现求幂运算的功能。通过键盘输入底数和幂次,由数码显示器显示计算结果,在简单计算器的基础上,实现了更高级的运算,实用性增强;4. 实现从计数的功能,并有自动计数、手动加1计数和手动减1计数功能可供选择。按下自动计数键,电路便开始实现计数的功能并由数码显示器显示,计数到预定值时停止并提示用户。十、总结(任务分工等)通过小组人员的共同努力,我们顺利实现了计算器的预计全部功能,并在此基础上增加了一些实用的功能。我们小组的任务分工如下:在本次的实验中,使我们熟练地掌握了Proteus软件的运用,对课本的知识理解更加深刻。学会

9、了运用所学的知识来解决实际的问题,积累了一些动手实践的经验。在上课时学习的都是基本的程序设计,没有什么子程序,程序短而且简单,分析起来不困难。而在本实验中,要求设计的是一个完整的系统,这就要求我们从系统出发,把视野放在整体上,力求各个子模块之间的相互协调和配合,共同组成完整可行的系统。本次实验一改以往做实验的风格,通过一个大的综合实验和小组结对的方式,给学员更多的自由发挥空间,使学员的许多方面得到了锻炼。在一个系统中,不是通过各个子模块的简单堆积就能够实现整体的功能,而是各个模块相互协调,发挥各自的功能,才能完美实现所需要的功能。因此,本实验其实难度更大,也更有实际意义。其实际意义早已超越了实

10、验本身。通过一个综合实验,我们更加充分的理解了课本的程序语句,不仅知道各条语句之间的相同点,也理解了在不同条件下它们的不同作用。本实验在做的过程中,我们从一个更高的层次对课本的知识进行了一遍详细的梳理。这次实验,不管是对于课本的学习,还是今后参加工作或者参加电子设计,都有很大的意义。十一、附录实验程序源码 DATA SEGMENT X DB ?,?,?,? ;存放数据的每一位 X1 DW ? ;存放第一个数据值 X2 DW ? ;存放第二个数据值 Y DW ? ;存放运算结果 S DB ? ;存放运算符号值 E DB ? ;按下等号键标记 CC DB ? ;存放运算数据位数 H DB 0 ;存

11、放按键行号 L DB 0 ;存放按键列号SJISZHIDB?;存放计数值的变量 DISCODE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;段码表 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AXMOVSJISZHI,0 MOV AL,90H ;设置为A口输入,B口输出,C口输出 OUT 46H,AL MOV DI,OFFSET X+3 ;DI指向X的高位 KKK: CALL KEY ;扫描按键 JMP

12、KKK;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号 KEY PROC CHECK: CALL DISP ;等待按键按下的同时进行显示 MOV AL,0F0H ;所有行输出低电平 OUT 44H,AL IN AL,40H CMP AL,0FFH ;读列值 JZ CHECK ;若都为高电平则无键按下,等待 MOV CX,50 LOOP $ ;延时消抖 IN AL,DX ;重读列值 CMP AL,0FFH JZ CHECK ;无键按下一直等待 MOV H,0 ;有键按下,先把行列号变量清0 MOV L,0 MOV BL,01H MOV BH,0FEH ;扫描法读键值:从第一

13、行开始测试,即PC0输出低电平 NEXT: MOV AL,BH OUT 44H,AL NEXTH: IN AL,40H ;读列值,判断是第几列有键按下 TEST AL,BL ;从第一列开始判断 JZ WAIT0 ROL BL,1 CMP BL,20H ;当前行状态下没有任何列有键按下,则转为对下一行的测试 JZ NEXTL INC H ;每判断一列,列号加1 JMP NEXTH ;再对下一列进行判断 NEXTL: MOV H,0 MOV BL,01H ROL BH,1 ;对下一行测试,让下一个PC口输出低电平 CMP BH,0EFH JZ EXIT INC L JMP NEXT WAIT0:

14、IN AL,40H ;若有键按下,则等该按键松开后再计算键值 CMP AL,0FFH JNZ WAIT0 MOV CX,50 LOOP $ ;延时消抖 IN AL,40H CMP AL,0FFH JNZ WAIT0 CALL KEYVALUE ;调计算键值子程序 EXIT: RET KEY ENDP ;以下为计算键值子程序,通过行列号计算键值(键值=列号*5+行号) ;键值存放在DL寄存器中 KEYVALUE PROC PUSH AX MOV AL,0FFH OUT 42H,AL CALL DELAY CALL DELAY CALL DELAY MOV AL,00H OUT42H,AL POP

15、 AX MOV DL,L MOV DH,H MOV AL,5 MUL DL ;列号乘5 MOV DL,AL ADD DL,DH CMP DL,0 JZQI CMP DL,1 JZBA CMP DL,2 JZ JIU CMP DL,5 JZSH CMP DL,6 JZWU CMP DL,7 JZ LIU CMP DL,9 JZ JISHU_CALL;自动计数 CMP DL,10 JZ YI CMP DL,11 JZ ER CMP DL,12 JZ SAN CMP DL,14 JZ SJI_CALL;手动加1 CMP DL,15 JZ CLR_CALL ;按下的是清除键 CMP DL,16 JZ

16、LIN CMP DL,17 JZ OUTP_CALL ;按下的是等于键 CMP DL,19 JZ SJIJ_CALL;手动减1 JMP CONT_CALL SH: MOV DL,4 CALL NUMBER JMP EXIT1 WU: MOV DL,5 CALL NUMBER JMP EXIT1 LIU: MOV DL,6 CALL NUMBER JMP EXIT1 QI: MOV DL,7 CALLNUMBER JMP EXIT1 BA: MOV DL,8 CALLNUMBER JMP EXIT1 JIU: MOV DL,9 CALLNUMBER JMP EXIT1 YI: MOVDL,1 C

17、ALLNUMBER JMP EXIT1 ER: MOVDL,2 CALLNUMBER JMP EXIT1 SAN: MOVDL,3 CALLNUMBER JMP EXIT1 LIN: MOV DL,0 CALLNUMBER JMP EXIT1 CLR_CALL: CALL CLEAR ;调清除键处理子程序JMP EXIT1 JISHU_CALL:CALLZJIS;调用自动计数子程序JMP EXIT1 SJIJ_CALL:DECSJISZHI;调用减1计数字程序CALLSJI SJI_CALL:INCSJISZHICALLSJI;调用手动计数子程序JMPEXIT1 NUM_CALL: CALL

18、NUMBER ;调数字键处理子程序 JMP EXIT1 CONT_CALL: MOV S,DL ;存放运算键的键值 MOV E,0 CALL COUNT ;调运算键处理子程序,计算第一个加数 JMP EXIT1 OUTP_CALL: CALL OUTP ;调等号键处理子程序 JMP EXIT1 EXIT1: RET KEYVALUE ENDP ;以下为清除键处理子程序,按下清除键后,X变量全部清0 CLEAR PROC MOV X3,0 MOV X2,0 MOV X1,0 MOV X0,0 CALL BITP RET CLEAR ENDP;以下为等号键处理子程序,该子程序负责将第二个运算数据的

19、数值计算出来存入X2变量;并根据运算符号,调用相应的运算子程序 OUTP PROC PUSH AX PUSH DX PUSH BX INC E CALL COUNT ;调运算键处理子程序,计算第二个运算数据 CMP S,18 JZ ADD_CALL ;运算符为加号,则调用加法子程序 CMP S,13 JZ SUB_CALL ;运算符为减号,则调用减法子程序 CMP S,8 JZ MUL_CALL ;运算符为乘号,则调用乘法子程序 CMP S,3 JZ DIV_CALL ;运算符为除号,则调用除法子程序 CMP S,4 JZ CF_CALL ADD_CALL: CALL ADDP JMP STO

20、RE1 SUB_CALL: CALL SUBP JMP STORE1 MUL_CALL: CALL MULP JMP STORE1 CF_CALL: CALL CFP JMP STORE1 DIV_CALL: CALL DIVP JMPSTORE1 STORE1: MOV AX,Y ;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量 MOV DX,0 MOV BX,1000 DIV BX MOV X0, AL MOV AX,DX MOV BL,100 DIV BL MOV X1,AL MOV AL,AH MOV AH,0 MOV BL,10 DIV BL MOV X2,AL MOV

21、X3,AH POP BX POP DX POP AX RET OUTP ENDP;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量;或者将第二个运算数据的数值计算出来并存入X2变量;将运算符的值存入S变量 COUNT PROC PUSH AX PUSH BX PUSH DX MOV DX,0 CALL BITP ;测试X中的数据是多少位 CMP CC,4 ;输入的数据是4位数 ? JZ C4 CMP CC,3 ;输入的数据是3位数 ? JZ C3 CMP CC,2 ;输入的数据是2位数 ? JZ C2 JMP C1 ;输入的数据是1位数 ? C4: MOV AX,0

22、MOV AL,X0 MOV BX,1000 MUL BX MOV DX,AX C3: MOV AL,X1 MOV BL,100 MUL BL ADD DX,AX C2: MOV AL,X2 MOV BL,10 MUL BL ADD DX,AX C1: MOV AL,X3 MOV AH,0 ADD DX,AX CMP E,1 JNZ X1_S MOV X2,DX ;按下的是等号,则将第二个运算数据的值存入X2变量 JMP EXIT3 X1_S: MOV X1,DX ;按下的是运算符号,则将第一个运算数据的值存X1变量 MOV X3,0 ;清空X变量 MOV X2,0 MOV X1,0 MOV X

23、0,0 EXIT3: POP DX POP BX POP AX RET COUNT ENDP;以下为数字键处理子程序;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数 NUMBER PROC CMP E,1 JNZ CONTINUE MOV E,0 CALL CLEAR CONTINUE: CMP CC,0 ;目前数据为0位,即没有数据,则转到SSS JZ SSS;若已有数据,以下程序将X左移8位。;例如:先输入“1”,当再输入2时,;先要将“1”从个位移到十位,然后再将“2”存放到个位 PUSH AX PUSH DX MOV AL,X3 MOV AH,X2 MOV DL,X1

24、MOV DH,X0 MOV CX,8 LL: SHL AX, 1 RCL DX,1 LOOP LL MOV X3,AL MOV X2,AH MOV X1,DL MOV X0,DH POP DX POP AX SSS: MOV DI,DL ;将当前键入的数据存放到X的最低位 INC CC ;数据位数加1 CMP CC,4 ;判断数据位数 JNG EXIT2 MOV CC,0 ;如果数据超过4位,重新从最低位开始存放 MOV X2,0 MOV X1,0 MOV X0,0 EXIT2: CALL DISP ;调显示子程序,显示输入的数据 RET NUMBER ENDP ;加法子程序 ADDP PRO

25、C PUSH AX MOV AX,X1 ADD AX,X2 MOV Y,AX POP AX RET ADDP ENDP;减法子程序 SUBP PROC PUSH AX MOV AX,X1 SUB AX,X2 MOV Y,AX POP AX RET SUBP ENDP;乘法子程序 MULP PROC PUSH AX PUSH DX MOV AX,X1 MOV DX,X2 MUL DX MOV Y,AX POP DX POP AX RET MULP ENDP;除法子程序 DIVP PROC PUSH AX PUSH BX PUSH DX MOV DX,0 MOV AX,X1 MOV BX,X2 D

26、IV BX MOV Y,AX POP DX POP BX POP AX RET DIVP ENDP;乘方子程序 CFP PROC PUSH AX PUSH DX PUSH CX MOV AX,X1 MOV DX,X1 MOV CX,X2 DEC CX LP: MUL DX MOV Y,AX MOVDX,X1 LOOP LP POP CXPOP DXPOP AXRETCFP ENDP ;显示子程序 ,将X中的数值按位显示出来 DISP PROC PUSH BX PUSH AX MOV BH,0 LEA SI,DISCODE CALL BITP ;测试X位数 CMP CC,4 JZ QIAN CM

27、P CC,3 JZ BAI CMP CC,2 JZ SHI CMP CC,1 JMP G QIAN: MOV AH,B ;从第4位开始显示 MOV AL,AH OUT 44H,AL MOV BL,X0 MOV AL,SI+BX OUT 42H,AL CALL DELY MOV AL,0 OUT 42H,AL BAI: MOV AH,B ;从第3位开始显示 MOV AL,AH OUT 44H,AL MOV BL,X1 MOV AL,SI+BX OUT 42H,AL CALL DELY MOV AL,0 OUT 42H,AL SHI: MOV AH,B ;从第2位开始显示 MOV AL,AH OU

28、T 44H,AL MOV BL,X2 MOV AL,SI+BX OUT 42H,AL CALL DELY MOV AL,0 OUT 42H,AL G: MOV AH,B ;从第1位开始显示 MOV AL,AH OUT 44H,AL MOV BL,X3 MOV AL,SI+BX OUT 42H,AL CALL DELY JMP EXIT4 EXIT4: POP AX POP BX RET DISP ENDP;分析数据位数子程序 BITP PROC CMP X0,0 ;如果X0不为0,则数据为4位数 JNZ FOURBIT CMP X1,0 ;如果X1不为0,则数据为3位数 JNZ THREEBI

29、T CMP X2,0 ;如果X2不为0,则数据为2位数 JNZ TOWBIT CMP X3,0 ;如果X3不为0,则数据为1位数 JNZ ONEBIT JMP ZER0BIT ;否则,没有数据 FOURBIT: MOV CC,4 JMP EXIT5 THREEBIT: MOV CC,3 JMP EXIT5 TOWBIT: MOV CC,2 JMP EXIT5 ONEBIT: MOV CC,1 JMP EXIT5 ZER0BIT: MOV CC,0 EXIT5: RET BITP ENDP;延时子程序 DELY PROC PUSH CX MOV CX,100 LOOP $ POP CX RET DELY ENDP;长延时子程序 DELAY PROC PUSH CX MOV CX,60000 LOOP $ POP CX RET DELAY ENDP;手动

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论