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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3950|回復: 4
打印 上一主題 下一主題
收起左側

帶注釋的單片機十字路口紅綠燈控制器程序與Proteus仿真圖

[復制鏈接]
跳轉到指定樓層
樓主
這是我花了一段時間寫出來的基于單片機的十字路口紅綠燈,下面的附件包含了源代碼,仿真圖,還有生成的hex文件。
功能如下
功能1:紅燈和綠燈相互轉換時經過黃燈,黃燈閃爍三次(6秒)
利用延時函數實現黃燈閃爍;紅綠黃LED燈接地,用P1口連接LED燈,置P1低電平點亮,置高電平熄滅.
基本功能:輸入輸出,延時函數
外接元件:紅綠黃LED燈
外接元件功能:有熄滅和點亮兩種狀態.

功能2:主干道方向通行30秒,輔干道方向通行20秒,單獨左轉信號15秒;先直行信號,后左轉信號。
讓連接直行綠燈的P1口置低電平和用定時器中斷計時30s,再讓連接左轉綠燈的P1口置低電平和用定時器中斷計時15秒.
基本功能:輸入輸出,定時器中斷
外接元件:LED燈;LED數碼管
外接元件功能:連接電路和斷開電路;可以顯示時間

功能3:設手動、自動、特殊情況三種方式。
通過按鍵來實現三種情況的實現
P3口各連接一個開關后接地,作為手動檔和自動檔、特殊情況檔.使開關置0就能選擇自己想要的一種方式
基本功能:輸入輸出
外接元件:按鈕   
外接元件功能:連接電路和斷開電路

功能4:特殊情況時所有路口紅燈都亮,給120、110等通行。
LED燈接地,四個路口12個LED燈都接P1口
使P1口全部置1,LED燈熄滅
再使連接紅燈的P1口置0
基本功能:輸入輸出
外接元件:LED燈
外接元件功能:熄滅和點亮兩種情況

功能5:自動時顯示各種狀態倒計時。
通過定時器中斷和LED數碼管的顯示來實現各種狀態的倒計時.
基本功能:定時器中斷
外接元件:LED數碼管
外接元件功能:可以顯示時間

功能6:夜間模式
(夜間的時候,四個路口一直亮黃燈)
類似于特殊情況,使P1=0x77,即可實現
基本功能:輸入輸出
外接元件:LED燈
外接元件功能:點亮和熄滅兩種狀態
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



單片機源程序如下(程序有詳細注釋):
  1. #include <reg52.h>

  2. #define uchar unsigned char        
  3. #define uint  unsigned int         


  4. sbit wela = P2^7;                  // 數碼管位選
  5. sbit dula = P2^6;                // 數碼管段選

  6. // 下面是八個交通燈對應的位定義
  7. sbit         LED1_blue   = P1^0;
  8. sbit         LED1_red    = P1^1;
  9. sbit         LED1_green  = P1^2;
  10. sbit         LED1_yellow = P1^3;
  11. sbit         LED2_blue   = P1^4;
  12. sbit         LED2_red    = P1^5;
  13. sbit         LED2_green  = P1^6;
  14. sbit         LED2_yellow = P1^7;

  15. // 按鍵位定義
  16. sbit        key_auto         = P3^0;        // 自動
  17. sbit        key_step         = P3^1;        // 手動
  18. sbit        key_emerg         = P3^2;        // 緊急情況 110/120通過
  19. sbit        key_night   = P3^6;// 夜間模式


  20. uint cnt = 0;        // 記錄定時器定時了多少毫秒
  21. uint sec = 0;        // 記錄定時器計時了多少秒

  22. uchar light_num = 0;

  23. // 四位八段共陰極數碼管數字顯示編碼
  24. uchar code table[]={
  25. //"0" "1"  "2"  "3"
  26. 0x3f,0x06,0x5b,0x4f,
  27. //"4" "5"  "6"  "7"
  28. 0x66,0x6d,0x7d,0x07,
  29. //"8" "9"  "A"  "B"
  30. 0x7f,0x6f,0x77,0x7c,
  31. //"C" "D"  "E"  "F"
  32. 0x39,0x5e,0x79,0x71
  33. };


  34. uchar code light[]={
  35. // 主G輔R      主G輔R    主Y輔R
  36.     0xdb,       0xde,     0xd7,
  37. // 主R輔G      主R輔B    主R輔R
  38.     0xbd,       0xed,     0x7d,
  39.         0xdf,       0xee,     0xdd
  40. };

  41. /*************函數聲明********************/
  42. void delay_ms(uint);
  43. void system_Init();
  44. void Display_R_time(uchar);
  45. void Display_C_time(uchar);
  46. void key_scan();

  47. void main()
  48. {
  49.     system_Init();

  50.     while(1)
  51.         {
  52.                 key_scan();
  53.         }
  54. }


  55. // 毫秒級延時
  56. void delay_ms(uint z)
  57. {
  58.         uint x,y;
  59.         for(x=z;x>0;x--)
  60.                 for(y=123;y>0;y--);

  61. }

  62. // 系統初始化
  63. void system_Init()
  64. {
  65.     wela=0;                // 關閉位選
  66.         dula=0;                // 關閉段選
  67.         TMOD=0x01;  // 定時器0方式1 16位
  68.         TH0=0x4c;         // 定時器裝初值 50ms(11.05926MHz  TH0=0x4c TL0=0x00)
  69.         TL0=0x00;        // (12MHz 的初值是 TH0=0x3c TL0=0xb0)
  70.         EA=1;                // 開總中斷
  71.         ET0=1;                // 開定時器0中斷
  72.         TR0=1;                // 允許中斷溢出
  73. }

  74. // 顯示橫向的(即輔干道)倒計時
  75. void Display_R_time(uchar time)
  76. {
  77.     uchar time_tens, time_ones;

  78.     time_tens = time / 10;        // 提取倒計時時間的十位數
  79.     time_ones = time % 10;        // 提取倒計時時間的個位數


  80.         // 下面對兩位數倒計時時間進行顯示(數碼管)
  81.     P0=0xff;
  82.         wela=1;
  83.         P0=0xbf;   
  84.         wela=0;
  85.         dula=1;
  86.         P0=table[time_tens];
  87.         dula=0;
  88.         delay_ms(1);                        
  89.         
  90.         P0=0xff;
  91.         wela=1;
  92.         P0=0x7f;   
  93.         wela=0;        
  94.         dula=1;
  95.         P0=table[time_ones];
  96.         dula=0;
  97.         delay_ms(1);
  98. }


  99. // 顯示豎向的(即主干道)倒計時
  100. void Display_C_time(uchar time)
  101. {
  102.     uchar time_tens, time_ones;  

  103.     time_tens = time / 10;
  104.     time_ones = time % 10;
  105.         
  106.         P0=0xff;
  107.         wela=1;
  108.         P0=0xfb;      
  109.         wela=0;        
  110.         dula=1;
  111.         P0=table[time_tens];
  112.         dula=0;
  113.         delay_ms(1);  

  114.     P0=0xff;
  115.         wela=1;
  116.         P0=0xf7;     
  117.         wela=0;        
  118.         dula=1;
  119.         P0=table[time_ones];
  120.         dula=0;
  121.         delay_ms(1);
  122. }


  123. void key_scan()
  124. {
  125.         if(key_auto == 0)
  126.         {
  127.                 delay_ms(5);
  128.             if(key_auto == 0)                                // 自動按鈕按下
  129.                 {
  130.                         // 主干道通過 輔干道紅燈
  131.                         if(sec <= 15)
  132.                 {
  133.                                 Display_C_time(15-sec);        // 倒計時顯示
  134.                                 Display_R_time(30-sec);
  135.                     P1 = light[0];          // 主道綠燈亮  輔道紅燈亮
  136.                 }
  137.                 else if(sec > 15 && sec <= 24)
  138.                 {
  139.                                 Display_C_time(24-sec);        // 倒計時顯示
  140.                                 Display_R_time(30-sec);
  141.                     P1 = light[1];                        // 主道藍燈亮 單獨左轉  輔道紅燈亮
  142.                 }
  143.                 else if(sec > 24 && sec <= 30)
  144.                 {
  145.                                 Display_C_time(30-sec);        // 倒計時顯示
  146.                                 Display_R_time(30-sec);
  147.                     P1 = light[2];                        // 主道黃燈亮  輔道紅燈亮
  148.                 }
  149.         
  150.                         // 下面換道
  151.                         else if(sec > 30 && sec <= 35)
  152.                         {
  153.                                 Display_R_time(35-sec);        // 倒計時顯示
  154.                                 Display_C_time(50-sec);
  155.                                 P1 = light[3];                        // 主道紅燈亮  輔道綠燈亮
  156.                         }
  157.                         else if(sec > 35 && sec <= 44)
  158.                         {
  159.                                 Display_R_time(44-sec);        // 倒計時顯示
  160.                                 Display_C_time(50-sec);
  161.                                 P1 = light[4];                        // 主道紅燈亮  輔道藍燈亮 單獨左轉信號
  162.                         }
  163.                         else if(sec > 44 && sec <= 50)
  164.                         {
  165.                                 Display_R_time(50-sec);        // 倒計時顯示
  166.                                 Display_C_time(50-sec);
  167.                                 P1 = light[5];                        // 主道紅燈亮  輔道黃燈亮        
  168.                         }
  169.         
  170.                 else
  171.                 {
  172.                     sec = 0;// 秒數清零,繼續循環上述代碼
  173.                 }
  174.                 }
  175.                
  176.         }

  177.         // 手動步進按鈕按下,按一次,交通燈的狀態改變一次
  178.         if(key_step == 0)
  179.         {
  180.                 delay_ms(5);
  181.                 if(key_step == 0)
  182.                 {
  183.                         if(light_num == 6)
  184.                         {
  185.                                 light_num = 0;
  186.                         }
  187.                         P1 = light[light_num];
  188.                         light_num++;
  189.                         while(!key_step);  // 松手檢測
  190.                 }
  191.         }

  192.         // 緊急情況 emergency
  193.         if(key_emerg == 0)
  194.         {
  195.                 delay_ms(5);
  196.                 if(key_emerg == 0)
  197.                 {
  198.                         P1 = 0xdd;  // 主干道輔干道都是紅燈
  199. ……………………

  200. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

Keil代碼與Proteus8.8仿真下載:
基于單片機的十字路口紅綠燈控制器.7z (347.29 KB, 下載次數: 76)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:262 發表于 2022-6-3 05:20 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:262 發表于 2022-9-4 03:46 | 只看該作者
注釋比較詳細,值得初學者學習
回復

使用道具 舉報

地板
ID:995680 發表于 2022-10-27 09:22 | 只看該作者
除了proteus和keil還需要下載什么軟件嗎
回復

使用道具 舉報

5#
ID:995680 發表于 2022-10-29 09:48 | 只看該作者
為什么proteus運行幾秒就退出啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频一区欧美 | 国产精品福利久久久 | 欧美日韩不卡在线 | 麻豆精品国产91久久久久久 | 草草草影院 | 精品国产一区二区 | 成人在线视 | 欧美日韩午夜精品 | 免费日本视频 | 国产一级特黄aaa大片评分 | 欧美日韩国产精品一区 | 欧美一区免费 | 精品欧美乱码久久久久久 | 午夜99| 久久国产精品-国产精品 | 96av麻豆蜜桃一区二区 | 99精品视频免费观看 | 日韩欧美国产不卡 | 91视频中文 | 国产一区二区影院 | 成人av在线播放 | 日韩成人在线电影 | 欧美性猛交一区二区三区精品 | 美女天天干天天操 | 成人欧美一区二区三区1314 | 玖玖国产精品视频 | www精品美女久久久tv | www九色 | 国产欧美精品一区二区 | 亚洲 欧美 在线 一区 | 日韩欧美在线视频 | 国内精品视频一区二区三区 | 国内激情av片| 欧美 中文字幕 | 日韩三级在线 | 成人精品一区 | 亚洲一区二区三区免费观看 | 久草免费在线视频 | 亚洲高清视频一区二区 | 丁香久久| 久久久精品视频一区二区三区 |