1、1 基于 AT89S52 单片机的交通灯控制系统设计 1、 项目概述 随着我国经济的高速发展 ,私家车、公交车的增加 ,无疑会给我国交通系统带来沉重的压力 ,很多大城市都不同程度地受到交通阻塞问题的困扰。 交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。 下面以 AT89S52 单片机为核心,设计出以人性化、智能化为目的的交通信号灯控制系统。 2、 项目要求 用 AT89S52 单片机控制一个交通信号灯系统,晶振采用 12MHZ。 设 A 车道与 B 车道交叉组成十字路口, A 是主道, B 是支道。设计 要求如下: 用发光二极管模拟交通信号灯
2、,用按键开关模拟车辆检测信号。正常情况下,A、 B 两车道轮流放行, A 车道放行 50s,其中 5s 用于警告; B 车道放行 30s,其中 5s 用于警告。交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。在 B 车道放行期间,若 A 车道有车而 B 车道无车,按下开关 K1 使 A 车道放行 15s;在 A 车道放行期间,若 B 车道有车而 A 车道无车,按下开关 K1 使 B 车道放行 15s。有紧急车辆通过时,按下 K2 开关使 A、 B 车道均为红灯,禁行 20s。 3、 系统设计 3、 1框图设计 总体设计框图如图 1 所示: 图 1 系统
3、整体设计方框图 3、 2知识点 交通控制系统主要控制 A、 B 两车道的交通,以 AT89S52 单片机为核心芯片,通过控制三色 LED 的亮灭来控制各车道的通行;另外通过 2 个按键来模拟各车道有无车辆的情况和有紧急车辆的情况。根据设计要求,制定总体设计思想AT89S52 单片机 复位电路 晶振电路 按键电路 七段数码管倒计 时显示电路 A、 B 车道 LED 显示电路 2 如下: ( 1) 正常情况下运行主程序,采用 0.5S 延时子程序的反复调用来实现各种定时时间。 ( 2) 一道有车而另一道无车时,采用外部中断 1 执行中断服务程序,并设置中断 为低优先级中断。 ( 3) 有紧急车辆通
4、过时,采用外部中断 0 执行中断服务程序,并设置中断为高优先级中断,实现二级中断嵌套。 该电路具有电路简单,设计方便,显示亮度高,耗电较少,也非常的可靠等点。 4、硬件设计 4.1 电路原理图 ( 1)时钟电路模块 时钟电路由一个晶体振荡器 12MHZ 和两个 30pF 的瓷片电容组成。时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地工作。其电路 如图 2 所示: 图 2 时钟电路模块 ( 2)复位电路模块 复位电路是使单片机的 CPU 或系统中的其他
5、部件处于某一确定的初始状态,并从这状态开始工作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以重新启动。本设计采用的是按键复位电路。其电路如图 3所示: 3 图 3 复位电路 ( 3)主控 制系统模块 主控制器采用 AT89S52,是 ATMEL 公司生产的一款性能稳定的 8 位单片机。AT89S52 具有 1 个 8KB 的 FLASH 程序存储器, 1个 512 字节的 RAM, 4 个 8位的双向可位寻址 I/O 端口, 3个 16 位定时 /计数器及 1 个串行口和 6 个向量二级中断结构。 单片机的 P0 口分别用于控制南
6、北及东西的通行灯, P2口和 P34-P37 口用于 4 组 4位 LED 计时器的控制,紧急车辆通行时使用外中断 0( P32)和外中断1(P33),进行手动按键,即可转换。其主控电路如图 4所示: 图 4 主控制系统模块 ( 4)交通灯输出控制模块 道口交通灯指示采用高亮度红、黄、绿发光二极管进行提示。其图如图 5所示 : 4 图 5 LED 显示模块 当 R=220 欧时,按公式 A=(5-1.8)/R 计算,电路中的电流大小应为A=14.545mA.由于每个路口的通行双向指示处理相同,因此每个端口应具有 3A的吸收电流能力。 ( 5)时间显示电路模块 道口通行剩余时间采用高亮红色 7段
7、 LED 发光数码管显示,采用共阳数码管,如用单片机吸收电流驱动,列扫描 驱动使用三极管,按每段 6mA 电流计算,全显示字形“ 8”时,每个数码需 6mA*8=48mA,由于时间显示每个道口相同,共需要电流 192mA,因此设计中也采用了中功率三极管 8550.其显示电路如图 6所示: 图 6 数码管显示模块 5 ( 6)紧急通车电路模块 为了实现此功能,利用单片机中断达到目的。利用一个手动按钮开关接至单片机外部中断 0,同时在软件设计时将其设定为最高优先级,当其按下时,四方全为红灯,同时将中断位置的 PSW、 ACC 进栈保护,当其计时完了之后,回到原来的位置进行执行。再利用一个 手动按钮
8、接至单片机外部中断 1 当其按下时,如果是东西道是红灯,而南北道是绿灯,则将其置为东西是绿灯,南北是红灯;如果是东西道是绿灯,而南北道是红灯,则将其置为东西是红灯,南北是绿灯。两种情况都是执行完后,回到断点处继续执行。其电路如图 7 所示: 图 7 按键控制电路 ( 7) 总原理图 如图 8所示 图 8 总的原理图 6 4、 2元件清单 如下表所示: 元件名称 型号 数量 /个 用途 单片机 AT89S52 1 控制核心 晶振 12MHZ 1 晶振电路 电容 30pF 2 晶振电路 电解电容 10uF 1 复位电路 电阻 5.1K 1 复位电路 发光二极管 LED 12 红、黄、绿灯 集成块
9、74LS08 1 按键电路 电阻 220 13 LED 限流 电阻 470 8 数码管电路 电阻 1K 7 数码管驱动、按键电路 四位共阳数码管 GC-3461BS 1 显示电路 微动开关 3 按键电路 三级管 PNP 8550 4 数码管驱动电路 5、软件设计 主程序采用查询方式定时,调用 0.5S 延时子程序的次数,从而获取交通灯的各种时间。子程序采用定时器 1 方式 1 查询式定时,定时器定时 50ms,确定50ms 循环 20 次,从而获得 1S 的延时时间。 有车车道的放行的中断服务程序首先要保护现场,因而需用到延时子程序,子程序采用定时器 0 方式 1 查询式定时,定时器定时 50
10、ms,确定 50ms 循环 20次,从而获得 1S 的延时时间,保护现场时还需关中断,以防止高优先级中断(紧急车辆通过所产生的中断)出现导致程序混乱。 开中断,由软件查询外中断 1,判别哪一道有车,再根据查询情况执行相应的服务。待交通灯信号出现后,保持 15S 的延时,然后,关中断,恢复现场,再开中断返回主程序。 紧急车辆出现时 的中断服务程序也需要保护现场,但无须关中断(因其为高优先级中断),然后执行相应的服务,待交通灯信号出现后延时 20S,确保紧急车辆通过交叉路口,然后,恢复现场,返回主程序。 5.1 软件流程图 7 主程序 有车车道放行时的中断服务程序(外中断 1) 紧急情况时的中断服
11、务程序(外中断 0) 中断响应 保护现场 A 红灯、 B 红灯 延时 20S 恢复现场 返回 初始化 开始 A 绿灯、 B 红灯 延 时 45S A 黄灯、 B 红灯 延时 5S A 红灯、 B 绿灯灯 延时 25S A 红灯、 B 黄灯 延时 5S 关中断 保护现场 开中断 A 绿灯、 B 红灯 A 红灯、 B 绿灯 延时 15S 关中断 恢复现场 开中断 中断响应 A 道有车吗 B 道有车吗 返回 8 5、 2程序清单 #include #define uchar unsigned char #define uint unsigned int #define time 50000 #def
12、ine on 0 #define off 1 sbit RED_ZHU = P00; /南北 红灯 sbit YELLOW_ZHU = P01;/南北 黄灯 sbit GREEN_ZHU = P02; /南北 绿灯 sbit RED_ZHI = P03; /东西 红灯 sbit YELLOW_ZHI = P04; /东西 黄灯 sbit GREEN_ZHI = P05; /东西 绿灯 sbit P23 = P34; sbit P22 = P35; /东西方向数码管位选 sbit P21 = P36; sbit P20 = P37; /南北方向数码管位选 sbit int0_key = P32;
13、 sbit int1_key = P33; void display1(uchar,uchar); void display2(uchar,uchar); void delayms(uint k); uchar temp1,temp2,temp3,temp4,temp5,temp6; /*=倒计时 =*/ uchar N = 50,Y = 45,Z = 50,M = 75,G = 80,U =80; uchar C50ms,t0; 9 uchar seg = 1; uchar flag=0,led_data_temp; void InitialT1(void) TMOD = 0x11; /定时
14、器 0,1 工作在方式 1 TH1 = (65536 - time)/256; /相 当于 (65536-time)/256; TL1 = (65536 - time)%256;/初值为 time(50ms) TR1 = 1;/开定时器 1 中断 ET1 = 1;/允许定时器 1中断 ET0 = 1; TH0 = (65536 - time)/256; TL0 = (65536 - time)%256; EX0 = 1; /允许外部中断 0 IE0 = 1;/启动外部中断 0 PX0 = 1; EX1=1; IE1=1; EA = 1; /开总中断 void int0(void) interr
15、upt 0 /外中断 0 flag = 0; led_data_temp = P0; t0 = 20; if(!int0_key) 10 delayms(10); if(!int0_key) while(!int0_key); TH0 = (65536 - time)/256; TL0 = (65536 - time)%256; TR1 = 0; TR0 = 1; EX0 = 0; EX1 = 0; C50ms = 0; void int1(void) interrupt 2 /外部中断 1 t0=15; flag = 1; led_data_temp = P0; if(RED_ZHU = 0) GREEN_ZHU = 0; RED_ZHI = 0; else /if(RED_ZHI = 0)&(GREEN_ZHU = 0)