资源描述
微型计算机技术课程设计报告长江大学
33
2020年4月19日
文档仅供参考,不当之处,请联系改正。
微型计算机技术
课程设计
指导教师: 李鹏 蔡明文
班 级: 计科11205班
姓 名: 专……
学 号: ……………
班内序号: 35
课设日期: 12月22日~ 1月4日
课设题目: 电梯控制系统电路及程序设计
一、课设目的
1.经过本设计,使学生综合运用《汇编语言与微型计算机技术》、《数字电子技术》等课程的内容,为今后从事计算机检测与控制工作奠定一定的基础。
2.掌握接口芯片8253、8255A、8259等可编程器件、译码器74LS138、8路同相三态双向总线收发器74LS245、六缓冲器/驱动器/反相器74LS06、点阵显示器件和七段数码管的使用。
3.学会用汇编语言编写一个较完整的实用程序。
4.掌握微型计算机技术应用开发的全过程,包括需求分析、原理图设计、元器件选用、布线、编程、调试、撰写报告等步骤。
二、课设内容
1.电梯程序启动后的初始状态
点阵显示器件能够显示的三种状态分别为:“↑“ “↓”、“-”。含义分别为电梯“向上运行中”、“ 向下运行中”、“停止,乘客上下”。这三种状态的点阵数据需要自己生成或经过点阵软件生成。其初始状态为“-”。
当电梯在某层停止时,黄色发光二极管每秒闪烁一次,15秒用于乘客上下(这个时间在调试时为了节省时间能够减少为5秒。也可用“←”控制乘客上下时间小于15秒时关门启动,用“→”控制乘客上下时间大于15秒时开门等待,选作);15秒后黄色发光二极管灭,触发绿色发光二极管每秒闪烁一次,表示电梯正在运行中;相邻的两层之间运行3秒,绿色发光二极管灭,触发七段数码管显示的楼层数加1或减1。两个发光二极管的初始状态都为“灭”,七段数码管能够显示的楼层为“0~9”,其初始状态为“0”,表示地下室或地下停车场。
2.电梯程序运行状态
电梯程序启动后,接收来自键盘的数据进入运行状态。来自键盘的合法数据只有“0~9”、“↑”、“↓” 、“←”、“→”、“空格”和Esc,程序应该检查来自键盘数据的合法性。除Esc是结束程序运行外,来自键盘的数据应为“数字+方向+数字”。来自键盘的数据能够是连续的,也能够是间断的。输入的数据要尽可能测试到各种情况,至少完成电梯一次完整的升降,如“3↑5 5↑7 5↑7 5↑3 1↑3 9↓4 9↓6 Esc”的一种可能的处理过程为0→3→5→7→9→6→4→0→1→3→9→0。另一种可能的处理过程为0→1→3→5→7→9→6→4→0。
3.结束电梯程序运行状态
按下Esc键结束程序。点阵显示器件显示“-”, 两个发光二极管的状态都为“灭”,七段数码管显示的楼层为“0”。
三、设计所需器材及工具
1.一块实验面包板(内含时钟信号1MHz或2MHz)。
2.可编程芯片8253、8255、74LS245、74LS06各一片,74LS138两片;发光二极管2个(绿色、黄色各1个);排电阻1个;七段数码管1个;200欧母电阻16个;8×8点阵显示器件一片。
3.导线若干。
4.示波器、万用表、常见工具等共用(从实验室现借现还)。
四、设计思路
1.利用一个74LS138设计地址译码电路,8255端口地址:300H~303H,8253端口地址:304H~307H。
2.74LS245用于总线和8253、8255之间的双向传输和隔离。
3.利用面包板上时钟(1MHz或2MHz)和8253设计一个1秒定时电路,将定时信号(1秒方波)接到总线的IRQ2或IRQ10送给8259。
4.8255的PA口控制点阵显示器件行变化,200欧母电阻接在PA口和点阵显示器件之间。PB口经过另一个74LS138控制点阵显示器件列变化,PB口经过还需经过74LS06控制发光二极管的的变化。
5.PC口控制七段数码管变化,200欧母电阻接在PC口和七段数码管之间。
6.每个74LS06中包含了6个非门,它的输入来自PB口的某一位,输出接到发光二极管的负极。
7.每个发光二极管的正极接排电阻的从2到9的一个引脚,排电阻的1脚接VCC(+5V)。
五、设计步骤
1.设计电路原理图,用protues画出电路图如下
2.用所给器件布线,按照protues里面的仿真图搭建好硬件电路。
3.选用汇编语言编写电梯运行的主程序以及各芯片调试子程序。
4.调试并排除括硬件电路设计错误和软件设计错误,使系统达到设计要求。
六、设计原理图
七、芯片介绍
(1) 74LS245数据总线缓冲器
74LS245功能表
(2)74LS06
(3)74LS138
(4)8253定时╱计数器 (5)8255A
(6)七段数码管 (7)发光二极管
(8)排电阻
(9)点阵显示器788BS
八、电梯流程图
初始化
等待
确认本层与目标层
目标层与本层是否同层
是否目标层
楼层检测
电梯运行
电梯选向
停止
九、程序设计
SSEG SEGMENT STACK
DW 200 DUP(?)
SSEG ENDS
DATA SEGMENT
MESG2 DB 'Please input the direction and the number of the elevator ',0ah,0dh
DB 'as dir ("UP"or"DOWN") + num (0--9)',0ah,0dh
DB 'Exit with Esc',0ah,0dh,'$'
NOW_FLOOR DB(1) ;电梯现在楼层
NEXT_FLOOR DB(1) ;电梯目标楼层
STATE DB(0) ;电梯运行的状态 0表示暂停 1表示向上 2表示向下
TIMECOUNT DB(0) ;时钟计数
SIGN DB(1)
UP DB 18H,0CH,06H,0FFH,0FFH,06H,0CH,18H
DOWN DB 18H,30H,60H,0FFH,0FFH,60H,30H,18H
STOP DB 00H,18H,18H,18H,18H,18H,18H,00H
SEVLED DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
SIGN_BUF DB(0)
UP_BUF DB 10 DUP(0)
DOWN_BUF DB 10 DUP(0)
MESG1 DB 'THE NUMBER IS ERROR',0DH,0AH,'$'
INTOA_OFF DW(?)
INTOA_SEG DW(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV DX,DATA
MOV DS,DX
MOV DX,SSEG
MOV SS,DX
MOV AH,09H
MOV DX,OFFSET MESG2
INT 21H ;显示提示信息
;初始化8255
MOV DX,303H
MOV AL,10000000B
OUT DX,AL
MOV DX,300H
MOV AL,00H
OUT DX,AL
MOV DX,301H
MOV AL,00H
OUT DX,AL
MOV DX,302H
MOV AL,0FFH
OUT DX,AL
;中断的设置
MOV AX,3572H
INT 21H
MOV INTOA_OFF,BX
MOV BX,ES
MOV INTOA_SEG,BX
CLI
MOV AX,2572H
MOV DX,SEG LEDLIGHT
PUSH DS
MOV DS,DX
MOV DX,OFFSET LEDLIGHT
INT 21H
POP DS
STI
;打开IRQ10和IRQ2
IN AL,0A1H
AND AL,0FBH
OUT 0A1H,AL
IN AL,21H
AND AL,0FBH
OUT 21H,AL
;8253初始化产生1S的计时
MOV DX,307H
MOV AL,01110110B
OUT DX,AL
MOV DX,305H
MOV AL,0E8H
OUT DX,AL
MOV AL,03H
OUT DX,AL
MOV DX,307H
MOV AL,10110110B
OUT DX,AL
MOV DX,306H
MOV AL,0E8H
OUT DX,AL
MOV AL,03H
OUT DX,AL
INPUT:
CALL FAR PTR MATRIX_SHOW
CALL FAR PTR DIGITRON_SHOW
MOV AH,0BH
INT 21H
CMP AL,00H
JZ INPUT
MOV AH,00H
INT 16H
CMP AL,0DH
JZ NEXT0 ;若没有输入为回车,进入运行状态
CMP AL,1BH
JNZ NEXT ;若输入ESC则退出程序
JMP EXIT
NEXT:
CMP AH,48H
JZ M_UP
CMP AH,50H
JZ M_DOWN
JMP INPUTERROR
M_UP:
MOV AH,01H
INT 21H
CMP AL,'0'
JB INPUTERROR
CMP AL,'9'
JA INPUTERROR
SUB AL,30H
MOV AH,00H
MOV SI,AX
MOV UP_BUF[SI],01H
JMP INPUT
M_DOWN:
MOV AH,01H
INT 21H
CMP AL,'0'
JB INPUTERROR
CMP AL,'9'
JA INPUTERROR
SUB AL,30H
MOV AH,00H
MOV SI,AX
MOV AX,0009H
SUB AX,SI
MOV SI,AX
MOV DOWN_BUF[SI],01H
JMP INPUT
NEXT0:
CALL FAR PTR MATRIX_SHOW
CALL FAR PTR DIGITRON_SHOW
CMP SIGN_BUF,14H
JZ REPEAT
CMP TIMECOUNT,02H
JBE NEXT0
MOV TIMECOUNT,00H
CALL FAR PTR RUN
JMP NEXT0
REPEAT:
MOV SIGN_BUF,00H
MOV AL,NEXT_FLOOR
MOV NOW_FLOOR,AL
MOV STATE,00H
JMP INPUT
INPUTERROR:
MOV AH,09H
MOV DX,OFFSET MESG1
INT 21H
JMP INPUT
EXIT:
MOV AX,2572H
MOV DX,INTOA_SEG
PUSH DS
MOV DS,DX
MOV DX,INTOA_OFF
INT 21H
POP DS
IN AL,0A1H
OR AL,04H
OUT 0A1H,AL
IN AL,21H
OR AL,04H
OUT 21H,AL
MOV AH,4CH
INT 21H
;电梯状态与运行程序
RUN PROC FAR
PUSH AX
PUSH BX
PUSH SI
MOV AL,NEXT_FLOOR
CMP AL,NOW_FLOOR
JA RUP
CMP AL,NOW_FLOOR
JB RDOWN
MOV AL,SIGN
MOV STATE,AL
MOV AH,00H
MOV BX,OFFSET UP_BUF
R0:
MOV AL,SIGN_BUF
MOV SI,AX
CMP BYTE PTR[BX+SI],01H
JZ R1
INC SIGN_BUF
CMP SIGN_BUF,14H
JNZ R0
JMP RBACK
R1:
MOV BYTE PTR[BX+SI],00H
CMP SIGN_BUF,09H
JA R2
MOV AL,SIGN_BUF
MOV NEXT_FLOOR,AL
JMP RBACK
R2:
MOV STATE,02H
MOV AL,SIGN_BUF
SUB AL,0AH
MOV AH,09H
SUB AH,AL
MOV NEXT_FLOOR,AH
JMP RBACK
RUP:
ADD NOW_FLOOR,01H
MOV STATE,01H
MOV SIGN,01H
MOV AL,NOW_FLOOR
CMP AL,NEXT_FLOOR
JZ R3
JMP RBACK
RDOWN:
SUB NOW_FLOOR,01H
MOV STATE,02H
MOV SIGN,02H
MOV AL,NOW_FLOOR
CMP AL,NEXT_FLOOR
JZ R3
JMP RBACK
R3:
MOV STATE,00H
JMP RBACK
RBACK:
POP SI
POP BX
POP AX
RET
RUN ENDP
;点阵显示程序
MATRIX_SHOW PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
CMP STATE,00H
JZ MSTOP
CMP STATE,02H
JZ MDOWN
MOV BX,OFFSET UP
MOV CL,00001000B
JMP MRUN
MSTOP:
MOV BX,OFFSET STOP
MOV CL,00010000B
JMP MRUN
MDOWN:
MOV BX,OFFSET DOWN
MOV CL,00001000B
MRUN:
MOV SI,0000H
MLP:
MOV DX,300H
MOV AL,[BX+SI]
OUT DX,AL
MOV DX,301H
MOV AL,CL
OUT DX,AL
INC SI
INC CL
CALL FAR PTR DELAY
CMP SI,0008H
JNZ MLP
POP SI
POP DX
POP CX
POP BX
POP AX
RET
MATRIX_SHOW ENDP
;7数码管显示程序
DIGITRON_SHOW PROC FAR
PUSH AX
PUSH DX
PUSH SI
MOV DX,302H
MOV AH,0000H
MOV AL,NOW_FLOOR
MOV SI,AX
MOV AL,SEVLED[SI]
OUT DX,AL
POP SI
POP DX
POP AX
RET
ENDP
;延迟程序
DELAY PROC FAR
PUSH CX
PUSH BX
MOV BX,0FFH
DLP2:
MOV CX,0FFFH
DLP1:
LOOP DLP1
DEC BX
JNZ DLP2
POP BX
POP CX
RET
DELAY ENDP
;中断服务程序
LEDLIGHT PROC FAR
PUSH AX
PUSH DX
CLI
ADD TIMECOUNT,01H
IBACK:
;发出EOI命令
MOV AL,62H
MOV DX,0A0H
OUT DX,AL
OUT 020H,AL
STI
POP DX
POP AX
IRET
LEDLIGHT ENDP
CODE ENDS
END START
十 课设截图
十一 课设总结
首先刚刚拿到这个课设题目时我一下子懵了,不知道程序怎么写。我的小伙伴桂蓉也是,我们两就在网上搜集了一些资料,然后相互讨论。我主要负责写程序,她主要负责连线。当我们拿到实验箱之后我们就开始积极分工互助合作。连线比较麻烦特别是要仔细,不能出错。很快我们摸清了连线的套路,实验箱上的带有绿线的一竖条是联通的,接地。带有红线的一条是联通,接VCC(+5v)。每一个块的一横条是联通的,芯片跨越在两个横块之间。我们开始布局芯片的位置,布局完了就开始连线。我们两一起对照着每个芯片的引脚图开始连线,经过两个多小时的奋斗,线终于连好了。于是我们开始调试程序,当我们开始测8255时,没有任何反应,于是我们又仔细检查连线,果然reset接口没有接。当我们接好之后再次测量终于成功接好了。
关于硬件调试我们弄了好几天,我的小伙伴桂蓉主要负责连线。我主要写程序和调试,说到写程序,开始的时候我纠结了好久,不知道到底用c语言编还是用汇编语言编,毕竟c语言我熟一些,汇编只是刚刚接触。可是毕竟我们学微机原理真门课主要讲的还是汇编,因此我想锻炼一下自己,果断用汇编语言写。当然开始存在很多问题,比如说不知道中断如何使用,不知道如何输出3秒和5秒的时间间隔,另外我也对汇编里面的语法不是很熟,上课老师讲的很清楚,可是现在我忘记了一些。面对如此多的问题,这时候,我翻开书本上的汇编语言程序设计那一章。我看了书上很多例子,我渐渐明白了软中断的各个用法,现在摆在我面前的是如何用这些软中断,以及8253输出的一秒中断怎么使用。大致思路我都懂,就是不知道如何调用这些中断。我又翻开中断那一章以及我们做的实验9(8259),我明白了中断的具体用法,现在我开始我的编程了!,首先有一个数据段,里面要放很多东西,定义一个变量存放当前的楼层,定义一个数组存放输入的楼层,定义一个堆栈保护现场。再我的不懈努力下,终于程序写完了。可是正当我准备调试的时候,我发现我的实验箱上的8253运行不了,然后我和我的小伙伴桂蓉仔细检查连线,我们同时也拿来万用表测量,最后我们确定是8253出了问题 ,于是我们们换掉了8253,果然,这次成功了,可是我写的程序却运行不了,执行起来没有错误,可是不出结果,这最让人脑壳疼。我又静下心来仔细检查我的程序,发现了一些逻辑上的错误,中断程序在执行的过程中,当调用点阵显示的子程序时,陷入了死循环当中不能出看来,当下一个中断信号来临时,所需要的子程序无法继续执行,陷入了忙等状态。这时候,我又在网上查询了一些中断程序的写法,真的。我做出来,可是点阵码有点乱,向上箭头和向下箭头不是很完美,我又仔细检查连线,原来有两根线没有按顺序连好。当一切ok了之后,终于程序正常的运行了。我和我的小伙伴都非常开心,尽管我们不是前几个做出来,可是这连线,这写程序让我学到了很多。
在此,我想说经过这个课设,我真的学到了很多东西,第一:耐心,我和我的小伙伴都重连了好几次线,这确实要耐心,开始我有点烦躁,幸好我的小伙伴及时安慰我,她很相信我能解决一些难题,我也很相信她能把线连的perfect!第二:合作,我和我的小伙伴都学会了如何分工合作,现在她把连线记得相当熟练,我把程序也理解的相当透彻,我们两在一起分工合作真的很有效!第三:动手能力大大提高,我和我的小伙伴在连线的过程中,不断地剪线,插线,确实很大程度上锻炼了自己!第四:对微机原理这门课程又得到了相当大的了解,对寄存器,存储器,以及寻址方式等理解的更透彻!也相当于复习了这次微机原理的期末考试!总之,收益匪浅啊,感谢老师给了我这么好一次锻炼自己的机会!
指导老师意见:
成绩 教师签名
展开阅读全文