实验报告一、设计任务:利用微机原理所学的8086微处理器相关知识为核心,利用Proteus仿真软件,设计一个关于计算器的仿真电路并编写汇编代码。
根据8086的结构和其寻址方式、输入输出、I/O口读写等技术,使用汇编语言的基本语法、伪指令,结合Proteus软件SAMPLES中8086 Demo Board示例的理解分析,自行设计。
二、需求分析:(1)用8086作为核心处理器;(2)用8255芯片连接主机与外设;(3)用74273锁存器对数据进行锁存;(4)用数码管显示器来显示输入的数字以及输出的结果;(5)由于需要输入数字及运算符所以要用到键盘;(6)用蜂鸣器在按下按键的同时发出声响;(7)连接整个电路要用到导线以及总线将相应的引脚相连接。
三、总体方案(选择与论证)1.方案的选择:基于技术成熟的Proteus软件,以Proteus软件SAMPLES中8086 Demo Board示例为蓝本并充分分析理解,在此基础上提出自己的设计方案。
将例子中电路结构优化精简,舍弃不必要的芯片,并用汇编来实现全部功能。
即计算器能够进行4位数的加、减、乘、除运算。
在此基础上,为使设计的计算器更具有实用性,我们通过循环调用的方式加入了对幂运算的功能。
与此同时,为优化人机界面,使计算器更为美观和实用,我们加入软件自带的封装好的矩阵键盘和蜂鸣器。
这就使得整个设计更加紧凑。
蜂鸣器实现了每按下一次按键就发出一次声响的功能以使按键检测更加直观,实际的计算器无差别。
此计算器拥有计数的功能,分自动计数和手动计数两种。
自动计数即为一个简单的计时器,用户可按需要定时,当到预定时间时,计算器会发声音提示用户。
手动计数有加1和减1两种,当用户需要计数某些场合中尤为适用。
2.方案的论证:8086通过74273锁存器与8255A相连,使8086能够读外部数据和给外部芯片写数据。
8255A的A口设置为输出,B口和C口设置为输入,将8255A分别和4*5矩阵、数码管、蜂鸣器相连接。
8086不断循环扫描键盘使键盘输入的数据能够读入8086,同时,8086通过8255A,将数据输入给数码管把相应的值显示出来,将高电平送到蜂鸣器的正极输入端使其发出预定的声音。
本方案在设计上无错误,应用界面友好的Proteus软件来设计在理论可实现。
在大一时学习了C语言,对于程序设计有一定的基础。
本学期还学习了汇编程序设计,结合C语言,对汇编程序的设计有一定的经验。
此外,小组中有3人曾参加工院的本科生科技创新项目,对单片机的编程熟练,并有一定的工程实践经验。
本小组成员团结性强,学习能力好。
能够相互协调克服困难。
本实验应用的软件技术成熟,在网上有很多成熟的设计可供借鉴。
图1图2四、硬件设计整个设计如图所示,8086通过地址总线与74273相连实现数据锁存的功能,再通过8255A与外设接口相连接,通过其A、B、C口实现对其它设备进行控制。
这些设备包括:输入键盘,蜂鸣器,4位数码管,幂运算按钮,计数按钮。
五、软件设计本实验的程序部分,其流程图如下:六、具体代码实现由于代码较多,因此放在最后的附录。
七、调试与测试第一步:对实现基本加、减、乘、除运算的测试。
分别进行四种基本运算:1.计算25+37的结果依次按下2、5、+、3、7、=,在显示器上显示出结果:63。
加法运算正确。
2.计算27-9的结果依次按下2、7、-、9、=,在显示器上显示出结果:18。
减法运算正确。
3.计算15*2的结果依次按下1、5、*、2、=,在显示器上显示出结果:30。
乘法运算正确。
4.计算56/8的结果依次按下5、6、/、8、=,在显示器上显示出结果:7。
除法运算正确。
第二步:对实现每按一次按键蜂鸣器发一次预定声音功能的测试。
执行后,按下按键蜂鸣器出声则此功能可以正常实现。
第三步:对实现幂运算的功能进行测试计算38的结果依次按下8、^、3,在显示器上显示出结果:524。
幂运算正确。
第四步:对计数功能进行测试使整个电路开始工作,按下自动计数开始的按钮,计数开始,到8结束,蜂鸣器发声提示时间到。
此功能执行成功。
第五步:手动计数加1和减1的功能测试按下手动加1按钮,数码管上显示的值加1,按下手动减1按钮,数码管上显示的值减1。
功能执行正常。
八、关键技术1.本实验利用子程序思想将整个程序模块化,使得程序清晰明了,并且调用方便,移植性好,升级简单;2.运用矩阵键盘扫描和键值比较确保每一个键都能够被8086及时检测到并正确识别;3.用大循环将整个程序反复执行,保证程序按设计执行,不会出现跑飞的情况;4.正确设置8255A工作方式,是8086读取键盘值和送数至数码管高效正确执行。
九、实际完成功能通过硬件电路的搭接和汇编程序的设计,我们设计出的计算器可以正确的完成以下功能:1.对加、减、乘、除的基本运算。
通过键盘输入并显示要计算的数字和执行的运算,通过数码显示器显示计算结果;2.实现每次按下按钮时蜂鸣器都能发出声响。
表明已有按键按下,可以根据声响的次数来判断输入数字的个数和是否误输的情况,有效避免和降低了用户错误的发生;3.实现求幂运算的功能。
通过键盘输入底数和幂次,由数码显示器显示计算结果,在简单计算器的基础上,实现了更高级的运算,实用性增强;4.实现从计数的功能,并有自动计数、手动加1计数和手动减1计数功能可供选择。
按下自动计数键,电路便开始实现计数的功能并由数码显示器显示,计数到预定值时停止并提示用户。
十、总结(任务分工等)通过小组人员的共同努力,我们顺利实现了计算器的预计全部功能,并在此基础上增加了一些实用的功能。
我们小组的任务分工如下:在本次的实验中,使我们熟练地掌握了Proteus软件的运用,对课本的知识理解更加深刻。
学会了运用所学的知识来解决实际的问题,积累了一些动手实践的经验。
在上课时学习的都是基本的程序设计,没有什么子程序,程序短而且简单,分析起来不困难。
而在本实验中,要求设计的是一个完整的系统,这就要求我们从系统出发,把视野放在整体上,力求各个子模块之间的相互协调和配合,共同组成完整可行的系统。
本次实验一改以往做实验的风格,通过一个大的综合实验和小组结对的方式,给学员更多的自由发挥空间,使学员的许多方面得到了锻炼。
在一个系统中,不是通过各个子模块的简单堆积就能够实现整体的功能,而是各个模块相互协调,发挥各自的功能,才能完美实现所需要的功能。
因此,本实验其实难度更大,也更有实际意义。
其实际意义早已超越了实验本身。
通过一个综合实验,我们更加充分的理解了课本的程序语句,不仅知道各条语句之间的相同点,也理解了在不同条件下它们的不同作用。
本实验在做的过程中,我们从一个更高的层次对课本的知识进行了一遍详细的梳理。
这次实验,不管是对于课本的学习,还是今后参加工作或者参加电子设计,都有很大的意义。
十一、附录实验程序源码DATA SEGMENTX DB ,,, ;存放数据的每一位X1 DW ;存放第一个数据值X2 DW ;存放第二个数据值Y DW ;存放运算结果S DB ;存放运算符号值E DB ;按下等号键标记CC DB ;存放运算数据位数H DB 0 ;存放按键行号L DB 0 ;存放按键列号SJISZHI DB ;存放计数值的变量DISCODE DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H ,71H ;段码表DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SJISZHI,0MOV AL,90H ;设置为A口输入,B 口输出,C口输出OUT 46H,ALMOV DI,OFFSET X+3 ;DI指向X的高位KKK: CALL KEY ;扫描按键JMP KKK;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号KEY PROCCHECK: CALL DISP ;等待按键按下的同时进行显示MOV AL,0F0H ;所有行输出低电平OUT 44H,ALIN AL,40HCMP AL,0FFH ;读列值JZ CHECK ;若都为高电平则无键按下,等待MOV CX,50LOOP $ ;延时消抖IN AL,DX ;重读列值CMP AL,0FFHJZ CHECK ;无键按下一直等待MOV H,0 ;有键按下,先把行列号变量清0MOV L,0MOV BL,01HMOV BH,0FEH ;扫描法读键值:从第一行开始测试,即PC0输出低电平NEXT:MOV AL,BHOUT 44H,ALNEXTH: IN AL,40H ;读列值,判断是第几列有键按下TEST AL,BL ;从第一列开始判断 JZ WAIT0ROL BL,1CMP BL,20H ;当前行状态下没有任何列有键按下,则转为对下一行的测试JZ NEXTLINC H ;每判断一列,列号加1JMP NEXTH ;再对下一列进行判断 NEXTL: MOV H,0MOV BL,01HROL BH,1 ;对下一行测试,让下一个PC口输出低电平CMP BH,0EFHJZ EXITINC LJMP NEXTWAIT0: IN AL,40H ;若有键按下,则等该按键松开后再计算键值CMP AL,0FFHJNZ WAIT0MOV CX,50LOOP $ ;延时消抖IN AL,40HCMP AL,0FFHJNZ WAIT0CALL KEYVALUE ;调计算键值子程序 EXIT: RETKEY ENDP;以下为计算键值子程序,通过行列号计算键值(键值=列号*5+行号);键值存放在DL寄存器中KEYVALUE PROCPUSH AXMOV AL,0FFHOUT 42H,ALCALL DELAYCALL DELAYCALL DELAYMOV AL,00HOUT 42H,ALPOP AXMOV DL,LMOV DH,HMOV AL,5MUL DL ;列号乘5 MOV DL,ALADD DL,DHCMP DL,0JZ QICMP DL,1JZ BACMP DL,2JZ JIUCMP DL,5JZ SHCMP DL,6JZ WUCMP DL,7JZ LIUCMP DL,9JZ JISHU_CALL ;自动计数CMP DL,10JZ YICMP DL,11JZ ERCMP DL,12JZ SANCMP DL,14JZ SJI_CALL ;手动加1CMP DL,15JZ CLR_CALL ;按下的是清除键 CMP DL,16JZ LINCMP DL,17JZ OUTP_CALL ;按下的是等于键 CMP DL,19JZ SJIJ_CALL ;手动减1JMP CONT_CALLSH: MOV DL,4CALL NUMBERJMP EXIT1WU: MOV DL,5CALL NUMBERJMP EXIT1 LIU: MOV DL,6CALL NUMBER JMP EXIT1 QI: MOV DL,7CALL NUMBERJMP EXIT1 BA: MOV DL,8CALL NUMBERJMP EXIT1 JIU: MOV DL,9CALL NUMBERJMP EXIT1 YI: MOV DL,1CALL NUMBERJMP EXIT1ER: MOV DL,2CALL NUMBERJMP EXIT1SAN: MOV DL,3CALL NUMBERJMP EXIT1LIN: MOV DL,0CALL NUMBERJMP EXIT1CLR_CALL: CALL CLEAR ;调清除键处理子程序JMP EXIT1JISHU_CALL: C ALL ZJIS ;调用自动计数子程序JMP EXIT1SJIJ_CALL: DEC SJISZHI ; 调用减1计数字程序CALL SJISJI_CALL: INC SJISZHICALL SJI ;调用手动计数子程序JMP EXIT1NUM_CALL: CALL NUMBER ;调数字键处理子程序JMP EXIT1CONT_CALL: MOV S,DL ;存放运算键的键值MOV E,0CALL COUNT ;调运算键处理子程序,计算第一个加数JMP EXIT1OUTP_CALL: CALL OUTP ;调等号键处理子程序JMP EXIT1EXIT1: RETKEYVALUE ENDP;以下为清除键处理子程序,按下清除键后,X变量全部清0 CLEAR PROCMOV X[3],0MOV X[2],0MOV X[1],0MOV X[0],0CALL BITPRETCLEAR ENDP;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量;并根据运算符号,调用相应的运算子程序OUTP PROCPUSH AXPUSH DXPUSH BXINC ECALL COUNT ;调运算键处理子程序,计算第二个运算数据CMP S,18JZ ADD_CALL ;运算符为加号,则调用加法子程序CMP S,13JZ SUB_CALL ;运算符为减号,则调用减法子程序CMP S,8JZ MUL_CALL ;运算符为乘号,则调用乘法子程序CMP S,3JZ DIV_CALL ;运算符为除号,则调用除法子程序CMP S,4JZ CF_CALLADD_CALL: CALL ADDPJMP STORE1SUB_CALL: CALL SUBPJMP STORE1MUL_CALL: CALL MULPJMP STORE1CF_CALL: CALL CFPJMP STORE1DIV_CALL: CALL DIVPJMP STORE1STORE1: MOV AX,Y ;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量MOV DX,0MOV BX,1000DIV BXMOV X[0], ALMOV AX,DXMOV BL,100DIV BLMOV X[1],ALMOV AL,AHMOV AH,0MOV BL,10DIV BLMOV X[2],ALMOV X[3],AHPOP BXPOP DXPOP AXRETOUTP ENDP;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量;或者将第二个运算数据的数值计算出来并存入X2变量;将运算符的值存入S变量COUNT PROCPUSH AXPUSH BXPUSH DXMOV DX,0CALL BITP ;测试X中的数据是多少位CMP CC,4 ;输入的数据是4位数 JZ C4CMP CC,3 ;输入的数据是3位数 JZ C3CMP CC,2 ;输入的数据是2位数 JZ C2JMP C1 ;输入的数据是1位数C4: MOV AX,0MOV AL,X[0]MOV BX,1000MUL BXMOV DX,AXC3: MOV AL,X[1]MOV BL,100MUL BLADD DX,AXC2: MOV AL,X[2]MOV BL,10MUL BLADD DX,AXC1: MOV AL,X[3]MOV AH,0ADD DX,AXCMP E,1JNZ X1_SMOV X2,DX ;按下的是等号,则将第二个运算数据的值存入X2变量JMP EXIT3X1_S: MOV X1,DX ;按下的是运算符号,则将第一个运算数据的值存X1变量MOV X[3],0 ;清空X变量MOV X[2],0MOV X[1],0MOV X[0],0EXIT3: POP DXPOP BXPOP AXRETCOUNT ENDP;以下为数字键处理子程序;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数NUMBER PROCCMP E,1JNZ CONTINUEMOV E,0CALL CLEARCONTINUE: CMP CC,0 ;目前数据为0位,即没有数据,则转到SSSJZ SSS;若已有数据,以下程序将X左移8位。