交通信号灯控制系统设计
一、设计目的
1、学习LED数码管的原理及编程方法。 2、学习键盘的原理及编程方法。
3、掌握51单片机定时器与中断的使用。
4、 掌握交通信号灯控制系统的原理和实现方法。
二、设计内容
设计一个交通信号灯控制系统,要求:
初始状态为两个方向的红灯全亮,时间6秒。
主干道绿灯亮,支干道红灯亮,主干道通车,时间为20秒。 主干道黄灯闪烁,支干道红灯亮,时间为6秒。
主干道红灯亮,支干道绿灯亮,支干道通车,时间为15秒。 主干道红灯亮,支干道黄灯闪烁,时间为6秒。 循环显示。
三、基本原理
在车辆通行繁忙的十字交叉路口设置的交通灯控制系统,其特点是:道路较窄而车流量较大,主干道,支干道的车辆通行时间不等,,同时设有道路应急控制。具体的情况是:在正常的情况下,东西支干道通行时间为20秒,南北主干道通行时间为15秒,每个方向在绿灯转为红灯时,要求黄灯先亮6秒钟,才能变换运行车道。并且能够在人工监控状态下,如果一道有车而另一道无车,交通灯控制系统能立即让有车道放行。而且有紧急车辆要求通过时,系统要能禁止普通车辆通行。
国内的交通灯一般设在十字路门,在醒目位置用红、绿、黄三种颜色的指示灯。加上一个倒计时的显示计时器来控制行车。对于一般情况下的安全行车,车辆分流尚能发挥作用,但根据实际行车过程中出现的情况,还存在以下缺点:
1.两车道的车辆轮流放行时间相同且固定, 在十字路口,经常一个车道为主干道,车辆较多,放行时间应该长些;另一车道为副干道,车辆较少,放行时间应该短些。
2.没有考虑紧急车通过时,两车道应采取的措施,臂如,消防车执行紧急任务通过时,两车道的车都应停止,让紧急车通过。
基于传统交通灯控制系统设计过于死板,红绿灯交替是间过于程式化的缺
点,智能交通灯控制系统的设计就更显示出了它的研究意义,它能根据道路交通拥护,交叉路口经常出现拥堵的情况。利用单片机控制技术.提出了软件和硬件设计方案,能够实现道路的最大通行效率。
1.芯片的选择与简单介绍
主控芯片采用AT89C52单片机。AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。 主要功能特性
1、兼容MCS51指令系统
2、8k可反复擦写(大于1000次)Flash ROM; 3、32个双向I/O口; 4、256x8bit内部RAM;
5、3个16位可编程定时/计数器中断; 6、时钟频率0-24MHz;
7、2个串行中断,可编程UART串行通道; 8、2个外部中断源,共8个中断源; 9、2个读写中断口线,3级加密位;
10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;
11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。 引脚功能:
AT89C52为8 位通用微处理器,准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输
入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
2.交通灯控制系统设计
原理方框图
电 源 AT89C52 交通灯时间显示部分 时钟电路 复位电路 交 通 灯 按键控制电路
工作原理
由软件设置交通灯的初始时间,南北方向通行20秒,东西方向通行15秒,数
码管采用动态显示,P0口送字形码,P2口送字位选通信号,通过单片机的P1口控制各种信号灯的燃亮与熄灭。采用中断方式实现按键的功能。 整体系统分析
1.总体流程图(实现各种状态间的转换):
东西绿灯 南北红灯 东西黄灯闪 南北红灯亮 东西红灯亮 南北黄灯闪 东西红灯 南北绿灯
2.相关参数计算
时间显示每一秒减一,定时50ms,每20次减一 T0的计数初值:M=65536-50000=15536=3CB0H 3.程序流程图
开 始 初始状态,东南西北都为红灯,时间6秒 Y 状态0,状态0时间显示 显示时间是否 N 为0 显示时间减1 显示时间减一 显示时间是否 N 为0 状态2,状态2时间显示 Y Y 状态1,状态1时间显示 显示时间是否为0 N N 显示时间是否为0 状态2,状态2时间显示 显示时间减1 显示时间减一 Y 4.仿真硬件连接电路图:
5.仿真结果
初始状态:东南西北都为红灯,时间6秒
状态0:南北方向绿灯亮,东西方向红灯亮
状态1:南北方向黄灯闪烁,东西方向红灯亮
状态2:南北方向红灯亮,东西方向绿灯亮
状态3:南北方向黄灯亮,东西方向黄灯闪烁
紧急情况:K3按下,东南西北四个方向都为红灯
6. 仿真结果分析
仿真实验实现南北方向车道和东西方向车道两条交叉道路的车辆交替运行,南北方向(主干道)每次通行时间设为20秒、东西方向通行时间设为15秒,时
间可以在程序中修改。同时能够实现红灯、黄灯、绿灯状态转换,红绿灯转换时间为6秒,转黄期间黄灯亮。可以准确显示每个状态所剩余的时间,按下禁行普通车辆键K3,东西南北方向都亮红灯;按下南北放行键K0,南北绿灯亮,东西红灯亮;按下东西放行键K1,东西绿灯亮,南北红灯亮;任何状态下,按复位电路中的复位键, 此系统都将回到初始状态;按当紧急状况出现时,按下紧急开关,可实现主干道和支干道全部禁止通行,允许紧急车辆安全通行;按下时间设置键K4一次,实现通行时间加,按K0南北通行时间加,按K1东西通行时间加,按返回键K2,以新设置的时间进行运行;按下时间设置键K4二次,实现通行时间减,按K0南北通行时间减,按K1东西通行时间减,按返回键K2,以新设置的时间进行运行;按下时间设置键K4三次,回复初始通行时间;实现了课程设计的要求。
四.设计心得
在这次课程设计中,我们首先对所选课题进行相关资料的查询,其次进行电路设计以及proteus仿真,在编程实现程序控制,在proteus中调试成功以后,购买器材完成电路连接。其中,最重要的是程序的编写,在了解单片机芯片的构造及性能的基础上,利用C语言进行编程,其中最主要的是利用了循环、条件和函数调用。感觉到C语言函数功能的强大和简便,并且认识到C语言在学习和工作中的重要性。在proteus仿真时,熟悉了仿真环境,利用其仿真工具连接交通灯电路,下载程序到单片机芯片上实现仿真结果,并把它用电子器件在面包板上实现,在这过程中出现了一些问题:(1)对C语言的编程环境和仿真环境不是太了解,把交通灯运用C语言实现花费了大量的精力和时间。(2)在仿真时,出现错误后,对于找出程序错误并修改仿真电路加大了一定的难度。(3)在面包板上连接好电路后,并没有预期的结果。在遇到以上问题后,我们查找相关资料和询问指导老师,克服了困难,最后完成了这次的程设计。
在这过程中,体会到了实践的重要性,感觉理论知识是要结合实践才能真正的掌握,团结在整个过程中起到了关键的作用,加强了我们的实践和团结意识,锻炼了我们的动手能力,掌握了一些元器件的性能和用法,虽然,我们在这次课程设计中选的课题简单,但是,我们的收获却很大,希望在以后的学习和工作中,能得到更多的实践经验,尤其是锻炼我们的自我意识,无论做什么事,都要自己去尝试并努力完成,是享受其过程而不是结果。
#include #define uchar unsigned char /*定义字符串类型为无符号型*/ uchar code a[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; uchar code b[4]={0x02,0x01,0x08,0x04}; /****P2口,低有效*/ uchar code c[4]={0xDE,0xDD,0xF3,0xEB}; /****P1口,低有效*/ char SN=20,WE=26; char SN_G=20,WE_G=15,Y=6; uchar i,k=0,count=0; int n=0; void delay(uchar t);/*定义函数*/ void light(); /*定义函数*/ void led(); /*定义函数*/ void chushi(); sbit K0=P3^7;/*开关K0接P3^7管脚*/ sbit K1=P3^6;/*开关K1接P3^6管脚*/ sbit K2=P3^5;/*开关K2接P3^5管脚*/ sbit K3=P3^3;/*开关K3接P3^3管脚*/ sbit K4=P3^2;/*开关K4接P3^2管脚*/ /*程序初始化*/ void init(void) { /*12MHz */ TMOD=0x01; /**计数器用模式1,为16位计数器*****/ TH0=0x3c; TL0=0xb0; /*0xB0*//*计50000个数,用时50ms*/ IT0=1;/*外部中断0为边沿触发方式*/ ET0=1;/*允许T0中断*/ TR0=1;/*启动计数器*/ EA=1;/*CPU开放总中断*/ EX0=1;/*允许外部中断0中断,即允许响应端口P3^2(K4)中断*/ EX1=1;/*允许外部中断1中断,即允许响应端口P3^3(K2)中断*/ } /*中断0处理程序*/ void int0(void) interrupt 0 { EA=0;/*CPU禁止响应一切中断*/ P1=0xDB; P0=a[0];/*东西南北方向均红灯亮,P0口输出0*/ TR0=!TR0; for(;;)/*无条件循环*/ { P2=b[0],P0=a[SN_G%10];/*南北方向数码管显示可通行时间的个位*/ delay(5); /*延时*/ 位*/ 的个位*/ 的十位*/ 程序*/ P2=b[1],P0=a[SN_G/10];/*南北方向数码管显示可通行时间的十delay(5); /*延时*/ P2=b[2],P0=a[WE_G%10];/*东西方向数码管显示可通行时间delay(5); /*延时*/ P2=b[3],P0=a[WE_G/10];/*东西方向数码管显示可通行时间delay(5); /*延时*/ if(K4==0) /*P3^2=0*/ { delay(10); /*延时,把抖动的时间抛掉*/ if(K4==0) { while(!K4)/*当松开K4开关时,跳出空循环,执行后面的 { } n++; /*K4按下次数*/ } } if(n==1) /*K4按下1次时,时间加*/ { /*设置南北方向通行时间*/ if(K0==0) /*P3^7=0*/ { delay(10);/*延时,把抖动的时间抛掉*/ if(K0==0) { while(!K0)/*当松开K0开关时,跳出空循环,执行 后面的程序*/ { } SN_G++;/*南北方向绿灯时间+1*/ if(SN_G==100) SN_G=0;/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/ } } /*设置东西方向通行时间*/ if(K1==0) /*P3^6=0*/ { delay(10);/*延时,把抖动的时间抛掉*/ if(K1==0) { while(!K1)/*当松开K1开关时,跳出空循环,执行后面的程序*/ { } WE_G++;/*东西方向绿灯时间+1*/ if(WE_G==100) WE_G=0;/*由于使用的是两位数码管,当东西方向绿灯时间加到100后清零*/ } } } if(n==2) /*K4按下2次时,时间减*/ { /*设置南北方向通行时间*/ if(K0==0) /*P3^7=0*/ { delay(10);/*延时,把抖动的时间抛掉*/ if(K0==0) { while(!K0)/*当松开K0开关时,跳出空循环,执行后面的程序*/ { } SN_G--;/*南北方向绿灯时间-1*/ if(SN_G<0) SN_G=0;/*当南北方向绿灯时间减到小于零后清零*/ } } /*设置东西方向通行时间*/ if(K1==0) /*P3^6=0*/ { delay(10);/*延时,把抖动的时间抛掉*/ if(K1==0) { while(!K1)/*当松开K1开关时,跳出空循环,执行后面的程序*/ { } WE_G--;/*东西方向绿灯时间-1*/ if(WE_G<0) WE_G=0;/*当东西方向绿灯时间减到小于零后清零*/ } } } if(n==3) /*K4按下3次时,时间恢复初值*/ { n=0; SN_G=20,WE_G=15; } /*返回*/ if(K2==0) /*P3^5=0*/ { delay(10);/*延时,把抖动的时间抛掉*/ if(K2==0) { while(!K2)/*当松开K2关时,跳出空循环,执行后面的程序*/ { } count=0;/*清零*/ k=0;/*南北方向通车,东西方向不通车*/ SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ light();/*调用交通灯函数*/ led(); /*调用数码管函数*/ EA=1; /*CPU开放总中断*/ TR0=!TR0; break;/*跳出*/ } } } } /*中断1处理程序*/ void int1(void) interrupt 2 { P1=0xDB,P0=a[0];/*东西南北方向均红灯亮,P0口输出0*/ EA=0;/*CPU禁止响应一切中断*/ TR0=!TR0;/*计数器停止工作*/ for(;;)/*无条件循环*/ { /*数码管扫描程序,*/ P2=b[0];/*显示南北方向个位*/ delay(5);/*延时*/ P2=b[1];/*显示南北方向十位*/ delay(5);/*延时*/ P2=b[2];/*显示东西方向个位*/ delay(5);/*延时*/ P2=b[3];/*显示东西方向十位*/ delay(5);/*延时*/ /*返回*/ if(K2==0) /*P3^5=0*/ { delay(10);/*延时,把抖动的时间抛掉*/ if(K2==0) { while(!K2)/*当松开K2开关时,跳出空循环,执行后面的程序*/ { } EA=1;/*CPU开放总中断*/ TR0=!TR0;/*启动计数器*/ break;/*跳出*/ } } } } /*键盘程序*/ void key() { /*南北有车而东西无车*/ if(K0==0) /*K0=0*/ { delay(10);/*延时,把抖动的时间抛掉*/ if(K0==0) { while(!K0)/*当松开K0开关时,跳出循环,执行后面的程序*/ { light();/*调用交通灯函数*/ led(); /*调用数码管函数*/ } count=0;/*清零*/ k=0;/*南北方向通车,东西方向不通车*/ SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ light();/*调用交通灯函数*/ led(); /*调用数码管函数*/ } } /*南北无车而东西有车*/ if(K1==0) /*K1=0*/ { delay(10);/*延时,把抖动的时间抛掉*/ if(K1==0) { while(!K1)/*当松开K1开关时,跳出循环,执行后面的程序*/ { light();/*调用交通灯函数*/ led(); /*调用数码管函数*/ } count=0;/*清零*/ k=2;/*南北方向不通车,东西方向通车*/ SN=WE_G+Y,WE=WE_G;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/ light();/*调用交通灯函数*/ led(); /*调用数码管函数*/ } } } /*定时函数*/ void time0(void) interrupt 1 { TH0=0x3c; TL0=0xb0;/*计50000个数,用时50ms*/ count++; /*自增运算*/ if(count>=20)/*当count大于或等于20时,历时1s,执行程序*/ { SN--;/*自减运算*/ WE--;/*自减运算*/ count=0;/*清零*/ if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/ { k++;/*自增运算*/ if(k>3)/*当k>3时,执行程序*/ { k=0;/*清零*/ SN=SN_G,WE=SN_G+Y; } else { switch(k)/*switch 语句*/ { case 0:SN=SN_G,WE=SN_G+Y;break;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ case 1:SN=Y,WE=Y;break; /*东西南北方向显示时间均为黄灯闪亮时间*/ case 2:SN=WE_G+Y,WE=WE_G;break;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/ case 3:SN=Y,WE=Y;break; /*东西南北方向显示时间均为黄灯闪亮时间*/ } } } } } /*延时t毫秒*/ void delay(uchar t) { uchar i; for(t;t>0;t--) { for(i=2000;i>0;i--) {} } } /*交通灯函数*/ void light() { P1=c[k];/*交通灯对应着k的值变化*/ if(P1==c[1]&&count==0)/*当南北方向亮黄灯且count=0时,执行程序*/ { P1=0xDF;/*南北方向黄灯熄灭,东西方向亮红灯*/ } else if(P1==c[3]&&count==0)/*当东西方向亮黄灯且count=0时,执行程序*/ { P1=0xFB;/*南北方向亮红灯,东西方向黄灯熄灭*/ } } /*数码管函数*/ void led() { P2=b[0],P0=a[SN%10];/*显示南北方向个位*/ delay(5);/*延时*/ P2=b[1],P0=a[SN/10];/*显示南北方向十位*/ delay(5);/*延时*/ P2=b[2],P0=a[WE%10];/*显示东西方向个位*/ delay(5);/*延时*/ P2=b[3],P0=a[WE/10];/*显示东西方向十位*/ delay(5); /*延时*/ } void chushi () { TH1=0x3c; TL1=0xb0; TMOD=0x10; EA=1; ET1=1;/*允许T1断*/ TR1=1;/*启动计数器*/ P1=0xDB; SN=6,WE=6; for(;;)/*无条件循环*/ { P2=b[0],P0=a[SN%10];/*显示南北方向个位*/ delay(5);/*延时*/ P2=b[1],P0=a[SN/10];/*显示南北方向十位*/ delay(5);/*延时*/ P2=b[2],P0=a[WE%10];/*显示东西方向个位*/ delay(5);/*延时*/ P2=b[3],P0=a[WE/10];/*显示东西方向十位*/ delay(5); /*延时*/ if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/ { TR1=!TR1,ET1=0; SN=20,WE=26; break; } } } void time1(void) interrupt 3 { TH1=0x3c; TL1=0xb0;/*计50000个数,用时50ms*/ count++; /*自增运算*/ if(count>=20)/*当count大于或等于20时,历时1s,执行程序*/ { SN--;/*自减运算*/ WE--;/*自减运算*/ count=0;/*清零*/ } } /*主函数*/ void main(void) { chushi (); init();/*调用程序初始化函数*/ for(;;)/*无条件循环*/ { key();/*调用键盘程序*/ light();/*调用交通灯函数*/ led(); /*调用数码管函数*/ } } 课程设计 ——交通灯控制系统设计 电子信息工程0803 范瑛 0807050305 侯楠 0807050307 慕旭娟 0807050308 因篇幅问题不能全部显示,请点此查看更多更全内容