微机原理课件设计简易计算器.docx
《微机原理课件设计简易计算器.docx》由会员分享,可在线阅读,更多相关《微机原理课件设计简易计算器.docx(16页珍藏版)》请在冰点文库上搜索。
微机原理课件设计简易计算器
二○一一~二○一二学年第一学期
信息科学与工程学院
自动化系
课程设计计划书
课程名称:
微机原理及应用课程设计
班级:
自动化0901
姓名:
王立
学号:
200904134032
指导教师:
孟志华
二○一一年十二月六日
一、课题名称
简易计算器设计
二、课题目的
利用8088和8255设计一个简易计算器,并将其结果显示在LED数码管上。
熟悉系统设计的基本步骤,掌握8088与8255的接口设计,掌握通过8255设计键盘扫描技术,掌握通过8255显示七段共阴极数码管设计。
加强对8088数据总线,地址总线及接口寻址的理解,加深对8255的端口控制的理解。
三、需求分析
(1)能够实现99以内的加减乘法运算,并显示在2位LED上。
(2)对于减法运算产生的负数,可在LED上显示“-”号,若负量超过9,则显示“E0”。
四、方案选择
方案一:
该方案将LED显示电路直接接在8088的DB上,而键盘则采用8255进行扫描。
方案二:
该方案则是将LED显示电路和键盘扫描电路分别接在两个不同的8255上,扫描和显示时,选中不同的8255。
方案三:
该方案则只用一片8255驱动LED显示和键盘扫描电路。
方案评估:
方案一:
LED显示驱动电路实现起来较简单,但是很浪费系统总线资源,舍弃!
方案二:
释放了系统数据总线,但是方案缺乏经济性,因为采用了两片8255,与建设资源节约型社会初衷冲突!
舍弃!
方案三:
此种方案较为经济,方便,具有模块化的特点(因为将计算和显示电路全部集成在了8255上,应用时,直接挂接8255即可实现要求!
)
综上所述:
采用方案三!
五、程序流程图
程序总流程图:
判断输入流程图:
六、系统原理图
键盘映射图:
7
8
9
*
4
5
6
+
1
2
3
-
0
=
键盘编码图:
77
7B
7D
7E
B7
BB
BD
BE
D7
DB
DD
DE
E7
EB
ED
EE
系统原理图:
注:
1、复位电路单独画在旁边,其参数设置符合6MHZ。
2、74HC04反相器由于位置不够,本人自己画了一个小型的74HC04。
3、IOW,IOR信号线由于采用了最大系统组态,故由8288的IORC和AIOWC代替。
4、8088的CLK由8284A提供,其电路连接方式参照Datasheet
5、最大系统组态连接方式参照课本。
6、LED与键盘扫描电路的上拉电阻阻值统一采用4.7K,保证数码管有足够亮度。
7、所有芯片的电源和GND均未标出。
8、7段数码管为共阴极连接方式。
9、74LS373和74LS245作为提高总线驱动能力的作用而存在。
10、8259A的INT信号和8088的INTR信号相连,由于纸张大小问题,用网络标号“INT8259A”表明他们是相连的。
11、CAD图纸见附件。
七、元件清单
元件名称
参数值
数量
8088
U1
1
8255
U2
1
8284
U3
1
8288
U4
1
8259A
U5
1
74LS245
U6
1
74LS373
U7U8U9
3
74LS00
U10
1
74LS30
U11
1
74HC04
U12U13U14U15
4
RES2
R1~R204.7K
20
RES2
R21200
1
RES2
R221K
1
RES1
R1
1
DIODE
D1
1
CAP
C1
1
CAP
C222uF
1
SW-PB
S0~S15
16
7-SEG-DPY
DS1DS2
2
CRYSTAL
Y1
1
八、程序源代码
PAGE60,132
TITLECalculatorAprogramtocalculatewith8088and8255
;--------------------------------------------------------
DISPLAYMACRO;送至LED显示函数
MOVDX,383H;控制字寄存器的端口地址(8255)
MOVAL,80H;方式选择字10000000B
OUTDX,AL
MOVDX,381H;B端口的地址送DX
MOVAL,HIGH_NUM;段码送至B端口显示
OUTDX,AL
MOVDX,383H
MOVAL,80H;方式选择字10000000B
OUTDX,AL
MOVDX,382H;C端口地址送DX
MOVAL,LOW_NUM;段码送至C端口显示
OUTDX,AL
JMPAllscan_Key;显示完成,跳至键盘扫描
ENDM
;--------------------------------------------------------
CALCMACRO;计算结果并存至HIGH_NUM,LOW_NUM中
DIVTEN;除10取余和商分别显示
MOVDX,AX;保存计算结果
CBW;将商AL符号扩展至AX
MOVBX,AX
MOVCL,LED[BX]
MOVHIGH_NUM,CL;高位段码送至HIGH_NUM(乘结果)
MOVAX,DX
XCHGAH,AL;交换AH和AL,将余数放在AL准备符号扩展
CBW;将余数AL符号扩展至AX
MOVBX,AX
MOVCH,LED[BX]
MOVLOW_NUM,CH;低位段码送至LOW_NUM(乘结果)
ENDM
;--------------------------------------------------------
.MODELSMALL;程序大小为SMALL数据段和代码段均小于64KB
.STACK100;堆栈大小100个字
.DATA;数据段
KEYTABDB0E7H,0D7H,0DBH,0DDH,0B7H,0BBH,0DBH
;键盘编码0~9*+-=
DB77H,7BH,7DH,7EH,0BEH,0DEH,0EEH
LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;LED显示字模(共阴极)
OPERANDDB0;用于存放运算符号
TENDB10
NUM1DB0;用于存放第一个计算数
NUM2DB0;用于存放第二个计算数
HIGH_NUMDB0;用于存放结果的高位段码
LOW_NUMDB0;用于存放结果的低位段码
;--------------------------------------------------------
.CODE;代码段
MAINPROCFAR;主程序开始
MOVAX,@data;将DS指向DATA
MOVDS,AX
Allscan_Key:
MOVDX,383H;控制字寄存器地址的端口地址(8255)
MOVAL,80H;方式控制字10000000B
OUTDX,AL
MOVDX,380H;端口A的地址送DX
XORAL,AL
OUTDX,AL;送0,全键盘扫描
MOVDX,383H
MOVAL,90H;方式控制字10010000BA输入
OUTDX,AL
MOVDX,380H;端口A
INAL,DX
ANDAL,0FH;屏蔽掉送回来的AL中的高四位
CMPAL,0FH
JZAllscan_Key;相等说明没有键按下,重新全键盘扫描
MOVBX,0
MOVAH,7FH;保存扫描设定初量
Scan_key:
MOVDX,383H
MOVAL,80H;方式控制字,A输出
OUTDX,AL
MOVDX,380H;端口A
MOVAL,AH;逐行扫描
OUTDX,AL
MOVDX,383H
MOVAL,90H;A输入
OUTDX,AL
MOVDX,380H;端口A
INAL,DX;读按键状态
ANDAL,0FH;取数据的低四位
CMPAL,0FH
JNEDecode
RORAH,1;向右循环移位,扫描下一行
JMPAllscan_Key
Decode:
ANDAH,0F0H
ORAL,AH;AL,AH或操作组合编码
CMPAL,KEYTAB[BX];比较编码
JENext
INCBX
JMPDecode
Next:
CMPBX,13;13的偏移量表示编码值为EE,即"="
JECalc;检测到"=",计算结果
CMPBX,10;10的偏移量表示编码值为7E,即"*"
JNSStroe;比10大,表示按下"*"或"+"或"-"
MOVAL,OPERAND
CMPAL,0;OPERAND若为0,表示为按下运算符号
JNENumber;OPERAND非0,说明按下过运算符号
MOVAL,NUM1
MULTEN;NUM1*10+BL
ADDAL,BL
MOVNUM1,AL;将第一个运算数保存在NUM1中
JMPAllscan_Key
Stroe:
MOVOPERAND,BL;按下了运算符号并存入OPERAND中
JMPAllscan_Key
Number:
MOVAL,NUM2
MULTEN;NUM2*10+BL
ADDAL,BL
MOVNUM2,AL;将第二个运算数保存在NUM2中
Calc:
CMPBL,10
JZ_Mul;乘法
CMPBL,11
JZ_Add;加法
CMPBL,12
JZ_Sub;减法
_Mul:
MOVAL,NUM1
MULNUM2
CMPAL,100;结果超过99,则显示"E0"
JAEOverflow
CALC;将计算结果存至HIGH_NUM,LOW_NUM中
DISPLAY;送至LED显示
Overflow:
MOVHIGH_NUM,79H;79H为"E"的段码
MOVLOW_NUM,3FH;3FH为"0"的段码
JMPAllscan_Key
_Add:
MOVAL,NUM1
ADDAL,NUM2;NUM1+NUM2
JAEOverflow;溢出
CALC;将计算结果存至HIGH_NUM,LOW_NUM中
DISPLAY;送至LED显示
_Sub:
MOVAL,NUM1
SBBAL,NUM2
JCNegtive;有借位,说明结果为负数
CALC;将计算结果存至HIGH_NUM,LOW_NUM中
DISPLAY;送至LED显示
Negtive:
CMPAL,-9;负量超过9了吗?
JSOverflow;超过了,则溢出,显示"E0"
MOVHIGH_NUM,40H;40H为"-"的段码
NEGAL;求补
CBW;AL符号扩展至AX
MOVBX,AX
MOVCL,LED[BX]
MOVLOW_NUM,CL;低位段码送至LOW_NUM
JMPAllscan_Key
;--------------------------------------------------------
MOVAX,4C00H
INT21H
MAINENDP
ENDMAIN
九、参考文献
[1]朱定华,《微机原理、汇编与接口技术》清华大学出版社,2005
Page:
163(8088引脚图)、171(最大系统组态连接方式)、176(最大系统组态时的I/O读写时序图)、221(4x4键盘扫描)、264(8255引脚图)、266~272(方式0输入输出程序例程)。
[2]张毅刚,《新编MCS-51单片机应用设计(第3版)》哈尔滨工业大学出版社,2003
Page:
26(按键电平复位电路)
[3]www.A8088pdf8255pdf
8088CLK时钟产生电路由8284产生。
十、心得与体会
此次的微机原理课程设计从开始的方案设计,方案选择,到原理图的设计,原理图的绘制,再到最后的接口程序编写只用了两天的时间。
其中编写手画原理图和编写程序用了一天,上机用Protel画图外加整理报告用了一天。
这两天感觉很充实,因为这是我有史以来第一次完全设计一个具有实用性的系统接口电路。
在设计的过程当中,以前总是感觉一上来就开始连接电路,但是脑海里的思绪似乎都很乱,没有一条很清晰的线路。
于是就静下心来,发现设计一个电路首先需要的是一个方案,于是方案选择的模块就诞生了,并且在思考的过程当中,发现了几种不同的设计方案,当时心里就开心了起来,毕竟都是突然冒出来的点子,比较有成就感,尤其是选择了一个具有模块化的方案三。
选择好了方案就开始设计电路的连接:
8088与8255的连接,键盘的扫描,LED的接口显示很快就完成了。
然后根据画出来的系统连接引脚图,开始了接口的程序设计,我想这应该是重头戏了,我用了一天的时间来做他。
之前编写程序的时候也总是不喜欢什么程序流程图之类的东西,感觉拿东西没必要,而且很浪费时间,还不如自己直接写代码来的爽。
刚开始感觉没问题,后来就卡了一个输入检测的地方。
因为从8255传来的数据可能是第一个运算数,也可能是第二个运算数,还可能是+、-、*之类的运算符号,甚至是“=”号。
于是很自然的就开始话条件判断语句开始程序的跳转指令设计。
完成之后,乍眼一看才发现原来我写的是流程图。
随后根据这个流程图很快就把这个难点给攻破了。
经过几经周折,终于把程序编好了,于是就开始上机用Protel画图,让我重拾了当年使用Protel的快感。
不过在画到8088的AEN信号时,我卡了壳(之前设计时,以为AEN在8088引脚上,采用的是最小系统组态)。
后来一翻书,才发现8088只有在最大系统组态中的8288总线控制器上才有AEN这个信号,于是就忍痛可爱的将辛辛苦苦画的最小系统换成了最大系统,于是就有了8259A。
在引出AEN信号之后,工程就差不多完成了,只是在74LS30八输入与非门那里,由于纸张的原因,不得不自己画了一个小型的74HC04反相器才得以解决问题。
另外说一句,LED数码管的上拉电阻由于没找到8255的最大灌电流参数,所以选用的4.7K,如果太亮则改用10K,太暗选用1K。
到此,整个设计过程就结束了。
回首一下自己的整个设计过程,打心眼里说之前的课程设计没这么认真仔细完完全全都是自己弄出来的,因为之前多多少少还是借鉴了网上的东西。
从这次的课程设计当中,体验了一把如何设计系统方案,如何分析方案并选择最佳方案;体会到了程序流程图在某些程序设计时的重要性;学会了使用Visio画程序流程图;重温了一次Protel画图的步骤和方法;用Protel自己画元件图的步骤;8088最大系统组态结构;datasheet的查看等知识和技能。
总之,学会了多少,自己心里清楚就行。