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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机硬件技术实践报告
题目简易计算器的设计
姓名
专业自动化(电站方向)
班级
学号
上海电力学院自动化工程学院
一、设计题目及目的
本次课程设计的实验目的是:通过该实验掌握较复杂程序的设计;能独立完成用程序对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个按键。

1、通过小键盘做加减乘除运算。

2、数码管显示器作输入数据和结果数据的显示。

3、数字用小键盘0~9,“C、+、-、×、÷、= ”做功能键
4、运算顺序:a.首先输入一个原始数据(在0~9之间,否则无反应)显示器跟随显示
b.按“+、-、×、÷”显示器内容不变
c.再次输入一个数据(在0~9之间,否则无反应)显示器跟随显示
d.按“=”显示器显示结果数据
e.按C显示“00”数据清0,并重新开始运算
f.若输入一个数据后直接按“=”则数据不变
设计思路:
将整个程序划分为键盘扫描部分,显示部分,运算程序部分。

首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序实现运算。

运算完成后将运算的结果储存并显示到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
图3 8255A
(1)并行输入/输出端口A,B,C
8255A内部包括三个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 写8255A
RESET 复位信号:由CPU输入。

RESET信号有效,清除8255A中所有控制字寄存器内容,并将各个端口置成输入方式。

图4 8255A内部结构
定义工作方式控制字:
工作方式0:8255A中各端口的基本输入/输出方式。

图5 8255A工作方式控制
3、显示模块
图6 显示器
显示原理:显示子程序把数据每一位独立显示,每次从最高位显示到最低位,在扫描键盘的时候不断调用显示子程序,形成了从高位到低位的不断循环显示,由于循环速度快,看起来就好像一起显示的。

4、74HC373
图7 74HC373
其中AD0-AD7为数据输入端,A0-A7为输出端。

当三态允许控制端OE为低电平时,A0-A7为正常逻辑状态,可用来驱动负载或总线,当OE 为高电平时,A0-A7成高阻态,不驱动总线。

当锁存允许端LE为高电平时,A随数据AD而变,当LE为低电平AD被锁存在已建立的数据电平。

5、74HC138
图8 74HC138
74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。

74HC138译码器可接受3位二进制加权地址输入(A0, A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。

74HC138特有3个使能输入端:两个低有效(E1和E2)和一个高有效(E3)。

除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高,74HC138为反相输出,它按照三位二进制输入码和赋能输入条件,从8 个输出端中译出一个低电平输出。

两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器。

6、8086CPU
图9
8086CPU的40条引脚信号可按功能分可分为四类,它们是:地址总线,数据总线,控制总线,其它(时钟与电源)。

最小模式下一些引脚功能(MN/MX接+5V):
AD15~AD0,地址/数据总线
A19/S6~A16/S3,地址/状态总线
RD,读信号
WR,写信号
M/IO,存储器/输入输出控制信号
ALE,地址锁存允许信号
READY(Ready),准备就绪信号
INTR,可屏蔽中断请求信号INTA,中断响应信号
NMI,非屏蔽中断请求信号RESET,系统复位信号
DEN,数据允许信号
DT/R,数据发送/接收控制信号HOLD,总线保持请求信号输入HLDA,总线保持响应信号TEST,测试信号
CLK,时钟输入信号
VCC(+5V),GND
六、程序清单,要有适当的注释
DATA SEGMENT
NUM1 DB 03H DUP(0) NUM DB 03H DUP(0) DATA ENDS STACK SEGMENT DW 100 DUP(0) STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
Y
N
N
PORTA EQU 30H ;A口地址
PORTB EQU 32H
PORTC EQU 34H
PORT8255 EQU 36H ;8255片选始地址MAIN PROC FAR
(8255初始化)
START: MOV AX,DATA ; 数据段
MOV DS,AX ;将寄存器AX的内容传送给寄存器DS
MOV DX,PORT8255 ;把8255计数器里的内容放到DX寄存器
MOV AL,81H ;A组方式0;A 口输出,C口高四位输入
OUT DX,AL ;B组方式0;B 口输出,C口低四位输入
LOPL: XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序
CMP AH,00H ;把AH和00H相比较
JZ LOPL ;ZF=1,即结果为0,则转到LOPL
CMP AL,0FH ;把AL和0FH相比较
JZ CCCL ;ZF=1,即结果为0,则转到CCCL
CMP AL,0AH ;把AH和0AH相比较 JZ LOPL ;ZF=1,即结果为0,则转到LOPL
JNC LOPL ;若CF=0,表示第
一个数大,转向LOPL
OUT 32H,AL ;输出B口数据AL LOPL2: LEA SI,NUM ;将NUM的偏移地址给SI MOV [SI],AL ;将AL的数据存放在SI中
PUSH AX ;AX出栈
LOPL1: XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序 CMP AH,00H ;把AH和00H相比较 JZ LOPL1 ;ZF=1,即结果为0,则转到LOPL1
CMP AL,0FH ;把AL和0FH相比较
JZ CCCL ;ZF=1,即结果为0,则转到CCCL
CMP AL,0AH ;把AL和0AH相比较 JZ XX1 ;ZF=1,即结果为0,则转到XX1
CMP AL,0BH ;把AL和0BH相比较
JZ XX2 ;ZF=1,即结果为0,则转到XX2
CMP AL,0CH ;把AL和0CH相比较
JZ XX3D ;ZF=1,即结果为0,则转到XX3D
CMP AL,0DH ;把AL和0DH相比较 JZ XX4D ;ZF=1,即结果为0,则转到XX4D
JMP LOPL1 ;转移到LOPL1 CCCL: MOV AL,00H
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
XX3D: CALL XX3 ;调用XX3程序
XX4D: CALL XX4 ;调用XX4程序
MAIN ENDP
XX1 PROC
NOP ;加
LOPL3: XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序
CMP AH,00H ;把AH和00H相比较
JZ LOPL3 ; ZF=1,即结果为0,则转到LOPL3
CMP AL,0FH ;把AL和0FH相比较
JZ CCCL ; ZF=1,即结果为0,则转到CCCL
CMP AL,0AH ;把AL和0AH相比较
JZ LOPL3 ; ZF=1,即结果为0,则转到LOPL3
JNC LOPL3 ;若CF=0,表示第一个数大,转向LOPL3
OUT 32H,AL ;输出B口数据AL
PUSH AX ;AX出栈
LEA SI,NUM ;将NUM的偏移地址给SI MOV [SI+1],AL ;将AL的数据存放在SI+1中
LOPL4: XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序
CMP AH,00H ;把AH和00H相比较
JZ LOPL4 ;ZF=1,即结果为0,
则转到LOPL4
CMP AL,0FH ;把AL和0FH相比较
JZ CCCL ; ZF=1,即结果为0,则转到CCCL
CMP AL,0EH ;把AL和0EH相比较
JZ XXX1 ; ZF=1,即结果为0,则转到XXX1
JMP LOPL4 ;转移到LOPL4
XXX1: LEA SI,NUM
MOV AL,[SI]
AND AL,0FH
MOV DL,[SI+1]
AND DL,0FH ; 相与,高四位置0,低四位保持不变,赋给DL
ADD AL,DL
DAA ;转化成BCD码
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
XX1 ENDP
XX2 PROC
NOP ;减
LOPL5: XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序
CMP AH,00H ;把AH和00H相比较
JZ LOPL5 ;ZF=1,即结果为0,则转到LOPL5
CMP AL,0FH ;把AL和0FH相比较
JZ CCCL ;ZF=1,即结果为0,则转到CCCL
CMP AL,0AH ;把AL和0AH相比较
JZ LOPL5 ; ZF=1,即结果为0,则转到LOPL5
JNC LOPL5
OUT 32H,AL ;输出B口数据AL
PUSH AX ;AX出栈
LEA SI,NUM ;将NUM的偏移地址给SI
MOV [SI+1],AL ;将AL的数据存放在SI+1中
LOPL6:
XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序
CMP AH,00H ;把AH和00H相比较
JZ LOPL6 ; ZF=1,即结果为0,则转到LOPL6
CMP AL,0FH ;把AL和0FH相比较
JZ CCCL7 ;ZF=1,即结果为0,则转到LOPL7
CMP AL,0EH ;把AL和0EH相比较
JZ XXX2 ;ZF=1,即结果为0,则转到XXX2
JMP LOPL6 ;转移到LOPL6
XXX2: LEA SI,NUM ;将NUM的偏移地址给SI
MOV AL,[SI]
AND AL,0FH
MOV DL,[SI+1]
AND DL,0FH
SUB AL,DL
ADD AL,00H
DAA
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
CCCL7: MOV AL,00H
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
XX2 ENDP
XX3 PROC ;乘
LOPL7: XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序
CMP AH,00H ;把AH和00H相比较
JZ LOPL7 ;ZF=1,即结果为0,则转到LOPL7
CMP AL,0FH ;把AL和0FH相比较
JZ CCCL2 ;ZF=1,即结果为0,则转到CCCL2
CMP AL,0AH ;把AL和0AH相比较
JZ LOPL7 ; ZF=1,即结果为0,则转到LOPL7
JNC LOPL7 ;若CF=0,表示第一个数大,转向LOPL
OUT 32H,AL ;输出B口数据AL
PUSH AX ;AX出栈
LEA SI,NUM ;将NUM的偏移地址给SI
MOV [SI+1],AL ;将AL的数据存放在SI+1中LOPL8: XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序
CMP AH,00H ;把AH和00H相比较
JZ LOPL8 ;ZF=1,即结果为0,则转到LOPL8
CMP AL,0FH ;把AL和0FH相比较
JZ CCCL3 ; ZF=1,即结果为0,则转到CCCL3
JZ XXX3 ;ZF=1,即结果为0,则转到XXX3
JMP LOPL8 ;转移到LOPL8
XXX3: LEA SI,NUM ;将NUM的偏移地址给SI
MOV AL,[SI]
AND AL,0FH
MOV DL,[SI+1]
AND DL,0FH
MUL DL ; DL*AL
AAM ;商放AH,余数放AL
MOV CL,4
SAL AH,CL ;把AH向左移四位
OR AL,AH ;或指令,有1置1
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
CCCL2: MOV AL,00H
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
CCCL3: MOV AL,00H
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
XX3 ENDP
XX4 PROC ;除
LOPL9: XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序
CMP AH,00H ;把AH和00H相比较
JZ LOPL9 ; ZF=1,即结果为0,则转到LOPL9
JZ CCCL5 ; ZF=1,即结果为0,则转到CCCL5
CMP AL,0AH ;把AL和0AH相比较
JZ LOPL9 ;ZF=1,即结果为0,则转到LOPL9
JNC LOPL9 ;若CF=0,表示第一个数大,转向LOPL9
OUT 32H,AL ;输出B口数据AL
PUSH AX ;AX出栈
LEA SI,NUM ;将NUM的偏移地址给SI
MOV [SI+1],AL ;将AL的数据存放在SI+1中
LOPL10: XOR AH,AH ;抑或指令,使AH清零
CALL KEY ;调用KEY程序
CMP AH,00H ;把AH和00H相比较
JZ LOPL10 ;ZF=1,即结果为0,则转到LOPL10
CMP AL,0FH ;把AL和0FH相比较
JZ CCCL4 ;ZF=1,即结果为0,则转到CCCL4
CMP AL,0EH ;把AL和0EH相比较
JZ XXX4 ; ZF=1,即结果为0,则转到XXX4
JMP LOPL10 ;转移到LOPL10
XXX4: LEA SI,NUM ;将NUM的偏移地址给SI
MOV AL,[SI]
AND AL,0FH ;与指令,高四位清零,低四位不变
MOV BL,[SI+1]
AND BL,0FH
AND AX,000FH
DIV BL ; AL÷BL,商放在AL中,余数放在AH中
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
CCCL4: MOV AL,00H
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
CCCL5: MOV AL,00H
OUT 32H,AL ;输出B口数据AL
JMP LOPL ;转移到LOPL
XX4 ENDP
KEY PROC
NOP
LEA SI,NUM1
MOV AL,0EH
OUT 30H,AL ;输出A口数据AL
IN AL,34H
CMP AL,07H ;把AL和07H相比较
JZ LL7 ; ZF=1,即结果为0,则转到LL7
CMP AL,0BH ;把AL和0BH相比较
JZ LL8 ;ZF=1,即结果为0,则转到LL8
CMP AL,0DH ;把AL和0DH相比较
JZ LL9 ; ZF=1,即结果为0,则转到LL9
CMP AL,0EH ;把AL和0EH相比较
JZ LDIV ; ZF=1,即结果为0,则转到LDIV
SS1: MOV AL,0DH
OUT 30H,AL ;输出A口数据AL
IN AL,34H
CMP AL,07H ;把AL和07H相比较
JZ LL4 ; ZF=1,即结果为0,则转到LL4
CMP AL,0BH ;把AL和0BH相比较
JZ LL5 ; ZF=1,即结果为0,则转到LL5
CMP AL,0DH ;把AL和0DH相比较
JZ LL6 ;ZF=1,即结果为0,则转到LL6
CMP AL,0EH ;把AL和0EH相比较
JZ LMUL ; ZF=1,即结果为0,则转到LMUL
SS2: MOV AL,0BH
OUT 30H,AL ;输出A口数据AL
IN AL,34H
CMP AL,07H ;把AL和07H相比较
JZ LL1 ; ZF=1,即结果为0,则转到LL1
CMP AL,0BH ;把AL和0BH相比较
JZ LL2 ; ZF=1,即结果为0,则转到LL2
CMP AL,0DH ;把AL和0DH相比较
JZ LL3 ; ZF=1,即结果为0,则转到LL3
CMP AL,0EH ;把AL和0EH相比较
JZ LSUB ;ZF=1,即结果为0,则转到LSUB
SS3: MOV AL,07H
OUT 30H,AL ;输出A口数据AL
IN AL,34H
CMP AL,07H ;把AL和07H相比较
JZ SCLC ;ZF=1,即结果为0,则转到SCLC
CMP AL,0BH ;把AL和0BH相比较
JZ LL0 ;ZF=1,即结果为0,则转到LL0
CMP AL,0DH ;把AL和0DH相比较
JZ LEQU ;ZF=1,即结果为0,则转到LEQU
CMP AL,0EH ;把AL和0DH相比较
JZ LADD ;ZF=1,即结果为0,则转到LADD
JMP KCLC ;转移到KCLC
LDIV: MOV AL,0DH
JMP LCLC
JMP LCLC
LL1: MOV AL,01H
JMP LCLC
LL2: MOV AL,02H
JMP LCLC
LL3: MOV AL,03H
JMP LCLC
LL4: MOV AL,04H
JMP LCLC
LL5: MOV AL,05H
JMP LCLC
LL6: MOV AL,06H
JMP LCLC
LL7: MOV AL,07H
JMP LCLC
LL8: MOV AL,08H
JMP LCLC
LL9: MOV AL,09H
JMP LCLC
LADD: MOV AL,0AH
JMP LCLC
LSUB: MOV AL,0BH
JMP LCLC
LMUL: MOV AL,0CH
JMP LCLC
LEQU: MOV AL,0EH
JMP LCLC
SCLC: MOV AL,0FH
LCLC: MOV [SI],AL ;将AL的数据存放在SI中 MOV AH,01H
KCLC:
RET ; 强制复位KEY ENDP ;KEY结束
CODE ENDS ;全部代码结束
END START
七、程序运行结果分析与预测
图7 程序运行结果显示
八、结果评述或总结
本次实验是一个相对而言比较难的设计,因为这次设计不仅仅是课本上知识的整合,而且还有很多是课外的扩展。

可以说是一个挑战。

我们做的题目是简易计算器的设计。

首先8255A的初始化和8086的接线也是十分简单,但是等到编程的时候发现有很多不懂的地方,觉得很容易的算法在编程中很难实现。

于是我开始查看课本和有关的资料,知道了一些编程常用的方法,受益匪浅。

本次实验设计,不仅加深了我对接口程序设计的认识,对接口各部件的工作原理有了进一步的了解,也增强了我分析故障的能力,更重要的是培养了我们面对问题、解决问题的能力。

从理论知识上我们对8255A的作用、功能以及初始化更加熟悉,并且有了客观上的理解,对键盘的使用和数码管显示问题也有了一定了解了。

这次课程设计还是比较成功的。

8086接高电平,在最小模式下,
373锁存器:ALE是地址锁存允许信号,低电平有效,LE高电平有效,低电平时LE不工作,允许数据地址进入输入端(AD0-AD7);高电平时无数据输入,U2工作,打开进入地址锁存。

LE在高电平时将状态输入。

138译码器,Y2片选信号用
第八位经过锁存器锁存,用译码器译码,计算出地址。

相关文档
最新文档