硬件课程设计实验报告 - 模拟交通灯 - 图文 下载本文

图2 8255接口电路 ? 软件设计思路: 设计数器0的计数初值为25000,由于CLK0接脉冲信号,频率为2.5MHZ,所以每10ms中断一次。利用CX对不同的状态时间计数,用来实现计数器0对1分钟,20秒钟,5秒钟的定时。中断子程序分为数码显示刷新部分和红绿黄灯各种状态切换部分。每进入中断即刷新LED显示。用对于东西车道和南北车道黄灯闪烁利用标志位判断实现,满足比较条件就暗,不满足条件就亮。 8253计数的起停由8255的PA0控制,8255的PA0输出1时,8253开始计数,交通灯按正常状态切换工作,PA0输出0时,计数器停止工作,交通灯不再按正常状态切换。8253开始计数后每100ms发出一个中断申请信号,在中断子程序中先刷新数码管,然后判断当前状态,进入相应的处理程序进行处理。 主程序负责系统的初始化,然后数码管数据输出显示,同时检测PC键盘按键,有按键就退出程序。主程序的流程图如图3所示。 初始化8253 开始 初始化8255 图3 主程序的流程图 定时中断子程序是本设计的重点,负责完成数码管输出数据刷新和各个状态的处理切换。中断子程序包括数码管输出数据刷新程序和各状态处理程序。数码管输出数据刷新子程序是实现倒计时25s,用LEDOUT表示输出的数据,cnt用来软件计时1s,就是计数10个100ms。LED输出是要将输出的数据转化为段选码。根据当前的状态跳转到相应的处理程序,在处理程序中完成定时和状态的切换。状态1和3的流程是一样的,先点亮对应的交通灯,再判断定时到了就可以切换了。状态2和4要实现黄灯的闪烁,间隔点亮和熄灭就可以了。状态1和3处理程序的流程图(以状态1为例)如图6所示,其中NUM是状态1对应的PC口输出。 外部中断服务子程序主要用来处理紧急情况,将2个方向的车都停止运行,点亮所有红灯。下次中断来时恢复以前的状态。用一个标志位FLAG判断是第一次进入还是恢复状态。 ? 源程序清单: 本次设计中,选用8235的计数器0定时向实验系统主片8259A的IRQ0请求中断。设置8253的计数器0每10ms请求一次中断,工作于模式3;8255的A端口控制交通灯。 初始化程序: DATA SEGMENT LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;存放七段代码表 DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H D1 EQU 10H D2 EQU 200H ;8255A端口A EA EQU 200H ;8259端口地址 EE EQU 203H CONTROL EQU 20bH ;8253端口地址 COUNT0 EQU 208H COUNT1 EQU 209H COUNT2 EQU 20aH Z8279 EQU 222H D8279 EQU 220H LEDMOD EQU 00 ;左边输入,八位显示外部译码八位显示 LEDFEQ EQU 38H ;扫描频率 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA CODE SEGMENT ASSUME CS:CODE CONT DB 0 CONT1 DB 0 CONT2 DB 0 BKSD DB 0 BKAD DB 0 BKDA DB 0 TEMP DB 0 ;******************************************* START: MOV AX,0 MOV DS,AX MOV AX,OFFSET IRQ0 ADD AX,2000H MOV SI,0FH*4 MOV [SI],AX MOV AX,0 MOV [SI+2],AX IN AL,218H AND AL,7FH OUT 219H,AL CLI MOV AL,80H ;初始化8255 OUT EE,AL MOV AL,00 OUT EA,AL MOV AL,0f0H OUT EA,AL MOV DX,218H ;8259初始化 MOV AL,b OUT DX,AL MOV AL,08H MOV DX,219H OUT DX,AL MOV DX,203H ;设置为全输出 MOV AL,80H OUT DX,AL MOV DX,200H MOV AL,0ffh OUT DX,AL ;清LED