一、功能簡介
本項目使用Proteus8.12仿真STM32單片機控制器,使用數(shù)碼管、按鍵、交通信號燈模塊等。
系統(tǒng)運行后,交通燈系統(tǒng)開始運行,數(shù)碼管顯示初始時間,默認南北綠燈5S,東西紅燈8S,綠燈過后南北黃燈3秒;然后切換東西綠燈5S,南北紅燈8S,綠燈過后南北黃燈3秒;如此循環(huán)??墒褂肒1鍵進入紅綠燈時間設置,K2和K3進行加減調(diào)節(jié),設定好后,K4鍵確定并繼續(xù)運行。在運行過程中,可通過K2鍵禁止通行,此時東南西北方向紅燈亮,K3鍵允許南北通行,此時南北綠燈亮,東西紅燈亮。K4鍵允許東西通行,此時南北紅燈亮,東西綠燈亮。此時可按下K1鍵返回交通燈自動控制模式運行。
主要功能如下:
(1)東西南北紅黃綠燈控制;
(2)交通燈時間設置;
(3)數(shù)碼管顯示;
(4)突發(fā)狀況交通燈控制。
二、軟件設計
/*******************************************************************************
- 函 數(shù) 名 : TIM2_IRQHandler
- 函數(shù)功能 : TIM2中斷函數(shù)
- 輸 入 : 無
- 輸 出 : 無
*******************************************************************************/
void TIM2_IRQHandler(void)
{
static u8 i=0;
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
i++;
if(i>=100)//間隔1S
{
i=0;
sys_ctrl.sec++;
if(sys_ctrl.led_sta==0)//南北綠燈,東西紅燈時間
{
sys_ctrl.nbled_time=sys_ctrl.gled_time-sys_ctrl.sec;
sys_ctrl.dxled_time=sys_ctrl.rled_time-sys_ctrl.sec;
//LED燈
NB_GLED=1;NB_YLED=0;NB_RLED=0;
DX_GLED=0;DX_YLED=0;DX_RLED=1;
if(sys_ctrl.sec>=sys_ctrl.gled_time)
{
sys_ctrl.sec=0;
sys_ctrl.led_sta=1;
sys_ctrl.nbled_time=YLED_TIME-sys_ctrl.sec;
sys_ctrl.dxled_time=YLED_TIME-sys_ctrl.sec;
//LED燈
NB_GLED=0;NB_YLED=1;NB_RLED=0;
DX_GLED=0;DX_YLED=0;DX_RLED=1;
}
}
else if(sys_ctrl.led_sta==1)//南北黃燈,東西紅燈時間
{
sys_ctrl.nbled_time=YLED_TIME-sys_ctrl.sec;
sys_ctrl.dxled_time=YLED_TIME-sys_ctrl.sec;
if(sys_ctrl.sec>=YLED_TIME)
{
sys_ctrl.sec=0;
sys_ctrl.led_sta=2;
sys_ctrl.nbled_time=sys_ctrl.rled_time-sys_ctrl.sec;
sys_ctrl.dxled_time=sys_ctrl.gled_time-sys_ctrl.sec;
//LED燈
NB_GLED=0;NB_YLED=0;NB_RLED=1;
DX_GLED=1;DX_YLED=0;DX_RLED=0;
}
}
else if(sys_ctrl.led_sta==2)//南北紅燈,東西綠燈時間
{
sys_ctrl.nbled_time=sys_ctrl.rled_time-sys_ctrl.sec;
sys_ctrl.dxled_time=sys_ctrl.gled_time-sys_ctrl.sec;
if(sys_ctrl.sec>=sys_ctrl.gled_time)
{
sys_ctrl.sec=0;
sys_ctrl.led_sta=3;
sys_ctrl.nbled_time=YLED_TIME-sys_ctrl.sec;
sys_ctrl.dxled_time=YLED_TIME-sys_ctrl.sec;
//LED燈
NB_GLED=0;NB_YLED=0;NB_RLED=1;
DX_GLED=0;DX_YLED=1;DX_RLED=0;
}
}
else if(sys_ctrl.led_sta==3)//南北紅燈,東西黃燈時間
{
sys_ctrl.nbled_time=YLED_TIME-sys_ctrl.sec;
sys_ctrl.dxled_time=YLED_TIME-sys_ctrl.sec;
if(sys_ctrl.sec>=YLED_TIME)
{
sys_ctrl.sec=0;
sys_ctrl.led_sta=0;
sys_ctrl.nbled_time=sys_ctrl.gled_time-sys_ctrl.sec;
sys_ctrl.dxled_time=sys_ctrl.rled_time-sys_ctrl.sec;
//LED燈
NB_GLED=1;NB_YLED=0;NB_RLED=0;
DX_GLED=0;DX_YLED=0;DX_RLED=1;
}
}
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
//系統(tǒng)數(shù)據(jù)顯示
void sys_data_show(void)
{
u8 buf[8];
//正常顯示
while(sys_ctrl.mode==0)
{
buf[0]=gsmg_code[sys_ctrl.nbled_time/10];
buf[1]=gsmg_code[sys_ctrl.nbled_time%10];
buf[2]=gsmg_code[sys_ctrl.nbled_time/10];
buf[3]=gsmg_code[sys_ctrl.nbled_time%10];
buf[4]=gsmg_code[sys_ctrl.dxled_time/10];
buf[5]=gsmg_code[sys_ctrl.dxled_time%10];
buf[6]=gsmg_code[sys_ctrl.dxled_time/10];
buf[7]=gsmg_code[sys_ctrl.dxled_time%10];
smg_display(buf,1);
break;
}
//時間設置模式顯示
while(sys_ctrl.mode==1)
{
buf[0]=gsmg_code[sys_ctrl.gled_time/10];
buf[1]=gsmg_code[sys_ctrl.gled_time%10];
buf[2]=gsmg_code[sys_ctrl.gled_time/10];
buf[3]=gsmg_code[sys_ctrl.gled_time%10];
buf[4]=gsmg_code[sys_ctrl.rled_time/10];
buf[5]=gsmg_code[sys_ctrl.rled_time%10];
buf[6]=gsmg_code[sys_ctrl.rled_time/10];
buf[7]=gsmg_code[sys_ctrl.rled_time%10];
smg_display(buf,1);
break;
}
//禁止通行顯示、//南北通行顯示、//東西通行顯示
while(sys_ctrl.mode==2 || sys_ctrl.mode==3 || sys_ctrl.mode==4)
{
buf[0]=0x40;
buf[1]=0x40;
buf[2]=0x40;
buf[3]=0x40;
buf[4]=0x40;
buf[5]=0x40;
buf[6]=0x40;
buf[7]=0x40;
smg_display(buf,1);
break;
}
}
//系統(tǒng)數(shù)據(jù)設置
void sys_data_set(void)
{
u8 key=0;
key=KEY_Scan(0);
if(sys_ctrl.mode==0)
{
//時間設置
if(key==KEY1_PRESS)
{
sys_ctrl.mode=1;
TIM_Cmd(TIM2,DISABLE);//關(guān)閉定時器
}
}
//非時間設置模式
if(sys_ctrl.mode!=1)
{
if(key==KEY1_PRESS)
{
sys_ctrl.mode=0;
TIM_Cmd(TIM2,ENABLE);//打開定時器
}
//禁止通行
else if(key==KEY2_PRESS)
{
sys_ctrl.mode=2;
TIM_Cmd(TIM2,DISABLE);//關(guān)閉定時器
//LED燈
NB_GLED=0;NB_YLED=0;NB_RLED=1;
DX_GLED=0;DX_YLED=0;DX_RLED=1;
}
//南北通行
else if(key==KEY3_PRESS)
{
sys_ctrl.mode=3;
TIM_Cmd(TIM2,DISABLE);//關(guān)閉定時器
//LED燈
NB_GLED=1;NB_YLED=0;NB_RLED=0;
DX_GLED=0;DX_YLED=0;DX_RLED=1;
}
//東西通行
else if(key==KEY4_PRESS)
{
sys_ctrl.mode=4;
TIM_Cmd(TIM2,DISABLE);//關(guān)閉定時器
//LED燈
NB_GLED=0;NB_YLED=0;NB_RLED=1;
DX_GLED=1;DX_YLED=0;DX_RLED=0;
}
}
//時間設置模式
if(sys_ctrl.mode==1)
{
if(key==KEY2_PRESS)//加
{
sys_ctrl.gled_time++;
if(sys_ctrl.gled_time>90)sys_ctrl.gled_time=0;
sys_ctrl.rled_time=sys_ctrl.gled_time+YLED_TIME;
}
else if(key==KEY3_PRESS)//減
{
sys_ctrl.gled_time--;
if(sys_ctrl.gled_time<0)sys_ctrl.gled_time=90;
sys_ctrl.rled_time=sys_ctrl.gled_time+YLED_TIME;
}
else if(key==KEY4_PRESS)//確定
{
sys_ctrl.mode=0;
TIM_Cmd(TIM2,ENABLE);//打開定時器
}
}
}
//應用控制系統(tǒng)
void appdemo_show(void)
{
LED_Init();
KEY_Init();
smg_init();
SMG_DATAPORT(0);
sys_parm_init();//系統(tǒng)參數(shù)初始化
TIM2_Init(500-1,79);//定時10ms
while(1)
{
sys_data_show();//系統(tǒng)數(shù)據(jù)顯示
sys_data_set();//系統(tǒng)數(shù)據(jù)設置
}
}
三、實驗現(xiàn)象
評論
查看更多