微机原理模拟计算器设计课程设计.docx
《微机原理模拟计算器设计课程设计.docx》由会员分享,可在线阅读,更多相关《微机原理模拟计算器设计课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
微机原理模拟计算器设计课程设计
课程设计任务书
课程名称微机原理及应用
院部名称机电工程学院
专业电气工程及其自动化
班级吴映阳
指导教师李国利
金陵科技学院教务处制
摘要
学了微型计算机原理与应用课程之后,为了巩固和检测所学知识,我选择基于8088CPU的模拟计算器设计。
要完成设计首先需要构建简单的微型计算机应用系统,其次是确定组成各部件的芯片,然后画原理图并且用仿真软件仿真。
仿真正确后再连接硬件电路,电路连接完成后进行调试。
设计过程中我们用到了8088CPU、可编程计时器8253、可编程并行输入/输出芯片8255A、74LS138、2*8矩阵式键盘、六位七段LED数码管。
原理图设计完成之后用PROTUES仿真软件对原理图进行了仿真得到了预期的结果。
我们的模拟计算器能实现5位十进制数以内的及减法运算和2位十进制数以内的乘除法运算。
关键词:
模拟计算器,8088CPU,PROTUES,8255A
一、概述……………………………………………………………………………4
二、硬件电路………………………………………………………………………4
2.1、CPU控制模块…………………………………………………………………4
2.2、键盘输入模块…………………………………………………………………6
2.3、可编程并行通信接口芯片8255A……………………………………………7
2.4、可编程计数器/定时器……………………………………………………8
2.5、总原理图……………………………………………………………………9
三、软件设计框图……………………………………………………………………10
四、源程序……………………………………………………………………………11
五、调试过程…………………………………………………………………………26
六、课程设计体会……………………………………………………………………26
七、参考文献…………………………………………………………………………27
模拟计算器设计
一、概述
设计思路:
首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序实现5位十进制数以内的及减法运算和2位十进制数以内的乘除法运算。
运算完成后将运算的结果储存并显示到LED显示器上。
二、硬件电路设计
硬件电路键盘输入及LED数码管通过8255A接口与系统总线连接,键盘的16个按键组成8*2矩阵,其中8根矩阵线作为8255A的输出线与PB7~PB0连接,2根矩阵线作为8255A的输入线与PC7、PC6连接。
键盘采用逐次扫描原理,16个按键中0~9座位数字健,+、-、*、/、=作为加、减、乘、除和等号功能键,C为清零键。
1、
CPU控制模块
16位微处理器,内含29000个晶体管,时钟频率为4.77MHz,地址总线为20位,可使用1MB内存。
8088内部数据总线都是16位,外部数据总线是8位。
图1-1.8284时钟发生器图1-2.8088CPU
2、键盘输入模块
键盘是常用信息输入元件,其实键盘也是由一个个按钮组成,如果是独立按钮的话必须要需要一个I/O口对它进行检测,而键盘往往这需要键盘按钮数一半的I/O口数对它进行检测,也许对一个比较简单的系统I/O口数一般不是问题,但对于一个大型、复杂的系统来说I/O资源就显得非常珍贵了,尽量减少I/O使用是非常利于降低成本,另外一方面键盘比用独立按键要美观。
我们设计时使用的是8*2行列式键盘,如图2-1所示。
图中有8行2列,8根行线与PA口相连,2根列线与PC口的PC6、PC7相连。
PA、PB口要么全部输入或输出。
PC口可以进行输入和输出。
按键设置在行、类交点处(数字或字符为其键号),行、列线分别连接到按键开关的两端。
当列线通过上拉电阻接+5V时,就被钳位在高电平状态。
键盘中有无按键按下是由行线送入全扫描字、列线读入行线状态来判断。
这就是:
给航线所有I/O线均置成低电平,然后读入列线电平状态。
如国有按键盘下,总会有一根列线电平被拉至低电平,从而使列线输入不全为1。
图2-1键盘电路图2-2数码管电路
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的控制命令,并根据控制命令向各个功能部件发出操作指令。
图2-3.8255A芯片图
CS片选信号:
由CPU输入,有效时表示该8255A被选中。
RD,WR读、写控制信号:
由CPU输入。
RD有效表示CPU读8255A,WR有效表示CPU写8255A。
RESET复位信号:
由CPU输入。
RESET信号有效,清除8255A中所有控制字寄存器内容,并将各个端口置成输入方式。
图2-4.8255A内部结构
定义工作方式控制字:
工作方式0:
8255A中各端口的基本输入/输出方式。
图2-5.8255A工作方式控制
8253
11
10
9
8
7
6
5
4
3
2
D7
1
D6
D5
D4
D3
D2
D1
D0
CLK0
OUT0
GET0
GND
12
14
15
16
17
18
19
20
21
22
23
24
0UT1
CLK1
GATE1
OUT2
GATE2
A1
WR
A0
CS
CKL2
RD
+5v
13
4、可编程计数器/定时器
8253具有3个独立的计数通道,采用减1计数方式。
在门控信号有效时,每输入1个计数脉冲,通道作1次计数操作。
当计数脉冲是已知周期的时钟信号时,计数就成为定时。
(1)、8253内部结构
8253芯片有24条引脚,封装在双列直插式陶瓷管壳内。
1.数据总线缓冲器
图2-6、8253芯片图
数据总线缓冲器与系统总线连接,8位双向,与CPU交换信息的通道。
这是8253与CPU之间的数据接口,它由8位双向三态缓冲寄存器构成,是CPU与8253之间交换信息的必经之路。
2.读/写控制
读/写控制分别连接系统的IOR和IOW,由CPU控制着访问8253的内部通道。
接收CPU送入的读/写控制信号,并完成对芯片内部各功能部件的控制功能,因此,它实际上是8253芯片内部的控制器。
A1A0:
端口选择信号,由CPU输入。
8253内部有3个独立的通道和一个控制字寄存器,它们构成8253芯片的4个端口,CPU可对3个通道进行读/写操作3对控制字寄存器进行写操作。
这4个端口地址由最低2位地址码A1、A0来选择。
5、总原理图
图2-7、PROTUES画出的总原理图
三、软件设计框图
四、源程序
一、源程序
STACKSEGMENTSTCAK
DB64DUP(?
)
STACKENDS
DATASEGMENT
ORG3000H
VAR1DB00H,01H,02H,03H,04H
VAR2DB3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH
VAR3DB00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
VAR4DB00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,
71H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAL,88H
OUT63H,AL;82255A初始化
MOVBX,0000H;BX清零
STT:
MOVAL,00H;键盘测试
OUT61H.AL
NEXT:
INAL,62H
ANDAL,0C0H
CMPAL,0C0H
JNZKEYABC
CALLDISP;调用显示程序
JMPSTT
KEYABC:
CALLTIME;延时,去抖动
INAL,62H
ANDAL,0C0H
CMPAL,0C0H
JNZKEY
JMPSTT
KEY:
MOVAL,0FEH;键盘扫描识别
OUT61H,AL
INAL,62H
TESTAL,80H
JNZKEY_0
CALLKEY8
JMPSTTK
KEY_0:
TESTAL,40H
JNZKEY_9
CALLKEY0
JMPSTTK
KEY_9:
MOVAL,0FDH
OUT61H,AL
INAL,62H
TESTAL,80H
JNZKEY_1
CALLKEY9
JMPSTTK
KEY_1:
TESTAL,40H
JNZKEY_A
CALLKEY1
JMPSTTK
KEY_A:
MOVAL,0FBH
OUT61H,AL
INAL,62H
TESTAL,80H
JNZKEY_2
CALLKEYA
JMPSTTK
KEY_2:
TESTAL,40H
JNZKEY_B
CALLKEY2
JMPSTTK
KEY_B:
MOVAL,0F7H
OUT61H,AL
INAL,62H
TESTAL,80H
JNZKEY_3
CALLKEYB
JMPSTTK
KEY_3:
TESTAL,40H
JNZKEY_C
CALLKEY3
JMPSTTK
KEY_C:
MOVAL,0EFH
OUT61H,AL
INAL,62H
TESTAL,80H
JNZKEY_4
CALLKEYC
JMPSTTK
KEY_4:
TESTAL,40H
JNZKEY_D
CALLKEY4
JMPSTTK
KEY_D:
MOVAL,0DFH
OUT61H,AL
INAL,62H
TESTAL,80H
JNZKEY_5
CALLKEYD
JMPSTTK
KEY_5:
TESTAL,40H
JNZKEY_D
CALLKEY5
JMPSTTK
KEY_E:
MOVAL,0BFH
OUT61H,AL
INAL,62H
TESTAL,80H
JNZKEY_6
CALLKEYE
JMPSTTK
KEY_6:
TESTAL,40H
JNZKEY_F
CALLKEY6
JMPSTTK
KEY_F:
MOVAL,07FH
OUT61H,AL
INAL,62H
TESTAL,80H
JNZKEY_7
CALLKEYF
JMPSTTK
KEY_7:
TESTAL,40H
JNZKEY_71
CALLKEY7
JMPSTTK
KEY_71:
JMPSTTK
KEY9:
CMPBH,00H;按键9处理子程序
JZKEY9_1;未按过符号键,不清零
CALLCLEAR;已按过符号键,清零
KEY9_1:
CALLLP1;低4位字节前移
MOVAL,6FH;最低字节输入一个数据
MOV[SI+4],AL
MOVAL,09H
MOV[DI+4],AL
CALLDISP;显示
RET;返回
KEY8:
CMPBH,00H;按键8处理子程序
JZKEY8_1
CALLCLEAR
KEY8_1:
CALLLP1
MOVAL,7FH
MOV[SI+4],AL
MOVAL,08H
MOV[DI+4],AL
CALLDISP
RET
KEY7:
CMPBH,00H;按键7处理子程序
JZKEY7_1
CALLCLEAR
KEY7_1:
CALLLP1
MOVAL,07H
MOV[SI+4],AL
MOVAL,07H
MOV[DI+4],AL
CALLDISP
RET
KEY6:
CMPBH,00H;按键6处理子程序
JZKEY6_1
CALLCLEAR
KEY6_1:
CALLLP1
MOVAL,7DH
MOV[SI+4],AL
MOVAL,06H
MOV[DI+4],AL
CALLDISP
RET
KEY5:
CMPBH,00H;按键5处理子程序
JZKEY5_1
CALLCLEAR
KEY5_1:
CALLLP1
MOVAL,6DH
MOV[SI+4],AL
MOVAL,05H
MOV[DI+4],AL
CALLDISP
RET
KEY4:
CMPBH,00H;按键4处理子程序
JZKEY4_1
CALLCLEAR
KEY4_1:
CALLLP1
MOVAL,66H
MOV[SI+4],AL
MOVAL,04H
MOV[DI+4],AL
CALLDISP
RET
KEY3:
CMPBH,00H;按键3处理子程序
JZKEY3_1
CALLCLEAR
KEY3_1:
CALLLP1
MOVAL,4FH
MOV[SI+4],AL
MOVAL,03H
MOV[DI+4],AL
CALLDISP
RET
KEY2:
CMPBH,00H;按键2处理子程序
JZKEY2_1
CALLCLEAR
KEY2_1:
CALLLP1
MOVAL,5BH
MOV[SI+4],AL
MOVAL,02H
MOV[DI+4],AL
CALLDISP
RET
KEY1:
CMPBH,00H;按键1处理子程序
JZKEY1_1
CALLCLEAR
KEY1_1:
CALLLP1
MOVAL,06H
MOV[SI+4],AL
MOVAL,01H
MOV[DI+4],AL
CALLDISP
RET
KEY0:
CMPBH,00H;按键0处理子程序
JZKEY0_1
CALLCLEAR
KEY0_1:
CALLLP1
MOVAL,3FH
MOV[SI+4],AL
MOVAL,00H
MOV[DI+4],AL
CALLDISP
RET
KEYA:
CMPBH,00H;按键+号处理子程序
JNZKEYA_1
CALLLP3;保存输入的数据
KEYA_1:
MOVBX,0101H;设置符号标志
RET;返回
KEYB:
CMPBH,00H;按键-号处理子程序
JNZKEYB_1
CALLLP3;保存输入的数据
KEYB_1:
MOVBX,0102H;设置符号标志
RET;返回
KEYC:
CMPBH,00H;按键*号处理子程序
JNZKEYC_1
CALLLP3;保存输入的数据
KEYC_1:
MOVBX,0103H;设置符号标志
RET;返回
KEYD:
CMPBH,00H;按键/号处理子程序
JNZKEYD_1
CALLLP3;保存输入的数据
KEYD_1:
MOVBX,0104H;设置符号标志
RET;返回
KEYE:
MOVBH,01H;按键=号处理子程序
CMPBL,01H;是+号?
JZK1;进行加法运算
CMPBL,02H;是-号?
JZK2;进行减法运算
CMPBL,03H;时*号?
JZK3;进行乘法运算
CMPBL,04H;是/号?
JZK4;进行除法运算
STTE:
RET
K1:
CALLADD1
JMPSTTE
K2:
CALLSUB1
JMPSTTE
K3:
CALLMUL1
JMPSTTE
K4:
CALLDIV1
JMPSTTE
KEYF:
CALLCLEAR;按键C(清零)处理子序
RET
CLEAR:
MOVSI,OFFSETVAR2;数据清零子程序
MOVDI,OFFSETVAR3
MOVCX,000AH
CLEAR1:
MOVAL,3FH
MOV[SI],AL
MOVAL,00H
MOV[DI],AL
INCSI
INCDI
LOOPCLEAR1
MOVBH,00H
RET
ADD1:
MOVSI,OFFSETVAR3;;加法子程序
MOVDI,OFFSETVAR4
CLC
MOVCX,0005H
ADD_1:
MOVAL,[DI]
ADCAL,[SI]
AAA
MOV[DI],AL
INCSI
INCDI
LOOPADD_1
CALLCHANGE
CALLDISP
RET
SUB1:
MOVSI,OFFSETVAR3;减法子程序
MOVDI,OFFSETVAR4
CLC
MOVCX,0005H
SUB_1:
MOVAL,[DI]
MOVCL,[SI]
AAS
MOV[DI],AL
INCSI
INCDI
LOOPSUB_1
CALLCHANGE
CALLDISP
RET
MUL1:
MOVSI,OFFSETVAR3;乘法子程序
MOVDI,OFFSETVAR4
MOVAL,[DI]
MOVCL,[SI]
MULCL
AAM
MOV[DI+5],AX
MOVAL,[DI+1]
MULCL
AAM
ADDAL,[DI+6]
AAA
MOV[DI+6],AX
MOVAL,[DI]
MOVCL,[SI+1]
MULCL
AAM
MOV[SI+5],AX
MOVAL,[DI+1]
MULCL
AAM
ADDAL,[SI+6]
AAA
MOV[SI+6],AX
MOVAL,[DI+5]
MOV[DI],AL
MOVAL,[DI+6]
ADDAL,[SI+5]
AAA
MOV[DI+1],AL
MOVAL,[DI+7]
ADCAL,[SI+6]
AAA