微机原理课程设计-简易计算器的设
计(总20页)
--本页仅作预览文档封面,使用时请删除本页--
目录
一 前言………………………………………………………………………………1 二 总体设计 ………………………………………………………………………2 三 硬件设计 ………………………………………………………………………2
微处理器8086芯片…………………………………………………………2 可编程并行接口芯片8255A ………………………………………………3 LED数码管 …………………………………………………………………4 4×4矩阵按键………………………………………………………………4 硬件原理图 …………………………………………………………………6
四 软件设计 ………………………………………………………………………7
程序流程图 …………………………………………………………………7 源代码 ………………………………………………………………………9
五 仿真 …………………………………………………………………………18 六 课程设计体会 ………………………………………………………………18 七 参考文献 ……………………………………………………………………19
2
一 前言
课程设计的目的和任务
课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。
通过课程设计,要求学生熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,使学生得到微机开发应用方面的初步训练。让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题,真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。
通过课程设计实践,不仅要培养学生事实求是和严肃认真的工作态度,培养学生的实际动手能力,检验学生对本门课学习的情况,更要培养学生在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。
课程设计指导及要求
在课程设计时,2~3名同学组成1个设计小组,分别完成项目的功能设计、电路编辑及调试、编码及调试和课程设计报告编写工作。同批次同学中选择同一题的不超过3组。在教师指导下,可以相互讨论。每设计小组提交1份设计报告,设计报告由设计小组同学独立完成,不得互相抄袭。教师的主导作用主要在于指明设计思路,启发学生独立设计的思路,解答疑难问题和按设计进度进行阶段审查。学生必须发挥自身学习的主动性和能动性,主动思考问题、分析问题和解决问题,而不应处处被动地依赖指导老师。同学应积极主动的提出问题、解决问题、讨论问题,互相帮助和启发。
学生在设计中可以引用所需的参考资料,避免重复工作,加快设计进程,但必须和题目的要求相符合,保证设计的正确。指导教师要引导学生学会掌握
3
和使用各种已有的技术资料,不能盲目地、机械地抄袭资料,必须具体分析,使设计质量和设计能力都获得提高。学生要在老师的指导下制定好自己各环节的详细设计进程计划,按给定的时间计划保质保量的完成个阶段的设计任务。设计中可边设计,边修改,软件设计与硬件设计可交替进行,问题答疑与调试和方案修改相结合,提高设计的效率,保证按时完成设计工作并交出合格的设计报告。
二 总体设计
设计思路:首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就调用子程序进行判断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程序进行操作,操作后则继续利用程序不断扫描键盘是不是有输入,从而实现4位十进制数以内的加减乘除法运算。运算完成后将运算的结果储存并显示到LED显示器上。
三 硬件设计 微处理器8086芯片
当引脚接高电平时,CPU工作于最小模式。此时,引脚信号24~31的含义及其功能如下:
(1)IO/M/(memory I/O select):存储器、I/O端口选择控制信号。 信号指明当前CPU是选择访问存储器还是访问I/O端口。为高电平时访问存储器,表示当前要进行CPU与存储器之间的数据传送。为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。
(2)WR/(write):写信号,输出,低电平有效。 信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。
(3)INTA/(interrupt acknowledge):可屏蔽中断响应信号,输出,低电平有效。 CPU通过信号对外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。
4
(4)ALE(address lock enable):地址锁存允许信号,输出,高电平有效。 CPU利用ALE信号可以把AD15 ~AD0地址/数据、A19/S6~A16/S3地址/状态线上的地址信息锁存在地址锁存器中。
(5)DT/(data transmit or receive):数据发送/接收信号,输出,三态。 DT/信号用来控制数据传送的方向。DT/为高电平时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。
(6)DEN/(data enable):数据允许控制信号,输出,三态,低电平有效。信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。
(7)HOLD(bus hold request):总线保持请求信号,输入,高电平有效。在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。
(8)HLDA(hold acknowledge):总线保持响应信号,输出,高电平有效。HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。
可编程并行接口芯片8255A
微机系统的信息交换有两种方式:并行通信接口方式和串行通信接口方式。接口电路在CPU和I/O设备之间起着信号的变换和传输的作用。8255A可为86系列CPU与外部设备之间提供并行输入/输出的通道。由于它是可编程的,可以通过软件来设置芯片的工作方式,因此,用8255A连接外部设备时,通常不用再附加外部电路,使用教方便。并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。
在输入过程中,输入设备把数据送给接口,并且使状态线“输入准备好”有效。接口把数据存放在“输入缓冲寄存器”中,同时使“输入回
5
答”线有效,作为对外设的响应。外设在收到这个回答信号后,就撤消数据和“输入准备好”信号。数据到达接口中后,接口会在“状态寄存器”中设置输入准备好标志,或者向CPU发一个中断请求。CPU可用查询方式或中断方式从接口中读取数据。接口中的数据被读取后,接口会自动清除状态寄存器中的标志,且撤消对CPU的中断请求。
在输出过程中,每当输出寄存器可以接收数据,接口就会将状态寄存器中“输出准备好”状态置1或向CPU发一个中断请求,CPU可用查询或中断方式向接口输出数据。当CPU输出的数据到达接口后,接口会清除“输出准备好”状态,把数据送往外设,并向外设发一个“数据输出准备好”信号。外设受到驱动后,便接收数据,并向接口电路发一个“输出回答”信号,接口收到该回答信号后,又将状态寄存器中“输出准备好”置位,以便CPU输出下一个数据。
定义工作方式控制字:
LED数码管
LED为发光二极管构成的显示器件,亦称数码管。由7个字符段和一个小数点段组成,每段对应一个发光二极管,当发光二极管点亮时,相应的字符段点亮。LED有共阴极和共阳极两种供应状态。共阴极显示时,将LED显示的COM接地,将八个字符段端a、b、c、d、e、f、g、dp依次与一个8位I/O口的最低到最高位连接,当I/O给LED的哪个字符段送入一个高电平时,该段就被点亮,从而可从这
6
7个字符段中被点亮的构成相应的字符显示出来。同理,COM阳极即将COM端接Vcc,其显示原理与COM阴极的基本相同,但I/O口送入低电平是相应的段才被点亮。
4×4矩阵按键
键盘是常用信息输入元件,其实键盘也是由一个个按钮组成,如果是独立按
钮的话必须要需要一个I/O口对它进行检测,而键盘往往这需要键盘按钮数一半的I/O口数对它进行检测,也许对一个比较简单的系统I/O口数一般不是问题,但对于一个大型、复杂的系统来说I/O资源就显得非常珍贵了,尽量减少I/O使用是非常利于降低成本,另外一方面键盘比用独立按键要美观,这也是键盘能够长期得到人们青睐的原因,可是硬件上的节省必然导致软件上编程的复杂,那就来看看键盘到底使软件编程有多复杂
因为4×4矩阵键盘有8个管脚,于是将键盘接8255A的PC口,至于为什么
选择PC是有原因的,进行键盘扫描一般要求有一部分的I/O口的工作方式是输入,另一部分I/O是输出,具体到4×4键盘则要求4个I/O口输入,另外4个输出,这一点PC口刚好符合,而PA、PB口要么全部输入或输出,所以只能是PC口接键盘。
7
硬件原理图
8
四 软件设计 程序流程图
(1)键盘扫描程序流程图:9
开始 初始化 2)总程序流程图:N 键闭合 Y 延时12ms N 键闭合 Y 键扫描 N 键释放 Y 保存键结束 10
(
扫描 计算键值 数值 源代码运算符 “ = ” 清零 “ + ” 加法运算 “ -- ” 减法运算 “ * ” 乘法运算 除法运算 存储 显示 11
DATA SEGMENT
X DB X1 DW X2 DW Y DW S DB E DB CC DB H DB L DB DISCODE DB
;存放数据的每一位 ;存放第一个数据值 ;存放第二个数据值 ;存放运算结果 ;存放运算符号值 ;按下等号键标记 ;存放运算数据位数 0 ;存放按键行号 0 ;存放按键列号 3FH,06H,5BH,4FH, 66H,6DH,7DH,07H, 7FH,6FH,77H,7CH, 39H,5EH,79H,71H ;段码表
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX MOV AL,90H ;设置为A口输入,B口输出,C口输出 OUT 46H,AL
MOV DI,OFFSET X+3 ;DI指向X的高位
KKK: CALL KEY ;扫描按键
JMP KKK
;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号 KEY PROC
CHECK: CALL DISP ;等待按键按下的同时进行显示
MOV AL,0F0H ;所有行输出低电平 OUT 44H,AL IN AL,40H CMP AL,0FFH ;读列值 JZ CHECK ;若都为高电平则无键按下,等待 MOV CX,50 LOOP $ ;延时消抖 IN AL,DX ;重读列值 CMP AL,0FFH JZ CHECK ;无键按下一直等待 MOV H,0 ;有键按下,先把行列号变量清0 MOV L,0 MOV BL,01H MOV BH,0FEH ;扫描法读键值:从第一行开始测试,即PC0输出低电平
12
NEXT:
MOV AL,BH OUT 44H,AL
NEXTH: IN AL,40H ;读列值,判断是第几列有键按下
TEST AL,BL ;从第一列开始判断 JZ WAIT0 ROL BL,1
CMP BL,10H ;当前行状态下没有列有键按下,则转为对下一行的测试
JZ NEXTL INC H ;每判断一列,列号加1 JMP NEXTH ;再对下一列进行判断
NEXTL:
MOV H,0 MOV BL,01H
ROL BH,1 ;对下一行测试,让下一个PC口输出低电平 CMP BH,0EFH JZ EXIT INC L JMP NEXT
IN
AL,40H ;若有键按下,则等该按键松开后再计
WAIT0: 算键值
EXIT: KEY ENDP
;以下为计算键值子程序,通过行列号计算键值(键值=行号*4+列号)键值存放在DL寄存器中
KEYVALUE PROC
MOV DL,L MOV DH,H SHL DL,1
SHL DL,1 ;列号乘4 ADD DL,DH CMP DL,9 ;按下的是数字键 JNG NUM_CALL CMP DL,14
13
CMP AL,0FFH JNZ WAIT0 MOV CX,50 LOOP $ IN AL,40H CMP AL,0FFH JNZ WAIT0 CALL KEYVALUE RET
;延时消抖
;调计算键值子程序
JL CONT_CALL ;按下的是运算键 CMP DL,14 JZ OUTP_CALL ;按下的是等于键 CMP DL,15 JZ CLR_CALL ;按下的是清除键
NUM_CALL: CALL NUMBER ;调数字键处理子程序
JMP EXIT1
CONT_CALL: MOV S,DL ;存放运算键的键值
MOV E,0
CALL COUNT 调运算键处理子程序,计算第一个加数
JMP EXIT1
OUTP_CALL: CALL OUTP ;调等号键处理子程序
JMP EXIT1
CLR_CALL: CALL CLEAR ;调清除键处理子程序 EXIT1: RET KEYVALUE ENDP
;以下为清除键处理子程序,按下清除键后,X变量全部清0 CLEAR PROC
MOV X[3],0 MOV X[2],0 MOV X[1],0 MOV X[0],0 CALL BITP RET
CLEAR ENDP
;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量
;并根据运算符号,调用相应的运算子程序 OUTP PROC
PUSH AX PUSH DX PUSH BX INC E
CALL COUNT ;调运算键处理子程序,计算第二个运算数据 CMP S,10 JZ ADD_CALL ;运算符为加号,则调用加法子程序 CMP S,11 JZ SUB_CALL ;运算符为减号,则调用减法子程序 CMP S,12 JZ MUL_CALL ;运算符为乘号,则调用乘法子程序 CMP S,13
14
CALL DIVP ;运算符为除号,则调用除法子程序 JMP STORE1
ADD_CALL: CALL ADDP
JMP STORE1
SUB_CALL: CALL SUBP
JMP STORE1
MUL_CALL: CALL MULP STORE1: MOV AX,Y
;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量
MOV DX,0 MOV BX,1000 DIV BX MOV X[0], AL MOV AX,DX MOV BL,100 DIV BL MOV X[1],AL MOV AL,AH MOV AH,0 MOV BL,10 DIV BL MOV X[2],AL MOV X[3],AH POP BX POP DX POP AX RET
OUTP ENDP
;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量
;或者将第二个运算数据的数值计算出来并存入X2变量 ;将运算符的值存入S变量 COUNT PROC
PUSH AX PUSH BX PUSH DX MOV DX,0 CALL BITP ;测试X中的数据是多少位 CMP CC,4 ;输入的数据是4位数 JZ C4 CMP CC,3 ;输入的数据是3位数 JZ C3 CMP CC,2 ;输入的数据是2位数
15
JZ C2 JMP C1
C4:
;输入的数据是1位数
MOV AX,0 MOV AL,X[0] MOV BX,1000 MUL BX MOV DX,AX C3: MOV AL,X[1]
MOV BL,100 MUL BL ADD DX,AX C2: MOV AL,X[2]
MOV BL,10 MUL BL ADD DX,AX C1: MOV AL,X[3]
MOV AH,0 ADD DX,AX CMP E,1 JNZ X1_S MOV X2,DX ;按下的是等号,则将第二个运算数据的值存入X2变量
JMP EXIT3 X1_S: MOV X1,DX ;按下的是运算符号,则将第一个运算数据的值存X1变量
MOV X[3],0 ;清空X变量 MOV X[2],0 MOV X[1],0 MOV X[0],0
EXIT3: POP DX
POP BX POP AX RET
COUNT ENDP
;以下为数字键处理子程序
;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数 NUMBER PROC
CMP E,1 JNZ CONTINUE MOV E,0 CALL CLEAR
CONTINUE:CMP CC,0 ;目前数据为0位,即没有数据,则转到SSS
16
JZ PUSH PUSH MOV MOV MOV MOV MOV
LL: SHL
RCL LOOP MOV MOV MOV MOV POP POP
SSS: MOV
INC CMP JNG MOV MOV MOV MOV
EXIT2: CALL
RET
NUMBER ENDP
;加法子程序 ADDP PROC
PUSH AX MOV AX,X1 ADD AX,X2 MOV Y,AX POP AX RET ADDP ENDP ;减法子程序 SUBP PROC
PUSH AX MOV AX,X1 SUB AX,X2 MOV Y,AX
SSS
AX DX AL,X[3] AH,X[2] DL,X[1] DH,X[0] CX,8 AX, 1 DX,1 LL
X[3],AL X[2],AH X[1],DL X[0],DH DX AX
[DI],DL ;将当前键入的数据存放到X的最低位 CC ;数据位数加1 CC,4 ;判断数据位数 EXIT2
CC,0 ;如果数据超过4位,重新从最低位开始存放 X[2],0 X[1],0 X[0],0
DISP ;调显示子程序,显示输入的数据
17
POP AX RET SUBP ENDP
;乘法子程序 MULP PROC
PUSH AX PUSH DX MOV AX,X1 MOV DX,X2 MUL DX MOV Y,AX POP DX POP AX RET MULP ENDP
;除法子程序 DIVP PROC
PUSH AX PUSH BX PUSH DX MOV DX,0 MOV AX,X1 MOV BX,X2 DIV BX MOV Y,AX POP DX POP BX POP AX RET DIVP ENDP
;显示子程序 ,将X中的数值按位显示出来 DISP PROC
PUSH BX PUSH AX MOV BH,0 LEA SI,DISCODE CALL BITP ;测试X位数 CMP CC,4 JZ QIAN CMP CC,3 JZ BAI
18
CMP CC,2 JZ SHI CMP CC,1 JMP G JMP NONE
QIAN: MOV AH,B ;从第4位开始显示
MOV AL,AH OUT 44H,AL MOV BL,X[0] MOV AL,[SI+BX] OUT 42H,AL CALL DELY MOV AL,0 OUT 42H,AL
BAI: MOV AH,B ;从第3位开始显示
MOV AL,AH OUT 44H,AL MOV BL,X[1] MOV AL,[SI+BX] OUT 42H,AL CALL DELY MOV AL,0 OUT 42H,AL
SHI: MOV AH,B ;从第2位开始显示
MOV AL,AH OUT 44H,AL MOV BL,X[2] MOV AL,[SI+BX] OUT 42H,AL CALL DELY MOV AL,0 OUT 42H,AL
G: MOV AH,01110000B ;从第1位开始显示
MOV AL,AH OUT 44H,AL MOV BL,X[3]
MOV AL,[SI+BX] OUT 42H,AL CALL DELY JMP EXIT4
NONE: MOV AL,0 ;X中没有数据,不显示
OUT 42H,AL
EXIT4: POP AX
POP BX
19
RET
DISP ENDP
;分析数据位数子程序 BITP PROC
CMP X[0],0 数
JNZ FOURBIT CMP X[1],0 JNZ THREEBIT CMP X[2],0 JNZ TOWBIT CMP X[3],0 JNZ ONEBIT JMP ZER0BIT
FOURBIT: MOV CC,4
JMP EXIT5
THREEBIT: MOV CC,3
JMP EXIT5
TOWBIT: MOV CC,2
JMP EXIT5
ONEBIT: MOV CC,1
JMP EXIT5
ZER0BIT: MOV CC,0 EXIT5: RET BITP ENDP
;延时子程序 DELY PROC
PUSH CX MOV CX,100 LOOP $ POP CX RET DELY ENDP
CODE ENDS
END START
五 仿真
;如果X[0]不为0,则数据为4位
;如果X[1]不为0,则数据为3位数 ;如果X[2]不为0,则数据为2位数 ;如果X[3]不为0,则数据为1位数 ;否则,没有数据
20
第一步,进行数码管显示的仿真。编写一段直接赋值送到数码管显示的程序,进行数码管显示的仿真。
第二步,进行键盘扫描的仿真。编写代码,将扫描到的键值送到数码管显示。
第三步,在数码管显示和键盘扫描程序都正确的基础上,逐步增加代码,增加功能,逐步实现按键值的存储与显示、清零、加法、减法、乘法、除法等功能的仿真。
六 课程设计体会
上学期刚学过微机原理,学得不是很深入,仅限于课本知识的掌握,而
此次课程设计将会是一个很好的机会,来考察自己对课本知识的掌握以及应用情况。本次课程设计是四人一组,并且自由选择设计课题,我们小组选择了简易计算器的课题,在做的过程中也遇到很多困难。
在硬件设计模块,参考了课本上的相关例题以及查阅相关资料,发现关
于此次课程设计的所有课题的硬件原理图都有很大的共同之处,都是利用8086芯片经过地址锁存器,再通过译码器,最后利用8255A或者更多芯片(如8253等)进行设计
在软件设计模块,数码管显示和键盘扫描程序参考了书上的相关例题,也查阅了很多资料,发现原理都差不多,并且对此次课程设计有了较为清晰的思路。前一周基本上都在写程序,期间一直没有进行仿真。在写好所有的程序时,才开始汇编,发现有很多语法错误,这是必然的,毕竟10多页的程序,肯定会有疏忽的地方。但没有想到的是,在proteus里与硬件原理图配合进行仿真时,遇到了大麻烦。程序丝毫不起作用,按键没反应,数码管也不亮,深受打击。最后,不得不进行分部仿真。
首先,进行数码管显示的仿真。改编了一段直接赋值送到数码管显示的程序,结果还有错,并且花费了很长时间才搞定。主要问题是,四位数码管采用一位静态显示时没错,当进行动态多位(比如4位)显示时,倘若4位数值一样,则显示正确,只要数值不全一样就不能正确显示,各个数码管中的一个或多个二极管总是不亮(实际上应该亮的),也就是数值显示的不完整,当调低
21
频率后,数码管一个接一个单独动态显示时则正确,数值显示得很完整,并且我们发现,在数码管显示的切换瞬间,上述所说的应该亮但没亮的二极管比其它二极管先熄灭。这个花费了我们很长时间才解决。
其次,再进行键盘扫描的仿真,这也是我们组所遇到的主要两大困难的另一个。键盘扫描程序参考了课本上的例题,对键盘扫描原理也理解的很透彻,为了适用于我们组所画的原理图,我们进行了改动,而且改动时特别注意与课本上原理图的区别,键盘扫描原理都是一样的。但是,在仿真时,按键没有丝毫反应,在检查、思考很多遍后任然没有找到出错之处。然后,又查阅了很多相关资料,发现原理都一样,然后又仔细检查,才发现8255A芯片的片选信号始终无效(即始终为高电平),这才找到出错之处。
最后,在数码管显示和键盘扫描程序都正确的基础上,逐步增加代码,增加功能,逐步实现按键值的存储与显示、清零、加法、减法、乘法、除法等功能。在所有基本功能都实现后,又对源代码进行了优化整合。
通过本次课程设计,我对微机原理有了进一步的理解,对8086、8255A的工作原理、用途以及使用时的注意事项等都有了深刻的认识,对这类的课程设计也从毫无概念到了有清晰的认识的转变,相信再做这类的课程设计时不会再迷茫、不知从何入手。
七 参考文献
[1] 陈继红.微机原理及应用[M].北京:高等教育出版社,2011年,276-283页 [2] 周明德.微型计算机系统原理及应用[M].北京:清华大学出版社,2007年 [3] 戴梅萼.微型计算机技术及应用[M].北京:清华大学出版社,2008年 [4] 雷印胜.微型计算机接口技术[M].北京:科学出版社,2011年
22
因篇幅问题不能全部显示,请点此查看更多更全内容