1、基于51单片机交通灯程序完整版#include #include #define uchar unsigned char #define uint unsigned int bit Flag_SN_Yellow; /SN黄灯标志位 bit Flag_EW_Yellow;/EW黄灯标志位 uchar Time_EW;/东西方向倒计时单元 uchar Time_SN;/南北方向倒计时单元 uchar EW=15,SN=10,EWL=19,SNL=19; /程序初始化赋值,正常模式 uchar EW1=60,SN1=40,EWL1=19,SNL1=19;/用于存放修改值的变量 ucharFlag_M
2、oden=1; /模式变量1正常模式 2 禁止南北通东西 3 禁止东西通南北 4 禁止东西南北5 夜间模式 ucharFlag_key=0; uchar code table10=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;/19段选码sbit HC164_Data =P00; sbit HC164_Clk =P01; sbitEW_green =P02; sbitEW_yellow =P03; sbitEW_red =P04; sbitSN_red =P05; sbitSN_green =P07; sbitSN_yellow =P06;
3、 sbitSN_RXD_red =P27; sbitSN_RXD_green =P26; sbitEW_RXD_red =P25; sbitEW_RXD_green =P24; sbit FMQ = P10; sbit key1 = P33; sbit key2 = P34; sbit key3 = P35; sbit WEI1 =P23; / 东西数码管第一位 sbit WEI2 =P22; / 东西数码管第二位 sbit WEI3 =P21; / 南北数码管第一位 sbit WEI4 =P20; / 南北数码管第二位 /ucharew=40;sn=35; /函数 delay(uchar z
4、) /功能能延时 void Delay(uchar z) uchara,b; for(a=z;a0;a-) for(b=200;b0;b-); void HC_164_Set_byte(ucharduan) uchar i; for(i=0;i8;i+) HC164_Data =duan& 0x80; HC164_Clk =0; HC164_Clk =1; duan =duan5) if(key1=0 | key2=0|key3=0) /Flag_Moden=1; TR0=0;/启动定时 break; Display(); SN_yellow=0; /SN黄灯亮开始闪烁5秒 SN_green
5、=1; /灭 /*S1状态* Time_SN=5; while(Time_EW5) if(key1=0 | key2=0|key3=0) /Flag_Moden=1; TR0=0;/启动定时 break; Display(); /*S3状态* EW_green=1; EW_yellow=0; Time_EW=5; while(Time_SN=5) if(key1=0 | key2=0|key3=0) TR0=0;/启动定时 break; Flag_EW_Yellow=1; /SN开黄灯信号位 Display(); Flag_EW_Yellow=0; EW_yellow=1; /模式2 禁止南北
6、通东西蜂鸣器响void Jsn() EW_green =0; EW_yellow =1; EW_red =1; SN_red =0; SN_green =1; SN_yellow =1; SN_RXD_red =0; SN_RXD_green =1; EW_RXD_red =1; EW_RXD_green =0; FMQ = FMQ; Delay(10); WEI1=1;WEI2=1;WEI3=1;WEI4=1; /模式3 禁止东西通南北蜂鸣器响void Jew() EW_green =1; EW_yellow =1; EW_red =0; SN_red =1; SN_green =0; SN
7、_yellow =1; SN_RXD_red =1; SN_RXD_green =0; EW_RXD_red =0; EW_RXD_green =1; FMQ = FMQ; Delay(10); WEI1=1;WEI2=1;WEI3=1;WEI4=1; /模式4 禁止东西南北蜂鸣器响 void JEwSn() EW_green =1; EW_yellow =1; EW_red =0; SN_red =0; SN_green =1; SN_yellow =1; SN_RXD_red =0; SN_RXD_green =1; EW_RXD_red =0; EW_RXD_green =1; FMQ
8、= FMQ; Delay(10); WEI1=1;WEI2=1;WEI3=1;WEI4=1; /模式5 夜间模式,东西南北黄灯闪烁void Yejian() EW_green =1; /EW_yellow =1; EW_red =1; SN_red =1; SN_green =1; /SN_yellow =1; SN_RXD_red =1; SN_RXD_green =1; EW_RXD_red =1; EW_RXD_green =1; Flag_EW_Yellow=1; /SN开黄灯信号位 Flag_SN_Yellow=1; /SN开黄灯信号位 void main () P1=0xff; P
9、2=0xff ; P3=0xff; P0=0xff; EW_green =1; EW_yellow =1; EW_red =1; SN_red =1; SN_green =1; SN_yellow =1; SN_RXD_red =1; SN_RXD_green =1; EW_RXD_red =1; EW_RXD_green =1; WEI1=1; WEI2=1; WEI3=1; WEI4=1; IT0=1; /INT0负跳变触发 TMOD=0x01;/定时器工作于方式1 TH0=(65536-50000)/256;/定时器赋初值 TL0=(65536-50000)%6; EA=1; /CPU开中断总允许 ET0=1;/开定时中断 / EX0=1;/开外部INTO中断 TR0=1;/启动定时 while(1) switch(Flag_Moden) case 1:Zc_moshi(); break; case 2:Jsn(); break; case 3: Jew();break; case 4: JEwSn();break; case 5: Yejian();break; default :break; Key();