#includereg51.h#defineucharunsignedchar#defineuintunsignedintuchardatabuf[4];uchardatasec_dx=20;//东西数默认uchardatasec_nb=30;//南北默认值uchardataset_timedx=20;//设置东西方向的时间uchardataset_timenb=30;//设置南北方向的时间intn;uchardatacountt0;//定时器0中断次数//定义5组开关sbitk4=P3^7;//切换方向sbitk1=P3^5;//时间加sbitk2=P3^6;//时间减sbitk3=P3^4;//确认sbitk5=P3^1;//禁止//P3^2//只允许东西方向通行,中断0//P3^3//只允许南北方向通行,中断1sbitRed_nb=P2^6;//南北红灯标志sbitYellow_nb=P2^5;//南北黄灯标志sbitGreen_nb=P2^4;//南北绿灯标志sbitRed_dx=P2^3;//东西红灯标志sbitYellow_dx=P2^2;//东西黄灯标志sbitGreen_dx=P2^1;//东西绿灯标志sbitBuzz=P3^0;bitBuzzer_Indicate;bitset=0;//调时方向切换键标志=1时,南北,=0时,东西bitdx_nb=0;//东西南北控制位bitshanruo=0;ucharcodetable[11]={//共阴极字型码0x3f,//--00x06,//--10x5b,//--20x4f,//--30x66,//--40x6d,//--50x7d,//--60x07,//--70x7f,//--80x6f,//--90x00//--NULL};//函数的声明部分voiddelay(intms);//延时子程序voidkey();//按键扫描子程序voidkey_to1();//键处理子程序voidkey_to2();voidkey_to3();voiddisplay();//显示子程序voidlogo();//开机LOGOvoidBuzzer();//主程序voidmain(){TMOD=0X11;//定时器设置TH0=0X3C;//定时器0置初值0.05STL0=0XB0;EA=1;//开总中断ET0=1;//定时器0中断开启TR0=1;//启动定时0EX0=1;//开外部中断0EX1=1;//开外部中断1logo();P2=0Xc3;//开始默认状态,东西绿灯,南北黄灯sec_nb=sec_dx+5;//默认南北通行时间比东西多5秒while(1){key();//调用按键扫描程序display();//调用显示程序Buzzer();}}//函数的定义部分voidkey(void)//按键扫描子程序{if(k1!=1)//当K1(时间加)按下时{display();//调用显示,用于延时消抖if(k1!=1){TR0=0;//关定时器shanruo=0;P2=0x00;if(set==0)set_timedx++;//南北加1Selseset_timenb++;//东西加1Sif(set_timenb==100)set_timenb=1;if(set_timedx==100)set_timedx=1;//加到100置1sec_nb=set_timenb;//设置的数值赋给东西南北sec_dx=set_timedx;//do{display();}while(k1!=1);}}if(k2!=1)//当K2(时间减)按键按下时{display();//调用显示,用于延时消抖if(k2!=1){TR0=0;//关定时器shanruo=0;P2=0x00;if(set==0)set_timedx--;//南北减1Selseset_timenb--;//东西减1Sif(set_timenb==0)set_timenb=99;if(set_timedx==0)set_timedx=99;//减到1重置99sec_nb=set_timenb;//设置的数值赋给东西南北sec_dx=set_timedx;do{display();//调用显示,用于延时}while(k2!=1);}}if(k3!=1)//当K3(确认)键按下时{display();//调用显示,用于延时消抖if(k3!=1){TR0=1;//启动定时器Buzzer_Indicate=0;sec_nb=set_timenb;//从中断回复,仍显示设置过的数值sec_dx=set_timedx;//显示设置过的时间if(set==0)//时间倒时到0时{P2=0X00;//东西绿灯,南北红灯Green_dx=1;Red_nb=1;sec_nb=sec_dx+5;//回到初值}else{P2=0x00;//南北绿灯,东西红灯Green_nb=1;Red_dx=1;sec_dx=sec_nb+5;}}}if(k4!=1)//当K4(切换)键按下{display();//调用显示,用于延时消抖if(k4!=1){TR0=0;set=!set;//取反set标志位,以切换调节方向dx_nb=set;do{display();}while(k4!=1);}}if(k5!=1)//当K5(禁止)键按下时{display();//调用显示,用于延时消抖if(k5!=1){TR0=0;//关定时器P2=0x00;Red_dx=1;Red_nb=1;//全部置红灯sec_dx=00;//四个方向的时间都为00sec_nb=00;Buzzer_Indicate=1;do{display();}while(k5!=1);}}}voiddisplay(void)//显示子程序{buf[1]=sec_nb/10;//第1位东西秒十位buf[2]=sec_nb%10;//第2位东西秒个位buf[3]=sec_dx/10;//第3位南北秒十位buf[0]=sec_dx%10;//第4位南北秒个位P1=0xff;//初始灯为灭的P0=0x00;P1=0xfe;//片选LED1P0=table[buf[1]];//送东西时间十位的数码管编码delay(1);//延时P1=0xff;//关显示P0=0x00;P1=0xfd;//片选LED2P0=table[buf[2]];delay(1);P1=0xff;P0=0x00;P1=0Xfb;//片选LED3P0=table[buf[3]];delay(1);P1=0xff;P0=0x00;P1=0Xf7;P0=table[buf[0]];//片选LED4delay(1);}voidtime0(void)interrupt1using1//定时中断子程序{TH0=0X3C;//重赋初值TL0=0XB0;TR0=1;//重新启动定时器countt0++;//软件计数加1if(countt0==10){if((sec_nb=5)&&(dx_nb==0)&&(shanruo==1))//东西黄灯闪{Green_dx=0;Yellow_dx=0;}if((sec_dx=5)&&(dx_nb==1)&&(shanruo==1))//南北黄灯闪{Green_nb=0;Yellow_nb=0;}}if(countt0==20)//定时器中断次数=20时(即1秒时){countt0=0;//清零计数器sec_dx--;//东西时间减1sec_nb--;//南北时间减1if((sec_nb=5)&&(dx_nb==0)&&(shanruo==1))//东西黄灯闪{Green_dx=0;Yellow_dx=1;}if((sec_dx=5)&&(dx_nb==1)&&(shanruo==1))//南北黄灯闪{Green_nb=0;Yellow_nb=1;}if(sec_dx==0&&sec_nb==5)//当东西倒计时到0时,重置5秒,用于黄灯闪烁时间{sec_dx=5;shanruo=1;}if(sec_nb==0&&sec_dx==5)//当南北倒计时到0时,重置5秒,用于黄灯闪烁时间{sec_nb=5;shanruo=1;}if(dx_nb==0&&sec_nb==0)//当黄灯闪烁时间倒计时到0时,{P2=0x00;//重置东西南背方向的红绿灯Green_nb=1;Red_dx=1;dx_nb=!dx_nb;shanruo=0;sec_nb=set_timenb;//重赋南北方向的起始值sec_dx=set_timenb+5;//重赋东西方向的起始值}if(dx_nb==1&&sec_dx==0)//当黄灯闪烁时间到{P2=0X00;//重置东西南北的红绿灯状态Green_dx=1;Red_nb=1;dx_nb=!dx_nb;shanruo=0;sec_dx=set_timedx;//重赋东西方向的起始值sec_nb=set_timedx+5;//重赋南北方向的起始值}}}//外部中断0voidint0(void)interrupt0using1//只允许东西通行{TR0=0;//关定时器P2=0x00;Green_dx=1;//东西方向置绿灯Red_nb=1;//南北方向为红灯Buzzer_Indicate=0;sec_dx=00;//四个方向的时间都为00sec_nb=00;}//外部中断1voidint1(void)interrupt2using1//只允许南北通行{TR0=0;//关定时器P2=0x00;Green_nb=1;//置南北方向为绿灯Red_dx=1;//东西方向为红灯Buzzer_Indicate=0;sec_nb=00;//四个方向的时间都为00sec_dx=00;}voidlogo()//开机的Logo----{for(n=0;n50;n++){P0=0x40;P1=0xfe;delay(1);P1=0xfd;delay(1);P1=0Xfb;delay(1);P1=0Xf7;delay(1);P1=0xff;}}voidBuzzer(){if(Buzzer_Indicate==1)Buzz=!Buzz;elseBuzz=1;}voiddelay(intms)//延时子程序{uintj,k;for(j=0;jms;j++)//延时msfor(k=0;k124;k++);//大约1毫秒的延时}