基于单片机的车辆闯红灯监控系统设计报告报告人:班级:日期:2011/12/2一、任务:设计并制作一台车辆闯红灯监控机。二、要求:1.基本要求(1)用红、黄、绿三种灯显示三种状态。(2)具有交通灯的所有功能,平时指挥车辆通行。(3)当有车辆闯红灯时发出声、光报警(用玩具车测试)。(4)可任意设定各种灯计时时间,两位数码管最大99秒;平时显示倒计时。(5)可人工干预强制执行某一通道通行。2.发挥部分1、具有自动拍照功能,当有车辆闯红灯时自动拍照(图像可在电视或其他屏幕显示)。2、具有智能调度功能,当侦测某一通道繁忙另一通道空闲时,能自动调整红绿灯时间。3、当有紧急通行车辆(如消防车、救护车、警车)要求通过时,能自动开通该通道而关闭另一通道。4、其他三、方案选取:用红、黄、绿三种灯显示三种状态,只需在每个路口各安一盏红、黄、绿led;要具有交通灯的所有功能,平时能正常指挥交通,就必须能够正常疏散每个通道的车辆,如果按先主通道后从道的疏散方式,中间转换状态有交叉,很多细节处理起来会麻烦,故选用按通道疏散,即四个通道按顺序轮流疏散,这样简化许多问题;要实现车辆闯红灯时,有声光报警,只要同时判断该通道是否处于禁止通行状态,以及是否收到由于车辆闯红灯时产生的信号;可任意设定各种灯计时时间,即实现外部与单片机的沟通,故采用中断方式进行设定;可人工强制某一通道通行,也是通过外部中断控制;对于发挥部分,首先第一功能从成本上、技术上首先否定;要实现智能调整红绿灯时间,可用红外对管对车流量进行采集信息,交与单片机处理,但是需要太多的红外对管,且考虑到单片机引脚的问题,该功能的实现给予放弃;当有紧急车辆通过时,可以产生一个信号,通过外部中断进行控制,需要红外对管、单片机引脚不多,可实现;其他功能,可实现通道通行状态转换时,有声音提示,当外部有人工强制某一通道通行或者紧急车辆要求通过时,以不同的频率声光提示等。综上,从设计成本与实用性综合考虑,所设计的系统要实现基本要求中的所有功能,并实现发挥部分的第三、第四功能(由红灯转换成绿灯时,声音提示;人工干预强制执行某一通道或紧急车辆要求通过时时,各灯分别以不同的频率闪烁及声音提示;)。四、理论分析与计算:首先,利用单片机的P0口驱动四个路口共8个数码管,采用动态扫描方式进行显示,各数码管a~g端并联,公共端作片选端。本设计采用共阴数码管。由于需要限流,故在片选端串接一个小电阻,通过该电阻的电流是各段led电流的总和,故电阻不能过大,否则分到各段的电流很小,数码管灰度不够,该电阻一般选取10Ohm。又因为P0口内部无上拉电阻,故需要在外部接上拉电阻,选择1K的排阻作上拉电阻。然后利用单片机的P1的0~2口经过74HC138译码器译码后连接数码管的片选端,即可实现数码管的动态扫描。单片机的P2口用于控制各通道的led。总共需要控制4x3=12个led,故可通过74LS139译码后连接led,一块139芯片有两片2—4译码器,两块139芯片共8个输入端于单片机相连,共16个输出端与12个led相连,其他四个输出端与各通道的蜂鸣器相连。这便实现对led状态的控制以及通道转换时的声音提示。74LS139输出是低电平有效,故led采用共阳的接法,同时需要限流,可像数码管一样在公共端串接一个10Ohm的电阻即可。P1口的3~5脚,通过74ls148编码器后于8个开关相连,分别表示八个数码管,开关按下,输入译码管为低电平,断开则为高电平。P1的6脚接一个开关,表示当修改数值时是加还是减,断开时为高,闭合为低。外部中断1脚接按键开关,摁下时为低电平。该中断源采用下降沿中断方式,当按键摁下,单片机判断8个开关经编码后的信息,同时判断加/减状态,对某一数码管的计时时间进行修改。当某一数码管被选中,相应的指示灯亮起,故与开关连接的上拉电阻选用510Ohm。这便实现外部可任意设定各灯计时时间的修改功能。单片机的10、11、17脚经过74LS148编码器与各中断源相连,这里所指的中断源是实现人工强制通行(一下简称人工)的4个中断源和紧急(一下简称紧急)车辆要求通行的4个中断源,它们需低电平有效。人工中断有开关控制,闭合时为低电平,故采用上拉电阻,选取10k电阻。紧急中断由红外接收管控制,当其接收到紧急车辆发来的有效信号,输出低电平。编码器的EO端接P1的7脚,同时各中断源通过与门相与后连接外部中断0引脚,该中断设定为下降沿中断。另在各个路口设设置红外接收管,输出通过与门相与后与单片机的16脚相连。15脚与74HC138的6脚输出使能端相连。当中断源产生中断信号时,单片机使74HC138输出无效,数码管熄灭,同时单片机收到编码后的信息,判断是人工中断还是紧急中断,若是人工中断,则判断P1.7脚的电平,若为高电平则单片机输出相应的状态,直到P1.7脚为低电平,此时表示人工中断开关已断开,结束中断(无编码时,EO为低电平,否则为高电平)。若为紧急中断,则输出相应的状态信息,直16脚为低电平,此时接收管收到有效信号,表明紧急车辆已通过,结束中断。当某一通道红灯亮起时,表明该通道禁止通行,此时该led阴极为低电平。在各路口放红外接收管,当有车辆闯红灯时,使接收管收到有效信号,输出低电平,与该通道的红灯led阴极引脚信号相或后作为报警电路的触发源。报警电路主要是利用555产生单稳态的电路。当触发源触发555时,输出一个单稳态,使报警led和蜂鸣器持续响起5秒左右。该电路中的R=470k,C=10uF,led限流电阻取200Ohm。由于有四个通道,每个通道有车辆闯红灯都要报警,故信号通过或门后要接与门,再输入到555的触发端。由于通行的通道红灯熄灭,其阴极为高电平,相或后还为高电平,故该通道即使有车辆使接收管产生低电平,也不会报警。单片机的复位采用上电复位和手动复位相结合的方式单片机的时钟频率选择12M,加两个30pF的微调电容。其他功能的实现由程序完成。五、电路与程序设计:1、电路原理图如下:2、单片机程序及注释如下#includereg51.h#includeabsacc.hunsignedcharcodedisp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedchara1=1;b1=1;c1=1;d1=1;//预置倒计时时间unsignedchara2=5;b2=5;c2=5;d2=5;unsignedcharx,y;unsignedintj=0;unsignedchartest2;unsignedchartest1;unsignedcharsave;unsignedcharflag;sbitP1_2=P1^2;sbitP1_1=P1^1;sbitP1_0=P1^0;sbitP1_6=P1^6;sbitP3_5=P3^5;sbitP3_6=P3^6;sbitP1_7=P1^7;sbitp3_3=P3^3;voidDelay(void)//数码管显示延时{unsignedinti;for(i=0;i2000;i++);}voidDelay10ms(void)//10ms延时程序{unsignedchari,j,k;for(i=5;i0;i--)for(j=4;j0;j--)for(k=248;k0;k--);}voidDelay200ms(void)//200ms延时程序{unsignedchari,j,k;for(i=5;i0;i--)for(j=132;j0;j--)for(k=150;k0;k--);}voidDelay500ms(void)//500ms延时程序{unsignedchari,j,k;for(i=15;i0;i--)for(j=202;j0;j--)for(k=81;k0;k--);}voidLoad_a(void)//A通道通行子程序{flag=1;//通道转换标志P2=0xc0;Delay200ms();//声音提示x=a1;y=a2;P2=0x40;//A通道绿灯,其他红灯while(1){P0=0x00;//关断段信号P1_2=0;P1_1=0;P1_0=0;//选择A通道第一个数码管P0=disp[x];//送显示数字Delay();//延时显示P0=0x00;P1_2=0;P1_1=0;P1_0=1;//选择A通道第二个数码管P0=disp[y];Delay();if(x==0&&y==2)P2=0x80;//A通道黄灯,其他红灯if(flag==0)break;//通道转换}}voidLoad_d(void)//D通道通行子程序{flag=1;P2=0x03;Delay200ms();//声音提示x=d1;y=d2;P2=0x01;//D通道绿灯,其他红灯while(1){P0=0x00;P1_2=1;P1_1=1;P1_0=0;P0=disp[x];Delay();P0=0x00;P1_2=1;P1_1=1;P1_0=1;P0=disp[y];Delay();if(x==0&&y==2)P2=0x02;//D通道黄灯,其他红灯if(flag==0)break;//通道转换}}voidLoad_c(void)//C通道通行子程序{flag=1;P2=0x0c;Delay200ms();x=c1;y=c2;P2=0x04;//C通道绿灯,其他红灯while(1){P0=0x00;P1_2=1;P1_1=0;P1_0=0;P0=disp[x];Delay();P0=0x00;P1_2=1;P1_1=0;P1_0=1;P0=disp[y];Delay();if(x==0&&y==2)P2=0x08;//C通道黄灯,其他红灯if(flag==0)break;}}voidLoad_b(void)//B通道通行子程序{flag=1;P2=0x30;Delay500ms();x=b1;y=b2;P2=0x10;//B通道绿灯,其他红灯while(1){P0=0x00;P1_2=0;P1_1=1;P1_0=0;P0=disp[x];Delay();P0=0x00;P1_2=0;P1_1=1;P1_0=1;P0=disp[y];Delay();if(x==0&&y==2)P2=0x20;//B通道黄灯,其他红灯if(flag==0)break;}}voiddecsec()interrupt1//定时0中断,使数码管显示的数减一{j++;if(j==4000){j=0;if(y!=0)y--;else{if(x!=0){x--;y=9;}elseflag=0;}if(x==0&&y=2)Delay200ms();//倒计时到2时,使数码管闪烁显示}}voidchange()interrupt2//外部中断1,改变各通道绿灯时间{Delay10ms();//消抖if(p3_3==0)//判断按键按下还是松开{test1=P1&0x38;//获取编码信息switch(test1){case0x00:{if(P1_6){if(a19)a1++;elsea1=0;}else{if(a1!=0)a1--;elsea1=9;}}break;case0x20:{if(P1_6){if(a29)a2++;elsea2=0;}else{if(a2!=0)a2--;elsea2=9;}}break;case0x10:{if(P1_6){if(b19)b1++;elseb1=0;}else{if(b1!=0)b1--;elseb1=9;}}break;case0x30:{if(P1_6){if(b29)b2++;elseb2=0;}else{if(b2!=0)b2--;elseb2=9;}}break;case0x08:{if(P1_6){if(c19)c1++;elsec1=0;}else{if(c1!=0)c1--;elsec1=9;}}break;case0x28:{if(P1_6){if(c29)c2++;e