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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機交通燈課設分享 順帶學習心得

[復制鏈接]
跳轉到指定樓層
樓主
上個學期幫老師帶了本科課程設計,40個同學,我就想著先做一遍吧,就隨便選了一個交通燈的題目。題目如下

用AT89S52單片機控制一個交通信號燈系統。設A車道與B車道交叉組成十字路口,A是主道,B是支道,要求如下:
(1)用發光二極管模擬交通信號燈,用按鍵開關模擬車輛檢測信號;
(2)正常情況下,A、B兩車道輪流放行,A車道放行12s,其中3s用于警告;B車道放行8s,其中3s用于警告;(警告為黃燈閃爍)
(3)在交通繁忙時,交通信號燈控制系統應有手控開關,可人為地改變信號燈的狀態,以緩解交通擁擠情況。在B車道放行期間,若A車道有車而B車道無車,按下開關k1使A車道放行5s,在A車道放行期間,若B車道有車而A車道無車,按下開關k2使B車道放行5s;
(4)有緊急車輛通過時,按下k3開關使A、B車道均為紅燈,禁行5s。

看了題目,感覺比較正常,就做唄。其實也簡單,按下按鍵相當于給他一個中斷,執行中斷子程序之后返回原來的地方,大概整個內容兩個小時搞定吧。嗯,比想象的時間要長。
做出來之后,感覺很奇怪。比如此時我是A通道放行,放行到第8s時,我讓B車道通,那么B車道通5s后我又回到A車道通,只通1s就開始警告3s然后又到B,感覺中間時間太短。而且閃爍的時候也挺混亂的。我設置的是閃爍3s,每秒亮0.5s,滅0.5s。那么直接回到中斷點的話這個時間也非常混亂。

基于此,我對這題進行了改進。
某通道通過時,有按鍵按下,執行相應的中斷子程序。執行完畢后會返回,但并不是之前中斷的位置,而是這樣的:
A通過通的過程中,按下k2并不會有任何動作。按下k1,使B通道通行,返回時是重新使A通道通行,即通行12s。按下k3時,返回時是直接使B通道通行。
B通道同理。另外針對黃燈警告的時候,比如A亮黃燈,那么就認為A通道已經放行了很長時間,按鍵之后偏向于直接使得B通道通。
嗯,具體是怎樣的過程我已經忘記了,可能剛剛描述的跟我做的不太準確。但是很明顯看出這是在原來的題目上加以補充的,更貼合于實際情況。
那么我們來編程吧,這就遇到困難了。之前的程序相當于是正常運行,然后三個按鍵進入三個中斷。但是現在我需要記住中斷之前我的狀態,中斷結束后要根據中斷前的狀態及具體執行哪一個中斷程序來判斷結束后執行什么任務。
因此,最重要的就是對各狀態進行判斷。
在最初的版本中,主要就是每個階段點燈的子函數,然后掃描鍵盤的函數觸發中斷。這里的思路是三個按鍵連接3個IO口,同時連接到外部中斷,同時加上拉電阻。當有按鍵按下時給一個低電平到外部中斷,中斷子函數掃描三個IO口判斷哪一個是低電平從而執行相應的操作。這里的連接涉及到一些與非門什么的。
但是這個版本并不能這樣。我考慮的是用定時器中斷而不用外部中斷。首先我使用了20個標志位來輔助判斷程序運行到哪一步了,這個就非常復雜了,環環相扣。另外我是采取的定時掃描方式,每隔1ms掃描各個標志位,來判斷按鍵是否按下,而并非通過中斷來按下按鍵。整個主程序執行時間極短,全部是根據標志位點亮相應的燈,而中斷程序主要根據按鍵及標志位兩者來改變標志位。現在放出來給大家看看,希望不會頭暈。。。
程序有270行,我就不復制過來啦。


嗯,下面是個人的一些心得。我曾經教過不下十個同學學習單片機,我推薦的都是普中的板子,但是他們看了視頻之后就認為自己會了,實際上不是的。比如數碼管,整個視頻大概20分鐘吧(具體記不清了),他們看了之后就沒了,實際上單片機這個東西是需要多練的,我就會出一些題目,比如數碼管顯示0-F,一個按鍵改變顯示頻率,一個開關改變顯示方向(+/-)。做得過程中我自己也會發現一些問題,譬如就這個題目如果不用中斷效果很差(不過我相信可以改進)。交通燈這個題目,應該是各種課程做爛了的,沒想到我竟然做了三天,其中熬了兩天夜。
其次,學習單片機不僅僅只是學會編程,更要學會思考。真正做項目中具體任務都是自己定的,并不會像題目一樣給你限定死了,那么該選取怎樣的目標?甚至包括具體硬件都是自己定的,需要自己靜下心來多思考。而我看得有些同學覺得這一塊不重要,只在意編程,這是不行的。

程序說不定有問題,半年前做的。只是提出一些自己的思路,希望能幫到大家。

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


單片機源程序如下:
  1. #include "reg51.h"
  2. sbit Ared=P2^0;
  3. sbit Ayel=P2^1;
  4. sbit Agre=P2^2;
  5. sbit Bred=P2^3;
  6. sbit Byel=P2^4;
  7. sbit Bgre=P2^5;
  8. sbit k1=P0^0;
  9. sbit k2=P0^1;
  10. sbit k3=P0^2;
  11. int flag_key,shine_a,shine_b;                        //通過flag_key來表示當前按鍵情況,shine來表示當前黃燈情況
  12. int flag_en1,flag_en2,flag_en3,flag_en4,flag_en5;                //五個任務的使能標志位
  13. int flag_time1,flag_time2,flag_time3,flag_time4,flag_time5;                //定時器的開啟標志位
  14. int time_1,time_2,time_3,time_4,time_5;                //定時器的計時標志位
  15. int delay,rst;                //rst是復位標志位,用來判斷中斷結束后執行哪一個任務

  16. void scankey()
  17. {
  18.          if(k1==0)
  19.         {
  20.                 delay=1000;
  21.                 while(delay--);
  22.                 if(k1==0)
  23.                 {
  24.                          flag_en5=1;
  25.                         flag_key=1;
  26.                         flag_time1=0;
  27.                         flag_time2=0;
  28.                         flag_time3=0;
  29.                         flag_time4=0;
  30.                         time_1=0;
  31.                         time_2=0;
  32.                         time_3=0;
  33.                         time_4=0;
  34.                         while(!k1);
  35.                 }        
  36.         }
  37.         if(k2==0)
  38.         {
  39.                 delay=1000;
  40.                 while(delay--);
  41.                 if(k2==0)
  42.                 {
  43.                          flag_en5=1;                        
  44.                         flag_key=2;
  45.                         flag_time1=0;
  46.                         flag_time2=0;
  47.                         flag_time3=0;
  48.                         flag_time4=0;
  49.                         time_1=0;
  50.                         time_2=0;
  51.                         time_3=0;
  52.                         time_4=0;
  53.                         while(!k2);
  54.                 }        
  55.         }
  56.         if(k3==0)
  57.         {

  58.                  delay=1000;
  59.                 while(delay--);
  60.                 if(k3==0)
  61.                 {
  62.                          flag_en5=1;
  63.                         flag_key=3;
  64.                         flag_time1=0;
  65.                         flag_time2=0;
  66.                         flag_time3=0;
  67.                         flag_time4=0;
  68.                         time_1=0;
  69.                         time_2=0;
  70.                         time_3=0;
  71.                         time_4=0;
  72.                         while(!k3);
  73.                 }        
  74.         }
  75. }

  76. void led(int r1,r2,r3,r4,r5,r6)
  77. {
  78.         Ared=r1;
  79.         Ayel=r2;
  80.         Agre=r3;
  81.         Bred=r4;
  82.         Byel=r5;
  83.         Bgre=r6;
  84. }

  85. void main()
  86. {
  87. //定時器初始化
  88.         TMOD=0;
  89.         TH1=(8192-1000)/32;
  90.         TL1=(8192-1000)%32;
  91.         EA=1;
  92.         ET1=1;
  93.         TR1=1;
  94. //參數初始化
  95.         flag_key=0;
  96.         flag_en1=1;
  97.         flag_en2=0;
  98.         flag_en3=0;
  99.         flag_en4=0;
  100.         flag_en5=0;
  101.         time_1=0;
  102.         time_2=0;
  103.         time_3=0;
  104.         time_4=0;
  105.         time_5=0;
  106.         flag_time1=0;
  107.         flag_time2=0;
  108.         flag_time3=0;
  109.         flag_time4=0;
  110.         flag_time5=0;
  111.         shine_a=1;
  112.         shine_b=1;
  113.         rst=0;
  114.         while(1)
  115.         {
  116.                 scankey();
  117. //按鍵未按下,正常運行                 
  118.                 if(flag_key==0)
  119.                 {
  120.                          if(flag_en1==1)
  121.                         {
  122.                                  rst=1;
  123.                                 flag_en1=0;
  124.                                 led(0,0,1,1,0,0);
  125.                                 flag_time1=1;
  126.                         }
  127.                         if(flag_en2==1)
  128.                         {
  129.                                 rst=2;
  130.                                 if(shine_a==1||shine_a==3||shine_a==5)
  131.                                         led(0,1,0,1,0,0);
  132.                                 else if(shine_a==2||shine_a==4||shine_a==6)
  133.                                         led(0,0,0,1,0,0);
  134.                                 flag_time2=1;
  135.                                 if(shine_a==6)
  136.                                         flag_en2=0;                                
  137.                         }
  138.                         if(flag_en3==1)
  139.                         {
  140.                                  rst=3;
  141.                                 flag_en3=0;
  142.                                 led(1,0,0,0,0,1);
  143.                                 flag_time3=1;
  144.                         }
  145.                         if(flag_en4==1)
  146.                         {
  147.                                 rst=4;
  148.                                 if(shine_b==1||shine_b==3||shine_b==5)
  149.                                         led(1,0,0,0,1,0);
  150.                                 else if(shine_b==2||shine_b==4||shine_b==6)
  151.                                         led(1,0,0,0,0,0);
  152.                                 flag_time4=1;
  153.                                 if(shine_b==6)
  154.                                         flag_en4=0;               
  155.                         }
  156.                 }

  157.                 if(flag_key==1)
  158.                 {
  159.                          if(flag_en5==1)
  160.                         {
  161.                                  flag_en5=0;
  162.                                 led(0,0,1,1,0,0);
  163.                                 flag_time5=1;
  164.                         }
  165.                 }

  166.                 if(flag_key==2)
  167.                 {
  168.                          if(flag_en5==1)
  169.                         {
  170.                                  flag_en5=0;
  171.                                 led(1,0,0,0,0,1);
  172.                                 flag_time5=1;
  173.                         }
  174.                 }

  175.                 if(flag_key==3)
  176.                 {
  177.                          if(flag_en5==1)
  178.                         {
  179.                                  flag_en5=0;
  180.                                 led(1,0,0,1,0,0);
  181.                                 flag_time5=1;
  182.                         }
  183.                 }
  184.         }
  185. }

  186. void hml() interrupt 3
  187. {
  188.          if(flag_time1==1)
  189.                 time_1++;
  190.         if(time_1==3000)
  191.         {
  192.                  time_1=0;
  193.                 flag_time1=0;
  194.                 flag_en2=1;
  195.         }

  196.         if(flag_time2==1)
  197.                 time_2++;
  198.         if(time_2==500)
  199.         {
  200.                  time_2=0;
  201.                 shine_a++;
  202.                 if(shine_a==7)
  203.                 {
  204.                          flag_time2=0;
  205.                         flag_en3=1;
  206.                         shine_a=1;
  207.                 }
  208.         }

  209.         if(flag_time3==1)
  210.                 time_3++;
  211.         if(time_3==3000)
  212.         {
  213.                  time_3=0;
  214.                 flag_time3=0;
  215.                 flag_en4=1;
  216.         }

  217.         if(flag_time4==1)
  218.                 time_4++;
  219.         if(time_4==500)
  220.         {
  221.                  time_4=0;
  222.                 shine_b++;
  223.                 if(shine_b==7)
  224.                 {
  225.                          flag_time4=0;
  226.                         flag_en1=1;
  227.                         shine_b=1;
  228.                 }
  229. ……………………

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

所有資料51hei提供下載:
交通燈.rar (115.47 KB, 下載次數: 21)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2018-3-15 02:40 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:291647 發表于 2018-3-15 09:28 | 只看該作者
資料很好,謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年人网站免费视频 | 草草在线观看 | 极品粉嫩国产48尤物在线播放 | 国产目拍亚洲精品99久久精品 | 阿v视频在线观看 | 日本亚洲一区 | 亚洲精品电影在线观看 | 久久青 | 久久国产精品72免费观看 | 精品中文字幕久久 | 爱爱综合网 | 欧洲成人午夜免费大片 | 国产精品女人久久久 | 99久久婷婷国产综合精品电影 | 久久成人综合 | 综合伊人 | 日韩一区二区成人 | 一二三区视频 | 国产视频在线观看一区二区三区 | 天天色官网 | 成人一区二 | 午夜影院普通用户体验区 | 久久国产成人 | 久久99深爱久久99精品 | 国产免费拔擦拔擦8x高清 | 欧美精品成人 | 日韩一区二区三区视频 | 精品国产aⅴ | 亚洲中午字幕 | 狠狠撸在线视频 | 亚洲第一成年免费网站 | 人妖一区 | 亚洲欧美在线一区 | 久久88| 日韩电影一区二区三区 | 丁香久久| 午夜视频导航 | 欧美日韩在线综合 | 亚洲欧美另类在线 | 日日日日操 | 在线观看亚洲精品视频 |