|
可实现 警灯 夜间 等功能的51单片机交通灯
51单片机交通灯的仿真图
交通灯的电路原理图
源程序:
- #include<reg51.h>
- #define smg P1
- #define bit P3
- sbit red1=P0^0;//1方向红灯
- sbit green1=P0^1;//1方向绿灯
- sbit yellow1=P0^2; //1方向黄灯
- sbit red2=P0^3;//2方向红灯
- sbit green2=P0^4; //2方向绿灯
- sbit yellow2=P0^5; //2方向黄灯
- sbit setkey=P2^0; //设置按键
- sbit upkey=P2^1;//时间加
- sbit downkey=P2^2;//时间减
- sbit backkey=P2^3;//退出键
- sbit choosekey=P2^4;//选择键
- unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char time,s,s1,s2,t,t2,x1,x2,flag,temp,r,q;
- int t1;
- void delay(int x); //延时程序
- void timer0(void); //中断
- void set();//设置程序
- void int0();//秒计数
- void main(void) //主函数
- { t=60;
- s=1;
- r=0;
- timer0();
- int0();
- while(1)
- {
- set();
- t1=t-s;
- if(t1==-1)
- {s=1;}
- s1=t1%10;s2=t1/10;
- bit=0xfd;smg=tab[s1];delay(2);bit=0xfe;smg=tab[s2];delay(2); //个位,十位显示赋值
- if(t1==-1){r++;q=r%2; if(r==4){r=2;}} //当数码管显示时间为-1时,对r进行加1并通过求余操作,产生两种不同的红绿灯状态。
- if(q==1){red1=0;green1=1;yellow1=0;red2=1;green2=0;yellow2=0; //状态1灯光。
- if(t1<3&&t1>-1){green1=0;if(time>9){yellow1=~yellow1;}}} //状态1黄灯闪烁。
- if(q==0){red1=1;green1=0;yellow1=0;red2=0;green2=1;yellow2=0; //状态2灯光。
- if(t1<3&&t1>-1){ green2=0;if(time>9){yellow2=~yellow2;}}} //状态2黄灯闪烁。
- if(TF0==1)//定时器溢出操作
- {TF0=0;break;}
- }
- }
- void set()
- {
- if(setkey==0)
- { delay(5); //防抖操作
- if(setkey==0)
- {flag=1;
- while(flag)
- { TR0=0;
- bit=0xfd;smg=0x00;delay(1); //数码管全灭
- bit=0xfe;smg=0x00;delay(1);
- if(backkey==0)
- {delay(15);
- if(backkey==0) //设置程序返回操作
- {flag=0;TR0=1;}
- }
- if(choosekey==0)
- {delay(60);
- if(choosekey==0)
- {++temp;
- if(temp==6){temp=1;}
- if(temp==1)
- {while(temp) //时间加减操作
- {x1=t%10; x2=t/10;
- bit=0xfd;smg=tab[x1];delay(2);bit=0xfe;smg=tab[x2];delay(2);
- if(upkey==0){delay(60);if(upkey==0)t++;if(t==100)t=10;}
- if(downkey==0){delay(60);if(downkey==0)t--;if(t==9)t=10;}
- red1=1;green1=0;yellow1=0;red2=1;green2=0;yellow2=0;
- if(setkey==0){ delay(60);if(setkey==0){break;} }}
- }
- else if(temp==2) {red1=1;green1=0;yellow1=0;red2=1;green2=0;yellow2=0;} //禁行模式
- else if(temp==3){red1=0;green1=1;yellow1=0;red2=1;green2=0;yellow2=0; }//方向1通行模式
- else if(temp==4){red1=1;green1=0;yellow1=0;red2=0;green2=1;yellow2=0; } //方向2通行模式
- else if(temp==5){red1=0;green1=0; red2=0;green2=0; //夜间模式
- while(1){delay(255);
- yellow1=~yellow1;
- yellow2=~yellow2;
- if(backkey==0)
- { delay(15);
- if(backkey==0)
- {break;}
- }}}}}
- }}}}
- void timer0(void)
- { TMOD = 0x01;
- TH0 = 0x3C;
- TL0 = 0xB0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void int0() interrupt 1 using 0
- {
- TH0=0x3C;
- TL0=0xB0;
- time++;
- if(time==20)
- { s++;
- time=0;}
- }
- void delay(int x)
- { int i,j;
- for(i=x;i>0l;i--)
- for(j=255;j>0;j--);
- }
-
复制代码
交通灯所有资料下载:
1352200108_赵晓杰_交通灯.rar
(9.46 MB, 下载次数: 84)
|
评分
-
查看全部评分
|