微机原理交通灯控制实验及其详细(5页).doc
- 交通灯信号控制实验一、实验目的1、掌握并行接口8253的基本原理2、掌握8253的编程方法二、实验内容如图,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。编程使六个灯按交通变化规律亮灭。三、编程提示1、8255控制寄存器地址: 28BH0C40BH A口地址: 288H04C408H C口地址: 28AH04C40AH2、十字路口交通灯的变化规律要求(1) 南北路口的绿灯、东西路口的红灯同时亮三秒;(2) 南北路口的黄灯闪烁三次,同时东西路口的红灯继续亮;(3) 南北路口的红灯、东西路口的绿灯同时亮三秒;(4) 南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁三次;(5) 转(1)重复。3、程序设计流程开始返回DOS设置8255C口输出南北路口的绿灯、东西路口的红灯亮长延时南北路口的黄灯闪烁,东西路口红灯亮南北路口的红灯、东西路口的绿灯亮长延时南北路口红灯亮、东西路口黄灯亮闪烁是否有键按下下?吗?YN四、程序设计及实验调试程序设计的思想及注意事项:1.首先是在选择程序时是选用软件延时还是硬件延时。我采用的是C口方式0输入,所以选用了软件延时。2.在选择循环的时间上,老师上课时说过,长延时可以采用双层嵌套,外层嵌套为0FFFFH,内层嵌套为4000H,我在编程时外层送进了0,相当于初值为65536,内层送进了4000H。为了达到闪烁和延时的区别,我在编闪烁的程序时,给外层嵌套送入初值3000H,内层0100H(这是我通过实验的结果)。人眼感觉闪烁的效果只是短延时的结果。3.最后程序调用了6号功能键执行键盘输入,当有输入改变标志位时,则返回操作系统。南北红南北黄南北绿东西红东西黄东西绿亮亮闪烁亮亮亮亮闪烁亮亮实验程序:CODE SEGMENTASSUME CS:CODE START: MOV DX,0C40BH MOV AL,10010000B ;C口方式0输入 OUT DX,ALFIRST: 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,0100HWEN1: 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,4000HDELAY2: 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,0100HLI2: DEC AX JNZ LI2 ;软件短延时 LOOP LI2 MOV DX,0C40AH MOV AL,10000000B OUT DX,AL ;东西黄灭 MOV CX,3000H MOV AX,0100HWEN2: 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 ENDSEND 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 几条语句,后来又试验了几次,并增加了停留时间,我最后发现是电脑运行较的问题。 4.对交通灯黄灯闪烁的时间控制问题上,我一次换了几个值 外层嵌套 内层嵌套 0FFFFH 300H 3000H 300H 3000H 100H五、实验结果及分析:程序执行后实验板上首先是南北绿灯和东西红灯亮,几秒后南北向的黄灯闪烁两次,东西向红灯亮,之后南北向的红灯和东西向的绿灯同时亮几秒钟,之后东西黄灯闪烁四次,南北红灯亮。然后LED继续以上循环,若在执行文件中有按键按下,则结束程序。本次编程中为了达到长延时的效果,我使用了双层嵌套的方法,通过嵌套编程,我熟悉了子程序的编写和调用。在延时语句的编写时,可以使用执行指令和定时器定时两种方法,我采用了执行指令(即软件延时)的方法。在处理黄灯闪烁的问题时,我令黄灯在短延时情况下交替亮灭,并可通过设置BL的值控制黄灯闪烁次数,达到了预期目的。实验时遇到了按键很慢才返回操作系统的问题。运行完执行文件,按键下去交通灯也在继续亮。而程序中有MOV AH,06H INT 21H JZ FIRST MOV AH,4CH INT 21H 几条语句,感觉这就是对毅力的考验,通过反复实验,发现可以返回,只是电脑反应较慢。六、实验总结:本次实验为8255A并行接口实验,这次实验在代码编写阶段一开始找到了入手点。我在程序中使用了软件延时,时长取决与循环次数和计算机的速度,一开始编制的程序中短延时采用了两层循环,由于自己没有实践经验,所以最后通过实验结果确定了最后的数据。 通过此次程序设计,我认识到画软件流程图的重要性,画好流程图后可以很清晰的看清逻辑,不仅加快了编写过程,而且有利于出错时查找问题所在。虽然这次实验我是一步一步编程下来的,但是在调试结果时,仍发现了红灯错亮的问题,最后发现时写程序时的粗心所致。-第 5 页-