久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4937|回復: 1
收起左側

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

[復制鏈接]
ID:907140 發表于 2021-4-17 09:54 | 顯示全部樓層 |閱讀模式
東西綠南北紅20秒,東西黃南北紅10秒完成后切換,緊急情況倒計時10秒,紅燈全亮,數碼管顯示倒計時
清單:DC005一個,220Ω電阻12個,3mmLED12個,最小系統配件一套,外加緊急按鍵一個

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

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

單片機源程序如下:

  1. #include <reg52.h>


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

  3. sbit NUM_SELECT_SW=P3^6;                //數碼管十位片選
  4. sbit NUM_SELECT_GW=P3^7;                //數碼管個位片選
  5. //這里說一下我遇到的一個問題,就是在仿真上的代碼中綠燈和黃燈的位定義和板子上是相反的即黃燈被當成了綠燈綠燈被當成了黃燈,然而第一塊板的時候和仿真同樣的代碼卻是能正常情況運行的
  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                        //定義數碼管數據端口


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


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





  17. //***************函數功能:秒累計****************************//

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






  34. //************數碼管顯示倒計時用的顯示函數**************************//

  35. static void NumDisplay(void)
  36. {
  37.         unsigned char DelayCount=0;//技計數延時變量
  38.         unsigned char mSec;//用來存放需要數碼管顯示的數字
  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;//計數延時
  53.         while(DelayCount--);
  54.         NUM_SELECT_SW=0;//關

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





  63. //***********函數功能:交通燈狀態切換************************//

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

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

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

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

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

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







  107. //****************函數功能:處理緊急模式**********************//

  108. static void WarningCheck(void)
  109. {

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

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

  116.                 return;
  117. }






  118. //******************外部中斷0中斷服務函數***************************//

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








  124. //***************定時器T0的中斷服務函數***************************//


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

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









  137. //***************函數功能:對系統進行初始化*************************//


  138. void SystemInit(void)
  139. {

  140.         //關閉所有燈               
  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,八位自動重裝定時,比較省心
  149.         //TL0逸出后會自動把TH0初值裝進TL0,因此只需在初始對TH0,TL0賦值,中斷程序就不用再對TH0,TL0賦值了
  150.         TH0=0x06;//高八位賦值
  151.         TL0=0x06;//低八位賦值
  152.         ET0=1;//定時器中斷0開關閉合
  153.         TR0=1;//啟動定時器
  154.         EX0=1;//開外部中斷0
  155.         EA=1;//總中斷允許
  156. }






  157. void main(void)
  158. {
  159.         SystemInit();//先初始化一下系統
  160.         while(1)//再來個死循環
  161.         {
  162.                 NumDisplay();                        //處理數碼管顯示

  163.                 if(WarningCount>0)                //判斷緊急狀態倒計時完成沒有
  164.                 {
  165.                         WarningCheck();                //沒有處理完緊急狀態就繼續調用緊急處理
  166.                 }else{
  167.                         LightCheck();                //反之按照正常的狀態處理
  168.                 }
  169.         }
  170. }
復制代碼
51hei.png
所有資料51hei提供下載:
含緊急模式交通燈.zip (1.07 MB, 下載次數: 100)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:904666 發表于 2021-4-18 22:26 | 顯示全部樓層
pcb的走線還可以美觀一點
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女一级毛片 | 伦理片97 | 自拍亚洲| 日本不卡免费新一二三区 | 亚洲一区二区视频在线播放 | 亚洲午夜精品一区二区三区他趣 | 中文字幕在线观看第一页 | 在线欧美一区 | 激情一区| 国产成人午夜电影网 | 81精品国产乱码久久久久久 | 午夜播放器在线观看 | 91中文视频 | 欧美电影在线观看网站 | 亚洲a视 | 欧美在线一区二区三区 | 久久久久亚洲精品 | 欧美日韩综合一区 | 久久影音先锋 | 日韩免费一区二区 | 国产 日韩 欧美 制服 另类 | 欧美黄色一区 | 亚洲精品电影在线观看 | 成人不卡视频 | 婷婷福利视频导航 | 免费看的黄网站 | 狠狠综合久久av一区二区老牛 | 国产视频在线一区二区 | 不卡一区二区在线观看 | 亚av在线| 国内自拍视频在线观看 | 久久久久亚洲 | 一区二区电影 | 欧美一级黄色片免费观看 | 男女羞羞视频大全 | 午夜国产在线 | 免费观看成人av | 五月天婷婷激情 | 精品久久久久久 | 国产精品久久久久久久岛一牛影视 | 91精品国产91久久久久久密臀 |