您的位置首页生活百科

51单片机 交通灯 protues仿真

51单片机 交通灯 protues仿真

的有关信息介绍如下:

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--);

}