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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21738|回復: 7
收起左側

單片機智能交通燈控制系統設計實驗流程圖與程序

[復制鏈接]
ID:409924 發表于 2018-10-15 14:10 | 顯示全部樓層 |閱讀模式
1.設計目的
  • 學習AT89C51的原理及應用
  • 了解使用單片機處理復雜邏輯的方法
2.設計任務

本系統的軟件設計主要分為四大模塊:定時模塊、倒計時顯示、紅綠燈顯示、按鍵輸入。定時模塊通過定時器T0在模式1下,完成1秒的定時功能,每1秒時間到,將會對通行時間進行倒計時。顯示模塊采用動態顯示的方式,段選碼從P2端口輸出,位選碼從P1端口輸出。紅綠燈顯示采用單片機IO端口直接驅動,當IO端口輸出低電平時,相應的發光二極管發光;當IO端口輸出高電平時,相應的發光二極管熄滅。按鍵輸入,主要完成“東西通行”、“南北通行”、“禁止通行”三個功能,每次按鍵輸入的時候,會對按鍵進行軟件消抖,從而保證按鍵的準確輸入。

基本要求

a顯示電路采用七段共陰極數碼管顯示,南北方向的數碼管的段選端分別與P2端口的P2.0~P2.7相連,位選端分別與P1.2和P1.3相連;東西方向的數碼管的段選端也與P2端口的P2.0~P2.7相連,位選端分別與P1.0和P1.1相連

b. 實現這三個功能:東西通行、南北通行、禁止通行。


  • 高級要求

   在以上設計基礎上,在單片機的P1.0-P1.3口分別接入4個按鍵:



    • 東西方向和南北方向的通行時間輸入和輸入時間的顯示
    • 在綠燈亮起時,添加聲音提示行人通行

3.設計原理圖







4.數字鐘程序流程圖

   

圖9.3 智能交通燈控制主程序流程圖


代碼:


  1. #include <reg51.h>                                             //包含MCS-51單片機頭文件
  2. #define uchar unsigned char   //定義宏uchar
  3. #define uint unsigned int     //定義宏uint
  4. sbit P1_0 =P1^0;              //定義單片機IO口P1.0
  5. sbit P1_1 =P1^1;               //定義單片機IO口P1.1
  6. sbit P1_2 =P1^2;               //定義單片機IO口P1.2
  7. sbit P1_3 =P1^3;               //定義單片機IO口P1.3
  8. sbit ew_red=P0^0;              //定義單片機IO口P0.0為東西方向紅燈控制位
  9. sbit ew_yellow=P0^1;           //定義單片機IO口P0.1為東西方向黃燈控制位
  10. sbit ew_green=P0^2;            //定義單片機IO口P0.2為東西方向綠燈控制位
  11. sbit sn_red=P0^3;              //定義單片機IO口P0.3為南北方向紅燈控制位
  12. sbit sn_yellow=P0^4;           //定義單片機IO口P0.4為南北方黃燈控制位
  13. sbit sn_green=P0^5;            //定義單片機IO口P0.5為南北方向綠燈控制位
  14. sbit key_earth_west=P3^2;      //定義單片機IO口P3.2東西方向通行控制按鍵
  15. sbit key_sourth_north= P3^3;              //定義單片機IO口P3.3南北方向通行控制按鍵
  16. sbit all_not=P3^4;             //定義單片機IO口P3.4為全部禁行控制位
  17. sbit key_earth_west_add=P3^0;      //定義單片機IO口P3.0為東西加
  18. sbit key_earth_west_jian= P3^1;              //   定義單片機IO口P3.1為東西減
  19. sbit key_sourth_north_add=P3^5;      //              定義單片機IO口P3.5為南北加
  20. sbit key_sourth_north_jian= P3^6;              //              定義單片機IO口P3.6為南北減
  21. uchar code s7_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  22.                                //七段碼顯示表
  23. uchar a,b,c,d;                                                                      //定義東西南北時間
  24. uchar sou_nor_time;            //南北通行時間變量定義
  25. uchar east_weat_time;          //東西通行時間變量定義
  26. uchar time_flag;               //時間標志位定義
  27. uchar traffic_flag;                       //traffic_flag=0時南北通行,traffic_flag=1時東西通行
  28. uchar time_multiply;           //定義計時變量
  29. void delayms(uchar z)          //延時子程序
  30. {
  31.               uchar i,j;                   //定義變量i,j
  32.               for(i=z;i>0;i--)             //for循環,共循環z次
  33.                             for(j=110;j>0;j--);                            //for循環,共循環j次
  34. }
  35. void display_time( )  //顯示倒計時子程序
  36. {
  37.               P1_0 =0;                                                                      //P1.0輸出低電平,位選使能
  38. P1_1 =1;                                                                       //P1.1輸出高電平
  39. P1_2 =1;                                                                      //P1.2輸出高電平
  40. P1_3 =1;                                                                      //P1.3輸出高電平
  41.               P2=s7_table[a/10];       //P2端口輸出顯示的段碼
  42.               delayms(2);                                                                      //延時2毫秒
  43.               P2=0;                                                               //P2端口輸出低電平
  44.               P1_0 =1;                                                                      //P1.0輸出高電平
  45.             
  46.               P1_1 =0;                                                                      //P1.1輸出低電平,位選使能
  47.               P2=s7_table[b%10];                            //P2端口輸出顯示的段碼
  48.               delayms(2);                                                                      //延時2毫秒
  49.               P2=0;                                                                                    //P2端口輸出低電平
  50.               P1_1 =1;                                                                      //P1.1輸出高電平
  51.             
  52.               P1_2 =0;                                                                      //P1.2輸出低電平,位選使能
  53.               P2=s7_table[(c)/10];                            //P2端口輸出顯示的段碼
  54.               delayms(2);                                                                      //延時2毫秒
  55.               P2=0;                                                                                    //P2端口輸出低電平
  56.               P1_2 =1;                                                                      //P1.2輸出高電平
  57.             
  58.               P1_3 =0;                                                                      //P1.3輸出低電平,位選使能
  59.               P2=s7_table[(d)%10];                            //P2端口輸出顯示的段碼
  60.               delayms(2);                                                                      //延時2毫秒
  61.               P2=0;                                                                                    //P2端口輸出低電平
  62.               P1_3 =1;                                                                      //P1.3輸出高電平
  63. }
  64. void  south_north_allow()     //南北通行允許子程序
  65. {               
  66.               ew_red=0;                                                                      //東西方向紅燈亮
  67.               ew_green=1;                                                                      //東西方向綠燈熄滅
  68.               ew_yellow=1;                                                        //東西方向黃燈熄滅

  69.               sn_red=1;                                                        //南北方向紅燈熄滅
  70.               sn_green=0;                                                        //南北方向綠燈亮
  71.               sn_yellow=1;                                          //南北方向黃燈熄滅                           
  72. }
  73. void  east_west_allow()   //東西通行允許子程序
  74. {
  75.               ew_red=1;                                                        //東西方向紅燈熄滅
  76.               ew_green=0;                                                        //東西方向綠燈亮
  77.               ew_yellow=1;                                          //東西方向黃燈熄滅
  78.               sn_red=0;                                                        //南北方向紅燈亮
  79.               sn_green=1;                                                        //南北方向綠燈熄滅
  80.               sn_yellow=1;                                             //南北方向綠燈熄滅
  81. }
  82. void init0_timer0()                            //定時器0初始化子程序
  83. {
  84.               TMOD=0X01;                                                                                    //定時器0設置為模式1
  85.               TH0=(65536-50000)/256;                                          //TH0裝載初值
  86.               TL0=(65536-50000)%256;                                          //TL0裝載初值
  87.               ET0=1;                                                                                                  //開啟定時器中斷
  88.               EA=1;                                                                                                  //開啟CPU中斷
  89.               TR0=1;                                                                                                  //啟動定時器T0
  90. }
  91. void keyscan()                                                                      //鍵盤掃描子程序
  92. {
  93.               if(key_sourth_north==0)                                          //判斷南北通行控制按鍵是否按下
  94.               {
  95.                             delayms(2);                                                                      //延時2毫秒
  96.                             if(key_sourth_north==0)                            //再次判斷南北通行控制按鍵是否按下
  97.                             {
  98.                                           south_north_allow();              //調用南北通行子程序
  99.                                           while(!key_sourth_north) display_time(); //南北通行時,
  100. //顯示通行倒計時
  101.                                           TR0=0;                                        //南北通行結束,關閉定時器T0
  102.                            
  103.                             }
  104.               }
  105.               if(key_earth_west==0)                                          //判斷東西通行控制按鍵是否按下
  106.               {
  107.                             delayms(2);                                                                      //延時2毫秒
  108.                             if(key_earth_west==0)                            //再次判斷東西通行控制按鍵是否按下
  109.                             {
  110.                                           east_west_allow();                            //調用東西通行子程序
  111.                                           while(!key_earth_west) display_time();              //東西通行時,
  112. //顯示通行倒計時
  113.                                           TR0=0;                                                                      //東西通行結束,關閉定時器T0
  114.                             }
  115.               }
  116.               if(all_not==0)                                                                      //判斷全部禁行按鍵是否按下
  117.               {
  118.                             delayms(2);                                                                      //延時2毫秒
  119.                             if(all_not==0)                                                        //再次全部禁行按鍵是否按下
  120.                             {
  121.                                           TR0=0;                                                                      //進入全部禁行子程序,關閉定時器T0
  122.                                           ew_red=0;                                                        //東西方向紅燈亮
  123.                                           ew_green=1;                                                        //東西方向綠燈熄滅
  124.                                           ew_yellow=1;                                          //東西方向黃燈熄滅
  125.                                           sn_red=0;                                                        //南北方向紅燈亮
  126.                                           sn_green=1;                                           //南北方向綠燈熄滅
  127.                                           sn_yellow=1;                                          //南北方向黃燈熄滅
  128.                             }
  129.               }
  130.               if(key_earth_west_add==0)                               //              東西時間+1
  131.               {
  132.                  delayms(200);
  133.                  if(key_earth_west_add==1)
  134.                  {
  135.                     east_weat_time=east_weat_time+1;
  136.                                             time_flag=time_flag+1;
  137.                  }
  138.               }
  139.               if(key_earth_west_jian==0)                                          //東西時間-1
  140.               {
  141.                  delayms(200);
  142.                  if(key_earth_west_jian==1)
  143.                  {
  144.                     east_weat_time=east_weat_time-1;
  145.                                           time_flag=time_flag-1;
  146.                  }
  147.               }
  148.               if(key_sourth_north_add==0)                                          //南北時間+1
  149.               {
  150.                  delayms(200);
  151.                  if(key_sourth_north_add==1)
  152.                  {
  153.                     sou_nor_time=sou_nor_time+1;
  154.                                           time_flag=time_flag+1;
  155.                  }
  156.               }
  157.               if(key_sourth_north_jian==0)                                             //南北時間-1
  158.               {
  159.                  delayms(200);
  160.                  if(key_sourth_north_jian==1)                                            
  161.                  {
  162.                     sou_nor_time=sou_nor_time-1;                              
  163.                                           time_flag=time_flag-1;
  164.                  }
  165.               }
  166. }

  167. void main()                                                                                                  //主程序
  168. {                           
  169.               sou_nor_time=15;                                                                      //初始化南北通行時間為15秒
  170.               east_weat_time=6;                                                                      //初始化東西通行時間為6秒
  171.               traffic_flag=0;                                                                                    //初始化,南北通行
  172.               time_flag=sou_nor_time;                                                        //設置南北通行的時間
  173.               time_multiply =0;                                                                      //計時變量初始化

  174.               init0_timer0();                                                                                    //調用定時器T0初始化子程序
  175.               south_north_allow();                                                        //調用南北通行允許子程序

  176.               while(1)                                                                                                  // while(1)無限循環
  177.               {
  178. keyscan();                                                                                    //調用鍵盤掃描子程序
  179.                             display_time();                   //調用顯示倒計時子程序
  180.               }
  181. }
  182. void int0_isr() interrupt 1                                            //定時器T0中斷服務程序
  183. {
  184.               TH0=(65536-50000)/256;                                                        //TH0裝載初值
  185.               TL0=(65536-50000)%256;                                                        //TL0裝載初值
  186.               time_multiply++;                                                                      //計時變量加1
  187.               if(time_multiply>=20)                                                        //判斷計時變量是否大于20
  188.               {
  189.                             time_multiply=0;                                                        //計時變量大于20,則把計時變量清零
  190.                             time_flag--;                                                                      //倒計時的秒數減1
  191.                            
  192.                             if(traffic_flag==0)                                          //若traffic_flag為0,則進入南北通行模式
  193.                             {
  194.                                           if(time_flag>2)                                          //南北通行倒計時進行中
  195.                                           {
  196.                                                         south_north_allow();//南北通行紅綠燈輸出
  197.                                                         a=time_flag;
  198.                                                         b=time_flag;
  199.                                                         c=time_flag-3;
  200.                                                         d=time_flag-3;                                          
  201.                                           }
  202.                                           else if(time_flag>0)               //若倒計時時間小于2秒
  203.                                           {                                                         
  204.                                                         sn_red=1;
  205.                                                         sn_green=1;
  206.                                                         sn_yellow=0;                                                         //此時南北黃燈亮2秒
  207.                                                         ew_red=0;                                                                      //此時東西仍然是紅燈亮
  208.                                                         ew_green=1;
  209.                                                         ew_yellow=1;
  210.                                                         a=time_flag;
  211.                                                         b=time_flag;
  212.                                                         c=0;
  213.                                                         d=0;
  214.                                                                                    
  215.                                           }
  216.                                           else
  217.                                           {
  218.                                                         traffic_flag=1;                                          //此時南北通行計時結束,改為東西通行模式
  219.                                                         time_flag= east_weat_time;              //東西通行時間變量賦值
  220.                                           }                           
  221.                             }
  222.                             if(traffic_flag==1)                                                          //此時為東西通行模式            
  223.                             {
  224.                                           if(time_flag>2)                                                                      //東西通行計時未結束
  225.                                           {
  226.                                                         east_west_allow();                               //東西通行紅綠燈輸出
  227.                                                         c=time_flag;                                                        //北時間
  228.                                                         d=time_flag;                                                        //南時間
  229.                                                         a=time_flag-3;                                                        //西時間
  230.                                                         b=time_flag-3;                                                        //東時間
  231.                                                                                                    
  232.                                           }
  233.                                           else if(time_flag>0)
  234.                                           {                                                         
  235.                                                       
  236.                                                         ew_red=1;                                                                      //此時東西黃燈亮2秒
  237.                                                         ew_green=1;
  238.                                                         ew_yellow=0;
  239.                                                         sn_red=0;                                                                      //此時南北仍然是紅燈亮
  240.                                                         sn_green=1;
  241.                                                         sn_yellow=1;
  242.                                                         c=time_flag;
  243.                                                         d=time_flag;
  244.                                                         a=0;
  245.                                                         b=0;                                                                     
  246.                                           }
  247.                                           else
  248.                                           {
  249.                                                         traffic_flag=0;                                          //此時東西通行計時結束,改為東西通行模式
  250.                                                         time_flag= sou_nor_time;              //南北通行時間變量賦值
  251.                                           }                             
  252.                             }                                         
  253.               }
  254.               else if(time_multiply>=10)                                                        //判斷計時變量是否大于20
  255.               {            
  256.                             if(traffic_flag==0)                                          //若traffic_flag為0,則進入南北通行模式
  257.                             {
  258.                                           if(time_flag>2)                                          //南北通行倒計時進行中
  259.                                           {
  260.                                                         south_north_allow();//南北通行紅綠燈輸出                                          
  261.                                           }
  262.                                           else if(time_flag>0)               //若倒計時時間小于2秒
  263.                                           {                                                         
  264.                                                         sn_red=1;
  265.                                                         sn_green=1;
  266.                                                         sn_yellow=1;                                                         //此時南北黃燈亮2秒
  267.                                                         ew_red=0;                                                                      //此時東西仍然是紅燈亮
  268.                                                         ew_green=1;
  269.                                                         ew_yellow=1;                           
  270.                                           }
  271.                                           else
  272.                                           {
  273.                                                         traffic_flag=1;                                          //此時南北通行計時結束,改為東西通行模式
  274.                                                         time_flag= east_weat_time;              //東西通行時間變量賦值
  275.                                           }                           
  276.                             }
  277.                             if(traffic_flag==1)                                                          //此時為東西通行模式            
  278.                             {
  279.                                           if(time_flag>2)                                                                      //東西通行計時未結束
  280.                                           {
  281.                                                         east_west_allow();                               //東西通行紅綠燈輸出                                          
  282.                                           }
  283.                                           else if(time_flag>0)
  284.                                           {                                                         
  285.                                                       
  286.                                                         ew_red=1;                                                                      //此時東西黃燈亮2秒
  287.                                                         ew_green=1;
  288.                                                         ew_yellow=1;
  289.                                                         sn_red=0;                                                                      //此時南北仍然是紅燈亮
  290.                                                         sn_green=1;
  291.                                                         sn_yellow=1;                                                                     
  292.                                           }
  293.                                           else
  294.                                           {
  295.                                                         traffic_flag=0;                                          //此時東西通行計時結束,改為東西通行模式
  296.                                                         time_flag= sou_nor_time;              //南北通行時間變量賦值
  297.                                           }                             
  298.                             }                                         
  299.               }                                 
  300.               }
復制代碼

實驗一.doc

176 KB, 下載次數: 151, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:453602 發表于 2018-12-24 16:35 | 顯示全部樓層
真的是非常的有用
回復

使用道具 舉報

ID:607466 發表于 2019-9-4 15:50 | 顯示全部樓層
dogjijrk 發表于 2018-12-24 16:35
真的是非常的有用

樓主厲害
回復

使用道具 舉報

ID:607466 發表于 2019-9-4 15:51 | 顯示全部樓層
dogjijrk 發表于 2018-12-24 16:35
真的是非常的有用

很有用謝謝分享
回復

使用道具 舉報

ID:607752 發表于 2019-9-8 16:31 | 顯示全部樓層
樓主厲害,感謝分享
回復

使用道具 舉報

ID:618858 發表于 2019-10-2 21:03 | 顯示全部樓層
下載了附件但是仿真圖還是看不清楚呢
回復

使用道具 舉報

ID:617465 發表于 2019-10-9 17:44 | 顯示全部樓層
你這個原理圖看不清楚啊,有沒有清楚點的圖啊
回復

使用道具 舉報

ID:718501 發表于 2020-3-30 22:18 來自手機 | 顯示全部樓層
定時器中斷服務程序這么長行嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线欧美 | 午夜一区二区三区视频 | 羞羞在线观看视频 | 日本大香伊一区二区三区 | 色婷婷综合久久久中字幕精品久久 | 国产精品电影在线观看 | 日韩色图在线观看 | 日韩在线视频免费观看 | 日韩高清不卡 | 欧美日韩精品一区二区三区蜜桃 | 亚洲区一区二 | 婷婷色国产偷v国产偷v小说 | 日韩在线一区二区三区 | 久久久国产一区二区三区 | 国产精品永久久久久 | 欧美精品福利视频 | 韩国欧洲一级毛片 | 国产精品a免费一区久久电影 | www.久久| 亚洲专区在线 | 欧美日韩在线一区 | 成人在线视频网 | 99re在线| 日韩欧美不卡 | 国产精品久久亚洲 | 在线一区| 成人av观看 | 亚洲高清视频在线 | 中文字幕av在线 | 久久婷婷国产麻豆91 | 亚洲国产乱码 | 亚洲国产精品人人爽夜夜爽 | 久久99国产精品 | 成人二区三区 | 午夜久久久| 爱爱免费视频网站 | 中文字幕动漫成人 | 国产精品久久久久久久7电影 | 天天夜天天操 | 孕妇一级毛片 | 成人av高清在线观看 |