找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4981|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

含緊急模式數(shù)碼管顯示30秒倒計(jì)時(shí)交通燈程序仿真與原理圖PCB文件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
東西綠南北紅20秒,東西黃南北紅10秒完成后切換,緊急情況倒計(jì)時(shí)10秒,紅燈全亮,數(shù)碼管顯示倒計(jì)時(shí)
清單:DC005一個(gè),220Ω電阻12個(gè),3mmLED12個(gè),最小系統(tǒng)配件一套,外加緊急按鍵一個(gè)

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:

  1. #include <reg52.h>


  2. sbit WARNING_KEY=P3^2;                //緊急按鈕

  3. sbit NUM_SELECT_SW=P3^6;                //數(shù)碼管十位片選
  4. sbit NUM_SELECT_GW=P3^7;                //數(shù)碼管個(gè)位片選
  5. //這里說一下我遇到的一個(gè)問題,就是在仿真上的代碼中綠燈和黃燈的位定義和板子上是相反的即黃燈被當(dāng)成了綠燈綠燈被當(dāng)成了黃燈,然而第一塊板的時(shí)候和仿真同樣的代碼卻是能正常情況運(yùn)行的
  6. sbit LED_RED_DX=P2^0;                //東西方向紅燈
  7. sbit LED_GRE_DX=P2^2;                //東西方向綠燈
  8. sbit LED_YEL_DX=P2^1;                //東西方向黃燈

  9. sbit LED_RED_NB=P2^4;                //南北方向紅燈
  10. sbit LED_GRE_NB=P2^6;                //南北方向綠燈
  11. sbit LED_YEL_NB=P2^5;                //南北方向黃燈


  12. #define NUM_PORT P0                        //定義數(shù)碼管數(shù)據(jù)端口


  13. code unsigned char NumCodeTable[]={
  14. 0x3,0xcf,0x2a,0x4a,0xc6,0x52,0x12,0xcb,0x2,0x42};//定義共陽數(shù)碼管段碼


  15. unsigned char SecondCount=60;        //全局變量,每秒遞減,歸零重置60
  16. unsigned char WarningCount=0;        //全局變量,每秒遞減,緊急狀態(tài)過后重置10秒





  17. //***************函數(shù)功能:秒累計(jì)****************************//

  18. static void TimerOnSecond(void)
  19. {
  20.        
  21.         if(WarningCount>0)//當(dāng)緊急模式計(jì)數(shù)沒到零還會(huì)繼續(xù)自減
  22.         {
  23.                 WarningCount--;
  24.                 return;
  25.         }
  26.         if(0==SecondCount)//當(dāng)自減到零,重新變?yōu)?0再繼續(xù)自減,反之還沒減到零就繼續(xù)一直自減直到為零
  27.         {
  28.                 SecondCount=60;
  29.         }else{
  30.                 SecondCount--;
  31.         }
  32.         return;
  33. }






  34. //************數(shù)碼管顯示倒計(jì)時(shí)用的顯示函數(shù)**************************//

  35. static void NumDisplay(void)
  36. {
  37.         unsigned char DelayCount=0;//技計(jì)數(shù)延時(shí)變量
  38.         unsigned char mSec;//用來存放需要數(shù)碼管顯示的數(shù)字
  39.         if(WarningCount>0)
  40.         {
  41.                 mSec=WarningCount;
  42.         }else{
  43.                 if(SecondCount>=30)
  44.                 {
  45.                         mSec=SecondCount-30;
  46.                 }else{
  47.                         mSec=SecondCount;
  48.                 }
  49.         }
  50.         NUM_SELECT_SW=1;//開
  51.         NUM_PORT=NumCodeTable[mSec/10];//十位
  52.         DelayCount=100;//計(jì)數(shù)延時(shí)
  53.         while(DelayCount--);
  54.         NUM_SELECT_SW=0;//關(guān)

  55.         NUM_SELECT_GW=1;//開
  56.         NUM_PORT=NumCodeTable[mSec%10];//個(gè)位
  57.         DelayCount=100;
  58.         while(DelayCount--);
  59.         NUM_SELECT_GW=0;//關(guān)
  60.        
  61.         return;
  62. }





  63. //***********函數(shù)功能:交通燈狀態(tài)切換************************//

  64. static void LightCheck(void)//東西放行30秒,南北放行三十秒為一個(gè)周期,共60秒
  65. {
  66.         //前30秒周期,也就是東西方向通行周期
  67.        
  68.         if(SecondCount>39)                //60s周期的前20秒,因?yàn)榈褂?jì)時(shí)所以是60-40  也就是東西方向綠燈亮
  69.         {
  70.                 LED_RED_DX=1;                //東西方向紅燈關(guān)閉
  71.                 LED_YEL_DX=1;                //東西方向黃燈關(guān)閉
  72.                 LED_GRE_DX=0;                //東西方向綠燈開啟
  73.         }
  74.        
  75.         if((SecondCount<40)&&(SecondCount>29))                //60s周期的第21-30秒,也就是東西方向黃燈亮
  76.         {
  77.                 LED_RED_DX=1;                //東西方向紅燈關(guān)閉
  78.                 LED_YEL_DX=0;                //東西方向黃燈開啟
  79.                 LED_GRE_DX=1;                //東西方向綠燈關(guān)閉
  80.         }

  81.         if(SecondCount>29)                //整個(gè)60s周期前30秒的南北方向只有紅燈開啟
  82.         {
  83.                 LED_RED_NB=0;                //南北方向紅燈開啟
  84.                 LED_YEL_NB=1;                //南北方向黃燈關(guān)閉
  85.                 LED_GRE_NB=1;                //南北方向綠燈關(guān)閉
  86.         }

  87.         //后30秒周期,也就是南北方向通行周期

  88.         if((SecondCount<30)&&(SecondCount>9))
  89.         {
  90.                 LED_RED_NB=1;                //南北方向紅燈關(guān)閉
  91.                 LED_YEL_NB=1;                //南北方向黃燈關(guān)閉
  92.                 LED_GRE_NB=0;                //南北方向綠燈開啟
  93.         }

  94.         if((SecondCount<10)&&(SecondCount>=0))
  95.         {
  96.                 LED_RED_NB=1;                //南北方向紅燈關(guān)閉
  97.                 LED_YEL_NB=0;                //南北方向黃燈開啟
  98.                 LED_GRE_NB=1;                //南北方向綠燈關(guān)閉
  99.         }

  100.         if(SecondCount<30)                //整個(gè)60s周期后30秒的東西方向只有紅燈開啟
  101.         {
  102.                 LED_RED_DX=0;                //東西方向紅燈開啟
  103.                 LED_YEL_DX=1;                //東西方向黃燈關(guān)閉
  104.                 LED_GRE_DX=1;                //東西方向綠燈關(guān)閉
  105.         }
  106. }







  107. //****************函數(shù)功能:處理緊急模式**********************//

  108. static void WarningCheck(void)
  109. {

  110.                 LED_RED_DX=0;                //東西方向紅燈開啟
  111.                 LED_YEL_DX=1;                //東西方向黃燈關(guān)閉
  112.                 LED_GRE_DX=1;                //東西方向綠燈關(guān)閉

  113.                 LED_RED_NB=0;                //南北方向紅燈開啟
  114.                 LED_YEL_NB=1;                //南北方向黃燈關(guān)閉
  115.                 LED_GRE_NB=1;                //南北方向綠燈關(guān)閉

  116.                 return;
  117. }






  118. //******************外部中斷0中斷服務(wù)函數(shù)***************************//

  119. void INT_0(void) interrupt 0                //外部中斷0,緊急情況按鈕
  120. {
  121.         while(!WARNING_KEY);        //等待按鈕釋放
  122.         WarningCount=10;                //預(yù)制10秒緊急計(jì)時(shí)
  123. }








  124. //***************定時(shí)器T0的中斷服務(wù)函數(shù)***************************//


  125. void TIMER0(void) interrupt 1        //定時(shí)器0中斷處理
  126. {
  127.         static unsigned int ms2sec;//該變量表示中斷次數(shù)

  128.         if(ms2sec<4000)  //250μm*4000=1S,每次中斷只有25微秒,但可以通過4000次計(jì)數(shù)達(dá)到1秒
  129.         {
  130.                 ms2sec++;//自加,中斷計(jì)數(shù)
  131.         }
  132.         else{
  133.                 ms2sec=0;//中斷夠4000次清零
  134.                 TimerOnSecond();
  135.         }
  136. }









  137. //***************函數(shù)功能:對(duì)系統(tǒng)進(jìn)行初始化*************************//


  138. void SystemInit(void)
  139. {

  140.         //關(guān)閉所有燈               
  141.         LED_RED_DX=1;       
  142.         LED_YEL_DX=1;
  143.         LED_GRE_DX=1;               
  144.         LED_RED_NB=1;               
  145.         LED_YEL_NB=1;       
  146.         LED_GRE_NB=1;

  147.         PCON=0x00;//控制寄存器
  148.         TMOD=0x22;//用T0的工作模式2,八位自動(dòng)重裝定時(shí),比較省心
  149.         //TL0逸出后會(huì)自動(dòng)把TH0初值裝進(jìn)TL0,因此只需在初始對(duì)TH0,TL0賦值,中斷程序就不用再對(duì)TH0,TL0賦值了
  150.         TH0=0x06;//高八位賦值
  151.         TL0=0x06;//低八位賦值
  152.         ET0=1;//定時(shí)器中斷0開關(guān)閉合
  153.         TR0=1;//啟動(dòng)定時(shí)器
  154.         EX0=1;//開外部中斷0
  155.         EA=1;//總中斷允許
  156. }






  157. void main(void)
  158. {
  159.         SystemInit();//先初始化一下系統(tǒng)
  160.         while(1)//再來個(gè)死循環(huán)
  161.         {
  162.                 NumDisplay();                        //處理數(shù)碼管顯示

  163.                 if(WarningCount>0)                //判斷緊急狀態(tài)倒計(jì)時(shí)完成沒有
  164.                 {
  165.                         WarningCheck();                //沒有處理完緊急狀態(tài)就繼續(xù)調(diào)用緊急處理
  166.                 }else{
  167.                         LightCheck();                //反之按照正常的狀態(tài)處理
  168.                 }
  169.         }
  170. }
復(fù)制代碼

所有資料51hei提供下載:
含緊急模式交通燈.zip (1.07 MB, 下載次數(shù): 100)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

樓主
ID:904666 發(fā)表于 2021-4-18 22:26 | 只看該作者
pcb的走線還可以美觀一點(diǎn)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表