电路图如下所示:
流程图:
单片机源程序如下:
- #include <STC12.H>
- #define u8 unsigned char
- #define u16 unsigned int
- sbit LED_NBS=P2^0;//南北数码管位选脚
- sbit LED_NBG=P2^1;//南北数码管位选脚
- sbit LED_DXS=P2^2;//东西数码管位选脚
- sbit LED_DXG=P2^3;//东西数码管位选脚
- sbit GNB=P3^0;//绿/南北
- sbit YNB=P3^1;//黄/南北
- sbit RNB=P3^2;//红/南北
- sbit GDX=P3^3;//绿/东西
- sbit YDX=P3^4;//黄/东西
- sbit RDX=P3^5;//红/东西
- sbit GRNB=P2^4;//绿/南北人行道
- sbit RRNB=P2^5;//红/南北人行道
- sbit GRDX=P2^6;//绿/东西人行道
- sbit RRDX=P2^7;//红/东西人行道
- sbit RADD=P1^0;//加/红灯
- sbit RSUB=P1^1;//减/红灯
- sbit GADD=P1^2;//加/绿灯
- sbit GSUB=P1^3;//减/绿灯
- sbit JJ=P3^6;//紧急
- sbit YJ=P3^7;//夜间
- #define Time_Y_Save 5//黄灯间隔时间
- code u8 seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
- 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码
- u16 Time=0;//定时器中断计数
- int Time_NB=20;//南北倒计时时间
- int Time_DX=30;//东西倒计时时间
- int Time_Y=Time_Y_Save;//黄灯倒计时时间
- int Time_NB_Save=20;//调整后北通行倒计时时间
- int Time_DX_Save=30;//调整后通行倒计时时间
- u8 Run_Flag=0;//运行记录标志
- /******定时器初始化******/
- void Time0_Init()
- {
- TMOD=0X01;//工作模式
- EA=1;//开总中断
- TR0=1;//开启定时器0计时
- ET0=1;//开定时器0中断
- TH0=0X3C;//初值
- TL0=0XB0;
- }
- /******************************************************************
- 延时函数
- ******************************************************************/
- void delay(u16 t)
- {
- u8 j;
- while(t--)
- for(j=100;j>0;j--);
- }
- /**********************************************************************
- 南北数码管动态扫描
- *********************************************************************/
- void Display_NB(u16 Data) //显示函数
- {
- u8 s,g;
- s=Data/10; //求十位
- g=Data%10; //求个位
- P0=seg7code[s];//送十位段选值
- LED_NBG=1;//关闭个位显示
- LED_NBS=0;//开启十位显示
- delay(10);
- LED_NBG=1;//关闭个位显示
- LED_NBS=1;//关闭十位显示
- P0=seg7code[g];//送个位段选值
- LED_NBG=0;//开启个位显示
- LED_NBS=1;//关闭十位显示
- delay(10);
- LED_NBG=1;//关闭个位显示
- LED_NBS=1;//关闭十位显示
- }
- /**********************************************************************
- 东西数码管动态扫描
- *********************************************************************/
- void Display_DX(u16 Data) //显示函数
- {
- u8 s,g;
- s=Data/10; //求十位
- g=Data%10; //求个位
- P0=seg7code[s];
- LED_DXG=1;
- LED_DXS=0;
- delay(10);
- LED_DXG=1;
- LED_DXS=1;
- P0=seg7code[g];
- LED_DXG=0;
- LED_DXS=1;
- delay(10);
- LED_DXG=1;
- LED_DXS=1;
- }
- /******************************************************************
- 特殊模式函数
- ******************************************************************/
- void TS_Mode()
- {
- while(JJ==0)//紧急模式/全亮红灯
- {
- P0=1;//关闭数码管
- GNB=1;//南北绿灯灭
- YNB=1;//南北黄灯灭
- RNB=0;//南北红灯亮
- GRNB=1;//南北人行道绿灯灭
- RRNB=0;//南北人行道红灯亮
- GDX=1;//东西绿灯灭
- YDX=1;//东西黄灯灭
- RDX=0;//东西红灯亮
- GRDX=1;//东西人行道绿灯灭
- RRDX=0;//东西人行道红灯亮
- }
- while(YJ==0)//夜间模式/黄灯闪烁
- {
- P0=1;//关闭数码管
- GRNB=1;//南北人行道绿灯灭
- RRNB=1;//南北人行道红灯灭
- GRDX=1;//东西人行道绿灯灭
- RRDX=1;//东西人行道红灯灭
- if(Time<=10)
- {
- GNB=1;//南北绿灯灭
- YNB=1;//南北黄灯灭
- RNB=1;//南北红灯灭
- GDX=1;//东西绿灯灭
- YDX=1;//东西黄灯灭
- RDX=1;//东西红灯灭
- }
- else if(Time<=20)
- {
- GNB=1;//南北绿灯灭
- YNB=0;//南北黄灯亮
- RNB=1;//南北红灯灭
- GDX=1;//东西绿灯灭
- YDX=0;//东西黄灯亮
- RDX=1;//东西红灯灭
- }
- }
- }
- /******************************************************************
- 按键调整函数
- ******************************************************************/
- void Key_Adjust()
- {
- u16 count=0;//循环计次
- if(RADD==0)//增加东西通行时间
- {
- Time_DX_Save++;
- if(Time_DX_Save>=99)
- Time_DX_Save=99;
- EA=0;//关中断
- for(count=0;count<20;count++)
- {
- LED_NBG=1;//南北数码管不显示
- LED_NBS=1;
- Display_DX(Time_DX_Save);//调整的东西数码管显示时间
- }
- EA=1;//开中断
- }
- if(RSUB==0)//减少东西通行时间
- {
- Time_DX_Save--;
- if(Time_DX_Save<=0)
- Time_DX_Save=0;
- EA=0;//关中断
- for(count=0;count<20;count++)
- {
- LED_NBG=1;//南北数码管不显示
- LED_NBS=1;
- Display_DX(Time_DX_Save);//调整的东西数码管显示时间
- }
- EA=1;//开中断
- }
- if(GADD==0)//增加南北通行时间
- {
- Time_NB_Save++;
- if(Time_NB_Save>=99)
- Time_NB_Save=99;
- EA=0;//关中断
- for(count=0;count<20;count++)
- {
- Display_NB(Time_NB_Save);//调整的南北数码管显示时间
- LED_DXG=1;//东西数码管不显示
- LED_DXS=1;
- }
- EA=1;//开中断
- }
- if(GSUB==0)//减少南北通行时间
- {
- Time_NB_Save--;
- if(Time_NB_Save<=0)
- Time_NB_Save=0;
- EA=0;//关中断
- for(count=0;count<20;count++)
- {
- Display_NB(Time_NB_Save);//调整的南北数码管显示时间
- LED_DXG=1;//东西数码管不显示
- LED_DXS=1;
- }
- EA=1;//开中断
- }
- }
- /******************************************************************
- 主函数
- ******************************************************************/
- void main()
- {
- Time0_Init();
- while(1)
- {
- if(Run_Flag==0)//南北绿灯东西红灯
- {
- Time_NB=Time_NB_Save;//获取南北绿灯倒计时时间
- Time_DX=Time_NB_Save+Time_Y_Save;//获取东西红灯倒计时时间
- Time=0;//初始化计时时间
- while(1)
- {
- TS_Mode();//特殊模式检测
- Key_Adjust();//按键调整时间检测
- GNB=0;//南北绿灯亮
- YNB=1;//南北黄灯灭
- RNB=1;//南北红灯灭
- GRNB=0;//南北人行道绿灯亮
- RRNB=1;//南北人行道红灯灭
- GDX=1;//东西绿灯灭
- YDX=1;//东西黄灯灭
- RDX=0;//东西红灯亮
- GRDX=1;//东西人行道绿灯灭
- RRDX=0;//东西人行道红灯亮
- if(GADD!=0&&GSUB!=0&&RADD!=0&&RSUB!=0)//无按键按下
- {
- Display_NB(Time_NB);//南北数码管显示时间
- Display_DX(Time_DX);//东西数码管显示时间
- }
- if(Time_NB==0)
- {
- Run_Flag=1;//即将进入南北黄灯东西黄灯
- break;
- }
- }
- }
- if(Run_Flag==1)//南北黄灯东西红灯
- {
- Time_Y=Time_Y_Save;//黄灯倒计时时间
- Time=0;//初始化计时时间
- while(1)
- {
- TS_Mode();//特殊模式检测
- Key_Adjust();//按键调整时间检测
- GNB=1;//南北绿灯灭
- YNB=0;//南北黄灯亮
- RNB=1;//南北红灯灭
- GRNB=1;//南北人行道绿灯灭
- RRNB=0;//南北人行道红灯亮
- GDX=1;//东西绿灯灭
- YDX=1;//东西黄灯灭
- RDX=0;//东西红灯亮
- GRDX=1;//东西人行道绿灯灭
- RRDX=0;//东西人行道红灯亮
- Display_NB(Time_Y);//南北数码管显示时间
- Display_DX(Time_Y);//东西数码管显示时间
- if(Time_Y==0)
- {
- Run_Flag=2;//即将进入南北红灯东西绿灯
- break;
- }
- }
- }
- if(Run_Flag==2)//东西绿灯南北红灯
- {
- Time_DX=Time_DX_Save;//获取东西绿灯倒计时时间
- Time_NB=Time_DX_Save+Time_Y_Save;//获取南北红灯倒计时时间
- Time=0;//初始化计时时间
- while(1)
- {
- TS_Mode();//特殊模式检测
- Key_Adjust();//按键调整时间检测
- GNB=1;//南北绿灯灭
- YNB=1;//南北黄灯灭
- RNB=0;//南北红灯亮
- GRNB=1;//南北人行道绿灯灭
- RRNB=0;//南北人行道红灯亮
- GDX=0;//东西绿灯亮
- YDX=1;//东西黄灯灭
- RDX=1;//东西红灯灭
- GRDX=0;//东西人行道绿灯亮
- RRDX=1;//东西人行道红灯灭
- if(GADD!=0&&GSUB!=0&&RADD!=0&&RSUB!=0)//无按键按下
- {
- Display_DX(Time_DX);//东西数码管显示时间
- Display_NB(Time_NB);//南北数码管显示时间
- }
- if(Time_DX==0)
- {
- Run_Flag=3;//即将进入南北黄灯东西黄灯
- break;
- }
- }
- }
- if(Run_Flag==3)//东西黄灯南北红灯
- {
- Time_Y=Time_Y_Save;//黄灯倒计时时间
- Time=0;//初始化计时时间
- while(1)
- {
- TS_Mode();//特殊模式检测
- Key_Adjust();//按键调整时间检测
- GNB=1;//南北绿灯灭
- YNB=1;//南北黄灯灭
- RNB=0;//南北红灯亮
- GRNB=1;//南北人行道绿灯灭
- RRNB=0;//南北人行道红灯亮
-
- GDX=1;//东西绿灯灭
- YDX=0;//东西黄灯亮
- RDX=1;//东西红灯灭
- GRDX=1;//东西人行道绿灯灭
- RRDX=0;//东西人行道红灯亮
- Display_NB(Time_Y);//南北数码管显示时间
- Display_DX(Time_Y);//东西数码管显示时间
- if(Time_Y==0)
- {
- Run_Flag=0;//即将进入南北绿灯东西红灯
- break;
- }
- }
- }
- }
- }
- /*********定时器中断**********/
- void Timer0() interrupt 1
- {
- TH0=0X3C;//重装初值
- TL0=0XB0;
- Time++;//中断计次,每进一次中断50ms
- if(Time==20)//计时1秒
- {
- Time=0;
- if(JJ!=0&&YJ!=0)//非紧急模式或者夜间模式
- {
- if(Run_Flag==0)//南北绿灯东西红灯
- {
- Time_NB--;//南北绿灯时间倒计时
- Time_DX--;//东西红灯时间倒计时
- if(Time_NB<=0)
- {
- Time_NB=0;
- }
- }
- else if(Run_Flag==1)//南北黄灯东西红灯
- {
- Time_Y--;//黄灯时间倒计时
- Time_DX--;//东西红灯时间倒计时
- if(Time_Y<=0)
- {
- Time_Y=0;
- }
- }
- else if(Run_Flag==2)//南北黄灯东西黄灯
- {
- Time_DX--;//东西绿灯时间倒计时
- Time_NB--;//南北红灯时间倒计时
- if(Time_DX<=0)
- {
- Time_DX=0;
- }
- }
- else if(Run_Flag==3)//东西黄灯南北红灯
- {
- Time_Y--;//黄灯时间倒计时
- Time_NB--;//南北红灯时间倒计时
- if(Time_Y<=0)
- {
- Time_Y=0;
- }
- }
- }
- }
- }
复制代码
附件包括源代码和仿真文件。
交通灯.zip
(257.17 KB, 下载次数: 85)
|