微机原理交通灯控制实验及其详细
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交通灯信号控制实验
一、实验目的
1、掌握并行接口8253的基本原理
2、掌握8253的编程方法
二、实验内容
如图,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。编程使六个灯按交通变化规律亮灭。
三、编程提示
1、8255控制寄存器地址:28BH—0C40BH
A口地址:288H—04C408H
C口地址:28AH—04C40AH
2、十字路口交通灯的变化规律要求
(1)南北路口的绿灯、东西路口的红灯同时亮三秒;
(2)南北路口的黄灯闪烁三次,同时东西路口的红灯继续亮;
(3)南北路口的红灯、东西路口的绿灯同时亮三秒;
(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁三次;
(5)转(1)重复。
3、程序设计流程
开始
设置8255C口输出
南北路口的绿灯、东西路口的红灯亮
长延时
南北路口的黄灯闪烁,东西路口红灯亮
南北路口的红灯、东西路口的绿灯亮
四、程序设计及实验调试
程序设计的思想及注意事项:
1.首先是在选择程序时是选用软件延时还是硬件延时。我采用的是C口方式0输入,所以选用了软件延时。
2.在选择循环的时间上,老师上课时说过,长延时可以采用双层嵌套,外层嵌套为0FFFFH,内层嵌套为4000H,我在编程时外层送进了0,相当于初值为65536,内层送进了4000H。为了达到闪烁和延时的区别,我在编闪烁的程序时,给外层嵌套送入初值3000H,内层0100H(这是我通过实验的结果)。人眼感觉闪烁的效果只是短延时的结果。
实验程序:
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,0C40BH
MOV AL,10010000B ;C口方式0输入
OUT DX,AL
FIRST: MOV DX,0C40AH
MOV AL,00100100B
OUT DX,AL ;南北绿,东西红写入C口
MOV CX,0 ;送入初值65536
MOV AX,4000H ;软件长延时,由经验值确定DELAY1: DEC AX
JNZ DELAY1
LOOP DELAY1
MOV BL,4 ;控制黄灯亮的次数SECOND:MOV DX,0C40AH
MOV AL,01000100B
OUT DX,AL ;南北黄,东西红
MOV CX,3000H
MOV AX,0100H
LI1:
DEC AX
JNZ LI1
LOOP LI1
MOV DX,0C40AH ;软件短延时
MOV AL,00000100B ;南北黄灭
OUT DX,AL
MOV CX,3000H
MOV AX,0100H
WEN1:
DEC AX
JNZ WEN1 ;软件短延时
LOOP WEN1
DEC BL
JNZ SECOND ;黄灯闪烁4次THIRD: MOV DX,0C40AH ;写入C口
MOV AL,10000001B
OUT DX,AL ;南北红,东西绿
MOV CX,0
MOV AX,4000H
DELAY2: DEC AX ;软件长延时
JNZ DELAY2
LOOP DELAY2
MOV BL,4 ;控制黄灯亮的次数FORTH: MOV DX,0C40AH ;写入C口
MOV AL,10000010B
OUT DX,AL ;南北红,东西黄
MOV CX,3000H
MOV AX,0100H
LI2:
DEC AX
JNZ LI2 ;软件短延时
LOOP LI2
MOV DX,0C40AH
MOV AL,10000000B
OUT DX,AL ;东西黄灭
MOV CX,3000H
MOV AX,0100H
WEN2:
DEC AX
JNZ WEN2
LOOP WEN2
DEC BL
JNZ FORTH ;黄灯闪烁4次
MOV DL,0FFH
MOV AH,06H
INT 21H ;执行键盘输入操作
JZ FIRST
MOV AH,4CH
INT 21H ;返回操作系统CODE ENDS
END START
实验中遇到问题及分析:
1.首先,实验出现的问题是在编程方面。由于自己使用了LOOP语句,而开始自己没有注意LOOP WEN2相当于DEC CX JNZ WEN2,而自己在赋值时,对CX赋值有点混乱。编程时由于粗心,写如C口的初值有错,导致二极管没能按预定结果亮,通过硬件结果,我很快发现了问题所在。
2.实验课上,自己认真听老师说怎样对六个灯进行赋值达到控制的结果,所以在编程时没有将灯的顺序搞混,在写入8255的C口时比较顺利。
3.实验时遇到了一些问题,有一个是按键下去返回操作系统。自己运行完执行文件,当按键下去返回操作系统时,却发现执行文件没有反应,而交通灯也在继续亮。我查看了自己的程序,发现有MOV AH,06H INT 21H JZ FIRST MOV AH,4CH INT 21H 几条语句,后来又试验了几次,并增加了停留时间,我最后发现是电脑运行较的问题。
五、实验结果及分析:
程序执行后实验板上首先是南北绿灯和东西红灯亮,几秒后南北向的黄灯闪烁两次,东西向红灯亮,之后南北向的红灯和东西向的绿灯同时亮几秒钟,之后东西黄灯闪烁四次,南北红灯亮。然后LED继续以上循环,若在执行文件中有按键按下,则结束程序。
本次编程中为了达到长延时的效果,我使用了双层嵌套的方法,通过嵌套编程,我熟悉了子程序的编写和调用。在延时语句的编写时,可以使用执行指令和定时器定时两种方法,我采用了执行指令(即软件延时)的方法。在处理黄灯闪烁的问题时,我令黄灯在短延时情况下交替亮灭,并可通过设置BL的值控制黄灯闪烁次数,达到了预期目的。
实验时遇到了按键很慢才返回操作系统的问题。运行完执行文件,按键下去交通灯也在继续亮。而程序中有MOV AH,06H INT 21H JZ FIRST MOV AH,4CH INT 21H 几条语句,感觉这就是对毅力的考验,通过反复实验,发现可以返回,只是电脑反应较慢。
六、实验总结:
本次实验为8255A并行接口实验,这次实验在代码编写阶段一开始找到了入手点。我在程序中使用了软件延时,时长取决与循环次数和计算机的速度,一开始编制的程序中短延时采用了两层循环,由于自己没有实践经验,所以最后通过实验结果确定了最后的数据。
通过此次程序设计,我认识到画软件流程图的重要性,画好流程图后可以很清晰的看清逻辑,不仅加快了编写过程,而且有利于出错时查找问题所在。虽然这次实验我是一步一步编程下来的,但是在调试结果时,仍发现了红灯错亮的问题,最后发现时写程序时的粗心所致。