基于单片机的智能交通灯系统程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
//sbit duan=P1^0;//数码管段控制
//sbit wei=P1^1; //数码管位控制
sbit Leden=P1^2;//LED灯控制端
sbit Line=P1^3;//点阵行控制端
sbit lcd_en=P1^7;//1602液晶使能端
//#define D0 P1^0;
//#define D1 P1^1;
//#define D2 P1^2;
//#define D3 P1^3;
//#define D4 P1^4;
//#define D5 P1^5;
sbit D8=P3^4;
sbit D9=P3^5;
//uchar duanma[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//uchar weima[]={0xfd,0xf7,0xfb,0xef};
uchar times1,times2,second=5,second2,jiange,cll1,cll2, t,k;
uchar flag=0;// A路口0亮红灯,1亮绿灯
uchar wei_table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar duan_table[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80,0x00};//0123456789-.灭
sbit weien=P1^1;
sbit duanen=P1^0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void init_timer0(void)
{
TMOD|=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
times1++,times2++;
if(times1==200)
{
times1=0;
second--;
} //1s
if(times2==20)
{
times2=0;
second2++;
} //0.1s
}
void smg_delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void smg_display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)
{
P0=wei_table[0];
weien=1;
weien=0;
P0=duan_table[a];
duanen=1;
duanen=0;
smg_delay(1);
P0=0x00;
duanen=1;
duanen=0;
P0=wei_table[1];
weien=1;
weien=0;
P0=duan_table[b];
duanen=1;
duanen=0;
smg_delay(1);
P0=0x00;
duanen=1;
duanen=0;
P0=wei_table[2];
weien=1;
weien=0;
P0=duan_table[c];
duanen=1;
duanen=0;
smg_delay(1);
P0=0x00;
duanen=1;
duanen=0;
P0=wei_table[3];
weien=1;
weien=0;
P0=duan_table[d];
duanen=1;
duanen=0;
smg_delay(1);
P0=0x00;
duanen=1;
duanen=0;
P0=wei_table[4];
weien=1;
weien=0;
P0=duan_table[e];
duanen=1;
duanen=0;
smg_delay(1);
P0=0x00;
duanen=1;
duanen=0;
P0=wei_table[5];
weien=1;
weien=0;
P0=duan_table[f];
duanen=1;
duanen=0;
smg_delay(1);
P0=0x00;
duanen=1;
duanen=0;
P0=wei_table[6];
weien=1;
weien=0;
P0=duan_table[g];
duanen=1;
duanen=0;
smg_delay(1);
P0=0x00;
duanen=1;
duanen=0;
P0=wei_table[7];
weien=1;
weien=0;
P0=duan_table[h];
duanen=1;
duanen=0;
smg_delay(1);
P0=0x00;
duanen=1;
duanen=0;
}
//void display()
//{
//
// duan=1;
// P0=duanma[jiange%10];
// duan=0;
// P0=0xff;
//
// wei=1;
// P0=0x7f;
// wei=0;
// delay(1);
//
//
//
// duan=1;
// P0=duanma[jiange/10];
// duan=0;
// P0=0xff;
//
// wei=1;
// P0=0xbf;
// wei=0;
// delay(1);
//
// //后两位数码管
//
//
//
//
//}
uchar cll() //车流量
检测
{
t=second;
k=(cll1+1)/(cll2+1);
if(D8==0)
{
delay(5); //3.4口车流量
if(D8==0)
{
cll1++;
}
}
if(D9==0)
{
delay(5);
if(D9==0)
{
cll2++; //3.5口车流量
}
}
if(second==0)
{
if(flag==0) //3·4口大于3·5口2倍时,下一时刻绿灯时间延长
{
if(k>2)
{
t=5;
second=5;
cll1=0;
cll2=0;
}
if(k
{
t=10;
second=10;
cll1=0;
cll2=0;
}
if(k==1) //3.5口大时,
{
t=5;
second=5;
cll1=0;
cll2=0;
}
}
else if(flag==1)
{
if(k
{
t=5;
second=5;
cll1=0;
cll2=0;
}
if(k>2) //3·4口大于3·5口2倍时,下一时刻红灯时间缩短
{
t=10;
second=10;
cll1=0;
cll2=0;
}
if(k==1) //3.5口大时,
{
t=5;
second=5;
cll1=0;
cll2=0;
}
}
}
return t;
}
//void display() //数码管显示灯亮及
//{
// uchar i;
// for(i=0;i
// {
// duan=1;
// P0=duanma[jiange/10];
// duan=0;
// P0=0xff;
//
// wei=1;
// P0=weima[i];
// wei=0;
//
// }
//// for(;i
//// {
//// duan=1;
//// P0=duanma[jiange%10];
//// duan=0;
//// P0=0xff;
////
//// wei=1;
//// P0=weima[i];
//// wei=0;
////
//// }
// while(second2!=10)
// {
// second2=0;
// jiange--;
// }
//
//}
void main(void)
{
// uchar a,b;
lcd_en=0;//关闭1602液晶
P0=0X00; //关闭点阵
Line=0;
P0=0XFF; //关闭LED灯
Leden=0;
init_timer0();
while(1)
{
// jiange=10;
jiange=cll();
while(jiange!=0)
{ cll();
if(flag==0)
{
while(jiange>3)
{ cll();
{
P2=0xde; //A红灯亮,B绿灯亮
// smg_display();
}
smg_display(jiange/10,jiange%10,12,12,12,12,jiange/10,jiange%10);
if(second2==10)
{
second2=0;
jiange--;
}
}
while(jiange!=0)
{ cll();
P2=0xed; //黄灯
// display();
smg_display(jiange/10,jiange%10,12,12,12,12,jiange/10,jiange%10);
if(second2==10)
{
second2=0;
jiange--;
}
}
flag=!flag;
}
else
{
while(jiange>3)
{
cll();
P2=0xf3;
// display();
smg_display(jiange/10,jiange%10,12,12,12,12,jiange/10,jiange%10);
if(second2==10)
{
second2=0;
jiange--;
}
}
while(jiange!=0)
{ cll();
P2=0xed; //黄灯
// display();
smg_display(jiange/10,jiange%10,12,12,12,12,jiange/10,jiange%10);
if(second2==10)
{
second2=0;
jiange--;
}
}
flag=!flag;
} //B红灯亮,A绿灯亮
}
}
}