東西綠南北紅20秒,東西黃南北紅10秒完成后切換,緊急情況倒計(jì)時(shí)10秒,紅燈全亮,數(shù)碼管顯示倒計(jì)時(shí)
清單:DC005一個(gè),220Ω電阻12個(gè),3mmLED12個(gè),最小系統(tǒng)配件一套,外加緊急按鍵一個(gè)
仿真原理圖如下(51單片機(jī)程序 原理圖 pcb文件 proteus仿真工程文件可到本帖附件中下載)
1.png (33.31 KB)
下載附件
2021-4-21 02:16 上傳
3.png (91 KB)
下載附件
2021-4-21 02:16 上傳
4.png (92.67 KB)
下載附件
2021-4-21 02:16 上傳
2.png (2.8 KB)
下載附件
2021-4-21 02:16 上傳
仿真文件+原理圖pcb下載:
含緊急模式交通燈.zip
(1.04 MB, 售價(jià): 5 E幣)
單片機(jī)c源碼:
- #include <reg52.h>
- sbit WARNING_KEY=P3^2; //緊急按鈕
- sbit NUM_SELECT_SW=P3^6; //數(shù)碼管十位片選
- sbit NUM_SELECT_GW=P3^7; //數(shù)碼管個(gè)位片選
- //這里說(shuō)一下我遇到的一個(gè)問(wèn)題,就是在仿真上的代碼中綠燈和黃燈的位定義和板子上是相反的即黃燈被當(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};//定義共陽(yáng)數(shù)碼管段碼
- unsigned char SecondCount=60; //全局變量,每秒遞減,歸零重置60
- unsigned char WarningCount=0; //全局變量,每秒遞減,緊急狀態(tài)過(guò)后重置10秒
- //***************函數(shù)功能:秒累計(jì)****************************//
- static void TimerOnSecond(void)
- {
-
- if(WarningCount>0)//當(dāng)緊急模式計(jì)數(shù)沒(méi)到零還會(huì)繼續(xù)自減
- {
- WarningCount--;
- return;
- }
- if(0==SecondCount)//當(dāng)自減到零,重新變?yōu)?0再繼續(xù)自減,反之還沒(méi)減到零就繼續(xù)一直自減直到為零
- {
- SecondCount=60;
- }else{
- SecondCount--;
- }
- return;
- }
- //************數(shù)碼管顯示倒計(jì)時(shí)用的顯示函數(shù)**************************//
- static void NumDisplay(void)
- {
- unsigned char DelayCount=0;//技計(jì)數(shù)延時(shí)變量
- unsigned char mSec;//用來(lái)存放需要數(shù)碼管顯示的數(shù)字
- if(WarningCount>0)
- {
- mSec=WarningCount;
- }else{
- if(SecondCount>=30)
- {
- mSec=SecondCount-30;
- }else{
- mSec=SecondCount;
- }
- }
- NUM_SELECT_SW=1;//開(kāi)
- NUM_PORT=NumCodeTable[mSec/10];//十位
- DelayCount=100;//計(jì)數(shù)延時(shí)
- while(DelayCount--);
- NUM_SELECT_SW=0;//關(guān)
- NUM_SELECT_GW=1;//開(kāi)
- 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; //東西方向綠燈開(kāi)啟
- }
-
- if((SecondCount<40)&&(SecondCount>29)) //60s周期的第21-30秒,也就是東西方向黃燈亮
- {
- LED_RED_DX=1; //東西方向紅燈關(guān)閉
- LED_YEL_DX=0; //東西方向黃燈開(kāi)啟
- LED_GRE_DX=1; //東西方向綠燈關(guān)閉
- }
- if(SecondCount>29) //整個(gè)60s周期前30秒的南北方向只有紅燈開(kāi)啟
- {
- LED_RED_NB=0; //南北方向紅燈開(kāi)啟
- 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; //南北方向綠燈開(kāi)啟
- }
- if((SecondCount<10)&&(SecondCount>=0))
- {
- LED_RED_NB=1; //南北方向紅燈關(guān)閉
- LED_YEL_NB=0; //南北方向黃燈開(kāi)啟
- LED_GRE_NB=1; //南北方向綠燈關(guān)閉
- }
- if(SecondCount<30) //整個(gè)60s周期后30秒的東西方向只有紅燈開(kāi)啟
- {
- LED_RED_DX=0; //東西方向紅燈開(kāi)啟
- LED_YEL_DX=1; //東西方向黃燈關(guān)閉
- LED_GRE_DX=1; //東西方向綠燈關(guān)閉
- }
- }
- //****************函數(shù)功能:處理緊急模式**********************//
- static void WarningCheck(void)
- {
- LED_RED_DX=0; //東西方向紅燈開(kāi)啟
- LED_YEL_DX=1; //東西方向黃燈關(guān)閉
- LED_GRE_DX=1; //東西方向綠燈關(guān)閉
- LED_RED_NB=0; //南北方向紅燈開(kāi)啟
- 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微秒,但可以通過(guò)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開(kāi)關(guān)閉合
- TR0=1;//啟動(dòng)定時(shí)器
- EX0=1;//開(kāi)外部中斷0
- EA=1;//總中斷允許
- }
- void main(void)
- {
- SystemInit();//先初始化一下系統(tǒng)
- while(1)//再來(lái)個(gè)死循環(huán)
- {
- NumDisplay(); //處理數(shù)碼管顯示
- if(WarningCount>0) //判斷緊急狀態(tài)倒計(jì)時(shí)完成沒(méi)有
- {
- WarningCheck(); //沒(méi)有處理完緊急狀態(tài)就繼續(xù)調(diào)用緊急處理
- }else{
- LightCheck(); //反之按照正常的狀態(tài)處理
- }
- }
- }
復(fù)制代碼
【必讀】版權(quán)免責(zé)聲明
1、本主題所有言論和內(nèi)容純屬會(huì)員個(gè)人意見(jiàn),與本論壇立場(chǎng)無(wú)關(guān)。2、本站對(duì)所發(fā)內(nèi)容真實(shí)性、客觀性、可用性不做任何保證也不負(fù)任何責(zé)任,網(wǎng)友之間僅出于學(xué)習(xí)目的進(jìn)行交流。3、對(duì)提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請(qǐng)勿將該數(shù)字內(nèi)容進(jìn)行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學(xué)習(xí)所提供,使用后發(fā)生的一切問(wèn)題與本站無(wú)關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準(zhǔn)確性、安全性和完整性;同時(shí)本網(wǎng)站也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來(lái),僅供學(xué)習(xí)用途使用,請(qǐng)務(wù)必下載后兩小時(shí)內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請(qǐng)及時(shí)聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|