1、交通灯十字路口控制器程序#include#define uchar unsigned char#define uint unsigned intuchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;/*digit display port*sbit led_w1=P11;sbit led_w2=P10;sbit led_w3=P13;sbit led_w4=P12;/*define led port *sbit R1=P24; /east and west red ledsbit Y1=P23; /eas
2、t and west yellow ledsbit G1=P22; /east and west green ledsbit R2=P25; /south and north red ledsbit Y2=P26; /south and north yellow ledsbit G2=P27; /south and north green led/*define key*sbit k0=P30; /emergencysbit k1=P31; /east and west passsbit k2=P32; /south and north passsbit k3=P33; /start and
3、subtract 1sbit k4=P34; /pause and add 1sbit k5=P35; /set time/*define variable*bit flag,flag_t;uchar dx_time,nb_time;uchar cnt,pass_time,cnt1,y_time;uchar k0num,k1num,k2num,k3num,k4num,k5num;/*define key*void delay(uint i) uint x,y; for(x=i;x0;x-) for(y=110;y0;y-); void timer0_init() TMOD=0x11; TH0=
4、(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET0=1; ET1=1;void led_display(uchar dx,nb) uchar dx1,dx2,nb1,nb2; dx2=dx/10; dx1=dx%10; nb2=nb/10; nb1=nb%10; if(dx99) led_w1=1; led_w2=1; else led_w1=0; P0=tabledx1; delay(5); led_w1=1; if(dx0) led_w2=1; e
5、lse led_w2=0; P0=tabledx2; delay(5); led_w2=1; if(nb99) led_w3=1; led_w4=1; else led_w3=0; P0=tablenb1; delay(5); led_w3=3; if(nb0) led_w4=1; else led_w4=0; P0=tablenb2; delay(5); led_w4=4; /*light work*void circle_led() if(!flag) if(pass_time5) led_display(pass_time-5,pass_time); R1=1;Y1=1;G1=0; /e
6、ast and west pass R2=0;Y2=1;G2=1; /south and north stop if(pass_time0) if(cnt=10) led_display(pass_time,pass_time); else led_display(100,pass_time); R1=1;G1=1; /east and west yellow led flash if(cnt=10) Y1=0; else Y1=1; R2=0;Y2=1;G2=1; if(pass_time=0) pass_time=nb_time; flag=1; else if(pass_time5) l
7、ed_display(pass_time,pass_time-5); R1=0;Y1=1;G1=1; /east and west stop R2=1;Y2=1;G2=0; /south and north pass if(pass_time0) if(cnt=10) led_display(pass_time,pass_time); else led_display(pass_time,100); R1=0;Y1=1;G1=1; R2=1;G2=1; /south and north yellow led flash if(cnt=10) Y2=0; else Y2=1; if(pass_t
8、ime=0) pass_time=dx_time; flag=0; void emergency() /east and west,south and north stop led_display(0,0); R1=0;Y1=1;G1=1; R2=0;Y2=1;G2=1;void dx_pass() /east and west pass,south and north stop led_display(100,100); if(y_time0) TR1=1; R1=0;Y1=1;G1=1; R2=1;G2=1; /south and north yellow led flash if(cnt
9、1=10) Y2=0; else Y2=1; if(y_time=0) TR1=0; R1=1;Y1=1;G1=0; R2=0;Y2=1;G2=1; void nb_pass() /south and north pass,east and west stop led_display(100,100); if(y_time0) TR1=1; R1=1;G1=1; if(cnt1=10) Y1=0; /east and west yellow led flash else Y1=1; R2=0;Y2=1;G2=1; if(y_time=0) TR1=0; R1=0;Y1=1;G1=1; R2=1
10、;Y2=1;G2=0; /*keyboard scan*void keyscan() if(!k5num) if(k0=0) /*emergency* delay(10); if(k0=0) while(!k0); TR0=0; k0num=1; if(!k1num&!k0num) if(k1=0) delay(10); if(k1=0) while(!k1); k1num=1; k2num=0; y_time=5; /单方向通行时,黄灯闪烁时间 TR0=0; TR1=1; if(!k2num&!k0num) if(k2=0) delay(10); if(k2=0) while(!k2); k
11、1num=0; k2num=1; y_time=5; /单方向通行时,黄灯闪烁时间 TR0=0; TR1=1; if(k3=0) delay(10); if(k3=0) while(!k3); if(k1num|k2num) pass_time=dx_time; /由东西或南北通行返回时,重新开始执行。 k0num=0; k1num=0; k2num=0; k4num=0; k5num=0; TR0=1; TR1=0; flag_t=0; if(!k4&!k0num) /pause delay(10); if(k4=0) while(!k4); TR0=0; k4num=1; if(k4num
12、=1) /暂停键按下时,才可以调整两个方向通行时间 if(k5=0) delay(10); if(k5=0) k5num+; while(!k5); switch(k5num) case 1: TR0=1; flag_t=1; /调整时间时,pass_time值不变。 k5num=1; break; case 2: k5num=2; break; case 3: TR0=0; k5num=0; pass_time=dx_time; /重新赋值 break; if(k5num!=0) if(k3=0) delay(10); if(k3=0) while(!k3); switch(k5num) c
13、ase 1: dx_time-; if(dx_time10) dx_time=99; break; case 2: nb_time-; if(nb_time=100) dx_time=10; break; case 2: nb_time+; if(nb_time=100) nb_time=10; break; void main() timer0_init(); dx_time=45; nb_time=30; pass_time=dx_time; while(1) keyscan(); if(k0num) emergency(); else switch(k4num) case 0: if(!
14、k1num&!k2num) circle_led(); else if(k1num) dx_pass(); if(k2num) nb_pass(); break; case 1: switch(k5num) case 0: if(!k1num&!k2num) circle_led(); else if(k1num) dx_pass(); if(k2num) nb_pass(); break; case 1: R1=1;Y1=1;G1=1; /调整时间时,关闭所有灯 R2=1;Y2=1;G2=1; if(cnt=10) led_display(100,nb_time); else led_dis
15、play(dx_time,nb_time); break; case 2: R1=1;Y1=1;G1=1; /调整时间时,关闭所有灯 R2=1;Y2=1;G2=1; if(cnt=10) led_display(dx_time,100); else led_display(dx_time,nb_time); break; break; void timer0() interrupt 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; cnt+; if(cnt=20) cnt=0; if(flag_t=0) pass_time-; /调整时间时,不执行此操作 void timer1() interrupt 3 TH1=(65536-50000)/256; TL1=(65536-50000)%256; cnt1+; if(cnt1=20) cnt1=0; y_time-; /单方向通行时,黄灯闪烁时间。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2