
交通转弯灯程序.doc
12页/*假设东西方向为主干道(放行 30s) ,南北方向为次干 道(放行 20s)*/ #include unsigned char code dispcode[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8, 0xf9,0xfa}; unsigned char tempcount=0,temp=20,temp0,temp1,date=9; unsigned char count=0,m=0; unsigned int k=0,date0=0; sbit dula1=P2^4; /*数码管 1 十位*/ sbit dula2=P2^5; /*数码管 1 个位*/ sbit wela1=P2^6; /*数码管 2 十位*/ sbit wela2=P2^7; /*数码管 2 个位*/ sbit glag=P3^0; bit flag0=1,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag=0; /*延时函数*/ void delay10ms(void) {unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--); }void delay(int x){for(;x>0;x--);} void main(void) //主函数 {IP=0x01; //外中断 0 优先级TMOD=0x01; //定义 T0 为定时中 断 INT0 为下降沿触发TH0=(65536-1000)/256;TL0=(65536-1000)%256;TR0=1; //开中断ET0=1;EA=1;EX0=1;IT0=1;while(1){if(glag==1) {if(flag0==1)//南北绿灯,东西红灯,转弯灯全 灭 { P1=0xbe; }if(flag1==1) //南北绿灯,东西红灯,转弯灯全 亮{ P1=0x36;}if(flag2==1) //南北红灯,东西黄灯闪,转弯灯灭{P1_0=1;P1_1=1;P1_2=0;P1_3=1;P1_4=1;P1_6=1;P1_7=1;}if(flag3==1) //南北红灯,东西绿灯,转弯灯全灭{ P1=0xeb; }if(flag4==1) //南北红灯亮,东西绿灯亮,转弯灯 亮 { P1=0x63; }if(flag5==1) //南北黄灯闪,东西红灯亮,转弯灯全 灭 {P1_0=1;P1_2=1;P1_3=1;P1_4=1;P1_5=1;P1_6=0;P1_7=1;}if(flag==1) //紧急车来时,所有红灯都亮 { P1=0xbb; }}else{if(flag0==1)//南北绿灯,东西红灯,转弯灯全 灭 { P1=0xbe; }if(flag2==1) //南北红灯,东西黄灯,转弯灯全 灭{P1_0=1;P1_1=1;P1_2=0;P1_3=1;P1_4=1;P1_6=1;P1_7=1;}if(flag3==1) //南北红灯,东西绿灯,转弯灯全灭{ P1=0xeb; }if(flag5==1) //南北黄灯闪,东西红灯亮,转弯灯灭 {P1_0=1;P1_2=1;P1_3=1;P1_4=1;P1_5=1;P1_6=0;P1_7=1;}if(flag==1) //紧急车来时,所有红灯都亮 { P1=0xbb; }}} } void t0(void)interrupt 1 using 0 //定时/计数器 0 {TH0=(65536-1000)/256;TL0=(65536-1000)%256;P0=dispcode[count]; //P2 端口接动态数码count++;if(count==8){count=0;}m++; //控制黄灯亮灭的时间if(m==100) //使的黄灯闪烁{m=0;if(flag2==1){ P1_5=~P1_5;}if(flag5==1){P1_1=~P1_1; }}if(flag==0) //警车或急救车到来时保存当前的状态{temp0=temp;k++;}else //警车或急救车到来时各个方向红灯, 10s 到计 时{flag0=0;flag1=0;flag2=0;flag3=0;flag4=0;flag5=0;temp0=date;date0++;if(date0==1000){date0=0;date--;if(date==0) //10s 到了后恢复中断之前的状态{temp=20;date=9;flag=0;}} }if(k==500) {k=0;temp--;temp1--;tempcount++;}if(0<=tempcountflag0=0;if(flag3==0){flag1=1;dula1=0;P0=dispcode[temp/10];delay(25);dula1=1;dula2=0;P0=dispcode[temp%10];delay(25);dula2=1;wela1=0;P0=dispcode[temp/10];delay(25);wela1=1;wela2=0;P0=dispcode[temp%10];delay(25);wela2=1;}}else if(flag==0){ flag0=1; dula1=0;P0=dispcode[temp/10];delay(25);dula1=1;dula2=0;P0=dispcode[temp%10];delay(25);dula2=1;wela1=0;P0=dispcode[temp/10];delay(25);wela1=1;wela2=0;P0=dispcode[temp%10];delay(25);wela2=1;}}if(20
