资源描述
交通信号灯实时控制系统设计报告 组员:李波 李敏一、实验目的现代城市交通日益拥挤,为保证交通安全,防止交通堵塞,使城市井然有序,交通信号灯在城市交通管理中的作用越来越重要。通过本实验:掌握交通信号灯实时控制系统的设计思想与实现方法。掌握定时/计时器和并行接口在实时控制系统中的应用。加深对定时/计时器和并行接口芯片的工作方式和编程方法的了解。加深对中断机理及应用方法的了解。二、实验任务设计制作一个交通信号灯实时控制系统。要求:在一个十字路口的一条主干道和一条支干道上分别装一套红,黄,绿3种信号灯;用钮开关模拟十字路口的车辆检测传感器信号。在一般情况下,主干道上的绿灯常亮,而支干道上总是红灯。当检测到支干道上来车时(用按键开关模拟),主干道的绿灯转为黄,持续4秒后,又变成红灯,同时支干道由红灯变为绿灯。支干道绿灯亮后,或者检测到主干道上来了3辆车(用3个钮子开关模拟),或者虽未来3辆车,但绿灯已持续了25秒,则支干道立即变为黄灯,4秒后转为红灯,同时主干道由红灯变为绿灯。三、实验设备器材80X86系列微机一台。微机硬件实验平台。定时/计时器和并行接口芯片。按键开关1个(单脉冲源),钮子开关(高低电平开关)3个及红,黄,绿发光二极管(即实验平台上的三色显示灯)。四、实验原理 根据实验任务要求,在本实验系统中,微机需要检测4个开关送来的主,支干道车辆到达信号,并按一定的条件发出主,支干道6个信号灯的控制信号。显然,用一片8255A足以满足上述要求。对8255A 各端口不妨作如下安排: 令端口A 工作于方式0的无条件数据输出方式,用以控制交通灯的亮灭;端口B 工作于方式1的输入方式,并设置为允许中断;将端口C 的PC2接到中断请求线上,使得当支干道上有车来时,由中断请求线向CPU发出中断,CPU响应中断后发出控制信号来控制主,支干道交通灯变换状态。端口C 的高4位用作输入口,从PC7,PC6,PC5接入3个钮子开关,当钮子开关打到高电平时,表示主干道有车辆到来。具体设置如下:端口A 的地址为:250H端口B的地址为:251H端口C的地址为:252H控制寄存器地址为;253H有关定时/计时器的功能,可以采用8253计时/定时器结合中断服务程序计数的方法来实现。可设想用8253来产生秒时钟信号,为此可以设置8253的定时器0工作方式3(方波方式),定时器1工作于方式2(分频方式),并将定时器0的输出端接到定时器1的时钟端。这样,就可以做到让定时器0每隔10ms向定时器1发出一个计数脉冲,而当定时器1计满100个数时,向主机发出一次中断请求信号,于是就实现了每隔1s发出一次中断请求的功能。然后在时钟中断服务程序中对秒信号作相应的计数。(通道1接10KHZ的方波脉冲源)。 另外附加三色显示灯的变色原理:从8255芯片的PA1,PA2,PA6,PA7 4个接口连出4根线接到三色显示灯的4个接口上,每两个控制一个灯。其中控制信号由程序中通过表示高低电平来设置好,如:红灯为1000 绿灯0100 黄灯1100 综上所述,本试验系统的硬件结构框架如下图所示:IRQ3微机扩展总线IRQ98255 PAPC0 PA2 PA7 PA6 PA58253 CLK0OUT1 OUT0 CLK1译 码电 路分 频电 路发光二极管单脉冲源开关状态信号10KHZ8253 通道0的端口地址为220H,通道1的为221H,控制寄存器的地址为223H。实验的主程序和支干道来车中断服务程序流程图则如下图:主程序设置两个中断向量初始化8253,设置两个计数器的工作方式保存原8259中断屏蔽字将8255的PC2置1,允许中断开中断,等待从8255的A 端口送出红绿灯信号(主干道绿灯,支干道红灯) 恢复中断向量及屏蔽字发中断结束命令,恢复现场初始化8255,设置各端口的工作方式返回DOS有Ctrl-C键吗?中断服务程序保护现场读8255端口的数据清除秒计数器送主干道黄灯,支干道红灯数据秒计数器清0,并将主干道红灯,支干道绿灯数据秒计数器清0,并送主干道红灯,支干道黄灯数据秒计数器=4?秒计数器=25主干道有3辆吗?秒计数器=4?中断返回YNYN主干道有3辆吗?YN.model small.stack.datacount db 0running db running,13,10,$message db inter,13,10,$time db .,$.codemain proc farstart: mov ax,data mov ds,ax cli ;中断标志置0 IF-0mov ah,09 lea dx,running int 21hmov al,0fh ;0bH mov ah,35h int 21h push es push bx push ds ;设置两个中断向量 mov ax,seg interproc mov ds,ax mov dx,offset interproc mov al,0fh mov ah,25h int 21h pop ds pop bx pop es mov al,0bh ;0bH mov ah,35h int 21h push es push bx push ds mov ax,seg timeproc mov ds,ax mov dx,offset timeproc mov al,0bh mov ah,25h int 21h pop ds pop bx pop es ;保存原8259屏蔽字 in al,21h push ax in al,0a1h push axmov al,071h out 21h,al mov al,0fdh out 0a1h,al ;初始化8253,设置两个计数器的工作方式 ;定时器0 工作方式3(方波方式) 10ms mov dx,223h mov al,16h ;控制字 out dx,al mov dx,210h mov al,64h out dx,al ;定时器1 工作方式2(分频方式) 100个数 mov dx,223h mov al,54h ;控制字 out dx,al mov dx,221h mov al,00001010b out dx,al ;初始化8255,设置各端口的工作模式 mov dx,253h mov al,10001111b ;控制字 out dx,al ;将8255的pc2置1,允许中断 mov dx,253h mov al,00000101b out dx,al repeat: ;开中断,等待 sti ;从8255的A端口送出红绿灯信号 mov dx,250h mov al,01000010b ;主绿支红 out dx,al mov ah,1 ;Ctrl+C int 16h jz repeat cli pop ax out 0a1h,al pop ax out 21h,al sti ;返回DOS mov ax,4c00h int 21hmain endpinterproc proc near ;中断处理程序 ;保存现场 cli push ds push ax push cx push dx mov ax,data mov ds,ax mov ah,09 lea dx,message int 21h mov dx,251h in al,dx ;主干道有3辆车吗? mov dx,252h in al,dx and al,11100000b ;7,6,5 cmp al,11100000b jz goend ;清除秒计算器 mov count,0 ;送主干道黄灯,支干道红灯数据 mov dx,250h mov al,11000010b ;主黄支红 out dx,al sti ;计数libo: cmp count,4 jnz libo ;秒计数器清零,送主干道红灯,支干道绿灯数据 mov count,0 mov dx,250h mov al,10000001b ;主红支绿 out dx,al captain: cmp count,25 jz cipher ;主干道有3辆车吗? mov dx,252h in al,dx and al,11100000b ;7,6,5 cmp al,11100000b jnz captaincipher: ;秒计数器清0,并送主干道红灯,支干道黄灯数据 mov count,0 mov dx,250h mov al,10000011b ;主红支黄 out dx,al smartcat: cmp count,4 jnz smartcatgoend: mov al,20h out 20h,al out 0a0h,al ;恢复现场 pop dx pop cx pop ax pop ds iret ;退出中断interproc endptimeproc proc near ;时间中断 ;保存现场 cli push ds push ax push cx push dx mov ax,data mov ds,ax inc count mov ah,09 lea dx,time int 21h mov al,20h out 20h,al out 0a0h,al ;恢复现场 pop dx pop cx pop ax pop ds sti iret ;退出中断timeproc endp end start
展开阅读全文