您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 项目训练二简易交通信号灯
项目训练二简易交通信号灯一、任务目标设计一个简易的交通信号灯控制器,其设计任务如下。某交通十字路口,南北向为主干道,东西向为支道。每个道口安装一组信号灯,每组信号灯有红、黄、绿3种信号,各信号灯按以下规则循环显示交通信号指挥交通,见表1。显示信号共有4种状态,称为四相。25s5s15s5s东西向绿灯黄灯红灯红灯南北向红灯红灯绿灯黄灯要求使用单片机控制发光二极管完成表1的显示功能。二、硬件1、显示器件显示状态共有红、黄、绿3种颜色,可以使用红、黄、绿色发光二极管,每组信号灯使用3只发光二极管,两个方向的道口各使用1组。控制系统需要6个开关量控制发光二极管,见图1。6只发光二极管的显示规则见表2。表1交通信号灯显示规则图1信号灯显示电路方向东西向南北向发光二极管时间/sD1D2D3D4D5D6红黄绿红黄绿25灭灭亮亮灭灭5灭亮灭亮灭灭15亮灭灭灭灭亮5亮灭灭灭亮灭2、驱动电路为了提高89S51的驱动能力,89S51的端口经驱动器件ULN2803驱动发光二极管。3、控制电路表2发光二极管显示规则选用89S51的P0口驱动ULN2803时必须接上拉电阻,为了简化电路使用P2口输出。交通信号灯电路见图7-2。4.控制方法根据显示规则,6只发光二极管一共有4种显示状态,每一种状态对应的P2口的输出状态见表3。需要改变输出时只需将P2口各位的状态组成一个字节发送到P2口即可,这样一个用于控制输出的数值称为控制字。四种状态的控制字见表3。图2交通信号灯电路P2.5南北绿P2.4南北黄P2.3南北红P2.2东西绿P2.1东西黄P2.O东西红控制字P2东西向信号灯南北向信号灯O011000CH绿色红色0O101O0AH黄色红色1000012lH红色绿色0100O11lH红色黄色三、软件1、算法分析(1)定时时间根据规则,信号灯显示时间的单位为秒(s),系统采用12MHz晶振时定时计数器的最长定时时间为65ms。为了计算方便,定时计数器设定为定时50ms。采用中断方式,中断表3信号灯控制方法程序中设置一个计数器(S1),每计数20次(1s)后设定时间标志(SBZ)通知主程序。(2)定时计数器设置选用定时计数器0,模式1,定时计数器控制字为01H,见图3。图3定时计数器控制字定时计数器0初值计算:12×10612X=216-×50×10-3解得:X=15536。可以利用汇编语言的运算功能计算出TH0与TL0的初值。TH0=15536/256操作符“/”表示整除运算:取商,截去余数。TL0=15536MOD256操作符“MOD”表示取模运算:取余数,截去商。(3)定时计数器中断程序定时计数器中断程序需完成的任务:每次中断后计数,当计数达到20次时设置标志SBZ通知主程序定时时间到,同时恢复计数器重新开始计数。中断程序框图见图4。(4)主程序为了使程序具有通用性,将控制规则存放在数据区中,称为规则表(GZB),见图5。规则表中数据的存放方法如下。CTC0:PUSHACCMOVTH0,#CTHMOVTL0,#CTLINCS1MOVA,S1CJNEA,#20,CTC1MOVS1,#0SETBSBZCTC1:POPACCRETI图4中断程序框图与程序GZB:DB25,0CH;25s,控制字0CHDB5,0AH;5s,控制字0AHDB15,21H;15s,控制字21HDB5,11H;5s,控制字11HDB0;结束标志图5规则表①则表每行对应一相规则,四相规则共有4行。②则表每行有两项数据,第一项为延时时问,第二项为输出控制字。③则表最后存放一个“0”,用做规则表结束标志。主程序将第一项数据读出后存放在寄存器中用做计时器,并将第二项数据由P2口送出,控制显示状态。每当SBZ=1(定时ls时间到)时将计时器减1。当计时器减到“0”时,说明本相显示时间到,再读出规则表中下一行数据,如此重复。当从规则表中读出时间值为“0’’(结束标志)时,调整数据指针从规则表第一行重新开始读数据,实现循环显示。这样当需要调整显示规则时只需修改规则表数据,而不必修改程序,从而使程序具有一定的通用性。主程序框图见图6。ORG0000HAJMPMAINORG000BHAJMPCTC0MAIN:MOVTMOD,#01HMOVTH0,#CTHMOVTL0,#CTLSETBTR0SETBET0SETBEAPROG1:MOVDPTR,#GZBPROG2:CLRAMOVCA,@A+DPTRINCDPTRJZPROGQMOVR2,ACLRAMOVCA,@A+DPTRINCDPTRMOVP2,AWAIT:JBCSBZ,PROG3SJMPWAITPROG3:DECR2CJNER2,#0,WAITSJMPPROG2图6主程序框图与程序2、程序清单;自动交通信号灯ORG0000HAJMPMAIN;跳转到主程序入口ORG000BH;定时计数器0中断入口AJMPCTC0;跳转到定时计数器0中断程序MAIN:MOVTMOD,#01H;设定定时计数器0为工作方式1MOVTH0,#CTH;设置计数器初值MOVTL0,#CTLSETBTR0;启动定时计数器0SETBET0;开定时计数器0中断SETBEA;开总中断PROG1:MOVDPTR,#GZB;数据指针指向规则表首地址PROG2:CLRA;取规则表中第一项数据(时间值)MOVCA,@A+DPTRINCDPTR;移动指针到规则表下一项数据JZPROG1;如果时间值为0,说明规则表数据已读完移动数据指针到规则表首地址MOVR2,A;保存时间值CLRA;取规则表下一项数据MOVCA,@A+DPTRINCDPTR;调整数据指针MOVP2,A;显示状态送P2口WAIT:JBCSBZ,PROG3;等待秒计时时间SJMPWAITPROG3:DECR2;秒计时时间到,计时值-1CJNER2,#0,WAIT;本相计时时间未到,继续等待SJMPPROG2;本相计时时间到,取下一阶段数据;========================================;以下为定时计数器0中断程序,中断每50mS产生一次CTC0:PUSHACC;保护现场MOVTH0,#CTH;恢复计数器初值MOVTL0,#CTLINCS1;中断次数累计MOVA,S1;判断是否已中断20次,未到20次中断返回CJNEA,#20,CTC1MOVS1,#0;已到20次,计数器清0SETBSBZ;设置秒计时标志CTC1:POPACC;恢复现场RETI;中断返回;=====================================;以下为数据设置S1DATA30H;秒计数器SBZBIT00H;时间标志CTHEQU15536/256;定时计数器0初值高位CTLEQU15536MOD256;定时计数器0初值低位GZB:DB25,0CH;显示规则表DB5,0AHDB15,21HDB5,11HDB0;规则表结束标志END;程序结束
本文标题:项目训练二简易交通信号灯
链接地址:https://www.777doc.com/doc-323776 .html