多语言展示
当前在线:1959今日阅读:27今日分享:41

51单片机 交通灯 protues仿真

1.按键可以选择正常模式和夜间模式2.按键可以选择正常模式和紧急模式原理图和仿真效果如下: 南北红灯模式南北黄灯模式南北绿灯模式程序如下:#include#define uint unsigned int#define uchar unsigned charuchar 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();elseS1();}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; //1temp=disp[i];//3temp1=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;//2temp=disp[i]; //8temp1=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[0]; P1=smg_dm[temp%10]; delay_ms(5); P1=0X00; P2=smg_wm[1]; P1=smg_dm[temp/10]; delay_ms(5); P1=0X00; P2=smg_wm[2]; P1=smg_dm[temp1%10]; delay_ms(5); P1=0X00; P2=smg_wm[3]; 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--);}
推荐信息