|
東西綠南北紅20秒,東西黃南北紅10秒完成后切換,緊急情況倒計(jì)時(shí)10秒,紅燈全亮,數(shù)碼管顯示倒計(jì)時(shí)
清單:DC005一個(gè),220Ω電阻12個(gè),3mmLED12個(gè),最小系統(tǒng)配件一套,外加緊急按鍵一個(gè)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (42.65 KB, 下載次數(shù): 44)
下載附件
2021-4-17 18:16 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (36.95 KB, 下載次數(shù): 66)
下載附件
2021-4-17 18:16 上傳
51hei.png (43.28 KB, 下載次數(shù): 56)
下載附件
2021-4-17 18:16 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- sbit WARNING_KEY=P3^2; //緊急按鈕
- sbit NUM_SELECT_SW=P3^6; //數(shù)碼管十位片選
- sbit NUM_SELECT_GW=P3^7; //數(shù)碼管個(gè)位片選
- //這里說一下我遇到的一個(gè)問題,就是在仿真上的代碼中綠燈和黃燈的位定義和板子上是相反的即黃燈被當(dāng)成了綠燈綠燈被當(dāng)成了黃燈,然而第一塊板的時(shí)候和仿真同樣的代碼卻是能正常情況運(yùn)行的
- sbit LED_RED_DX=P2^0; //東西方向紅燈
- sbit LED_GRE_DX=P2^2; //東西方向綠燈
- sbit LED_YEL_DX=P2^1; //東西方向黃燈
- sbit LED_RED_NB=P2^4; //南北方向紅燈
- sbit LED_GRE_NB=P2^6; //南北方向綠燈
- sbit LED_YEL_NB=P2^5; //南北方向黃燈
- #define NUM_PORT P0 //定義數(shù)碼管數(shù)據(jù)端口
- code unsigned char NumCodeTable[]={
- 0x3,0xcf,0x2a,0x4a,0xc6,0x52,0x12,0xcb,0x2,0x42};//定義共陽數(shù)碼管段碼
- unsigned char SecondCount=60; //全局變量,每秒遞減,歸零重置60
- unsigned char WarningCount=0; //全局變量,每秒遞減,緊急狀態(tài)過后重置10秒
- //***************函數(shù)功能:秒累計(jì)****************************//
- static void TimerOnSecond(void)
- {
-
- if(WarningCount>0)//當(dāng)緊急模式計(jì)數(shù)沒到零還會(huì)繼續(xù)自減
- {
- WarningCount--;
- return;
- }
- if(0==SecondCount)//當(dāng)自減到零,重新變?yōu)?0再繼續(xù)自減,反之還沒減到零就繼續(xù)一直自減直到為零
- {
- SecondCount=60;
- }else{
- SecondCount--;
- }
- return;
- }
- //************數(shù)碼管顯示倒計(jì)時(shí)用的顯示函數(shù)**************************//
- static void NumDisplay(void)
- {
- unsigned char DelayCount=0;//技計(jì)數(shù)延時(shí)變量
- unsigned char mSec;//用來存放需要數(shù)碼管顯示的數(shù)字
- if(WarningCount>0)
- {
- mSec=WarningCount;
- }else{
- if(SecondCount>=30)
- {
- mSec=SecondCount-30;
- }else{
- mSec=SecondCount;
- }
- }
- NUM_SELECT_SW=1;//開
- NUM_PORT=NumCodeTable[mSec/10];//十位
- DelayCount=100;//計(jì)數(shù)延時(shí)
- while(DelayCount--);
- NUM_SELECT_SW=0;//關(guān)
- NUM_SELECT_GW=1;//開
- NUM_PORT=NumCodeTable[mSec%10];//個(gè)位
- DelayCount=100;
- while(DelayCount--);
- NUM_SELECT_GW=0;//關(guān)
-
- return;
- }
- //***********函數(shù)功能:交通燈狀態(tài)切換************************//
- static void LightCheck(void)//東西放行30秒,南北放行三十秒為一個(gè)周期,共60秒
- {
- //前30秒周期,也就是東西方向通行周期
-
- if(SecondCount>39) //60s周期的前20秒,因?yàn)榈褂?jì)時(shí)所以是60-40 也就是東西方向綠燈亮
- {
- LED_RED_DX=1; //東西方向紅燈關(guān)閉
- LED_YEL_DX=1; //東西方向黃燈關(guān)閉
- LED_GRE_DX=0; //東西方向綠燈開啟
- }
-
- if((SecondCount<40)&&(SecondCount>29)) //60s周期的第21-30秒,也就是東西方向黃燈亮
- {
- LED_RED_DX=1; //東西方向紅燈關(guān)閉
- LED_YEL_DX=0; //東西方向黃燈開啟
- LED_GRE_DX=1; //東西方向綠燈關(guān)閉
- }
- if(SecondCount>29) //整個(gè)60s周期前30秒的南北方向只有紅燈開啟
- {
- LED_RED_NB=0; //南北方向紅燈開啟
- LED_YEL_NB=1; //南北方向黃燈關(guān)閉
- LED_GRE_NB=1; //南北方向綠燈關(guān)閉
- }
- //后30秒周期,也就是南北方向通行周期
- if((SecondCount<30)&&(SecondCount>9))
- {
- LED_RED_NB=1; //南北方向紅燈關(guān)閉
- LED_YEL_NB=1; //南北方向黃燈關(guān)閉
- LED_GRE_NB=0; //南北方向綠燈開啟
- }
- if((SecondCount<10)&&(SecondCount>=0))
- {
- LED_RED_NB=1; //南北方向紅燈關(guān)閉
- LED_YEL_NB=0; //南北方向黃燈開啟
- LED_GRE_NB=1; //南北方向綠燈關(guān)閉
- }
- if(SecondCount<30) //整個(gè)60s周期后30秒的東西方向只有紅燈開啟
- {
- LED_RED_DX=0; //東西方向紅燈開啟
- LED_YEL_DX=1; //東西方向黃燈關(guān)閉
- LED_GRE_DX=1; //東西方向綠燈關(guān)閉
- }
- }
- //****************函數(shù)功能:處理緊急模式**********************//
- static void WarningCheck(void)
- {
- LED_RED_DX=0; //東西方向紅燈開啟
- LED_YEL_DX=1; //東西方向黃燈關(guān)閉
- LED_GRE_DX=1; //東西方向綠燈關(guān)閉
- LED_RED_NB=0; //南北方向紅燈開啟
- LED_YEL_NB=1; //南北方向黃燈關(guān)閉
- LED_GRE_NB=1; //南北方向綠燈關(guān)閉
- return;
- }
- //******************外部中斷0中斷服務(wù)函數(shù)***************************//
- void INT_0(void) interrupt 0 //外部中斷0,緊急情況按鈕
- {
- while(!WARNING_KEY); //等待按鈕釋放
- WarningCount=10; //預(yù)制10秒緊急計(jì)時(shí)
- }
- //***************定時(shí)器T0的中斷服務(wù)函數(shù)***************************//
- void TIMER0(void) interrupt 1 //定時(shí)器0中斷處理
- {
- static unsigned int ms2sec;//該變量表示中斷次數(shù)
- if(ms2sec<4000) //250μm*4000=1S,每次中斷只有25微秒,但可以通過4000次計(jì)數(shù)達(dá)到1秒
- {
- ms2sec++;//自加,中斷計(jì)數(shù)
- }
- else{
- ms2sec=0;//中斷夠4000次清零
- TimerOnSecond();
- }
- }
- //***************函數(shù)功能:對(duì)系統(tǒng)進(jìn)行初始化*************************//
- void SystemInit(void)
- {
- //關(guān)閉所有燈
- LED_RED_DX=1;
- LED_YEL_DX=1;
- LED_GRE_DX=1;
- LED_RED_NB=1;
- LED_YEL_NB=1;
- LED_GRE_NB=1;
- PCON=0x00;//控制寄存器
- TMOD=0x22;//用T0的工作模式2,八位自動(dòng)重裝定時(shí),比較省心
- //TL0逸出后會(huì)自動(dòng)把TH0初值裝進(jìn)TL0,因此只需在初始對(duì)TH0,TL0賦值,中斷程序就不用再對(duì)TH0,TL0賦值了
- TH0=0x06;//高八位賦值
- TL0=0x06;//低八位賦值
- ET0=1;//定時(shí)器中斷0開關(guān)閉合
- TR0=1;//啟動(dòng)定時(shí)器
- EX0=1;//開外部中斷0
- EA=1;//總中斷允許
- }
- void main(void)
- {
- SystemInit();//先初始化一下系統(tǒng)
- while(1)//再來個(gè)死循環(huán)
- {
- NumDisplay(); //處理數(shù)碼管顯示
- if(WarningCount>0) //判斷緊急狀態(tài)倒計(jì)時(shí)完成沒有
- {
- WarningCheck(); //沒有處理完緊急狀態(tài)就繼續(xù)調(diào)用緊急處理
- }else{
- LightCheck(); //反之按照正常的狀態(tài)處理
- }
- }
- }
復(fù)制代碼
51hei.png (6.92 KB, 下載次數(shù): 62)
下載附件
2021-4-17 18:16 上傳
所有資料51hei提供下載:
含緊急模式交通燈.zip
(1.07 MB, 下載次數(shù): 100)
2021-4-17 09:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|