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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

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

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

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

功能5:自動(dòng)時(shí)顯示各種狀態(tài)倒計(jì)時(shí)。
通過定時(shí)器中斷和LED數(shù)碼管的顯示來實(shí)現(xiàn)各種狀態(tài)的倒計(jì)時(shí).
基本功能:定時(shí)器中斷
外接元件:LED數(shù)碼管
外接元件功能:可以顯示時(shí)間

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



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

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


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

  6. // 下面是八個(gè)交通燈對應(yīng)的位定義
  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;        // 自動(dòng)
  17. sbit        key_step         = P3^1;        // 手動(dòng)
  18. sbit        key_emerg         = P3^2;        // 緊急情況 110/120通過
  19. sbit        key_night   = P3^6;// 夜間模式


  20. uint cnt = 0;        // 記錄定時(shí)器定時(shí)了多少毫秒
  21. uint sec = 0;        // 記錄定時(shí)器計(jì)時(shí)了多少秒

  22. uchar light_num = 0;

  23. // 四位八段共陰極數(shù)碼管數(shù)字顯示編碼
  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. /*************函數(shù)聲明********************/
  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. // 毫秒級(jí)延時(shí)
  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. // 系統(tǒng)初始化
  63. void system_Init()
  64. {
  65.     wela=0;                // 關(guān)閉位選
  66.         dula=0;                // 關(guān)閉段選
  67.         TMOD=0x01;  // 定時(shí)器0方式1 16位
  68.         TH0=0x4c;         // 定時(shí)器裝初值 50ms(11.05926MHz  TH0=0x4c TL0=0x00)
  69.         TL0=0x00;        // (12MHz 的初值是 TH0=0x3c TL0=0xb0)
  70.         EA=1;                // 開總中斷
  71.         ET0=1;                // 開定時(shí)器0中斷
  72.         TR0=1;                // 允許中斷溢出
  73. }

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

  78.     time_tens = time / 10;        // 提取倒計(jì)時(shí)時(shí)間的十位數(shù)
  79.     time_ones = time % 10;        // 提取倒計(jì)時(shí)時(shí)間的個(gè)位數(shù)


  80.         // 下面對兩位數(shù)倒計(jì)時(shí)時(shí)間進(jìn)行顯示(數(shù)碼管)
  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. // 顯示豎向的(即主干道)倒計(jì)時(shí)
  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)                                // 自動(dòng)按鈕按下
  129.                 {
  130.                         // 主干道通過 輔干道紅燈
  131.                         if(sec <= 15)
  132.                 {
  133.                                 Display_C_time(15-sec);        // 倒計(jì)時(shí)顯示
  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);        // 倒計(jì)時(shí)顯示
  140.                                 Display_R_time(30-sec);
  141.                     P1 = light[1];                        // 主道藍(lán)燈亮 單獨(dú)左轉(zhuǎn)  輔道紅燈亮
  142.                 }
  143.                 else if(sec > 24 && sec <= 30)
  144.                 {
  145.                                 Display_C_time(30-sec);        // 倒計(jì)時(shí)顯示
  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);        // 倒計(jì)時(shí)顯示
  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);        // 倒計(jì)時(shí)顯示
  160.                                 Display_C_time(50-sec);
  161.                                 P1 = light[4];                        // 主道紅燈亮  輔道藍(lán)燈亮 單獨(dú)左轉(zhuǎn)信號(hào)
  162.                         }
  163.                         else if(sec > 44 && sec <= 50)
  164.                         {
  165.                                 Display_R_time(50-sec);        // 倒計(jì)時(shí)顯示
  166.                                 Display_C_time(50-sec);
  167.                                 P1 = light[5];                        // 主道紅燈亮  輔道黃燈亮        
  168.                         }
  169.         
  170.                 else
  171.                 {
  172.                     sec = 0;// 秒數(shù)清零,繼續(xù)循環(huán)上述代碼
  173.                 }
  174.                 }
  175.                
  176.         }

  177.         // 手動(dòng)步進(jìn)按鈕按下,按一次,交通燈的狀態(tài)改變一次
  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黑下載附件…………
復(fù)制代碼

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

評分

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

查看全部評分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:262 發(fā)表于 2022-9-4 03:46 | 只看該作者
注釋比較詳細(xì),值得初學(xué)者學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级淫片007 | 日韩中文字幕av | 亚洲毛片在线 | 国产福利在线播放麻豆 | 在线国产99 | 亚洲精品国产偷自在线观看 | 91国产视频在线观看 | 一区二区三区亚洲精品国 | 中文字幕加勒比 | 狠狠色狠狠色综合日日92 | 久久久一二三 | 欧美猛交 | 日韩成人免费av | 国产精品综合久久 | 国产免费va| 国户精品久久久久久久久久久不卡 | 亚洲人成人一区二区在线观看 | 免费不卡视频 | 成人免费在线 | 成人精品鲁一区一区二区 | 欧美一区二区综合 | 国产日韩久久久久69影院 | 色婷婷综合成人av | 国产视频日韩 | 欧洲精品码一区二区三区免费看 | 午夜精品久久久久久久久久久久久 | 久久午夜视频 | 国产日韩欧美一区 | www.99热.com | 激情国产 | 天堂网中文字幕在线观看 | 午夜日韩精品 | 成人高潮片免费视频欧美 | 99久久精品免费看国产小宝寻花 | 国产a区 | 国产精品美女久久久久aⅴ国产馆 | 亚洲一区综合 | 国产成人精品一区二区三区视频 | 91精品国产99久久 | 精品成人免费一区二区在线播放 | 国产成人一区二区三区 |