51单片机控制交通灯原理图及C语言程序_51单片机交通灯程序
51单片机控制交通灯原理图及C语言程序由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“51单片机交通灯程序”。
Proteus仿真原理图:
Keil C源程序:
#include #define uchar unsigned char #define uint
unsigned
int sbit
RED_DONGXI
= P1^0;//南北方向红灯亮 sbit
YELLOW_DONGXI = P1^1;//南北方向黄灯亮 sbit
RED_NANBEI
= P1^3;//东西方向红灯亮 sbit
GREEN_DONGXI = P1^2;//南北方向绿灯亮 sbit
YELLOW_NANBEI = P1^4;//东西方向黄灯亮 sbit
GREEN_NANBEI = P1^5;//东西方向绿灯亮
sbit
DXweixuan1
= P1^6;//南北方向数码管位选1 sbit
DXweixuan2
= P1^7;//南北方向数码管位选2 sbit
NBweixuan1
= P3^0;//东西方向数码管位选1 sbit
NBweixuan2
= P3^1;//东西方向数码管位选2 sbit
L1=P3^5;sbit
L2=P3^6;sbit
L3=P3^7;uint aa, bai,shi,ge,bb;uint shi1,ge1,shi2,ge2;uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uint code table1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};void delay(uint z);void init(uint a);void display(uint shi1,uint ge1,uint shi2,uint ge2);void xtimer0();void init1();void init2();void init3();void init4();void init5();void xint1();void xint0();void LED_ON();void LED_OFF();
void main(){ P0=0xFF;P1=0xFF;P2=0x00;
P3=0xFF;EA=1;EX0=1;IT0=0;
init1();while(1)
{
init2();//第2个状态
init3();//第3个状态
init4();//第4个状态
init5();//第5个状态
} } void init1()//第一个状态:东西、南北方向均亮红灯5S { uint temp;temp=5;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_DONGXI=0;
//第一个状态东西、南北均亮红灯5S
RED_NANBEI=0;
GREEN_DONGXI=1;
GREEN_NANBEI=1;
YELLOW_DONGXI=1;
YELLOW_NANBEI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;
temp--;
}
shi1=shi2=temp/10;
ge1=ge2=temp%10;
if(temp==0)
{
temp=5;
break;
}
display(ge1,shi1,ge2,shi2);} } void init2()//第二个状态:东西亮红灯30S~5S、南北亮绿灯25~0S;{ uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_DONGXI=1;
RED_NANBEI=0;
GREEN_DONGXI=0;
GREEN_NANBEI=1;
YELLOW_DONGXI=1;//第二个状态:东西亮绿灯25S、南北亮红灯
YELLOW_NANBEI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;
temp--;
shi1=(temp+5)/10;
}
}
} ge1=(temp+5)%10;shi2=temp/10;ge2=temp%10;if(temp==0){ temp=26;break;} display(ge1,shi1,ge2,shi2);void init3()//第三个状态:东西绿灯变为黄灯闪5次、南北亮红灯5S { uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_NANBEI=0;
GREEN_DONGXI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;
temp--;
YELLOW_DONGXI=~YELLOW_DONGXI;
shi1=temp/10;
shi2=shi1;
ge1=temp%10;
ge2=ge1;
}
if(temp==0)
{
temp=6;
break;
}
display(ge1,shi1,ge2,shi2);} } void init4()//第四个状态:东西亮绿灯25~0S,南北方向亮红灯30~5S; { uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_DONGXI=0;
RED_NANBEI=1;
YELLOW_DONGXI=1;//第一个状态东西、南北均亮红灯5S
GREEN_NANBEI=0;
if(aa==20)
{
aa=0;
temp--;
shi1=temp/10;
shi2=(temp+5)/10;
ge1=temp%10;
ge2=(temp+5)%10;
if(temp==0)
{
temp=26;
break;
}
}
display(ge1,shi1,ge2,shi2);} } void init5()//第五个状态:东西亮红灯、南北绿灯闪5次转亮黄灯5S { uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_NANBEI=1;
RED_DONGXI=0;
GREEN_DONGXI=1;
GREEN_NANBEI=1;
if(aa==20)
{
aa=0;
temp--;
YELLOW_NANBEI=~YELLOW_NANBEI;
shi1=temp/10;
shi2=shi2;
ge1=temp%10;
ge2=ge1;
if(temp==0)
{
temp=6;
break;
}
}
display(ge1,shi1,ge2,shi2);} }
void display(uint shi1,uint ge1,uint shi2,uint ge2){ DXweixuan1=0;DXweixuan2=1;NBweixuan1=1;NBweixuan2=1;P0=table[ge1];delay(5);DXweixuan1=1;DXweixuan2=0;NBweixuan1=1;NBweixuan2=1;P0=table[shi1];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=0;NBweixuan2=1;P0=table[ge2];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=1;NBweixuan2=0;P0=table[shi2];delay(5);} void xint0()interrupt 0 { RED_NANBEI=0;RED_DONGXI=0;GREEN_NANBEI=1;GREEN_DONGXI=1;
YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);return;} void xint1()interrupt 2 { RED_NANBEI=1;RED_DONGXI=1;GREEN_NANBEI=0;GREEN_DONGXI=0;
YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);return;} void xtimer0()interrupt 1 { TH0=(65535-50000)/256;TL0=(65535-50000)%256;aa++;} void delay(uint z){uint x,y;for(x=0;x
for(y=0;y