編寫交通燈程序,下面程序能夠實現紅綠燈顯示及對應流水燈的顯示,但是怎么實現在黃燈時間流水燈閃爍不知道怎么調試了嘗試過黃燈流水燈亮時直接加入延時函數發現數碼管閃爍了,求大神指點實現黃燈閃爍。
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit EW_LED2=P0^3; //東西數碼管十位
- sbit EW_LED1=P0^2; //東西數碼管個位
- sbit SN_LED2=P0^1; //南北數碼管十位
- sbit SN_LED1=P0^0; //南北數碼管個位
- sbit SN_red=P1^2; //南北紅燈
- sbit SN_yellow=P1^3; //南北黃燈
- sbit SN_green=P1^4; //南北綠燈
- sbit EW_red=P1^5; //東西紅燈
- sbit EW_yellow=P1^6; //東西黃燈
- sbit EW_green=P1^7; //東西綠燈
- char Time_EW; //東西數碼管顯示時間
- char Time_SN; //南北數碼管顯示時間
- uchar EW=5,SN=10; //南北通行狀態數碼管初始化
- uchar EW1=10,SN1=5; //南北通行狀態數碼管初始化
- uchar code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9數碼管端段碼(共陽極)
- void delay_ms(uint x)//延時函數
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Display(void) //數碼管顯示函數
- {
- char h,l;
- h=Time_EW/10;
- l=Time_EW%10;
- P3=table[l];EW_LED2=1;delay_ms(1);EW_LED2=0;
- P3=table[h];EW_LED1=1;delay_ms(1);EW_LED1=0;//東西方向數碼管秒數顯示
-
- h=Time_SN/10;
- l=Time_SN%10;
- P2=table[l];SN_LED2=1;delay_ms(1);SN_LED2=0;
- P2=table[h];SN_LED1=1;delay_ms(1);SN_LED1=0;//南北方向數碼管秒數顯示
- }
- void main(void)
- {
- EA=1;
- ET0=1;
- TMOD=0x01;
- TL0=0xb0;
- TH0=0x3c;
- TR0=1;
- while(1)
- //狀態1:東西綠燈5秒,南北紅燈10秒
- {
- Time_EW=EW; //數碼管賦初值
- Time_SN=SN;
- while(Time_SN>=6)
- {
- SN_yellow=0; //南北黃燈滅
- SN_red=1; //南北紅燈亮
- SN_green=0; //南北綠燈滅
- EW_yellow=0; //東西黃燈滅
- EW_red=0; //東西紅燈滅
- EW_green=1; //東西綠燈亮
- Display(); //數碼管顯示
- }
- //狀態2:東西黃燈5秒,南北紅燈5秒
- P1=0x00; //清除燈的顯示
- if(Time_SN==5)
- Time_EW=5;
- while(Time_SN>=1)
- {
- SN_yellow=0; //南北黃燈滅
- SN_red=1; //南北紅燈亮
- SN_green=0; //南北綠燈滅
- EW_yellow=1; //東西黃燈亮
- EW_red=0; //東西紅燈滅
- EW_green=0; //東西綠燈滅
- Display(); //數碼管顯示
- }
- //狀態3:東西紅燈10秒,南北綠燈5秒
- Time_EW=EW1; //數碼管賦初值
- Time_SN=SN1;
- while(Time_EW>=6)
- {
- SN_yellow=0; //南北黃燈滅
- SN_red=0; //南北紅燈滅
- SN_green=1; //南北綠燈亮
- EW_yellow=0; //東西黃燈滅
- EW_red=1; //東西紅燈亮
- EW_green=0; //東西綠燈滅
- Display(); //數碼管顯示
- }
- //狀態4:東西紅燈5秒,南北黃燈5秒
- P1=0x00; //清除燈的顯示
- if(Time_EW==5)
- Time_SN=5;
- while(Time_EW>=1)
- {
- SN_yellow=1; //南北黃燈亮
- SN_red=0; //南北紅燈滅
- SN_green=0; //南北綠燈滅
- EW_yellow=0; //東西黃燈滅
- EW_red=1; //東西紅燈亮
- EW_green=0; //東西綠燈滅
- Display(); //數碼管顯示
- }
- }
- }
- void timer0() interrupt 1
- {
- uchar count;
- TL0=0xb0;
- TH0=0x3c;
- count++;
- if(count==20)
- {
- Time_EW--;
- Time_SN--;
- count=0;
- }
- }
復制代碼
|