《基于51单片机的交通灯控制电路设计5页》由会员分享,可在线阅读,更多相关《基于51单片机的交通灯控制电路设计5页(5页珍藏版)》请在金锄头文库上搜索。
1、交通灯一、功能要求要求甲车道和乙车道两条交叉道路上的车辆交替运行,每次通行时间都设为25秒,黄灯先亮5秒钟,才能变换运行车道;黄灯亮时,要求每秒钟闪亮一次。二、电路图说明:1)每一位数码管位选要分开,对应IO口参照程序中红色部分2)图示数码管为共阳,没加驱动数码管显示较暗,建议加驱动三、程序/TrafficLight.c#includereg52.h/IO口定义sbit red_1=P20;/南北方向sbit red_2=P23;/东西方向sbit yellow_1=P21;sbit yellow_2=P24;sbit green_1=P22;sbit green_2=P25;sbit com
2、1_1=P36;/十位 南北方向 数码管位选sbit com1_2=P37;/个位 南北方向sbit com2_1=P34;/十位 东西方向sbit com2_2=P35;/个位 东西方向/全局变量char time=30;/倒计时unsigned char num1=0,num2=0;/辅助计时unsigned char flag1=0,flag2=0;/黄灯闪标志位unsigned char shi1,shi2,ge1,ge2;/数码管十位个位const unsigned char ledNum = / 0 1 2 3 4 5 6 7 8 9 A b c d E F 不显示 - o(18)
3、H(19)h(20)C(21)0(22)n(23)0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab; /共阳数码管/中断优先级别T0T1,数码管显示中断间隔2ms,计时时间间隔50ms/计时要求比较精确,间隔长,不应该被打断,故中断优先级要高,使用T0/数码管中断可以被打断,打断时间较短,不会影响显示,使用T1/在交通灯中,计时和数码管显示一直进行,故定时器开启后不用停止void InitInter(voi
4、d)TMOD=0x11;/设置定时器工作方式为16位计时器TH0=(65535-45872)/256;/11.0592M晶振,50msTL0=(65535-45872)%256;TH1=(65535-1835)/256;/11.0592M晶振,2msTL1=(65535-1835)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;void Display(void)static unsigned char i=1;switch(i)case 1:com2_2=0;P0=ledNumshi1;com1_1=1;break;case 2:com1_1=0;P0=ledNumge1
5、;com1_2=1;break;case 3:com1_2=0;P0=ledNumshi2;com2_1=1;break;case 4:com2_1=0;P0=ledNumge2;com2_2=1;break;default: ;i+;if(i4)i=1;/红灯可以直接变成绿灯,但绿灯必须先变成黄灯再变红灯void main(void)bit i=0;InitInter();while(1)red_1=0;/0为亮red_2=1;green_2=0;time=30;while(time5)shi1=time/10;ge1=time%10;shi2=(time-5)/10;ge2=(time-5
6、)%10;green_2=1;yellow_2=0;flag2=1;num2=0;while(time0)shi1=time/10;ge1=time%10;shi2=time/10;ge2=time%10;flag2=0;yellow_2=1;red_2=0;red_1=1;green_1=0;time=30;while(time5)shi2=time/10;ge2=time%10;shi1=(time-5)/10;ge1=(time-5)%10;green_1=1;yellow_1=0;flag1=1;num2=0;while(time0)shi2=time/10;ge2=time%10;s
7、hi1=time/10;ge1=time%10;flag1=0;yellow_1=1;/red_1=0;/green_2=0;void Timer_0(void) interrupt 1/计时TH0=(65535-45872)/256;TL0=(65535-45872)%256;num1+;if(num1=20)num1=0;time-;/if(time=10)num2=0;if(flag1)yellow_1=yellow_1;if(flag2)yellow_2=yellow_2;void Timer_1(void) interrupt 3TH1=(65535-1835)/256;/11.0592M晶振,2msTL1=(65535-1835)%256;Display();