《微机原理课程设计报告用8255A实现4位十进制计算器.doc》由会员分享,可在线阅读,更多相关《微机原理课程设计报告用8255A实现4位十进制计算器.doc(17页珍藏版)》请在三一办公上搜索。
1、-课程设计报告名 称:微型计算机原理及应用 题 目:用8255A实现四位十进制数简单计算器一、 课程设计的目的与要求课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。通过课程设计,要求学生熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,使学生得到微机开发应用方面的初步训练。让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题,真正做到理论联系实际,提高
2、动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。我组根据微机原理课程所学相关知识及实验教程相关容,在基于proteus平台,使用汇编语言,以8086为核心的情况下,配合可编程并行接口器件8255A,LED数码管等器件实现可进展简单四位数加减乘除法功能的十进制计算器。在课程设计实践中,我们不仅锻炼了实际动手能力,培养了团队精神和严肃认真的工作态度,更增强了自己在实际的工程设计中查阅资料,撰写设计报告
3、表达设计思想和结果的能力。二、 课程设计进度及任务分工课设进度:1.选择课程设计题目,查阅相关资料。全体组员 2.需求分析及总体设计。全体组员3.软硬件设计。昌负责主程序的框架与整体调试、LED数码显示局部及硬件构架,贾旭负责键盘管理局部,郭欢、玉婷负责算法及相关程序4.仿真调试。昌、贾旭5.总结及撰写设计报告。郭欢、玉婷 6.个人总结全体组员三、设计正文1 需求分析l 操控核心微处理器8086芯片l 可编程并行接口芯片8255Al 可编程定时/计数器8253Al 对输入扫描的矩阵键盘l 显示模块LED数码管l 辅助器件如74LS138译码器、74LS373等2 总体设计l 确定键盘是否有输入
4、使用程序不断进展扫描l 假设有输入就调用子程序进展判断,是数值则进展存储并同时进展显示,是运算符号等就调用相应的子程序进展操作l 继续扫描键盘是否有输入,从而实现4位十进制数以的加减乘除法或者扩展功能运算l 运算完成后将运算的结果储存并显示到LED显示器上3 硬件设计见附录。4 软件设计见附录。四、课程设计总结或结论1个人总结本次课程设计我们做的课题是用8255A实现4位十进制数简易计算器,四人一组,我负责主程序的框架与整体调试、LED数码显示局部及硬件构架。对于主程序的框架,是整个计算器的核心,通过与其他组员的商量我们最终确定了我们的主要算法:通过一个4*4键盘,输入数据,实现加减乘除操作,
5、将输入的数据和运算符分别存储,接收到“=时进展运算,并将结果输出。 看起来简单的算法,由于涉及到十进制和十六进制的转换,其中就需要很多中间的转换程序。经过反复修改与查阅资料,我们的程序最终能够完成局部预期功能。我还负责LED数码管显示局部的程序,四位七段数码管的显示,原理看起来简单,但是实际操作时却有各种各样的毛病,按照原理写好程序,往往不能到达预期效果,数码管又是不显示,有时会显示乱码,有时会闪烁,所有这些,都要一步一步调试,参加适宜的延时程序是关键,延时过长、过短都不好。显示乱码是程序方面出了问题,经过一次次调试,终于得到了稳定的显示,我对数码管的应用也更熟练了。由于我之前有接触过prot
6、eus仿真软件,所以我负责硬件的搭建,熟悉使用proteus软件对我们专业来说是一项根本技能,通过一次次摸索与百度,我对这个软件的使用也越来越熟悉,学会了怎么连总线,怎么仿真,怎么快速连线,以及常用元件的搜索。其中最让我满足的是键盘的设计,如果用16个按钮排列当然可以实现我们的要求,但是每次按按钮有很不方便,所以我在网上查询资料,学会了用proteus自身的模型制作自己的元件,上图左边是普通矩阵键盘,右图是我利用proteus自身模型制作的的键盘,感觉很满意。整个硬件仿真的搭建,由于对软件的不熟悉,本身设计的问题,花了我很长时间,而且重复连接了很屡次,最后我们成功仿真出了我们的计算器。通过本次
7、课程设计,就我本身来说我学会了很多东西,无论是软件上汇编语言程序的编写与调试,还是硬件的搭建技巧与相关软件的应用的能力都得到了很大提高,同时也锻炼了我的自我学习能力与交流合作能力,相关软件的学习使用,相关芯片与元件的使用与选择能力都在一定程度上有了很大进步。同时,软硬件的结合,也表达了我们自动化专业的特点。最后,有一点遗憾的就是做好了四位的简易计算器,我们想进一步扩展做成八位的计算器,但是难度有所加大,不是想象中的则简单,数码管显示局部就花了很大精力去调试。最后由于时间关系没有完成8位计算器的制作。2团队总结 本次课程设计,我们是四人一组,团队合作的要求就比拟高。因为选题的关系,需要更多的人合
8、作,所以决定四人组队,各自发挥特长。 在设计过程中,我们配合得很好,初期的查阅资料共享,极大地表达了我们人数上的优势。对于整个设计的交流更让我们在大方向上走上了正确的道路,少走了很多弯路。我们的课题看起来简单,其实不然,仔细分析,涉及的知识面很广,很考验我们的根本功和自学能力。软件方面的算法由于是大家一起讨论后决定的,一般都是可行的,也有很多难点,比方说十进制与十六进制的转换,数据的输出与存储等,但是在我们的通力合作下一一解决了我们面临的很多难题。硬件方面用的是proteus软件仿真,硬件电路的设计也是一个难点,但是通过查阅资料与相互交流,我们的电路最终是可行的,虽然之前失败了好几次。软件和硬
9、件的结合再一次考验了我们的合作精神,软件是建立在硬件上的,硬件表达软件的功能,主要负责硬件和组要负责软件的同学建立了很好的默契,相互学习,圆满的完成了任务。本次课程设计我们对自己的成果相比照拟满意,在设计的过程中,大家相互学习,相互帮助,都收获很多。但是我们也有很多缺乏的地方,比方四位的计算器位数太少,不能进展小数运算等,这些都是对我们能力的极大挑战,为了解决这些问题我们也进展了积极探索,设计了一个八位的简单计算器,但是由于时间有限,没能完成设计。五、参考文献1?清华大学TPC2003A实验指导书?,2006版 2?新编16/32位微型计算机原理及应用?,继灿主编,清华大学,2008版,第四版
10、3 继红.微机原理及应用M.:高等教育,2011年,276-283页4 周明德.微型计算机系统原理及应用M.:清华大学,2007年附录一、 软件设计扫描计算键值数值?运算符?“=?“+?“-?“*?除法运算加法运算清零减法运算乘法运算存储显示1. 总程序流程图2. 扫描程序流程图开场初始化延时12ms按键扫描保存键值按键闭合按键释放按键闭合YYYNNN完毕3. 程序代码;8255A端口地址:A口:40H,B口:44H,C口:42H,控制端口:46HDATA SEGMENT*DB? , ? , ? , ?;存放数据的每一位*1DW ?;存放第一个数据值*2DW?;存放第二个数据值YDW?;存放运
11、算结果SDB? ;存放运算符号值EDB? ;按下等号键标记CC DB? ;存放运算数据位数HDB0 ;存放按键行号LDB0 ;存放按键列号DISCODEDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;段码表DATA ENDSCODE SEGMENTASSUMECS:CODEDS:DATASTART:MOVA*,DATAMOVDS,A*MOVAL,90H;设置为A口输入,B口输出,C口输出OUT46H,ALMOVDI,OFFSET *+3;DI指向*的高位KKK:CALLKEY;扫描按键JMPKKK;以下为按键
12、扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号KEY PROCCHECK:CALLDISP;等待按键按下的同时进展显示MOVAL,0F0H;所有行输出低电平OUT44H,ALINAL,40HCMPAL,0FFH ;读列值JZ CHECK;假设都为高电平则无键按下,等待MOVC*,50LOOP$ ;延时消抖INAL,D* ;重读列值CMPAL,0FFHJZCHECK ;无键按下一直等待MOVH,0 ;有键按下,先把行列号变量清0MOVL,0MOVBL,01HMOVBH,0FEH ;扫描法读键值:从第一行开场测试,即PC0输出低电平NE*T:MOVAL,BHOUT 44H,ALNE*T
13、H:INAL,40H ;读列值,判断是第几列有键按下TESTAL,BL ;从第一列开场判断JZWAIT0ROLBL,1CMPBL,10H ;当前行状态下没有列有键按下,则转为对下一行的测试JZNE*TLINCH;每判断一列,列号加1JMPNE*TH;再对下一列进展判断NE*TL:MOVH,0MOVBL,01HROLBH,1 ;对下一行测试,让下一个PC口输出低电平CMPBH,0EFHJZE*ITINCLJMPNE*TWAIT0:INAL,40H ;假设有键按下,则等该按键松开后再计算键值CMPAL,0FFHJNZWAIT0MOVC*,50LOOP$;延时消抖INAL,40HCMPAL,0FFH
14、JNZWAIT0CALLKEYVALUE ;调计算键值子程序E*IT:RETKEY ENDP;以下为计算键值子程序,通过行列号计算键值键值=行号*4+列号键值存放在DL存放器中KEYVALUE PROCMOVDL,LMOVDH,HSHLDL,1SHLDL,1 ;列号乘4ADDDL,DHCMPDL,9 ;按下的是数字键JNGNUM_CALLCMPDL,14JLCONT_CALL;按下的是运算键CMPDL,14JZOUTP_CALL ;按下的是等于键CMPDL,15JZCLR_CALL;按下的是去除键NUM_CALL: CALLNUMBER;调数字键处理子程序JMPE*IT1CONT_CALL:M
15、OVS,DL ;存放运算键的键值MOVE,0CALLCOUNT 调运算键处理子程序,计算第一个加数JMPE*IT1OUTP_CALL:CALLOUTP ;调等号键处理子程序JMPE*IT1CLR_CALL:CALLCLEAR ;调去除键处理子程序E*IT1:RETKEYVALUE ENDP;以下为去除键处理子程序,按下去除键后,*变量全部清0CLEAR PROCMOV*3,0MOV*2,0MOV*1,0MOV*0,0CALLBITPRETCLEAR ENDP;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入*2变量;并根据运算符号,调用相应的运算子程序OUTP PROCP
16、USHA*PUSHD*PUSHB*INCECALLCOUNT ;调运算键处理子程序,计算第二个运算数据CMPS,10JZADD_CALL ;运算符为加号,则调用加法子程序CMPS,11JZSUB_CALL ;运算符为减号,则调用减法子程序CMPS,12JZMUL_CALL ;运算符为乘号,则调用乘法子程序CMPS,13CALLDIVP ;运算符为除号,则调用除法子程序JMPSTORE1ADD_CALL:CALLADDPJMPSTORE1SUB_CALL:CALLSUBPJMPSTORE1MUL_CALL:CALLMULPSTORE1:MOVA*,Y;以下程序将各运算子程序返回的运算结果,按位分
17、解,送入*变量MOVD*,0MOVB*,1000DIVB*MOV*0, ALMOVA*,D*MOVBL,100DIVBLMOV*1,ALMOVAL,AHMOVAH,0MOVBL,10DIVBLMOV*2,ALMOV*3,AHPOPB*POPD*POPA*RETOUTP ENDP;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入*1变量;或者将第二个运算数据的数值计算出来并存入*2变量;将运算符的值存入S变量COUNT PROCPUSHA*PUSHB*PUSHD*MOVD*,0CALLBITP ;测试*中的数据是多少位CMPCC,4 ;输入的数据是4位数?JZC4CMPCC,3
18、 ;输入的数据是3位数?JZ C3CMPCC,2 ;输入的数据是2位数?JZC2JMPC1 ;输入的数据是1位数?C4:MOVA*,0MOVAL,*0MOV B*,1000MUL B*MOV D*,A*C3:MOVAL,*1MOV BL,100MUL BLADD D*,A*C2:MOV AL,*2MOVBL,10MULBLADDD*,A*C1:MOVAL,*3MOVAH,0ADDD*,A*CMPE,1JNZ*1_SMOV*2,D* ;按下的是等号,则将第二个运算数据的值存入*2变量JMPE*IT3*1_S:MOV*1,D* ;按下的是运算符号,则将第一个运算数据的值存*1变量MOV*3,0;清
19、空*变量MOV*2,0MOV*1,0MOV *0,0E*IT3: POP D*POPB*POPA*RETCOUNT ENDP;以下为数字键处理子程序;该程序,将输入的数据按位存放在*变量中,并由CC记录数据的位数NUMBER PROCCMPE,1JNZCONTINUEMOVE,0CALLCLEARCONTINUE:CMPCC,0 ;目前数据为0位,即没有数据,则转到SSSJZSSSPUSHA*PUSHD*MOVAL,*3MOVAH,*2MOVDL,*1MOVDH,*0MOV C*,8LL:SHLA*, 1RCLD*,1LOOPLLMOV*3,ALMOV*2,AHMOV*1,DLMOV*0,DH
20、POPD*POPA*SSS:MOV DI,DL ;将当前键入的数据存放到*的最低位INCCC ;数据位数加1CMPCC,4 ;判断数据位数JNGE*IT2MOVCC,0 ;如果数据超过4位,重新从最低位开场存放MOV*2,0MOV*1,0MOV *0,0E*IT2: CALL DISP ;调显示子程序,显示输入的数据RETNUMBER ENDP;加法子程序ADDP PROCPUSHA*MOVA*,*1ADDA*,*2MOVY,A*POPA*RETADDP ENDP;减法子程序SUBP PROCPUSHA*MOVA*,*1SUBA*,*2MOV Y,A*POP A*RETSUBP ENDP;乘法
21、子程序MULP PROCPUSHA*PUSHD*MOV A*,*1MOVD*,*2MULD*MOVY,A*POPD*POPA*RETMULP ENDP;除法子程序DIVP PROCPUSHA*PUSHB*PUSHD*MOVD*,0MOV A*,*1MOVB*,*2DIV B*MOVY,A*POP D*POP B*POP A*RETDIVP ENDP;显示子程序,将*中的数值按位显示出来DISP PROCPUSHB*PUSH A*MOVBH,0LEA SI,DISCODECALLBITP ;测试*位数CMP CC,4JZ QIANCMP CC,3JZ BAICMP CC,2JZ SHICMP C
22、C,1JMP GJMP NONEQIAN:MOVAH,11100000B ;从第4位开场显示MOVAL,AHOUT 44H,ALMOV BL,*0MOV AL,SI+B*OUT 42H,ALCALL DELYMOV AL,0OUT 42H,ALBAI:MOVAH,11010000B ;从第3位开场显示MOV AL,AHOUT44H,ALMOV BL,*1MOV AL,SI+B*OUT 42H,ALCALL DELYMOV AL,0OUT 42H,ALSHI:MOV AH,10110000B ;从第2位开场显示MOV AL,AHOUT 44H,ALMOV BL,*2MOV AL,SI+B*OUT
23、 42H,ALCALL DELYMOV AL,0OUT 42H,ALG:MOV AH,01110000B ;从第1位开场显示MOVAL,AHOUT 44H,ALMOV BL,*3MOV AL,SI+B*OUT 42H,ALCALL DELYJMP E*IT4NONE: MOVAL,0 ;*中没有数据,不显示OUT42H,ALE*IT4: POP A*POP B*RETDISP ENDP;分析数据位数子程序BITP PROCCMP *0,0 ;如果*0不为0,则数据为4位数JNZ FOURBITCMP *1,0 ;如果*1不为0,则数据为3位数JNZ THREEBITCMP *2,0 ;如果*2
24、不为0,则数据为2位数JNZ TOWBITCMP *3,0 ;如果*3不为0,则数据为1位数JNZ ONEBITJMP ZER0BIT ;否则,没有数据FOURBIT:MOVCC,4JMPE*IT5THREEBIT: MOVCC,3JMP E*IT5TOWBIT: MOV CC,2JMP E*IT5ONEBIT: MOV CC,1JMP E*IT5ZER0BIT: MOV CC,0E*IT5: RETBITP ENDP;延时子程序DELY PROCPUSHC*MOV C*,100LOOP $POP C*RETDELY ENDPCODE ENDSEND START二、 硬件设计1.微处理器808
25、6当引脚接高电平时,CPU工作于最小模式。此时,引脚信号2431的含义及其功能如下: (1)INTA/interrupt acknowledge:可屏蔽中断响应信号,输出,低电平有效。 CPU通过信号对外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的中断请求,即将执行中断效劳程序。2ALEaddress lock enable:地址锁存允许信号,输出,高电平有效。 CPU利用ALE信号可以把AD15 AD0地址/数据、A19/S6A16/S3地址/状态线上的地址信息锁存在地址锁存器中。 3DEN/data enable:数据允许控制信号,输出,三态,低电平有效。信号用作总
26、线收发器的选通控制信号。当为低电平时,说明CPU进展数据的读/写操作。 4DT/data transmit or receive:数据发送/接收信号,输出,三态。 DT/信号用来控制数据传送的方向。DT/为高电平时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。5IO/M/memory I/O select:存储器、I/O端口选择控制信号。 信号指明当前CPU是选择访问存储器还是访问I/O端口。为高电平时访问存储器,表示当前要进展CPU与存储器之间的数据传送。为低电平时,访问I/O端口,表示当前要进展CPU与I/O端口之间的数据传送。 6WR/w
27、rite:写信号,输出,低电平有效。 信号有效时,说明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。7HLDAhold acknowledge:总线保持响应信号,输出,高电平有效。HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。8HOLDbus hold request:总线保持请求信号,输入,高电平有效。在DMA数据传送方式中,由总线控制器
28、8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。 2. 可编程并行接口芯片8255ARESET:复位输入线,当该输入端外于高电平时,所有部存放器包括控制存放器均被去除,所有I/O 口均被置成输入方式。PA0PA7:端口A 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入锁存器。PB0PB7:端口B 输入输出线,一个8 位的I/O 锁存器, 一个 8 位的输入输出缓冲器。PC0PC7:端口C 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入缓冲器。端口C 可以通过工作方式设定而分成2 个4 位的端
29、口, 每个 4 位的端口包含一个4 位的锁存器,分别与端口A 和端口B 配合使用,可作为控制信号输出或状态信号输入端口。CS:片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许8255 与CPU 进展通讯。RD:读信号线,当这个输入引脚为低电平时,允许8255 通过数据总线向CPU 发送数据或状态信息,即CPU 从8255 读取信息或数据。WR:写入信号,当这个输入引脚为低电平时,允许CPU 将数据或控制字写8255。D0D7:三态双向数据总线,8255 与CPU 数据传送的通道,当CPU 执行输入输出指令时,通过它实现8 位数据的读/写操作,控制字和状态信息也通过数据总线传送。825
30、5 的读写控制:8255 的读/写控制逻辑电路承受CPU 发来的控制口号RD、WR、RESET 和地址信号A1A0。然后根据命令端口,控制信号的要求,将端口的数据读出选信CPU 或者将CPU送来的数据写入端口,各端口的工作状态。通过用输出指令对8255A 的控制字存放器编程,写入设定工作方式的控制字,可以让3个数据口以不同的方式工作,端口A 可工作于3 种方式的任一种,端口B 只能工作于方式0 和方式1,端口C 除了用于输入输出端口外,还能配合A 口和B 口工作,为这两个端口的输入输出操作提供联系信号。3.可编程定时/计数器8253A8253A的引脚可以分为两局部:与CPU的接口引脚和与外设的
31、接口引脚。(1) 与CPU的接口引脚 D0D7:三态双向数据线,和CPU数据总线相连,用于传输CPU与8253之间的数据信息、控制信息和状态信息。CS:片选信息,输入、低电平有效。A1、A0:用来对8253A片三个计数通道和控制字存放器进展寻址。RD:读信号,输入,低电平有效。WR:写信号,输入,低电平有效。(2) 与外设的接口引脚CLK:时钟输入引脚,用于输入定时脉冲或计数脉冲信号。计数器对这个引脚输入的脉冲进展计数。GATE:门控输入端。用于外部控制计数器的启动计数和停顿计数的操作。两个或两个以上计数器连用时,可以用此信号来同步,也可用于与外部*信号的同步。OUT:计数输出端。不管8253
32、以何种方式工作,当计数器计数到0时,在OUT引脚上必定有输出。在不同模式下,可输出不同形式的信号。4.LED数码管LED为发光二极管构成的显示器件,亦称数码管。由7个字符段和一个小数点段组成,每段对应一个发光二极管,当发光二极管点亮时,相应的字符段点亮。LED有共阴极和共阳极两种供给状态。共阴极显示时,将LED显示的接地,将八个字符段端a、b、c、d、e、f、g、dp依次与一个8位I/O口的最低到最高位连接,当I/O给LED的哪个字符段送入一个高电平时,该段就被点亮,从而可从这7个字符段中被点亮的构成相应的字符显示出来。同理,阳极即将端接Vcc,其显示原理与阴极的根本一样,但I/O口送入低电平
33、是相应的段才被点亮。5.44矩阵按键键盘是信息输入元件,由一个个按钮组成,如果是独立按钮的话必须要需要一个I/O口对它进展检测。因为44矩阵键盘有8个管脚,于是将键盘接8255A的PC口。因为进展键盘扫描一般要求有一局部的I/O口的工作方式是输入,另一局部I/O是输出,具体到44键盘则要求4个I/O口输入,另外4个输出,这一点PC口刚好符合,而PA、PB口要么全部输入或输出,所以只能是PC口接键盘。4*4矩阵按键面板6.74L138译码器当一个选通端E1为高电平,另两个选通端(/E2)和/(E3)为低电平时,可将地址端A0、A1、A2的二进制编码在Y0至Y7对应的输出端以低电平译出。比方:A2
34、A1A0=110时,则Y6输出端输出低电平信号。 利用 E1、E2和E3可级联扩展成 24 线译码器;假设外接一个反相器还可级联扩展成 32 线译码器。 假设将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。 可用在8086的译码电路中,扩展存。7.74LS373D 锁存器373为三态输出的八 D 透明锁存器,共有 54S373 和 74LS373 两种线路。当三态允许控制端 OE 为低电平时,Q0Q7为正常逻辑状态,可用来驱动负载或总线。当 OE 为高电平时,Q0Q7 呈高阻态,即不驱动总线,也不为总线的负载,但锁存器部的逻辑操作不受影响。 当锁存允许端 LE 为高电平时,Q 随数据 D 而变。当 LE 为低电平时,D 被锁存在已建立的数据电平。当 LE 端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善 400mV。 引出端符号:D0D7 数据输入端 OE 三态允许控制端低电平有效 LE 锁存允许端 Q0Q7 输出端三、设计原理图. z.