微机原理课程设计用8255A实现4位十进制计算器.docx
《微机原理课程设计用8255A实现4位十进制计算器.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计用8255A实现4位十进制计算器.docx(32页珍藏版)》请在冰豆网上搜索。
微机原理课程设计用8255A实现4位十进制计算器
微机原理课程设计(用8255A实现4位十进制计算器)
课程设计报告
(2012--2013年度第1学期)
名称:
微型计算机原理及应用
题目:
用8255A实现四位十进制数简单计算器
院系:
控制与计算机工程学院
班级:
自动化1003班
学号:
02
学生姓名:
范昌
指导教师:
王震宇
设计周数:
一周
成绩:
同组人:
贾旭郭欢刘玉婷
日期:
2013年1月5日
一、课程设计的目的与要求
课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。
它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。
通过课程设计,要求学生熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,使学生得到微机开发应用方面的初步训练。
让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题,真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。
通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。
我组根据微机原理课程所学相关知识及实验教程相关内容,在基于proteus平台,使用汇编语言,以8086为核心的情况下,配合可编程并行接口器件8255A,LED数码管等器件实现可进行简单四位数加减乘除法功能的十进制计算器。
在课程设计实践中,我们不仅锻炼了实际动手能力,培养了团队精神和严肃认真的工作态度,更增强了自己在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。
二、课程设计进度及任务分工
课设进度:
1.选择课程设计题目,查阅相关资料。
(全体组员)
2.需求分析及总体设计。
(全体组员)
3.软硬件设计。
(范昌负责主程序的框架与整体调试、LED数码显示部分及硬件构架,贾旭负责键盘管理部分,郭欢、刘玉婷负责算法及相关程序)
4.仿真调试。
(范昌、贾旭)
5.总结及撰写设计报告。
(郭欢、刘玉婷)
6.个人总结(全体组员)
三、设计正文
1.需求分析
操控核心微处理器8086芯片
可编程并行接口芯片8255A
可编程定时/计数器8253A
对输入扫描的矩阵键盘
显示模块LED数码管
辅助器件如74LS138译码器、74LS373等
2.总体设计
确定键盘是否有输入(使用程序不断进行扫描)
若有输入就调用子程序进行判断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程序进行操作
继续扫描键盘是否有输入,从而实现4位十进制数以内的加减乘除法或者扩展功能运算
运算完成后将运算的结果储存并显示到LED显示器上
3.硬件设计
见附录。
4.软件设计
见附录。
四、课程设计总结或结论
(1)个人总结
本次课程设计我们做的课题是用8255A实现4位十进制数简易计算器,四人一组,我负责主程序的框架与整体调试、LED数码显示部分及硬件构架。
对于主程序的框架,是整个计算器的核心,通过与其他组员的商量我们最终确定了我们的主要算法:
通过一个4*4键盘,输入数据,实现加减乘除操作,将输入的数据和运算符分别存储,接收到“=”时进行运算,并将结果输出。
看起来简单的算法,由于涉及到十进制和十六进制的转换,其中就需要很多中间的转换程序。
经过反复修改与查阅资料,我们的程序最终能够完成部分预期功能。
我还负责LED数码管显示部分的程序,四位七段数码管的显示,原理看起来简单,但是实际操作时却有各种各样的毛病,按照原理写好程序,往往不能达到预期效果,数码管又是不显示,有时会显示乱码,有时会闪烁,所有这些,都要一步一步调试,加入合适的延时程序是关键,延时过长、过短都不好。
显示乱码是程序方面出了问题,经过一次次调试,终于得到了稳定的显示,
我对数码管的应用也更熟练了。
由于我之前有接触过proteus仿真软件,所以我负责硬件的搭建,熟悉使用proteus软件对我们专业来说是一项基本技能,通过一次次摸索与XX,我对这个软件的使用也越来越熟悉,学会了怎么连总线,怎么仿真,怎么快速连线,以及常用元件的搜索。
其中最让我满足的是键盘的设计,如果用16个按钮排列当然可以实现我们的要求,但是每次按按钮有很不方便,所以我在网上查询资料,学会了用proteus自身的模型制作自己的元件,上图左边是普通矩阵键盘,右图是我利用proteus自身模型制作的的键盘,感觉很满意。
整个硬件仿真的搭建,由于对软件的不熟悉,本身设计的问题,花了我很长时间,而且重复连接了很多次,最后我们成功仿真出了我们的计算器。
通过本次课程设计,就我本身来说我学会了很多东西,无论是软件上汇编语言程序的编写与调试,还是硬件的搭建技巧与相关软件的应用的能力都得到了很大提高,同时也锻炼了我的自我学习能力与交流合作能力,相关软件的学习使用,相关芯片与元件的使用与选择能力都在一定程度上有了很大进步。
同时,软硬件的结合,也体现了我们自动化专业的特点。
最后,有一点遗憾的就是做好了四位的简易计算器,我们想进一步扩展做成八位的计算器,但是难度有所加大,不是想象中的那么简单,数码管显示部分就花了很大精力去调试。
最后由于时间关系没有完成8位计算器的制作。
(2)团队总结
本次课程设计,我们是四人一组,团队合作的要求就比较高。
因为选题的关系,需要更多的人合作,所以决定四人组队,各自发挥特长。
在设计过程中,我们配合得很好,初期的查阅资料共享,极大地体现了我们人数上的优势。
对于整个设计的交流更让我们在大方向上走上了正确的道路,少走了很多弯路。
我们的课题看起来简单,其实不然,仔细分析,涉及的知识面很广,很考验我们的基本功和自学能力。
软件方面的算法由于是大家一起讨论后决定的,一般都是可行的,也有很多难点,比如说十进制与十六进制的转换,数据的输出与存储等,但是在我们的通力合作下一一解决了我们面临的很多难题。
硬件方面用的是proteus软件仿真,硬件电路的设计也是一个难点,但是通过查阅资料与相互交流,我们的电路最终是可行的,虽然之前失败了好几次。
软件和硬件的结合再一次考验了我们的合作精神,软件是建立在硬件上的,硬件体现软件的功能,主要负责硬件和组要负责软件的同学建立了很好的默契,相互学习,圆满的完成了任务。
本次课程设计我们对自己的成果相对比较满意,在设计的过程中,大家相互学习,相互帮助,都收获很多。
但是我们也有很多不足的地方,比如四位的计算器位数太少,不能进行小数运算等,这些都是对我们能力的极大挑战,为了解决这些问题我们也进行了积极探索,设计了一个八位的简单计算器,但是由于时间有限,没能完成设计。
五、参考文献
[1]《清华大学TPC—2003A实验指导书》,2006版
[2]《新编16/32位微型计算机原理及应用》,李继灿主编,清华大学出版社,2008版,第四版
[3]陈继红.微机原理及应用[M].北京:
高等教育出版社,2011年,276-283页
[4]周明德.微型计算机系统原理及应用[M].北京:
清华大学出版社,2007年
附录
一、软件设计
1.
总程序流程图
2.扫描程序流程图
3.程序代码
;8255A端口地址:
A口:
40H,B口:
44H,C口:
42H,控制端口:
46H
DATASEGMENT
XDB,,,;存放数据的每一位
X1DW;存放第一个数据值
X2DW;存放第二个数据值
YDW;存放运算结果
SDB;存放运算符号值
EDB;按下等号键标记
CCDB;存放运算数据位数
HDB0;存放按键行号
LDB0;存放按键列号
DISCODEDB3FH,06H,5BH,4FH,
66H,6DH,7DH,07H,
7FH,6FH,77H,7CH,
39H,5EH,79H,71H;段码表
DATAENDS
CODESEGMENT
ASSUMECS:
CODE
DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,90H;设置为A口输入,B口输出,C口输出
OUT46H,AL
MOVDI,OFFSETX+3;DI指向X的高位
KKK:
CALLKEY;扫描按键
JMPKKK
;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号
KEYPROC
CHECK:
CALLDISP;等待按键按下的同时进行显示
MOVAL,0F0H;所有行输出低电平
OUT44H,AL
INAL,40H
CMPAL,0FFH;读列值
JZCHECK;若都为高电平则无键按下,等待
MOVCX,50
LOOP$;延时消抖
INAL,DX;重读列值
CMPAL,0FFH
JZCHECK;无键按下一直等待
MOVH,0;有键按下,先把行列号变量清0
MOVL,0
MOVBL,01H
MOVBH,0FEH;扫描法读键值:
从第一行开始测试,即PC0输出低电平
NEXT:
MOVAL,BH
OUT44H,AL
NEXTH:
INAL,40H;读列值,判断是第几列有键按下
TESTAL,BL;从第一列开始判断
JZWAIT0
ROLBL,1
CMPBL,10H;当前行状态下没有列有键按下,则转为对下一行的测试
JZNEXTL
INCH;每判断一列,列号加1
JMPNEXTH;再对下一列进行判断
NEXTL:
MOVH,0
MOVBL,01H
ROLBH,1;对下一行测试,让下一个PC口输出低电平
CMPBH,0EFH
JZEXIT
INCL
JMPNEXT
WAIT0:
INAL,40H;若有键按下,则等该按键松开后再计算键值
CMPAL,0FFH
JNZWAIT0
MOVCX,50
LOOP$;延时消抖
INAL,40H
CMPAL,0FFH
JNZWAIT0
CALLKEYVALUE;调计算键值子程序
EXIT:
RET
KEYENDP
;以下为计算键值子程序,通过行列号计算键值(键值=行号*4+列号)键值存放在DL寄存器中
KEYVALUEPROC
MOVDL,L
MOVDH,H
SHLDL,1
SHLDL,1;列号乘4
ADDDL,DH
CMPDL,9;按下的是数字键
JNGNUM_CALL
CMPDL,14
JLCONT_CALL;按下的是运算键
CMPDL,14
JZOUTP_CALL;按下的是等于键
CMPDL,15
JZCLR_CALL;按下的是清除键
NUM_CALL:
CALLNUMBER;调数字键处理子程序
JMPEXIT1
CONT_CALL:
MOVS,DL;存放运算键的键值
MOVE,0
CALLCOUNT调运算键处理子程序,计算第一个加数
JMPEXIT1
OUTP_CALL:
CALLOUTP;调等号键处理子程序
JMPEXIT1
CLR_CALL:
CALLCLEAR;调清除键处理子程序
EXIT1:
RET
KEYVALUEENDP
;以下为清除键处理子程序,按下清除键后,X变量全部清0
CLEARPROC
MOVX[3],0
MOVX[2],0
MOVX[1],0
MOVX[0],0
CALLBITP
RET
CLEARENDP
;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量
;并根据运算符号,调用相应的运算子程序
OUTPPROC
PUSHAX
PUSHDX
PUSHBX
INCE
CALLCOUNT;调运算键处理子程序,计算第二个运算数据
CMPS,10
JZADD_CALL;运算符为加号,则调用加法子程序
CMPS,11
JZSUB_CALL;运算符为减号,则调用减法子程序
CMPS,12
JZMUL_CALL;运算符为乘号,则调用乘法子程序
CMPS,13
CALLDIVP;运算符为除号,则调用除法子程序
JMPSTORE1
ADD_CALL:
CALLADDP
JMPSTORE1
SUB_CALL:
CALLSUBP
JMPSTORE1
MUL_CALL:
CALLMULP
STORE1:
MOVAX,Y
;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量
MOVDX,0
MOVBX,1000
DIVBX
MOVX[0],AL
MOVAX,DX
MOVBL,100
DIVBL
MOVX[1],AL
MOVAL,AH
MOVAH,0
MOVBL,10
DIVBL
MOVX[2],AL
MOVX[3],AH
POPBX
POPDX
POPAX
RET
OUTPENDP
;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量
;或者将第二个运算数据的数值计算出来并存入X2变量
;将运算符的值存入S变量
COUNTPROC
PUSHAX
PUSHBX
PUSHDX
MOVDX,0
CALLBITP;测试X中的数据是多少位
CMPCC,4;输入的数据是4位数
JZC4
CMPCC,3;输入的数据是3位数
JZC3
CMPCC,2;输入的数据是2位数
JZC2
JMPC1;输入的数据是1位数
C4:
MOVAX,0
MOVAL,X[0]
MOVBX,1000
MULBX
MOVDX,AX
C3:
MOVAL,X[1]
MOVBL,100
MULBL
ADDDX,AX
C2:
MOVAL,X[2]
MOVBL,10
MULBL
ADDDX,AX
C1:
MOVAL,X[3]
MOVAH,0
ADDDX,AX
CMPE,1
JNZX1_S
MOVX2,DX;按下的是等号,则将第二个运算数据的值存入X2变量
JMPEXIT3
X1_S:
MOVX1,DX;按下的是运算符号,则将第一个运算数据的值存X1变量
MOVX[3],0;清空X变量
MOVX[2],0
MOVX[1],0
MOVX[0],0
EXIT3:
POPDX
POPBX
POPAX
RET
COUNTENDP
;以下为数字键处理子程序
;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数
NUMBERPROC
CMPE,1
JNZCONTINUE
MOVE,0
CALLCLEAR
CONTINUE:
CMPCC,0;目前数据为0位,即没有数据,则转到SSS
JZSSS
PUSHAX
PUSHDX
MOVAL,X[3]
MOVAH,X[2]
MOVDL,X[1]
MOVDH,X[0]
MOVCX,8
LL:
SHLAX,1
RCLDX,1
LOOPLL
MOVX[3],AL
MOVX[2],AH
MOVX[1],DL
MOVX[0],DH
POPDX
POPAX
SSS:
MOV[DI],DL;将当前键入的数据存放到X的最低位
INCCC;数据位数加1
CMPCC,4;判断数据位数
JNGEXIT2
MOVCC,0;如果数据超过4位,重新从最低位开始存放
MOVX[2],0
MOVX[1],0
MOVX[0],0
EXIT2:
CALLDISP;调显示子程序,显示输入的数据
RET
NUMBERENDP
;加法子程序
ADDPPROC
PUSHAX
MOVAX,X1
ADDAX,X2
MOVY,AX
POPAX
RET
ADDPENDP
;减法子程序
SUBPPROC
PUSHAX
MOVAX,X1
SUBAX,X2
MOVY,AX
POPAX
RET
SUBPENDP
;乘法子程序
MULPPROC
PUSHAX
PUSHDX
MOVAX,X1
MOVDX,X2
MULDX
MOVY,AX
POPDX
POPAX
RET
MULPENDP
;除法子程序
DIVPPROC
PUSHAX
PUSHBX
PUSHDX
MOVDX,0
MOVAX,X1
MOVBX,X2
DIVBX
MOVY,AX
POPDX
POPBX
POPAX
RET
DIVPENDP
;显示子程序,将X中的数值按位显示出来
DISPPROC
PUSHBX
PUSHAX
MOVBH,0
LEASI,DISCODE
CALLBITP;测试X位数
CMPCC,4
JZQIAN
CMPCC,3
JZBAI
CMPCC,2
JZSHI
CMPCC,1
JMPG
JMPNONE
QIAN:
MOVAH,B;从第4位开始显示
MOVAL,AH
OUT44H,AL
MOVBL,X[0]
MOVAL,[SI+BX]
OUT42H,AL
CALLDELY
MOVAL,0
OUT42H,AL
BAI:
MOVAH,B;从第3位开始显示
MOVAL,AH
OUT44H,AL
MOVBL,X[1]
MOVAL,[SI+BX]
OUT42H,AL
CALLDELY
MOVAL,0
OUT42H,AL
SHI:
MOVAH,B;从第2位开始显示
MOVAL,AH
OUT44H,AL
MOVBL,X[2]
MOVAL,[SI+BX]
OUT42H,AL
CALLDELY
MOVAL,0
OUT42H,AL
G:
MOVAH,01110000B;从第1位开始显示
MOVAL,AH
OUT44H,AL
MOVBL,X[3]
MOVAL,[SI+BX]
OUT42H,AL
CALLDELY
JMPEXIT4
NONE:
MOVAL,0;X中没有数据,不显示
OUT42H,AL
EXIT4:
POPAX
POPBX
RET
DISPENDP
;分析数据位数子程序
BITPPROC
CMPX[0],0;如果X[0]不为0,则数据为4位数
JNZFOURBIT
CMPX[1],0;如果X[1]不为0,则数据为3位数
JNZTHREEBIT
CMPX[2],0;如果X[2]不为0,则数据为2位数
JNZTOWBIT
CMPX[3],0;如果X[3]不为0,则数据为1位数
JNZONEBIT
JMPZER0BIT;否则,没有数据
FOURBIT:
MOVCC,4
JMPEXIT5
THREEBIT:
MOVCC,3
JMPEXIT5
TOWBIT:
MOVCC,2
JMPEXIT5
ONEBIT:
MOVCC,1
JMPEXIT5
ZER0BIT:
MOVCC,0
EXIT5:
RET
BITPENDP
;延时子程序
DELYPROC
PUSHCX
MOVCX,100
LOOP$
POPCX
RET
DELYENDP
CODEENDS
ENDSTART
二、硬件设计
1.微处理器8086
当引脚接高电平时,CPU工作于最小模式。
此时,引脚信号24~31的含义及其功能如下:
(1)INTA/(interruptacknowledge):
可屏蔽中断响应信号,输出,低电平有效。
CPU通过信号对外设提出的可屏蔽中断请求做出响应。
为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。
(2)ALE(addresslockenable):
地址锁存允许信号,输出,高电平有效。
CPU利用ALE信号可以把AD15~AD0地址/数据、A19/S6~A16/S3地址/状态线上的地址信息锁存在地址锁存器中。
(3)DEN/(dataenable):
数据允许控制信号,输出,三态,低电平有效。
信号用作总线收发器的选通控制信号。
当为低电平时,表明CPU进行数据的读/写操作。
(4)DT/(datatransmitorreceive):
数据发送/接收信号,输出,三态。
DT/信号用来控制数据传送的方向。
DT/为高电平时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。
(5)IO/M/(memoryI/Oselect):
存储器、I/O端口选择控制信号。
信号指明当前CPU是选择访问存储器还是访问I/O端口。
为高电平时访问存储器,表示当前要进行CPU与存储器之间的数据传送。
为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。
(6)WR/(write):
写信号,输出,低电平有效。
信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。
(7)HLDA(holdacknowledge):
总线保持响应信号,输出,高电平有效。
HLDA是与HOLD配合使用的联络信号。
在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。
(8)HOLD(busholdrequest):
总线保持请求信号,输入,高电平有效。
在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。
2.可编程并行接口芯片8255A
RESET:
复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
PA0~PA7:
端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入锁存器。
PB0~PB7:
端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。
PC0~PC7:
端口C输入输出线,一个8位的数据输出锁存器/缓冲器,