交通信号灯控制系统2B完整的C51编程.docx
- 文档编号:9224807
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:28
- 大小:52.02KB
交通信号灯控制系统2B完整的C51编程.docx
《交通信号灯控制系统2B完整的C51编程.docx》由会员分享,可在线阅读,更多相关《交通信号灯控制系统2B完整的C51编程.docx(28页珍藏版)》请在冰豆网上搜索。
交通信号灯控制系统2B完整的C51编程
交通信号灯控制系统
摘要:
十字路口的红绿灯指挥着行人和各种车辆安全通行,实现红绿灯的自动指挥是城市交通管理自动化的重要课题。
因为交通信号灯控制系统是要根据计时的情况实现对交通信号灯的控制和对数字显示器的控制,所以用微控制器MCU(MicrocontrollerUnit,又称单片机)实现交通信号控制系统的设计。
又因为微控制器MCU应用系统抗干扰性差,故一般应该综合采用软、硬件抗干扰措施,才能获得好的抗干扰效果,以便交通信号的控制系统更好的实现。
关键词:
单片机芯片AT89C52;驱动器芯片74LS245;显示模块;RTX51Tiny内核
十字路口的红绿灯指挥着行人和各种车辆安全通行,实现红绿灯的自动指挥是城市交通管理自动化的重要课题。
一般说来,十字路口处的两条相互交叉的道路是由主次之分的,其中一条道路平时车流量较大,称为主干道;而另一条道路平时车流量较小,称为次干道。
十字路口交通信号灯控制系统应考虑十字路口主、次干道车流量不同的特点,并且能根据车流量发生变化的实际情况,可以很方便地更改主、次干道的通车时间。
1方案的比较论证
1.1以CPLD为核心的实现方案
运用EDA技术实现电子系统的设计特别是数字电子系统的设计,是现代电子技术发展的趋势。
CPLD芯片内部的电路功能可以通过标准硬件描述语言进行设计,而且整个设计过程都是在通过计算机的帮助下完成的,从而使得以CPLD为核心的方案容易实现、容易修改、容易保存。
因此,无论是在系统的工作可靠性方面,还是在系统的成本、系统的运行速度、系统结构的简易程度等方面,以CPLD为核心的实现方案具有一定的技术先进性,而且最后能得到让人比较满意的设计结果。
1.2以MCU为核心的实现方案
用微控制器MCU实现交通信号控制系统的设计,相对而言是最容易的,因为交通信号灯控制系统就是要根据计时的情况实现对交通信号灯的控制和对数字显示器的控制。
而微控制器MCU最适宜于对物理对象的控制,通过微控制器软件编程,很容易实现对交通信号灯的控制和对LED数码管的显示控制。
但是,微控制器MCU应用系统具有抗干扰性差的特点,而对交通信号灯控制系统工作可靠性的要求是很高的,因此,必须采取有效措施提高微控制器MCU应用系统的可靠性。
一般应该综合采用软、硬件抗干扰措施,才能获得好的抗干扰效果。
上述两种实现方案各自的特点有所不同,采用的技术手段有较大区别。
但是,因为设计任务时要求“为了便于制作,系统硬件要求尽可能的简单”,所以我采用以MCU为核心的实现方案。
2系统硬件设计
2.1交通信号灯控制电路
“交通信号灯控制电路”是本系统的核心,由它实现对红、绿、黄三色信号灯的控制。
交通信号控制系统只包含“交通信号灯控制电路”和“红、黄、绿三色信号灯”两个部分。
有一条主干道和一条次干道的城市道路交叉路口,其每一边(共4边)都设置红、绿、黄三色信号灯。
红灯亮表示禁止通行;绿灯亮表示可以通行;在绿灯亮转变为红灯亮之前,先要求黄灯亮几秒钟,以便让交叉路口停车线以外的车辆停止通行,而交叉路口停车线以内的车辆快速通过交叉路口。
每一边的红、黄、绿三的信号灯亮的顺序是红→绿→黄→红→绿→黄……。
主干道红灯亮时,对应次干道的绿灯亮、黄灯亮;主干道绿灯亮时,对应次干道黄灯亮的时间之和。
同理,次感到红灯亮的时间,应等于主干道绿灯亮的时间与主干道黄灯亮的时间之和。
设某城市道路十字交叉路口的交通信号灯控制方案如表1所示:
表1交通信号灯控制方案
Tab.1Thecontrolschemeofthetrafficlights
路口道路
主干道
次干道
信号灯
Red1
Yellow1
Green1
Red2
Yellow2
Green2
主红支绿20s
0
1
1
1
1
0
主红支黄5s
0
1
1
1
0
1
主绿支红30s
1
1
0
0
1
1
主黄支红5s
1
0
1
0
1
1
由表1可知,十字交叉路口的主干道车辆通行时间是30s,次干道车辆通行时间是20s,交通信号灯由绿灯亮状态转换到红灯亮状态以前,黄灯亮的时间是5s。
控制红、黄、绿三色信号灯的控制信号是开关信号,并且约定,当色灯亮时用逻辑0表示,色灯灭时用逻辑1表示。
交通信号灯控制电路如图1所示:
由图1可知,这是一种简单的微控制器最小系统。
为了以后能够在线升级更新系统用户应用程序,采用了带ISP下载接口的单片机AT89C52。
AT89C52具有快速8051内核、8KBFLASHEEPROM、256字节IDATARAM,完全符合运行嵌入式实时操作系统RTX51Tiny的硬件要求。
图中包含了信号灯电路,用6个发光二极管模拟主干道和次干道的红、黄、绿三色信号灯。
图1交通信号灯控制电路图
Fig.1Thecircuitdigramofcontrollingthetrafficlights
2.2自适应倒计时器硬件电路
“自适应倒计时器”能根据对红、黄、绿三色信号灯的控制信号,实时地对红、黄、绿3种色灯的点亮时间进行倒计时并驱动“倒计时时间数字显示部分”,以便行人和汽车司机能意识到当前红、黄、绿灯地实际点亮状态,以及距离下一个色灯状态变换时刻的确切时间,为下一个正确的行为或操作提前做好思想准备,这样能够提高交叉路口的交通效率和交通安全性。
自适应倒计时器硬件电路图如图2所示:
图2自适应倒计时器电路图
Fig.2Thecircuitdigramoftheimplementwhichcanadapt
tomovebackwardandreckonbytimebyitself
由图2可知,自适应倒计时器以AT89C52为核心。
微控制器芯片AT89C52的输入信号为红、黄、绿三色灯信号,由交通信号灯控制电路提供,它们是3个矩形脉冲信号,在不同的时间段内,这3个矩形脉冲信号的周期是不同的。
微控制器芯片AT89C52根据接受到的红、黄、绿三色灯信号,在其内部进行一系列的处理后,由AT89C52的P0口和P2口输出信号给“倒计时时间数字显示部分”,并由二极管显示模块用数字的形式显示倒计时时间。
“倒计时时间数字显示部分”由驱动器和发光二极管阵列显示模块组成,驱动器就是8位总线缓冲器/驱动器芯片74LS245,共有两片。
发光二极管阵列显示模块由若干个双色发光二极管组成,每个双色发光二极管是一个像素点,能显示红、黄、绿3种颜色。
3系统软件设计
3.1交通信号灯控制电路的软件设计
交通信号灯控制电路的软件设计目的是结合图1所示的硬件电路,实现如表1所示的城市道路十字交叉路口交通信号灯控制方案,根据交通常识,可列出十字交叉路口交通信号灯的状态变换关系为:
主绿支红30s→主黄支红5s→主红支绿20s→主红支黄5s→主绿支红30s。
任务0:
系统初始化任务。
首先将6个信号灯全部熄灭,然后启动任务1,最后自我删除任务0,这样可以保证系统初始化任务0只在系统复位时运行一次。
任务1:
按照时间原则控制信号灯任务。
控制系统处于某一状态,然后调用操作系统函数os_wait(K_IVL,ticks)实现精确定时,使得系统在这一状态下停留特定的时间,再控制系统处于下一个状态,调用操作系统函数os_wait(K_IVL,ticks)实现精确定时,使得系统在这一状态下也停留特定得时间。
采用这样的方法就可方便地实现信号灯的状态变换。
且任务1是一个无限循环,在操作系统调度程序的控制下按照时间片轮循的方式被执行。
3.2自适应倒计时器的软件设计
一般来说,交叉路口的信号灯在一天不同的时段有不同的向位和放行表。
所谓向位是指交叉路口所有的红、黄、绿信号灯在某一时刻亮灭状态的一种组合,一般每一个向位的运行时间为几十秒钟。
而放行表是指在某个时间段内所有的向位运行的时间顺序表,每一个放行表的运行时间一般为几个小时。
这就要求自适应倒计时器实时地跟踪红、黄、绿灯被分别点亮地状态,并对其被点亮地时间进行倒计时和显示。
但是,在一些特定地时段,如夜深人静时,要求交叉路口地信号灯进入黄闪状态,这时则要求自适应倒计时器能控制数码显示器熄灭而进入消隐状态。
另外,在某些特定的时段,如重要人物的车队要通过交叉路口时,要求交叉路口某个方向上的信号灯进入常绿状态,这时也要求自适应倒计时器能控制数码显示器熄灭而进入消隐状态。
总之,对自适应倒计时器的设计要求是,在正常情况下,能分别测量红、黄、绿三色信号灯的被点亮时间,并按秒进行倒计时和显示倒计时时间,而且一般来说,在一天不同时间段内,红、黄、绿三色信号灯的被点亮时间是不同的。
在非正常情况下(如信号灯处于黄闪状态或常绿状态),则要求能够消隐数码显示器。
由上面的分析可知,这是一种实时性要求很强的嵌入式微控制器应用。
微控制器需要及时地判断出红、黄、绿三色信号灯地状态变化时刻;需要不断地测量红、黄、绿三色信号灯地被点亮时间;需要对信号灯的被点亮时间按秒进行倒计时;需要控制数码显示器完成倒计时时间的显示,并使得数码显示器的显示颜色与信号灯的颜色同步;需要微控制器能分辨出信号灯的正常状态和非正常状态,并实时地做出不同的响应。
RTX51嵌入式实时操作系统能够满足自适应倒计时器的系统软件设计的要求。
根据对系统功能的分析,可将用户程序分解为7个任务,具体情况如下:
任务0:
系统初始化;分别测量红、黄、绿三色信号灯地被点亮时间;启动任务1~6并最后删除任务0。
任务1:
检测信号色灯的状态改变时刻,从而根据红、黄、绿色灯状态的改变分别向任务2~4发送触发信号。
任务2:
等待触发信号。
若SIGNAL被置位,则将红色灯的点亮时间设置为倒计时器的计时初始值。
任务3:
等待触发信号。
若SIGNAL被置位,则将黄色灯的点亮时间设置为倒计时器的计时初始值。
任务4:
等待触发信号。
若SIGNAL被置位,则将绿色灯的点亮时间设置为倒计时器的计时初始值。
任务5:
每秒减1计数器。
正常情况下只完成每秒钟减1的功能,非正常情况下消隐数码显示器并启动任务0,最后自我删除任务5,实现自适应功能。
任务6:
每隔10ms刷新一次显示器,实现两位彩色LED数码管动态扫描频率100Hz,并做到LED数码管显示的颜色与信号灯的颜色同步,程序做到了消隐无效数字0。
4系统源程序清单
4.1交通信号灯控制电路的微控制器源程序
采用C51高级语言编程,程序由两个部分所组成,其一是用户应用程序Traffic3.c,其二是嵌入式实时操作系统内核程序Rtx51tny.a51和Conf_tny.a51。
1.用户应用程序Traffic3.c
用C51高级语言写成的用户应用程序Traffic3.c如下:
/*------------------------------------------------------------------------程序功能:
循环点亮红、黄、绿灯;主干道通行30s,次干道通行20s,黄灯点亮5s。
------------------------------------------------------------------------------------*/
#include
#include
sbitmain_red=P0^0;
sbitmain_yellow=P0^1;
sbitmain_green=P0^2;
sbitbranch_red=P0^5;
sbitbranch_yellow=P0^6;
sbitbranch_green=P0^7;
/*******************************************/
/*Task0’init’:
initialize
/*******************************************/
voidinit(void)_task_0
{
main_red=1;
main_yellow=1;
main_green=1;
branch_red=1;
branch_yellow=1;
branch_green=1;
os_create_task
(1);
os_create_task(0);
}
/*******************************************/
/*Task1’ledcontrol’
/*******************************************/
voidledcontrol(void)_task_1
{
while
(1)
{
main_red=0;
main_yellow=1;
main_green=1;
branch_red=1;
branch_yellow=1;
branch_green=0;
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
main_red=0;
main_yellow=1;
main_green=1;
branch_red=1;
branch_yellow=0;
branch_green=1;
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
main_red=1;
main_yellow=1;
main_green=0;
branch_red=0;
branch_yellow=1;
branch_green=1;
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
main_red=1;
main_yellow=0;
main_green=1;
branch_red=0;
branch_yellow=1;
branch_green=1;
os_wait2(K_IVL,250);
os_wait2(K_IVL,250);
}
}
2.实时操作系统RTX51Tiny内核程序
RTX51Tiny内核程序由文件Conf_tny.a51和Rtx51tny.a51组成。
前者是一个配置文件,用来定义系统运行所需要的全局变量和堆栈出错时要执行的宏STACK_ERROR,这些全局变量和宏,用户可以根据自己系统的配置而灵活修改,配置文件比较简单。
后者是RTX51Tiny内核的主要部分,完成系统调用的所有函数,源程序文件Rtx51tny.a51比较复杂。
RTX51Tiny内核程序代码用汇编语言写成,可读性差,但代码效率较高。
内核程序文件Conf_tny.a51的源代码如下:
;-------------------------------------------------------------------------------------------------------------
;Thisfileispartofthe‘RTX-51tiny’Real-TimeOperatingSystemPackage
;CopyrightKEILELEKTRONIKGmbH1991
;-------------------------------------------------------------------------------------------------------------
;CONF_TNY.A51:
Thiscodeallowstheconfigurationofthe‘RTX-51tiny’Real-TimeOperatingSystem
;
;TotranslatethisfileuseA51withthefollowinginvocation:
;
;A51CONF_TNY.A51
;
;TolinkthemodifiedCONF_TNY.OBJfiletoyourapplicationusethefollowing
;BL51invocation:
;BL51
;--------------------------------------------------------------------------------------------------------------
;‘RTX-51tiny’Hardware-Timer
;================================================================
;WiththefollowingEQUstatementstheinitializationofthe‘RTX-51tiny’
;Hardware-Timercanbedefined(‘RTX-51tiny’usesthe8051Timer0forcontrolling
;RTX-51softwaretimers).
;
;definetheregisterbankusedforthetimerinterrupt.
INT_REGBANKEQU1;defaultisRegister-bank1
;defineHardware-TimerOverflowin8051machinecycles.
INT_CLOCKEQU10000;defaultis9216cycles(fosc=12MHz)
;defineRound-RobinTimeoutinHardware-TimerTicks.
TIMESHARINGEQU5;defaultis5ticks.
;note:
Round-Robincanbedisabledbyusingvalue0.
;Note:
Round-RobinTaskSwitchingcanbedisabledbyusing‘0’asvaluefortheTIMESHARINGequate.
;-------------------------------------------------------------------------------------------------------------
;‘RTX-51tiny’StackSpace
;===================================
;ThefollowingEQUstatementsdifinesthesizeoftheintermalRAMusedforstackarea
andtheminimumfreespaceonthestack.Amacrodifinesthecodeexecutedwhenthe
stackspaceisexhausted.
;
;definethehighestRAMaddressusedforCPUstack
RAMTOPEQU0FFH;defaultisaddress(256-1)
FREE_STACKEQU20;defaultis20bytesfreespaceonstack
STACK_ERRORMACRO
CLREA;defaultinterrupts
SJMP$;endlessloopifstackspaceisexhausted
ENDM
;-------------------------------------------------------------------------------------------------------------
NAME?
RTX51_TINY_CONFIG
PUBLIC?
RTX_REGISTERBANK,?
RTX_TIMESHARING,?
RTX_RAMTOP,
?
RTX_CLOCK
PUBLIC?
RTX_ROBINTIME,?
RTX_SAVEACC,?
RTX_SAVEPSW
PUBLIC?
RTX_FREESTACK,?
RTX_STACKERROR,?
RTX_CURRENTTASK
?
RTX_TIMESHARINGEQU-TIMESHARING
?
RTX_RAMTOPEQURAMTOP
?
RTX_FREESTACKEQUFREESTACK
?
RTX_CLOCKEQU-INT_CLOCK
?
RTX_REGISTERBANKEQUINT_REGBANK*8
DSEGAT?
RTX_REGISTERBANK
DS2;temporaryspace
?
RTX_SAVEACC:
DS1
?
RTX_SAVEPSW:
DS1
?
RTX_ROBINTIME:
DS1
?
RTX_CURRENTTASK:
DS1
?
RTX?
CODESEGMENTCODE
RSEG?
RTX?
CODE
?
RTX_STACKERROR:
STACK_ERROR
END
内核程序文件Rtx51tny.a51的源代码如下:
#include
#include
#defineRECEIVE1//任务标识号ID的定义
#defineTRANSMIT2
#defineWATCH_DOG3
/***********************************
任务0:
系统初始化,启动其他的任务
***********************************/
voidinitial(void)_task_0
{
intitialization();//初始化系统
os_create_task(RECEIVE);//启动接收任务
os_create_task(TRANSMIT);//启动发送任务
os_create_task(WATCH_DOG);//启动喂看门狗任务
os_create_task(0);//删除任务0
}
/**********************************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通 信号灯 控制系统 完整 C51 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)