国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
含緊急模式數碼管顯示30秒倒計時交通燈程序仿真與原理圖...
[打印本頁]
作者:
coolfire
時間:
2021-4-21 02:22
標題:
含緊急模式數碼管顯示30秒倒計時交通燈程序仿真與原理圖...
東西綠南北紅20秒,東西黃南北紅10秒完成后切換,緊急情況倒計時10秒,紅燈全亮,數碼管顯示倒計時
清單:DC005一個,220Ω電阻12個,3mmLED12個,最小系統配件一套,外加緊急按鍵一個
仿真原理圖如下(51單片機程序 原理圖 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, 售價: 5 E幣)
2021-4-21 02:20 上傳
點擊文件名下載附件
售價: 5 E幣
[記錄]
[
購買
]
單片機c源碼:
#include <reg52.h>
sbit WARNING_KEY=P3^2; //緊急按鈕
sbit NUM_SELECT_SW=P3^6; //數碼管十位片選
sbit NUM_SELECT_GW=P3^7; //數碼管個位片選
//這里說一下我遇到的一個問題,就是在仿真上的代碼中綠燈和黃燈的位定義和板子上是相反的即黃燈被當成了綠燈綠燈被當成了黃燈,然而第一塊板的時候和仿真同樣的代碼卻是能正常情況運行的
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 //定義數碼管數據端口
code unsigned char NumCodeTable[]={
0x3,0xcf,0x2a,0x4a,0xc6,0x52,0x12,0xcb,0x2,0x42};//定義共陽數碼管段碼
unsigned char SecondCount=60; //全局變量,每秒遞減,歸零重置60
unsigned char WarningCount=0; //全局變量,每秒遞減,緊急狀態過后重置10秒
//***************函數功能:秒累計****************************//
static void TimerOnSecond(void)
{
if(WarningCount>0)//當緊急模式計數沒到零還會繼續自減
{
WarningCount--;
return;
}
if(0==SecondCount)//當自減到零,重新變為60再繼續自減,反之還沒減到零就繼續一直自減直到為零
{
SecondCount=60;
}else{
SecondCount--;
}
return;
}
//************數碼管顯示倒計時用的顯示函數**************************//
static void NumDisplay(void)
{
unsigned char DelayCount=0;//技計數延時變量
unsigned char mSec;//用來存放需要數碼管顯示的數字
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;//計數延時
while(DelayCount--);
NUM_SELECT_SW=0;//關
NUM_SELECT_GW=1;//開
NUM_PORT=NumCodeTable[mSec%10];//個位
DelayCount=100;
while(DelayCount--);
NUM_SELECT_GW=0;//關
return;
}
//***********函數功能:交通燈狀態切換************************//
static void LightCheck(void)//東西放行30秒,南北放行三十秒為一個周期,共60秒
{
//前30秒周期,也就是東西方向通行周期
if(SecondCount>39) //60s周期的前20秒,因為倒計時所以是60-40 也就是東西方向綠燈亮
{
LED_RED_DX=1; //東西方向紅燈關閉
LED_YEL_DX=1; //東西方向黃燈關閉
LED_GRE_DX=0; //東西方向綠燈開啟
}
if((SecondCount<40)&&(SecondCount>29)) //60s周期的第21-30秒,也就是東西方向黃燈亮
{
LED_RED_DX=1; //東西方向紅燈關閉
LED_YEL_DX=0; //東西方向黃燈開啟
LED_GRE_DX=1; //東西方向綠燈關閉
}
if(SecondCount>29) //整個60s周期前30秒的南北方向只有紅燈開啟
{
LED_RED_NB=0; //南北方向紅燈開啟
LED_YEL_NB=1; //南北方向黃燈關閉
LED_GRE_NB=1; //南北方向綠燈關閉
}
//后30秒周期,也就是南北方向通行周期
if((SecondCount<30)&&(SecondCount>9))
{
LED_RED_NB=1; //南北方向紅燈關閉
LED_YEL_NB=1; //南北方向黃燈關閉
LED_GRE_NB=0; //南北方向綠燈開啟
}
if((SecondCount<10)&&(SecondCount>=0))
{
LED_RED_NB=1; //南北方向紅燈關閉
LED_YEL_NB=0; //南北方向黃燈開啟
LED_GRE_NB=1; //南北方向綠燈關閉
}
if(SecondCount<30) //整個60s周期后30秒的東西方向只有紅燈開啟
{
LED_RED_DX=0; //東西方向紅燈開啟
LED_YEL_DX=1; //東西方向黃燈關閉
LED_GRE_DX=1; //東西方向綠燈關閉
}
}
//****************函數功能:處理緊急模式**********************//
static void WarningCheck(void)
{
LED_RED_DX=0; //東西方向紅燈開啟
LED_YEL_DX=1; //東西方向黃燈關閉
LED_GRE_DX=1; //東西方向綠燈關閉
LED_RED_NB=0; //南北方向紅燈開啟
LED_YEL_NB=1; //南北方向黃燈關閉
LED_GRE_NB=1; //南北方向綠燈關閉
return;
}
//******************外部中斷0中斷服務函數***************************//
void INT_0(void) interrupt 0 //外部中斷0,緊急情況按鈕
{
while(!WARNING_KEY); //等待按鈕釋放
WarningCount=10; //預制10秒緊急計時
}
//***************定時器T0的中斷服務函數***************************//
void TIMER0(void) interrupt 1 //定時器0中斷處理
{
static unsigned int ms2sec;//該變量表示中斷次數
if(ms2sec<4000) //250μm*4000=1S,每次中斷只有25微秒,但可以通過4000次計數達到1秒
{
ms2sec++;//自加,中斷計數
}
else{
ms2sec=0;//中斷夠4000次清零
TimerOnSecond();
}
}
//***************函數功能:對系統進行初始化*************************//
void SystemInit(void)
{
//關閉所有燈
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,八位自動重裝定時,比較省心
//TL0逸出后會自動把TH0初值裝進TL0,因此只需在初始對TH0,TL0賦值,中斷程序就不用再對TH0,TL0賦值了
TH0=0x06;//高八位賦值
TL0=0x06;//低八位賦值
ET0=1;//定時器中斷0開關閉合
TR0=1;//啟動定時器
EX0=1;//開外部中斷0
EA=1;//總中斷允許
}
void main(void)
{
SystemInit();//先初始化一下系統
while(1)//再來個死循環
{
NumDisplay(); //處理數碼管顯示
if(WarningCount>0) //判斷緊急狀態倒計時完成沒有
{
WarningCheck(); //沒有處理完緊急狀態就繼續調用緊急處理
}else{
LightCheck(); //反之按照正常的狀態處理
}
}
}
復制代碼
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0