下载此文档

8086简易计算器的设计-计算机硬件-微机原理-课程设计.pdf


文档分类:IT计算机 | 页数:约26页 举报非法文档有奖
1/26
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/26 下载此文档
文档列表 文档介绍
该【8086简易计算器的设计-计算机硬件-微机原理-课程设计 】是由【青山代下】上传分享,文档一共【26】页,该文档可以免费在线阅读,需要了解更多关于【8086简易计算器的设计-计算机硬件-微机原理-课程设计 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..简易计算器的设计姓名专业自动化(电站方向)班级学号:..:..本次课程设计的实验目的是:通过该实验掌握较复杂程序的设计;能独立完成用程序对8086、8255A控制键盘和LED显示的控制,完成计算器加减法的应用;独立编写程序,明白和掌握程序的原理和实现方式;学****和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用;进一步加强理论知识与应用相结合的实践和锻炼,为以后的设计提供经验。这次设计实践,加深了我对专业知识和理论知识学****的认识和理解,使我的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。我们的具体任务是用8086设计一个能实现0~9整数加减乘除法的运算器,并用2位LED数码显示,键盘包括0-9,+,-,×,÷,=,NO/C共16个按键。二、小组成员分工及成果在实验课程要求下,我们选择基于8086CPU的模拟计算器设计。要完成设计首先需要构建简单的微型计算机应用系统,其次是确定组成各部件的芯片,然后画原理图,根据相应的原理以及实现过程,编写出相应的汇编代码。再根据原理图连接硬件电路,电路连接完成后进行调试。设计过程中我们用到了8086CPU、可编程并行输入/输出芯片8255A、74HC138、74HC373、矩阵式键盘、LED数码管。我们的模拟计算器能实现2位十进制数以内的加减乘除法运算。首先,本组的三个成员一起讨论研究简易计算器设计的主要方案。粗略设计程序流程图以确定简易计算器设计的大概框架。明确目的后各自查询资料了解设计原理、逐步清晰设计思路。以下为大体分工:主要负责:1、设计主要程序,编写;2、查找资料验证修改;主要负责:1、选择需要用的各个芯片;2、设计硬件原理图;主要负责:1、各个芯片功能的资料查找;2、设计程序流程图三、设计方案思路用8086设计一个能实现0~9整数加减乘除法的运算器,并用2位LED数码显示,键盘包括0-9,+,-,×,÷,=,NO/C共16个按键。:..、通过小键盘做加减乘除运算。2、数码管显示器作输入数据和结果数据的显示。3、数字用小键盘0~9,“C、+、-、×、÷、=”做功能键4、运算顺序:(在0~9之间,否则无反应)“+、-、×、÷”(在0~9之间,否则无反应)“=”“00”数据清0,“=”则数据不变设计思路:将整个程序划分为键盘扫描部分,显示部分,运算程序部分。首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序实现运算。运算完成后将运算的结果储存并显示到LED显示器上。软件流程大致如下:开始,然后是系统的初始化,进行键盘扫描,对扫描的键值进行判断(分为数字键和功能键),若为数字键,则执行数字键处理程序,即显示数字并将数值存储;若为功能键,则先判断是否为清屏,如是清屏,则执行清屏子程序,如是加减乘除运算键则调用相应程序运算,如是等号键,则先判断上个符号位,调用相对应的运算子程序进行运算,如此就可以得到需要的结果了。四、硬件原理图(包括芯片的选型介绍)硬件电路图:(见图1):..图1原理图1、键盘输入模块键盘是常用信息输入元件,其实键盘也是由一个个按钮组成,如果是独立按钮的话必须要对应一个I/O口对它进行检测,而键盘往往只需要键盘按钮数一半的I/O口对它进行检测,也许对一个比较简单的系统I/O口数一般不是问题,但对于一个大型、复杂的系统来说I/O资源就显得非常珍贵了,尽量减少I/O使用是非常利于降低成本,另外一方面键盘比用独立按键要美观,同时硬件上的节省必然导致软件上编程的复杂。我们设计时使用的是4*4式键盘,如图2所示。:..2键盘图中有4行4列,4根行线与PC口相连,4根列线与PA口相连。按键设置在行、列交点处(数字或字符为其键号),行、列线分别连接到按键开关的两端。键盘中有无按键按下是由行线送入全扫描字、列线读入行线状态来判断。这就是:给行线所有I/O线均置成低电平,然后读入列线电平状态。如果有按键按下,总会有一根列线电平被拉至低电平,从而使列线输入不全为1。2、可编程并行通信接口芯片8255A图38255A(1)并行输入/输出端口A,B,C8255A内部包括三个8位的输入输出端口,分别是端口A、端口B、端口C,相应信号线是PA7~PA0、PB7~PB0、PC7~PC0。端口都是8位,都可以作为输入或输出。通常将端口A和端口B定义为输入/输出的数据端口,而端口C则既可以作数据端口,又可以作为端口A和端口B的状态和控制信息的传送端口。(2)A组和B组控制部件端口A和端口C的高4位(PC7~PC4)构成A组;由A组控制部件实现控制功能。端口B和端口C的低4位(PC3~PC0)构成B组;由B组控制部件实现控制功能。A组和B:..CPU通过数据总线(D0~D7)送来的控制字,并根据他们来定义各个端口的操作方式。(3)数据总线缓冲存储器三态双向8位缓冲器,是8255A与8086CPU之间的数据接口。与I/O操作有关的数据、控制字和状态信息都是通过该缓冲器进行传送。(4)读/写控制部件8255A是能完成读/写控制功能的部件。能接收CPU的控制命令,并根据控制命令向各个功能部件发出操作指令。CS片选信号:由CPU输入,有效时表示该8255A被选中。RD,WR读、写控制信号:由CPU输入。RD有效表示CPU读8255A,WR有效表示CPU写8255ARESET复位信号:由CPU输入。RESET信号有效,清除8255A中所有控制字寄存器内容,并将各个端口置成输入方式。图48255A内部结构定义工作方式控制字:工作方式0:8255A中各端口的基本输入/输出方式。:..58255A工作方式控制3、显示模块图6显示器显示原理:显示子程序把数据每一位独立显示,每次从最高位显示到最低位,在扫描键盘的时候不断调用显示子程序,形成了从高位到低位的不断循环显示,由于循环速度快,看起来就好像一起显示的。4、74HC373:..774HC373其中AD0-AD7为数据输入端,A0-A7为输出端。当三态允许控制端OE为低电平时,A0-A7为正常逻辑状态,可用来驱动负载或总线,当OE为高电平时,A0-A7成高阻态,不驱动总线。当锁存允许端LE为高电平时,A随数据AD而变,当LE为低电平AD被锁存在已建立的数据电平。5、74HC138图874HC13874HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。:..译码器可接受3位二进制加权地址输入(A0,A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。74HC138特有3个使能输入端:两个低有效(E1和E2)和一个高有效(E3)。除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高,74HC138为反相输出,它按照三位二进制输入码和赋能输入条件,从8个输出端中译出一个低电平输出。两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器。6、8086CPU图98086CPU的40条引脚信号可按功能分可分为四类,它们是:地址总线,数据总线,控制总线,其它(时钟与电源)。最小模式下一些引脚功能(MN/MX接+5V):AD15~AD0,地址/数据总线A19/S6~A16/S3,地址/状态总线RD,读信号WR,写信号M/IO,存储器/输入输出控制信号ALE,地址锁存允许信号READY(Ready),准备就绪信号:..,可屏蔽中断请求信号INTA,中断响应信号NMI,非屏蔽中断请求信号RESET,系统复位信号DEN,数据允许信号DT/R,数据发送/接收控制信号HOLD,总线保持请求信号输入HLDA,总线保持响应信号TEST,测试信号CLK,时钟输入信号VCC(+5V),GND五、程序流程图开始8255A初始化有无压键N继续扫描是数字键YOPER为0加号YY保存第一个数据保存“+”在OPER减号YNN保存第二个数据乘号Y保存“-”在OPER放键除号NY等号保存“×”在OPER清零:..NYY保存“÷”在OPERNN继续扫描键盘YNY清零显示器和数据N进行+、-、×、÷运算,并将结果进行显示,等待C被按下DATASEGMENTNUM1DB03HDUP(0)NUMDB03HDUP(0)DATAENDSSTACKSEGMENTDW100DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK:..口地址PORTBEQU32HPORTCEQU34HPORT8255EQU36H;8255片选始地址MAINPROCFAR(8255初始化)START:MOVAX,DATA;数据段MOVDS,AX;将寄存器AX的内容传送给寄存器DSMOVDX,PORT8255;把8255计数器里的内容放到DX寄存器MOVAL,81H;A组方式0;A口输出,C口高四位输入OUTDX,AL;B组方式0;B口输出,C口低四位输入LOPL:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL;ZF=1,即结果为0,则转到LOPLCMPAL,0FH;把AL和0FH相比较L;ZF=1,即结果为0,LCMPAL,0AH;把AH和0AH相比较JZLOPL;ZF=1,即结果为0,则转到LOPLJNCLOPL;若CF=0,表示第:..LOPLOUT32H,AL;输出B口数据ALLOPL2:LEASI,NUM;将NUM的偏移地址给SIMOV[SI],AL;将AL的数据存放在SI中PUSHAX;AX出栈LOPL1:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL1;ZF=1,即结果为0,则转到LOPL1CMPAL,0FH;把AL和0FH相比较L;ZF=1,即结果为0,LCMPAL,0AH;把AL和0AH相比较JZXX1;ZF=1,即结果为0,则转到XX1CMPAL,0BH;把AL和0BH相比较JZXX2;ZF=1,即结果为0,则转到XX2CMPAL,0CH;把AL和0CH相比较JZXX3D;ZF=1,即结果为0,则转到XX3DCMPAL,0DH;把AL和0DH相比较JZXX4D;ZF=1,即结果为0,则转到XX4DJMPLOPL1;转移到LOPL1CCCL:MOVAL,00H:..输出B口数据ALJMPLOPL;转移到LOPLXX3D:CALLXX3;调用XX3程序XX4D:CALLXX4;调用XX4程序MAINENDPXX1PROCNOP;加LOPL3:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL3;ZF=1,即结果为0,则转到LOPL3CMPAL,0FH;把AL和0FH相比较L;ZF=1,即结果为0,LCMPAL,0AH;把AL和0AH相比较JZLOPL3;ZF=1,即结果为0,则转到LOPL3JNCLOPL3;若CF=0,表示第一个数大,转向LOPL3OUT32H,AL;输出B口数据ALPUSHAX;AX出栈LEASI,NUM;将NUM的偏移地址给SIMOV[SI+1],AL;将AL的数据存放在SI+1中LOPL4:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL4;ZF=1,即结果为0,:..LOPL4CMPAL,0FH;把AL和0FH相比较L;ZF=1,即结果为0,LCMPAL,0EH;把AL和0EH相比较JZXXX1;ZF=1,即结果为0,则转到XXX1JMPLOPL4;转移到LOPL4XXX1:LEASI,NUMMOVAL,[SI]ANDAL,0FHMOVDL,[SI+1]ANDDL,0FH;相与,高四位置0,低四位保持不变,赋给DLADDAL,DLDAA;转化成BCD码OUT32H,AL;输出B口数据ALJMPLOPL;转移到LOPLXX1ENDPXX2PROCNOP;减LOPL5:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL5;ZF=1,即结果为0,则转到LOPL5CMPAL,0FH;把AL和0FH相比较L;ZF=1,即结果为0,则LCMPAL,0AH;把AL和0AH相比较:..,即结果为0,则转到LOPL5JNCLOPL5OUT32H,AL;输出B口数据ALPUSHAX;AX出栈LEASI,NUM;将NUM的偏移地址给SIMOV[SI+1],AL;将AL的数据存放在SI+1中LOPL6:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL6;ZF=1,即结果为0,则转到LOPL6CMPAL,0FH;把AL和0FH相比较L7;ZF=1,即结果为0,则转到LOPL7CMPAL,0EH;把AL和0EH相比较JZXXX2;ZF=1,即结果为0,则转到XXX2JMPLOPL6;转移到LOPL6XXX2:LEASI,NUM;将NUM的偏移地址给SIMOVAL,[SI]ANDAL,0FHMOVDL,[SI+1]ANDDL,0FHSUBAL,DLADDAL,00HDAAOUT32H,AL;输出B口数据ALJMPLOPL;转移到LOPL:..OUT32H,AL;输出B口数据ALJMPLOPL;转移到LOPLXX2ENDPXX3PROC;乘LOPL7:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL7;ZF=1,即结果为0,则转到LOPL7CMPAL,0FH;把AL和0FH相比较L2;ZF=1,即结果为0,L2CMPAL,0AH;把AL和0AH相比较JZLOPL7;ZF=1,即结果为0,则转到LOPL7JNCLOPL7;若CF=0,表示第一个数大,转向LOPLOUT32H,AL;输出B口数据ALPUSHAX;AX出栈LEASI,NUM;将NUM的偏移地址给SIMOV[SI+1],AL;将AL的数据存放在SI+1中LOPL8:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL8;ZF=1,即结果为0,则转到LOPL8CMPAL,0FH;把AL和0FH相比较L3;ZF=1,即结果为0,L3:..把AL和0EH相比较JZXXX3;ZF=1,即结果为0,则转到XXX3JMPLOPL8;转移到LOPL8XXX3:LEASI,NUM;将NUM的偏移地址给SIMOVAL,[SI]ANDAL,0FHMOVDL,[SI+1]ANDDL,0FHMULDL;DL*ALAAM;商放AH,余数放ALMOVCL,4SALAH,CL;把AH向左移四位ORAL,AH;或指令,有1置1OUT32H,AL;输出B口数据ALJMPLOPL;转移到LOPLCCCL2:MOVAL,00HOUT32H,AL;输出B口数据ALJMPLOPL;转移到LOPLCCCL3:MOVAL,00HOUT32H,AL;输出B口数据ALJMPLOPL;转移到LOPLXX3ENDPXX4PROC;除LOPL9:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL9;ZF=1,即结果为0,则转到LOPL9:..把AL和0FH相比较L5;ZF=1,即结果为0,L5CMPAL,0AH;把AL和0AH相比较JZLOPL9;ZF=1,即结果为0,则转到LOPL9JNCLOPL9;若CF=0,表示第一个数大,转向LOPL9OUT32H,AL;输出B口数据ALPUSHAX;AX出栈LEASI,NUM;将NUM的偏移地址给SIMOV[SI+1],AL;将AL的数据存放在SI+1中LOPL10:XORAH,AH;抑或指令,使AH清零CALLKEY;调用KEY程序CMPAH,00H;把AH和00H相比较JZLOPL10;ZF=1,即结果为0,则转到LOPL10CMPAL,0FH;把AL和0FH相比较L4;ZF=1,即结果为0,L4CMPAL,0EH;把AL和0EH相比较JZXXX4;ZF=1,即结果为0,则转到XXX4JMPLOPL10;转移到LOPL10XXX4:LEASI,NUM;将NUM的偏移地址给SIMOVAL,[SI]ANDAL,0FH;与指令,高四位清零,低四位不变MOVBL,[SI+1]ANDBL,0FH:..DIVBL;AL÷BL,商放在AL中,余数放在AH中OUT32H,AL;输出B口数据ALJMPLOPL;转移到LOPLCCCL4:MOVAL,00HOUT32H,AL;输出B口数据ALJMPLOPL;转移到LOPLCCCL5:MOVAL,00HOUT32H,AL;输出B口数据ALJMPLOPL;转移到LOPLXX4ENDPKEYPROCNOPLEASI,NUM1MOVAL,0EHOUT30H,AL;输出A口数据ALINAL,34HCMPAL,07H;把AL和07H相比较JZLL7;ZF=1,即结果为0,则转到LL7CMPAL,0BH;把AL和0BH相比较JZLL8;ZF=1,即结果为0,则转到LL8CMPAL,0DH;把AL和0DH相比较JZLL9;ZF=1,即结果为0,则转到LL9CMPAL,0EH;把AL和0EH相比较JZLDIV;ZF=1,即结果为0,则转到LDIV:..OUT30H,AL;输出A口数据ALINAL,34HCMPAL,07H;把AL和07H相比较JZLL4;ZF=1,即结果为0,则转到LL4CMPAL,0BH;把AL和0BH相比较JZLL5;ZF=1,即结果为0,则转到LL5CMPAL,0DH;把AL和0DH相比较JZLL6;ZF=1,即结果为0,则转到LL6CMPAL,0EH;把AL和0EH相比较JZLMUL;ZF=1,即结果为0,则转到LMULSS2:MOVAL,0BHOUT30H,AL;输出A口数据ALINAL,34HCMPAL,07H;把AL和07H相比较JZLL1;ZF=1,即结果为0,则转到LL1CMPAL,0BH;把AL和0BH相比较JZLL2;ZF=1,即结果为0,则转到LL2CMPAL,0DH;把AL和0DH相比较JZLL3;ZF=1,即结果为0,则转到LL3CMPAL,0EH;把AL和0EH相比较JZLSUB;ZF=1,即结果为0,则转到LSUBSS3:MOVAL,07H:..输出A口数据ALINAL,34HCMPAL,07H;把AL和07H相比较JZSCLC;ZF=1,即结果为0,则转到SCLCCMPAL,0BH;把AL和0BH相比较JZLL0;ZF=1,即结果为0,则转到LL0CMPAL,0DH;把AL和0DH相比较JZLEQU;ZF=1,即结果为0,则转到LEQUCMPAL,0EH;把AL和0DH相比较JZLADD;ZF=1,即结果为0,则转到LADDJMPKCLC;转移到KCLCLDIV:MOVAL,0DHJMPLCLCJMPLCLCLL1:MOVAL,01HJMPLCLCLL2:MOVAL,02HJMPLCLCLL3:MOVAL,03HJMPLCLCLL4:MOVAL,04HJMPLCLCLL5:MOVAL,05HJMPLCLCLL6:MOVAL,06HJMPLCLCLL7:MOVAL,07H:..LL8:MOVAL,08HJMPLCLCLL9:MOVAL,09HJMPLCLCLADD:MOVAL,0AHJMPLCLCLSUB:MOVAL,0BHJMPLCLCLMUL:MOVAL,0CHJMPLCLCLEQU:MOVAL,0EHJMPLCLCSCLC:MOVAL,0FHLCLC:MOV[SI],AL;将AL的数据存放在SI中MOVAH,01HKCLC:RET;强制复位KEYENDP;KEY结束CODEENDS;全部代码结束ENDSTART七、程序运行结果分析与预测:..7程序运行结果显示八、结果评述或总结本次实验是一个相对而言比较难的设计,因为这次设计不仅仅是课本上知识的整合,而且还有很多是课外的扩展。可以说是一个挑战。我们做的题目是简易计算器的设计。首先8255A的初始化和8086的接线也是十分简单,但是等到编程的时候发现有很多不懂的地方,觉得很容易的算法在编程中很难实现。于是我开始查看课本和有关的资料,知道了一些编程常用的方法,受益匪浅。本次实验设计,不仅加深了我对接口程序设计的认识,对接口各部件的工作原理有了进一步的了解,也增强了我分析故障的能力,更重要的是培养了我们面对问题、解决问题的能力。从理论知识上我们对8255A的作用、功能以及初始化更加熟悉,并且有了客观上的理解,对键盘的使用和数码管显示问题也有了一定了解了。这次课程设计还是比较成功的。:..接高电平,在最小模式下,373锁存器:ALE是地址锁存允许信号,低电平有效,LE高电平有效,低电平时LE不工作,允许数据地址进入输入端(AD0-AD7);高电平时无数据输入,U2工作,打开进入地址锁存。LE在高电平时将状态输入。138译码器,Y2片选信号用第八位经过锁存器锁存,用译码器译码,计算出地址

8086简易计算器的设计-计算机硬件-微机原理-课程设计 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数26
  • 收藏数0 收藏
  • 顶次数0
  • 上传人青山代下
  • 文件大小2.09 MB
  • 时间2024-04-14