国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊(cè)
搜索

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

[復(fù)制鏈接]
樓主
coolfire 發(fā)表于 2021-4-21 02:22:40 | 只看該作者 |只看大圖 |倒序?yàn)g覽 |閱讀模式
東西綠南北紅20秒,東西黃南北紅10秒完成后切換,緊急情況倒計(jì)時(shí)10秒,紅燈全亮,數(shù)碼管顯示倒計(jì)時(shí)
清單:DC005一個(gè),220Ω電阻12個(gè),3mmLED12個(gè),最小系統(tǒng)配件一套,外加緊急按鍵一個(gè)

仿真原理圖如下(51單片機(jī)程序 原理圖 pcb文件 proteus仿真工程文件可到本帖附件中下載)
含緊急模式數(shù)碼管顯示30秒倒計(jì)時(shí)交通燈程序仿真與原理圖... 1.png 含緊急模式數(shù)碼管顯示30秒倒計(jì)時(shí)交通燈程序仿真與原理圖... 3.png 含緊急模式數(shù)碼管顯示30秒倒計(jì)時(shí)交通燈程序仿真與原理圖... 4.png

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

仿真文件+原理圖pcb下載: 含緊急模式交通燈.zip (1.04 MB, 售價(jià): 5 E幣)
單片機(jī)c源碼:
  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. //這里說(shuō)一下我遇到的一個(gè)問(wèn)題,就是在仿真上的代碼中綠燈和黃燈的位定義和板子上是相反的即黃燈被當(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};//定義共陽(yáng)數(shù)碼管段碼


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

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

  18. static void TimerOnSecond(void)
  19. {
  20.         
  21.         if(WarningCount>0)//當(dāng)緊急模式計(jì)數(shù)沒(méi)到零還會(huì)繼續(xù)自減
  22.         {
  23.                 WarningCount--;
  24.                 return;
  25.         }
  26.         if(0==SecondCount)//當(dāng)自減到零,重新變?yōu)?0再繼續(xù)自減,反之還沒(méi)減到零就繼續(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;//用來(lái)存放需要數(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;//開(kāi)
  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;//開(kāi)
  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;                //東西方向綠燈開(kāi)啟
  73.         }
  74.         
  75.         if((SecondCount<40)&&(SecondCount>29))                //60s周期的第21-30秒,也就是東西方向黃燈亮
  76.         {
  77.                 LED_RED_DX=1;                //東西方向紅燈關(guān)閉
  78.                 LED_YEL_DX=0;                //東西方向黃燈開(kāi)啟
  79.                 LED_GRE_DX=1;                //東西方向綠燈關(guān)閉
  80.         }

  81.         if(SecondCount>29)                //整個(gè)60s周期前30秒的南北方向只有紅燈開(kāi)啟
  82.         {
  83.                 LED_RED_NB=0;                //南北方向紅燈開(kāi)啟
  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;                //南北方向綠燈開(kāi)啟
  93.         }

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

  100.         if(SecondCount<30)                //整個(gè)60s周期后30秒的東西方向只有紅燈開(kāi)啟
  101.         {
  102.                 LED_RED_DX=0;                //東西方向紅燈開(kāi)啟
  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;                //東西方向紅燈開(kāi)啟
  111.                 LED_YEL_DX=1;                //東西方向黃燈關(guān)閉
  112.                 LED_GRE_DX=1;                //東西方向綠燈關(guān)閉

  113.                 LED_RED_NB=0;                //南北方向紅燈開(kāi)啟
  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微秒,但可以通過(guò)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開(kāi)關(guān)閉合
  153.         TR0=1;//啟動(dòng)定時(shí)器
  154.         EX0=1;//開(kāi)外部中斷0
  155.         EA=1;//總中斷允許
  156. }
  157. void main(void)
  158. {
  159.         SystemInit();//先初始化一下系統(tǒng)
  160.         while(1)//再來(lái)個(gè)死循環(huán)
  161.         {
  162.                 NumDisplay();                        //處理數(shù)碼管顯示

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


您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

手機(jī)版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 02:54

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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