1、 四川师范大学成都学院电子工程系课程设计报告前言随着经济发展,汽车保有量急剧增加,城市道路日渐拥挤,交通拥塞已成为一个城市管理的难题。为了缓解这一难题交通信号灯出现于道路平面交叉路口,通过对车辆、行人发出行进或停止的指令,使人与人、车与车之间尽可能减少相互干扰,从而提高路口的通行能力,保障路口畅通和安全。因此十字路口的红绿灯就成为了指挥着行人和车辆的安全通过的一种方式,实现红绿灯自动指挥也就成为城市管理自动化的重要课题。围绕这一课题,多年来有众多设计方案来实现这一功能,随着数字技术、软件编程的发展和进步,实现这一功能的新的设计方案更是层出不穷。就目前而言,在这一方面,比较普遍使用而技术又先进的
2、主要是以CPLD和MCU为核心的实现方案。然而本次课程设计将通过C/OS-II软件编程实现十字路口交通信号灯控制系统,该系统采用了以8051为内核的单片机芯片AT89s51作为核心控制器,以嵌入式操作系统RTX51为软件开发平台,通过用红、绿、黄三种颜色作为交通控制信号,分别指示主道和支道的通行状态,来控制城市十字路口的交通。该系统具有制作简单、成本低、功能实用等特点。 1. 设计要求本次设计用红、绿、黄三种颜色作为交通信号控制,分别指示主道和支道的通行状态实现十字路口的红绿灯控制。 在相应信号灯字母的下方,用数字表示该信号灯切换的剩余时间。该时间每秒钟减一,减为零时,切换信号灯。信号灯切换时
3、间缺省为 60 秒。某方向由红灯切换为绿灯时,应有5秒钟的缓冲时间,以确保另一方向的车辆安全通过。即在切换信号灯时,有5秒钟的时间两个方向的信号灯都是红灯。不能出现两个方向都是绿灯的情况。 用户可通过键盘输入信号灯切换时间,切换时间范围为20秒至120秒之间。用户输入的数字以回车键结束。对于错误的输入,系统可不作任何响应。对于正确的输入,下次信号灯切换后,采用新输入的切换时间。2 . 设计原理 2.1 显示模块 2.1.1 电路的显示模块 电路的显示模块可分为三部分,因为有三种显示部分,红绿灯显示、人行横道显示、时间显示,红绿灯显示器是最简单的一种电路连接方式,它有三种颜色的发光二极管,每种颜
4、色的有 7 个二极管并连接起来,假如每个发光二极管的电流为10mA,所以一种发光颜色的电流为70mA,电路的并联虽然会产生较大的电流,但他所需要电压低,小电压就能驱动起来,如果7个二极管都串联所需电流比较低但所需总电压高,假如每个二极管的导通压降为1.5V,那么一种颜色发光所需要10.5V 电压来驱动,这样很有可能损坏二极管,并且串联的二极管如果有一支损坏就都不会点亮导致工作的可靠性不高,因此采用并联。见图 2.1 图 2.1 红绿灯显示2.1.2 人行横道显示 人行横道显示部分是比较复杂的一个设计了,它不像红绿灯一样只要三种状态显示就行,它需要动态人行走动显示,但单片机只提供了三种状态输出,
5、所以我们的人行横道显示必须进行电路的设计。我采用的是二极管隔离显示,采用 13 个二极管隔离,以完成目的。人行横道人行走路显示为绿色灯显示,暂停为红色灯显示。见图 2.2: 图 2.2 人行横道原理图2.1.3 时间显示 CD4511是七段码十六进制锁存译码驱动芯片,它能将四位二进制数编码转换为七段LED显示器的字段码,同时具有锁存和驱动能力。CD4511有四个输入端,ABCD-BCD 码输入端,LE锁存允许端。当LE锁存允许端为0 时,4 位BCD码进入锁存器,当LE锁存允许端为1时,输入的数据被锁存。CD4511的输出接七段数码显示器,七段数码显示器是共阴极。见图 2.3 图 2.3 时间
6、显示电路2.1.4 电源部分 本实验采用直流稳压电源。如图2.4所示。电源变压器是将交流电网220V的电压变为所需要的电压值。交流电经过二极管整流之后,方向单一了,但是电流强度大小还是处在不断地变化之中。这种脉动直流一般是不能直接用来给集成电路供电的,而要通过整流电路将交流电变成直流电压。由于此脉动的直流电压还含有较大的纹波,必须通过滤波电路加以滤除,从而得到平滑的直流电压。滤波的任务,就是把整流器输出电压中的波动成分尽可能地减小,改造成接近稳恒的直流电。但这样的电压还随电网电压波动,一般有10%左右的波动,负载和温度的变化而变化,因而在整流、滤波电路之后,还需要接稳压电路。稳压电路的作用是当
7、电网电压波动,负载和温度变化时,维持输出直流电压稳定。220V交流电通过9V变压器变为9V的交流电,9V交流电通过四个二极管的全桥整流后变为9V直流电,然后经过电解电容(10F)进行一级滤波,以去除直流电里面的杂波,防止干扰。9V直流电出来后再经过三端稳压器LM7805稳压成为稳定的5V电源,其中7805的Vin脚是输入脚,接9V直流电源正极,GND是接地脚,接9V直流电源负极,Vout为输出脚,它和接地脚的电压就是+5V了。5V电源出来再经过电解电容的二级滤波,使5V电源更加稳定可靠。同时在5V稳压电源加上一个10K的电阻和一个红色发光二极管,当上电后,发光二极管点亮,表示电源工作正常。 图
8、2.4 3.3V与2.5V电源输出2.2 LED 2.2.1 LED灯具的优点LED 照明灯具在近期得到飞跃的发展,LED 作为绿色环保的清洁光源得到广泛的认可。LED 光源使用寿命长、节能省电、应用简单方便、使用成本低,因而在LED 手电筒、LED 矿灯及便携照明;在建筑照明、装饰照明、标识牌照明;在汽车的仪表板背光、前后雾灯、第三刹车灯、方向灯、尾灯.。 LED 高节能:节能能源无污染即为环保。直流驱动,超低功耗(单管0.03瓦-1 瓦)电光功率转换接近100%,相同照明效果比传统光源节能80%以上。LED 利环保:LED 是一种绿色光源,环保效益更佳。光谱中没有紫外线和红外线,热量低和无
9、频闪,无辐射,而且废弃物可回收,没有污染不含汞元素,冷光源,可以安全触摸,属于典型的绿色照明光源。 2.2.2 LED灯具驱动原理LED灯具驱动需要先将高压的交流电变换成低压的交流电(AC/AC),然后将低压的交流电经桥式整流变换成低压的直流电(AC/DC),再通过高效率的DC/DC 开关稳压器降压和变换成恒流源,输出恒定的电流驱动LED 光源。LED光源是按灯具的设计要求由小功率或大功率LED 多串多并而组成。每串的IF 电流是按所选用的LED光源IF要求设计,总的正向电压VF 是N 颗LED 的总和。LED 灯具选用36V 以下的交流电源可以考虑非隔离供电,如选用220V 和100V 的交
10、流电源应考虑隔离供电。目前 MR11、MR16 射灯、水底灯、洗墙灯、路灯、隧道灯、汽车工作灯等LED 灯具大多选用散热较好的自带铜基或铝基板的1W、3W 大功率LED 光源,使用AC/DC12-36V 电源,因而需要使用DC/DC 的降压(Buck)+ 恒流给LED提供VF 和IF。LED 灯具大多使用低压电源,因此在这类灯具的电路设计上,LED的串联个数在1-9 颗,尤以1-3 颗为常见。串联的总VF 应低于电源Vin。如三颗LED 串联,VF=3.4V X 3=10.2V。在Vin12V,能正常工作。MR11、MR16射灯常见的是1W X 3 串联或3W X 1;水底灯常见的是1W X
11、3 串联2-3 并,三个一组;洗墙灯常见的是1W X 7-9 串联;路灯常见的是1W X 9 串联3 并,4-6个一组;、汽车工作灯常见的是1W X 3-6 串联3 并。当然LED 的串并联的方案是多种多样的,串联个数与其工作电压(Vin)有关,这里就DC12-36V 工作电压而言。目前1W 的LED 光源散热较好,因此选用较多。2.2.3 LED灯具对低压驱动芯片的要求 驱动芯片的标称输入电压范围应当满足DC5-40V,以覆盖应用面的需要,耐压如能大于40V 更好;AC 12V 或24 V 输入时简单的桥式整流器输出电压会随电网电压波动,特别是电压偏高时输出直流电压也会偏高,驱动IC 如不能
12、适应宽电压范围,往往在电网电压升高时会被击穿,LED 光源也因此被烧毁。 驱动芯片的标称输出电流要求大于1.2-1.5A,作为照明用的LED 光源,1W功率的LED 光源其标称工作电流为350mA,3W 功率的LED 光源其标称工作电流为700mA,功率大的需要更大的电流,因此LED 照明灯具选用的驱动IC 必需有足够的电流输出,设计产品时必需使驱动IC 工作在满负输出的70-90%的最佳工作区域。使用满负输出电流的驱动IC 在灯具狭小空间散热不畅,容易疲劳和早期失效。 驱动芯片的输出电流必需长久恒定,LED 光源才能稳定发光,亮度不会闪烁;同一批驱动芯片在同等条件下使用,其输出电流大小要尽可
13、能一致,也就是离散性要小,这样在大批量自动化生产线上生产才能有效和有序;对于输出电流有一定离散性的驱动芯片必选在出厂或投入生产线前分档,调整PCB 板上电流设定电阻(Rs)的阻值大小,使之生产的LED 灯具恒流驱动板对同类LED 光源的发光亮度一致,保持最终产品的一致性。2.3系统设计 2.3.1 设计方案 东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯,指挥车辆和行人安全通行。红灯亮禁止通行,绿灯亮允许通行。黄灯亮提示人们注意红、绿灯的状态即将切换,且黄灯燃亮时间为东西、南北两干道的公共停车时间。设东西道比南北道的车流量大,指示灯燃亮的方案如下表60S5S60S5S东西
14、道红灯亮黄灯亮绿灯亮黄灯亮南北道绿灯亮黄灯亮红灯亮黄灯亮表1 指示灯燃亮的方案(1)当东西方向为红灯、南北道为绿灯;东西干道车辆、行人禁止通行,南北干道车辆、行人通行。时间为60秒。(2)黄灯闪烁5秒,警示车辆和行人红、绿灯的状态即将切换。(3)当东西方向为绿灯,南北方向为红灯;东西干道车辆、行人通行;南北道车辆行人禁止通过。时间60秒。 东西方向车流量大通行时间长。(4)这样如上表的时间和红、绿、黄出现的顺序依次出现这样行人和车辆就能安全畅通的通行。(5)此表可根据车流量动态设定红绿灯初始值。2.3.2 交通信号灯控制方案 信号灯 R Y G 主红支绿30s 1 0 0 0 0 1 主路口街
15、道 主干道 次干道 红支黄5s 1 0 0 0 1 0 主绿支红40s 0 0 1 1 0 0 主黄支红5s 0 1 0 1 0 0主干道车辆通行时间是30s,次干道为20s,红绿灯转换之间黄灯亮5s,控制三色灯的信号为开关信号,约定逻辑0表示灯灭,逻辑1表示灯亮。 这是一个非常简单的微控制器最小系统,其中,发光二极管实际为若干发光二极管组成的阵列,每个发光二极管只是一个像素点,能显示红、黄、绿三种颜色,这是因为每个发光二极管封装内包含两个发光二极管。仅当Red亮时,灯显红色,仅当Green亮时,灯显绿色,当两者同时点亮时,由混色原理可知,灯显黄色。2.3.3 C/OS-II做为操作系统内核的
16、原因 C/OS-II 是一种基于优先级的抢占式多 任务实时操作系统, 包含了实时内核、任务管理、时间管理、任务间通信同步(信号量, 邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。 C/OS-II 是一个完整的、可移植、可固化、可裁剪的占先式实 时多任务内核。C/OS-II绝大部分的代码是用ANSI的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。 至今从8位到6 4位,C/OS-II 已在超过 40 种不同架构上的微处理器上运行。C/OS-II 已经在世界
17、范围内得到广泛应用,包括很多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。实际上,C/OS-II已经通过了非常严格的测试,这说明C/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统。更重要的是C/OS-II的源码公开,便于移植和维护。3. 系统实现3.1总体工作过程 交通灯示意图如图3.1所示:在十字路口的东,南,西,北方向装有主干道“红绿黄”灯 ,人行道“红绿黄”灯,其中主干道的“红绿黄”灯又分为左转“红绿黄”灯和直行“红绿黄”灯。当南北方向绿灯亮东西方向红灯亮时表示通往南北方向的车和人直行,而通往东西方向的车和人停止,并且
18、此时在东方向的车需要到达北方向,在西方向的车需要到达南方向可以右转弯到达。如果东西方向绿灯亮南北方向红灯亮时,从南到北或者从北到南的人和车禁止通行,而通往东西方向的车和人直行,此时可以允许机动车通过左转弯从西到北或者从东到南。 图 3.1 交通灯的布置图3.2 函数说明流程图 系统服务后从main函数开始执行,C/OS-II便是在main函数中启动的,main函数调用OSInit初始化操作系统,调用OSTaskCreate创建一个初始化任务,然后调用OSStart开始系统多任务调度,C/OS-II便全部运行起来了。 Main函数流程图 初始化C/OS-II 保存DOS环境 C/OS-II中断
19、启动多任务管理Main函数源码: int main (void)intDisAll(); /* 关闭所有中断 */OSInit(); /* OS-II 初始化uC/OS-II的内核 */OSTaskCreate ( taskStart, (void *)0, &GstkStartTASK_START_STK_SIZE-1, TASK_START_PRIO ); /* 初始化启动任务 */ OSStart(); /* Start uC/OS-II 启动uC/OS-II */return(0) ;在这个系统中设计了两个任务Task1和Task2。 其中Task1的任务是接收键盘的输入,判断是否是回
20、车,回车后结束,如果接收到字母的话不做任何响应,如果是数字的话要判断是不是在20到 120之间,要是不在此区间内则清空缓冲区,接受下一次输入,如果在区间内的话,则传递给Task2,同时在屏幕上显示下一次循环的时间。如果是ESC的话则任务退出。Task2用来设置交通灯的残留时间,初始值为 60秒改变一次,当接收到Task1传来的值后,下一次循环按此值计数。 Task1 流程图 Key =enterInstall time IR Set time frequency True Digit aInitialize statistics task 20=a 120) SetTime = 120; if
21、 (key = 0x32) SetTime-; / 如果按下数字1键则将 SetTime 的全局变量减一if (SetTime 20) SetTime = 20; OSCtxSwCtr = 0; OSTimeDly(OS_TICKS_PER_SEC); / 设置 1 秒钟的时延 /* * 界面显示函数 * */Static void TaskStartDispInit (void) PC_DispStr( 0, 0, “ Traffic Lights System “, DISP_FGND_WHITE+ DISP_BGND_RED + DISP_BLINK);PC_DispStr( 0, 1,
22、 “ “ , DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 2,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE); PC_DispStr( 0, 3,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 4,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0,5,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 6,” ”, DISP_BGND_BLACK+DI
23、SP_FGND_WHITE);PC_DispStr( 0, 7,” N-S Light : ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 8,” Time Remain: (s) ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 9,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 10,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 11,” ”, DISP_BGND_BL
24、ACK+DISP_FGND_WHITE);PC_DispStr( 0, 12,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 13,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE); PC_DispStr( 0,14,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 15,”W-E Light : ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 16,” TimeRemain: (s) ”, DISP_
25、BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 17,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 18,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 19,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 20,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 21,” ”, DISP_BGND_BLACK+DISP_FGND
26、_WHITE);PC_DispStr( 0, 22,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr( 0, 23,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE); PC_DispStr( 0, 24,” ”, DISP_BGND_BLACK+DISP_FGND_WHITE);/* 初始化显示 * */static void TaskStartDisp (void) char *arr ;int arrow2 = 49,50;sprintf(arr, SetTime : %d ( %c Add, 23, %c Redu
27、ce), SetTime,arrow0,arrow1); PC_DispStr ( 0, 23, arr, DISP_BGND_BLACK+DISP_FGND_WHITE);/*创建任务 * */ Static void TaskStartDisp (void) OSTaskCreateExt(TaskClk, (void*)0, &TaskClkStkTASK_STK_SIZE-1, TASK_CLK_PRIO, TASK_CLK_ID, &TaskClkStk0, TASK_STK_SIZE, (void*)0, OS_TASK_OPT_STK_CHK OS_TASK_OPT_STK_CLR); OSTaskCreateExt (Task1, (void *) 0, &Task1StkTASK_STK_SIZE - 1, TASK_1_PRIO, TASK_1_ID, &Task1Stk0, TASK_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK OS_TASK_OPT_STK_CLR);OSTaskCreateExt(Task2, (void *)0