51单片机 交通灯 protues仿真
的有关信息介绍如下:1.按键可以选择正常模式和夜间模式
2.按键可以选择正常模式和紧急模式
原理图和仿真效果如下:
南北红灯模式
南北黄灯模式
南北绿灯模式
程序如下:
#include
#define uint unsigned int
#define uchar unsigned char
uchar num;//定时器T0计数变量
uchar num1;//定时器T1计数变量
uchar key1num;
uchar key2num;
uchar key3num;
uchar temp; //南北时间变量
uchar temp1;//东西时间变量
//uchar flagS1; //状态一标志位
uchar flagS2; //状态二标志位
uchar flagS3; //状态三标志位
uchar flagS4; //状态四标志位
uchar key1flag;
uchar key2flag;
uchar key3flag;
uchar flag;
uchar flag1;
disp[]={11,3,8}; //南北显示时间数值
disp1[]={14,5,3}; //东西显示时间数值
uchar i;
uchar code smg_dm[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,};//数码管段码数组
uchar code smg_wm[]={
0x0f,0x1f,0x2f,0x3f,
0x4f,0x5f,0x6f,0x7f,}; //数码管位码数组
////////指示灯 位定义//////////////
sbit NS_R=P0^0; //南北走向 红灯
sbit NS_Y=P0^1; //南北走向 黄灯
sbit NS_G=P0^2; //南北走向 绿灯
sbit EW_R=P0^3; //东西走向 红灯
sbit EW_Y=P0^4; //东西走向 黄灯
sbit EW_G=P0^5; //东西走向 绿灯
sbit key3=P3^2;//设置键
sbit key2=P3^3;//紧急键切换正常 南北紧急 东西紧急三种状态
sbit key1=P3^4;//模式切换键 切换正常模式 夜间模式
/////////子函数声明//////////////
void init(); //初始化
void delay_ms(uint z); //延时ms级
/////////////////////////////////
void smg();//数码管显示
/////////////////////////////////
void key();//按键函数
/////////////////////////////////
void S0(); //初始状态
void S1(); //状态1函数
void S2(); //状态2函数
void S3(); //状态3函数
void S4(); //状态4函数 构成一个正常显示的循环
//////////////////////////////////
void yejian();
void zhengchang();
void naibeijinji();
void dongxijinji();
////////////主程序///////////////
void main()
{
init();
//flagS1=1; //进入状态下
temp=disp[i]; //取初值
temp1=disp1[i];//取初值
S0();
TR0=1;
while(1)
{
key();
if(flag==1)
{
if(key2flag==1)
{
naibeijinji();
TR0=0;
num=0; ///////////////////////////////调试
}
else if (key2flag==2)
{
dongxijinji();
TR0=0;
num=0;//////////////////////////////调试
}
else
{
TR0=1;
// NS_R=1; NS_Y=1; NS_G=1;/////////////调试
// EW_R=1; EW_Y=1; EW_G=1;
NS_R=0; NS_Y=0; NS_G=0;/////////////调试
EW_R=0; EW_Y=0; EW_G=0;
zhengchang();
}
}
else if(flag1==1)
{
if(key3flag==1)
{
yejian();
TR0=0;
num=0;
}
else
{
TR0=1;
// NS_R=1; NS_Y=1; NS_G=1;
// EW_R=1; EW_Y=1; EW_G=1;
NS_R=0; NS_Y=0; NS_G=0;/////////////调试
EW_R=0; EW_Y=0; EW_G=0;
zhengchang();
}
}
else
{
zhengchang();
}
}
}
void yejian()
{
// NS_R=1; NS_Y=0; NS_G=1;
// EW_R=1; EW_Y=0; EW_G=1;
NS_R=0; NS_Y=1; NS_G=0;
EW_R=0; EW_Y=1; EW_G=0;
delay_ms(500); //////////延时太长 按键切换会不灵敏
//NS_R=1; NS_Y=1; NS_G=1;
// EW_R=1; EW_Y=1; EW_G=1;
NS_R=0; NS_Y=0; NS_G=0;/////////////调试
EW_R=0; EW_Y=0; EW_G=0;
delay_ms(500);
}
void zhengchang()
{
if(flagS2==1)
S2();
else if(flagS3==1)
S3();
else if(flagS4==1)
S4();
else
S1();
}
void naibeijinji()//南北绿灯,东西红灯
{
//NS_R=1; NS_Y=1; NS_G=0;
// EW_R=0; EW_Y=1; EW_G=1;
NS_R=0; NS_Y=0; NS_G=1;
EW_R=1; EW_Y=0; EW_G=0;
}
void dongxijinji()//东西绿灯,南北红灯
{
//NS_R=0; NS_Y=1; NS_G=1;
//EW_R=1; EW_Y=1; EW_G=0;
NS_R=1; NS_Y=0; NS_G=0;
EW_R=0; EW_Y=0; EW_G=1;
}
void key()
{
if(key2==0)
{
delay_ms(10);
if(key2==0)
{
flag=1;
flag1=0;
key2num++;
key2num=key2num%3;
switch(key2num)
{
case 0:key2flag=0;break; //正常模式
case 1:key2flag=1;break; //南北紧急
case 2:key2flag=2;break; //东西紧急
}
}
while(!key2);
}
if(key3==0)
{
delay_ms(10);
if(key3==0)
{
flag=0;
flag1=1;
key3num++;
key3num=key3num%2;
switch(key3num)
{
case 0:key3flag=0;break; //正常模式
case 1:key3flag=1;break; //夜间模式
}
}
while(!key3);
}
}
void S0()
{
//NS_R=0; NS_Y=0; NS_G=0;
//EW_R=0; EW_Y=0; EW_G=0;
NS_R=1; NS_Y=1; NS_G=1;
EW_R=1; EW_Y=1; EW_G=1;
delay_ms(2000);
// NS_R=1; NS_Y=1; NS_G=1;
// EW_R=1; EW_Y=1; EW_G=1;
NS_R=0; NS_Y=0; NS_G=0;
EW_R=0; EW_Y=0; EW_G=0;
}
void S1()
{
//NS_G=0;//南北绿灯亮
//EW_R=0;//东西红灯亮
NS_G=1;//南北绿灯亮
EW_R=1;//东西红灯亮
if(num==20)
{
num=0;
temp=temp-1;
temp1=temp1-1;
}
if(temp==0)
{
flagS2=1;
// NS_G=1;//南北绿灯灭
// EW_R=0;//东西红灯亮
NS_G=0;//南北绿灯灭
EW_R=1;//东西红灯亮
i=i+1; //1
temp=disp[i];//3
temp1=temp1;
// flagS1=0;
}
smg();
}
void S2()
{
//NS_Y=0;//南北黄灯亮
//EW_R=0;//东西红灯亮
NS_Y=1;//南北黄灯亮
EW_R=1;//东西红灯亮
//temp=3;
if(num==20)
{
num=0;
temp=temp-1;
temp1=temp1-1;
}
if(temp==0)
{
flagS2=0;
flagS3=1;
// NS_Y=1;
// EW_R=1;
NS_Y=0;
EW_R=0;
i=i+1;//2
temp=disp[i]; //8
temp1=disp1[i-1];//5
}
smg();
}
void S3()
{
//NS_R=0;//南北红灯亮
//EW_G=0;//东西绿灯亮
NS_R=1;//南北红灯亮
EW_G=1;//东西绿灯亮
if(num==20)
{
num=0;
temp=temp-1;
temp1=temp1-1;
}
if(temp1==0)
{
flagS3=0;
flagS4=1;
//NS_R=0;
//EW_G=1;
NS_R=1;
EW_G=0;
i=i+1;
temp=temp;
temp1=disp1[i-1];
}
smg();
}
void S4()
{
//NS_R=0;//南北红灯亮
//EW_Y=0;//
NS_R=1;//南北红灯亮
EW_Y=1;//
if(num==20)
{
num=0;
temp=temp-1;
temp1=temp1-1;
}
if(temp==0)
{
flagS4=0;
//NS_R=1;
//EW_Y=1;
NS_R=0;
EW_Y=0;
//flagS1=1;
i=i+1;
if(i>2)
{i=0;}
temp=disp[i];
temp1=disp1[i];
}
smg();
}
void smg()
{
P2=smg_wm;
P1=smg_dm[temp%10];
delay_ms(5);
P1=0X00;
P2=smg_wm;
P1=smg_dm[temp/10];
delay_ms(5);
P1=0X00;
P2=smg_wm;
P1=smg_dm[temp1%10];
delay_ms(5);
P1=0X00;
P2=smg_wm;
P1=smg_dm[temp1/10];
delay_ms(5);
P1=0X00;
}
void init()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
//TR0=1;
//ET1=1;
//TR1=1;
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
/*
void time1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num1++;
}
*/
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}