||
//晶振:11.0592M T1-250微秒溢出一次
/*變量的定義:
show_val_sn,show_val_ew: 顯示的值0-59
state_val_sn,state_val_ew: 狀態值 南北方向0-綠燈亮;1-黃燈亮;2-紅燈亮
T1_cnt: 定時器計數溢出數
cnt_sn,cnt_ew: 倒計時的數值
init_sn[3],init_ew[3] 倒計時
led_seg_code:數碼管7 段碼
*/
#include "reg51.h"
sbit SN_green=P3^2 ;//南北方向綠燈
sbit SN_yellow=P3^1 ;//南北方向黃燈
sbit SN_red=P3^0 ;//南北方向紅燈
sbit EW_green=P3^5 ;//東西方向綠燈
sbit EW_yellow=P3^4 ;//東西方向黃燈
sbit EW_red=P3^3 ;//東西方向紅燈
unsigned char data cnt_sn,cnt_ew;
unsigned int data T1_cnt;
unsigned char data state_val_sn,state_val_ew;
char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char code init_sn[3]={24,4,29};
char code init_ew[3]={29,24,4};
//------------------------
void delay(unsigned int i)//延時
{ while(--i); }
//------------------------
void led_show(unsigned int u,unsigned int v)
{ unsigned char i;
i=u%10; //暫存個位
P0=led_seg_code[i];
P2=0xbf;
delay(100); //延時
i=u%100/10; //暫存十位
P0=led_seg_code[i];
P2=0x7f;
delay(100); //延時
i=v%10; //暫存個位
P0=led_seg_code[i];
P2=0xfe;
delay(100); //延時
i=v%100/10; //暫存十位
P0=led_seg_code[i];
P2=0xfd;
delay(100); //延時
}
//-------------------------
void timer1() interrupt 3 //T1中斷
{ T1_cnt++;
if(T1_cnt>3999) //如果計數>3999, 計時1s
{ T1_cnt=0;
if (cnt_sn!=0) //南北方向計時
{ cnt_sn--; }
else
{ state_val_sn++;
if (state_val_sn>2) state_val_sn=0;
cnt_sn=init_sn[state_val_sn];
switch (state_val_sn) //根據狀態值,刷新各信號燈的狀態
{ case 0: SN_green=0 ;//南北方向綠燈
SN_yellow=1 ;//南北方向黃燈
SN_red=1 ;//南北方向紅燈
break;
case 1: SN_green=1 ;//南北方向綠燈
SN_yellow=0 ;//南北方向黃燈
SN_red=1 ;//南北方向紅燈
break;
case 2:SN_green=1 ;//南北方向綠燈
SN_yellow=1 ;//南北方向黃燈
SN_red=0 ;//南北方向紅燈
break;
}
}
if (cnt_ew!=0) //東西方向計時
{ cnt_ew--; }
else
{ state_val_ew++;
if (state_val_ew>2) state_val_ew=0;
cnt_ew=init_ew[state_val_ew];
switch (state_val_ew) //根據狀態值,刷新各信號燈的狀態
{ case 0: EW_green=1 ;//東西方向綠燈
EW_yellow=1;//東西方向黃燈
EW_red=0 ;//東西方向紅燈
break;
case 1: EW_green=0 ;//東西方向綠燈
EW_yellow=1 ;//東西方向黃燈
EW_red=1 ;//東西方向紅燈
break;
case 2: EW_green=1 ;//東西方向綠燈
EW_yellow=0 ;//東西方向黃燈
EW_red=1 ;//東西方向紅燈
break;
}
}
}
}
//-------------------------
main()
{//初始化各變量
cnt_sn=init_sn[0];
cnt_ew=init_ew[0];
T1_cnt=0;
state_val_sn=0; //啟動后,默認工作在序號為1 的狀態
state_val_ew=0;
//初始化各燈的狀態
SN_green=0 ;//南北方向綠燈亮
SN_yellow=1 ;//南北方向黃燈滅
SN_red=1 ;//南北方向紅燈滅
EW_green=1 ;//東西方向綠燈滅
EW_yellow=1;//東西方向黃燈滅
EW_red=0 ;//東西方向紅燈亮
//初始化51的寄存器
TMOD=0x20;//用T1計時 8位自動裝載定時模式
TH1=0x19;//0x4b; //500微秒溢出一次; 250=(256-x)*12/11.0592 -> x= 230.4
TL1=0x19;
EA=1; //開中斷
ET1=1;
TR1=1; //開定時器T1
while(1)
{ led_show(cnt_sn,cnt_ew);}}
//主程序結束