AT89S52交通灯程序
2016-10-20 来源:eefocus
课程设计任务:利用单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭,并且用LED数码管显示时间。
要求:(1)能够调节定时时间:(2)能够实现全红灯的禁止通行状态和全绿灯的任意通行状态。
#include'reg51.h'
#define uchar unsigned char
sbit key4= P3^3;
sbit key1= P3^0;
sbit key2= P3^1;
sbit key3= P3^2;
uchar flag=1;
uchar display_co
uchar time[]={0,0,0,0};
uchar time1[]={30,30};
void delay(int n) //延时
{
while(n--);
}
void display() //显示
{
uchar i,k;
k=0x80;
for(i=0;i<4;i++)
{
P2=0;
P0=display_co
P2=k;
k=k>>1;
delay(50);
P2=0;
P0=display_co
P2=k;
k=k>>1;
delay(50);
}
P2=0;
}
void display1() //time1[0] 显示
{
uchar i,k;
k=0x80;
for(i=0;i<4;i++)
{
P2=0;
P0=display_co
P2=k;
k=k>>1;
//delay(50);
P2=0;
P0=display_co
P2=k;
k=k>>1;
//delay(50);
}
P2=0;
}
void display2() ///time1[1] 显示
{
uchar i,k;
k=0x80;
for(i=0;i<4;i++)
{
P2=0;
P0=display_co
P2=k;
k=k>>1;
// delay(50);
P2=0;
P0=display_co
P2=k;
k=k>>1;
// delay(50);
}
P2=0;
}
////////////////////////////////////////////////////////////////////////////////
void calc() // 计算
{
uchar j;
for(time[3]=time1[0];time[3]>0;time[3]--)
{
if(time[3]>3)
{
P1=0xF1;
}
if(time[3]<4)
{
P1=0x5F;
}
for(j=0;j<250;j++)
{
//display();
key3=1;
if(key3==0)
{
delay(100);
while(key3==0)
{
display1();
key1=1;
if(key1==0)
{
delay(100);
if(key1==0)
{
time1[0]++;
if(time1[0]>99)
time1[0]=0;
while(key1==0);
}
}
///////////////////////
key2=1;
if(key2==0)
{
delay(100);
if(key2==0)
{
if(time1[0]==0)time1[0]=99;
else
time1[0]--;
while(key2==0);
}
}
} // while
}///// 1 i
display();
}
}
///////////////////
if(time[3]==0)
{
for(time[2]=time1[1];time[2]>0;time[2]--)
{
if(time[2]>3)
{
P1=0x7F;
}
if(time[2]<4)
{
P1=0x5F;
}
for(j=0;j<250;j++) //for
{
//display();
key3=1;
if(key3==0)
{
delay(100);
while(key3==0)
{
display2();
key1=1;
if(key1==0)
{
delay(100);
if(key1==0)
{
time1[1]++;
if(time1[1]>99)
time1[1]=0;
while(key1==0);
}
}
///////////////////////
key2=1;
if(key2==0)
{
delay(100);
if(key2==0)
{
if(time1[1]==0)time1[1]=99;
else
time1[1]--;
while(key2==0);
}
}
}
}
display();
}
}
}
}
void light()
{
P2=0x00;//数码管全亮
P1=0xF1;//全红灯
}
void light1()
{
P2=0x00;//数码管全亮
P1=0x5F;//全绿灯
}
void main()
{
IT0=1; //外部中断0
ET0=1;
EX0=1;
TR0=1;
EA=1;
//flag=1;
while(1)
{
switch(flag)
{
case 1: calc();break;
case 2: light();break;
case 3: light1();break;
}
}
}
void int0() interrupt 0
{
delay(10);
if(key4==0)
{
delay(10);
if(key4==0)
{
flag++;
if(flag>3)flag=1;
}
}
}
上一篇:LCD显示的c51单片机频率计
下一篇:C51串口通讯定义