任务5.3交通灯_第1页
任务5.3交通灯_第2页
任务5.3交通灯_第3页
任务5.3交通灯_第4页
任务5.3交通灯_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5.2 模拟交通灯任务三 交通灯的模拟控制5.3.1 任务要求红绿交通灯安装在各个路口上,已经成为疏导交通车辆最有效和最常见的手段。本节的任务是利用单片机控制开发板上的6个LED,模拟实现交通灯的简单控制。通过编写交通灯控制程序,加深状态机的理解。任务要求如下:A:放行线:绿灯亮放行27秒,黄灯闪烁警告3秒,然后红灯亮禁行。B:禁行线:红灯亮30秒禁止通行,然后绿灯亮放行。设计能控制东、南、西、北四个路口的黄红绿信号灯正常工作,当东西方向放行时,南北方向禁行,反之亦然。同时用2位数码管显示倒计时。5.3.2 知识准备1、交通灯的状态切换南北两个方向的交通灯控制方式相同,东西方向控制方式也相同。

2、我们以西和北两个方向来分析一下交通灯的切换状态,状态如下:状态1:西方向绿灯亮,北方向红灯亮,持续27秒钟。状态2:西方向黄灯闪烁,北方向红灯亮,持续3秒钟。状态3:西方向红灯亮,北方向绿灯亮,持续27秒。状态4:西方向红灯亮,北方向黄灯闪烁,持续3秒钟。整个过程从状态1到状态4,状态4执行完后又重新回到状态1中,在程序中我们用状态机来切换状态。另外数码管要显示当前状态剩余的时间。2、交通灯硬件电路开发板上只有西和北两个方向的交通灯,共6只LED,分别为红、绿、黄。另外开发板上6位数码管的前两位和后两位来显示倒计时,其中前两位用来显示西方向的倒计时,后两位用来显示北方向的倒计时,中间两位不用。

3、交通灯的电路如图5.3.1所示。 图5.3.1 交通灯电路图5.3.3 任务实施模拟交通灯的程序中任务较多,采用模块化,模块化后文档结构如图5.3.2所示。 图 5.3.2 交通灯文档结构图在文档结构图中,除了主函数,在HardWare文件夹中有3个功能模块,分别是定时器模块,交通都能控制模块Traffic,数码管显示模块Seg7Display,以及宏定义模块。定时器模块提供1ms时标信号,数码管显示模块负责对4位数码管的扫描,和之前的一样,不再重复。先来分析一下主函数:(1) Main.c#include<reg52.h>#include"microDefine.h&q

4、uot;#include"Timer0.h"#include"Traffic.h"#include"Seg7Display.h" /*函数名称:main()*功能 :完成模拟交通灯的各个人物*入口参数:无*出口参数:无*说明 :*/void main(void) uint Cnt1Ms=0; /1ms计数变量 DelayMs(200); Timer0Init(); /定时器0初始化 TrafficInit(); /交通灯状态初始化 while(1) if(FlagSystem1Ms=1) FlagSystem1Ms=0; Seg7Di

5、splay(); /每隔1ms,扫描一次数码管 if(+Cnt1Ms>=500) /每隔500ms,执行1次交通灯函数 Cnt1Ms=0; TrafficLedRun(); /交通灯控制 NumToBuffer(); /待显示值送入显示缓冲区 程序解释:系统上电后,首先完成定时器的初始化和交通灯状态的初始化。在大循环中,每间隔1ms,扫描一次数码管。每间隔500ms,运行一次交通灯控制程序。(2) 交通灯控制模块TrafficLedRun.h#ifndef _TRAFFIC_H#define _TRAFFIC_H#include<reg52.h>#include "

6、MicroDefine.h"#include "Seg7Display.h"/6个LED的接口定义sbit WestRed=P30;sbit WestGreen=P31;sbit WestYellow=P32;sbit NorthRed=P33;sbit NorthGreen=P34;sbit NorthYellow=P35;/接口宏定义,便于移植#define NorthRedOn NorthRed=0#define NorthRedOff NorthRed=1#define NorthGreenOn NorthGreen=0#define NorthGreen

7、Off NorthGreen=1#define NorthYellowOn NorthYellow=0#define NorthYellowOff NorthYellow=1 #define WestRedOn WestRed=0#define WestRedOff WestRed=1#define WestGreenOn WestGreen=0#define WestGreenOff WestGreen=1#define WestYellowOn WestYellow=0 #define WestYellowOff WestYellow=1 /函数声明extern void NumToBuf

8、fer(); /缓冲区数据更新extern void TrafficInit(); /交通灯状态初始化extern void TrafficLedRun(); /交通灯状态切换#endif在头文件中,完成了交通灯中的6个LED的接口定义,另外声明了3个函数。TrafficLedRun.c:#include"Traffic.h"uchar WestNum=0; /西向数码管计数变量uchar NorthNum=0; /北向数码管技术变量/*函数名称:NumToBuffer()*功能 :待显示值传递给显示缓冲区*入口参数:待显示值*出口参数:无*说明 :*/void NumTo

9、Buffer()DispBuffer0=WestNum/10; DispBuffer1=WestNum%10; DispBuffer2=NorthNum/10; DispBuffer3=NorthNum%10; /*函数名称:Traffic_Init()*功能 :交通灯状态初始化*入口参数:无*出口参数:无*说明 :*/void TrafficInit() WestNum=27; /西向数码管初始值 NorthNum=30; /北向数码管初始值 WestGreenOn;WestRedOff;WestYellowOff; /西向绿灯亮 NorthGreenOff;NorthRedOn;North

10、YellowOff; /北向红灯亮/*函数名称:TrafficLed()*功能 :交通灯状态切换*入口参数:无*出口参数:无*说明 :用状态机实现,每隔500ms扫描一次状态*/void TrafficLedRun() static uchar TrafficState=0; /交通灯状态机 static uchar Cnt500Ms=0; /500ms计数器 static uchar Cnt500Ms=0; /500ms计数器 static uchar Cnt1000Ms=0; /1000ms计数器 static bit Seg7TwinkleOn=0; /数码管闪烁标志 switch(Tr

11、afficState) case 0: /西向绿灯亮,北向红灯亮 if(+Cnt500Ms>=2) /1s,倒计数减1 Cnt500Ms=0; WestNum-; NorthNum-; if(+Cnt1000Ms>=27) /27s后,切换到下一状态 Cnt1000Ms=0; TrafficState=1; WestNum=3; WestGreenOff;WestRedOff;WestYellowOn; /西向黄灯亮 NorthGreenOff;NorthRedOn;NorthYellowOff; /北向红灯亮 break; case 1: /西向黄灯闪烁 Seg7TwinkleO

12、n=!Seg7TwinkleOn; /黄灯闪烁 if(Seg7TwinkleOn) WestYellowOff; else WestYellowOn; if(+Cnt500Ms>=2) /1秒到 Cnt500Ms=0; WestNum-; /倒计时减1 NorthNum-; if(+Cnt1000Ms>=3) /3秒到 Cnt1000Ms=0;TrafficState=2; /切换到下一状态 WestNum=30; /倒计时重新赋初值 NorthNum=27; WestGreenOff;WestRedOn;WestYellowOff; /西向绿灯亮 NorthGreenOn;Nor

13、thRedOff;NorthYellowOff; /北向红灯亮 break; case 2: if(+Cnt500Ms>=2) Cnt500Ms=0; WestNum-; NorthNum-; if(+Cnt1000Ms>=27) Cnt1000Ms=0; TrafficState=3; NorthNum=3; WestGreenOff;WestRedOn;WestYellowOff; /西向红灯亮 NorthGreenOff;NorthRedOff;NorthYellowOn; /北向黄灯亮 break; case 3: /北向黄灯闪烁 Seg7TwinkleOn=!Seg7TwinkleOn; if(Seg7TwinkleOn) /黄灯闪烁 NorthYellowOff; else NotrthYellowOn; /1秒到,倒计时减1 if(+Cnt500Ms>=2) Cnt500Ms=0; WestNum-; NorthNum-; if(+Cnt1000Ms>=3) /3秒到 Cnt1000Ms=0; TrafficState=0; /跳到下一状态 WestNum=27; /倒计时重新赋初值 NorthNum=30; WestGreenOn;WestRedOff;WestYellowOff; /西向绿灯亮 NorthGree

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论