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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3291|回復: 0
收起左側

51單片機道路交通燈電路+代碼設計

[復制鏈接]
ID:639511 發表于 2019-11-20 09:09 | 顯示全部樓層 |閱讀模式
利用單片機設計道路交通燈。
1.  設計一個十字路口的交通燈控制電路,要求東西方向(主干道)車道和南北方向(從干道)車道兩條交叉道路上的車輛交替運行。開始運行后,先東西綠燈60s(通行)、南北紅燈65s(禁止);然后,東西轉黃燈閃爍5s;接著,南北綠燈30s,東西紅燈35s。時間可設置修改。
2.  在綠燈轉為紅燈時,要求黃燈閃爍,才能變換運行車道;
3.  黃燈亮時,要求每秒閃亮一次;
4.  在二極管亮或者閃爍的同時,兩個方向的數碼管顯示倒計時,東西一組數碼管,南北向一組數碼管;
5.  緊急情況發生時,要求四個路口同時加亮黃燈閃爍,并且倒計時顯示裝置關閉;

仿真圖

仿真圖


單片機源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dula=P3^6;          //段選鎖存器鎖存端
  5. sbit wela=P3^7;          //位選鎖存器鎖存端

  6. uchar time1=13;  //初值南北13秒
  7. uchar time2=10;  //初值東西10秒
  8. uchar t1=13,t2=10,chose=0;
  9. uchar time1_2,temp=0,p=0,tab;
  10. uchar shi1,ge1,shi2,ge2,q;
  11. uchar status,key,flag;

  12. //共陰極數字顯示編碼
  13. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  14.                        0x66,0x6d,0x7d,0x07,
  15.                        0x7f,0x6f};
  16. uchar code wei[]={0xfd,0xfe,0xf7,0xfb,
  17.                                   0xdf,0xef,0x7f,0xbf}; //位選

  18. void delay(uint x)
  19. {
  20.                 uint i,j;
  21.                 for(i=x;i>0;i--)                        //定時x毫秒
  22.                         for(j=110;j>0;j--);
  23. }
  24. void display(uint ge1,uint shi1,uint ge2,uint shi2)        //數碼管顯示
  25. {
  26.         //顯示北
  27.         wela=1; //打開位選鎖存器
  28.         P0=wei[0];        //送入位選碼(北個位)
  29.         wela=0; //關閉位選鎖存器
  30.         P0=0;  //消影
  31.         dula=1; //打開段選鎖存器
  32.         P0=table[ge1]; //送入段選
  33.         dula=0;        //關閉段選鎖存器
  34.         delay(1);

  35.         wela=1; //打開位選鎖存器
  36.         P0=wei[1];        //送入位選碼(北十位)
  37.         wela=0; //關閉位選鎖存器
  38.         P0=0;
  39.         dula=1; //打開段選鎖存器
  40.         P0=table[shi1]; //送入段選
  41.         dula=0;        //關閉段選鎖存器
  42.         delay(1);

  43.         //顯示東西
  44.         wela=1; //打開位選鎖存器
  45.         P0=wei[2];        //送入位選碼(東個位)
  46.         wela=0; //關閉位選鎖存器
  47.         P0=0;
  48.         dula=1; //打開段選鎖存器
  49.         P0=table[ge2];
  50.         dula=0;        //關閉段選鎖存器
  51.         delay(1);

  52.         wela=1; //打開位選鎖存器
  53.         P0=wei[3];        //送入位選碼(東十位)
  54.         wela=0; //關閉位選鎖存器
  55.         P0=0;       
  56.         dula=1; //打開段選鎖存器
  57.         P0=table[shi2];
  58.         dula=0;        //關閉段選鎖存器
  59.         delay(1);
  60. }
  61. void key1_6()
  62. {
  63.         //第一個按鍵(南北通行)
  64.         if(key==1)
  65.         {
  66.                 TR0=0;  //定時器0停止計時
  67.                 P1=0x0c; //南北通行
  68.                 p=1;        //數碼管顯示99
  69.         }
  70.         //第二個按鍵(東西通行)
  71.         if(key==2)
  72.         {
  73.                 TR0=0;  //定時器0停止計時
  74.                 P1=0x21; //東西通行
  75.                 p=1;
  76.         }
  77.         //第三個按鍵(夜間模式)
  78.         if(key==3)
  79.         {
  80.                 TR0=0;  //關閉定時器
  81.                 p=1;
  82.         }
  83.         //第四個按鍵(減時間)
  84.         if(key==4)
  85.         {
  86.                 p=0;                       
  87.                 TR0=0;  //定時器0停止計時
  88.                 P1=0;        //燈滅
  89.                 if(chose==0)  //減南北方向
  90.                 {
  91.                         if(time1>0)          //最低減到0
  92.                         {
  93.                                 time1--;
  94.                                 t1=time1;
  95.                         }
  96.                 }
  97.                 if(chose==1)  //減東西方向
  98.                 {
  99.                         if(time2>0)
  100.                         {
  101.                                 time2--;
  102.                                 t2=time2;
  103.                         }
  104.                 }
  105.         }
  106.         //第五個按鍵(加時間)
  107.         if(key==5)
  108.         {
  109.                 p=0;
  110.                 TR0=0;  //定時器0停止計時
  111.                 P1=0;        //燈滅
  112.                 if(chose==0)  //加南北方向
  113.                 {
  114.                         if(time1<99)   //最多加到99
  115.                         {
  116.                                 time1++;
  117.                                 t1=time1;
  118.                         }
  119.                 }
  120.                 if(chose==1)  //加東西方向
  121.                 {
  122.                         if(time2<99)
  123.                         {
  124.                                 time2++;
  125.                                 t2=time2;
  126.                         }
  127.                 }
  128.         }
  129.         //第六個按鍵(加減后確定工作)
  130.         if(key==6)
  131.         {
  132.                 if(time1>time2)
  133.                         time1=time2+3;                                         
  134.                 else
  135.                         time2=time1+3;
  136.                 temp=0;         //計數值清零
  137.                 p=0;
  138.                 P1=0x21;  //南北紅燈,東西綠燈       
  139.                 TR0=1;  //定時器0開始計時
  140.         }
  141.         //第七個按鍵(切換)
  142.         if(key==7)
  143.         {
  144.                 p=0;
  145.                 chose=!chose;  
  146.         }
  147. }
  148. void dis()
  149. {
  150.         wela=1;
  151.         P0=0xff;
  152.         wela=0;
  153. }         
  154. void main()
  155. {
  156.         P1=0x21;  //剛開始南北的紅燈亮,東西的綠燈亮
  157.         TMOD=0x01;
  158.         TH0=(65535-50000)/256;
  159.         TL0=(65535-50000)%256;   //初值
  160.         EA=1;           //打開總中斷
  161.         ET0=1;           //定時器0允許中斷
  162.         TR0=1;           //定時器0開始計時
  163.         EX0=1;           //外部中斷0允許位
  164.         IT0=1;           //外部中斷0觸發方式(下降沿)
  165.         while(1)
  166.         {
  167.                 if(flag)
  168.                 {
  169.                         switch(status)                   //判斷按鍵
  170.                         {
  171.                                 case 0xfe:key=1;break;
  172.                                 case 0xfd:key=2;break;
  173.                                 case 0xfc:key=3;break;
  174.                                 case 0xfb:key=4;break;
  175.                                 case 0xfa:key=5;break;
  176.                                 case 0xf9:key=6;break;
  177.                                 case 0xf8:key=7;break;
  178.                         }
  179.                         key1_6();   //按鍵程序
  180.                         flag=0;
  181.                 }       
  182.                 if(!p)
  183.                 {
  184.                         shi1=time1/10;        //南北十位
  185.                         ge1=time1%10;        //南北個位
  186.                         shi2=time2/10;        //東西十位
  187.                         ge2=time2%10;        //東西個位       
  188.                         display(ge1,shi1,ge2,shi2); //顯示函數
  189.                 }
  190.             if(p)
  191.                         dis();         //不顯示函數
  192.                 if(key==3)          //夜間模式
  193.                 {
  194.                         P0=0xff;
  195.                         q=!q;
  196.                         if(q!=0)
  197.                                 P1=0x12;
  198.                         else
  199.                                 P1=0;
  200.                         delay(200);
  201.                 }
  202.         }  
  203. }          
  204. void ext0() interrupt 0
  205. {
  206.         flag=1;
  207.         status=P2;       
  208. }
  209. void timer() interrupt 1   //定時中斷程序
  210. {
  211.         TH0=(65535-50000)/256;
  212.         TL0=(65535-50000)%256;                //重新賦初值
  213.         temp++;
  214.         if(temp==20)   //說明過去了1秒
  215.         {
  216.                 temp=0;   //清零,重新加到20
  217.                 //東西方向南北方向時間自減
  218.                 time1--;
  219.                 time2--;
  220.                 if(time1>time2)        //南北大于東西
  221.                 {
  222.                         time1=time2+5;
  223.                         P1=0x21;        //南北紅燈亮起,東西綠燈亮起
  224.                         if(time2==0&&time1==5)  
  225.                         {
  226.                                 time2=5;  //重新賦南北和東西的差值,與南北方向一起倒計時
  227.                                 P1=0x11;  //東西黃燈亮起,東西綠燈關閉
  228.                                 tab=0;         //標志位
  229.                         }       
  230.                 }
  231.                 if(time1<time2)        //南北小于東西
  232.                 {       
  233.                         time2=time1+5;               
  234.                         P1=0x0c;        //南北綠燈亮起,東西紅燈亮起
  235.                         if(time1==0&&time2==5)  
  236.                         {
  237.                                 time1=5;  //重新賦南北和東西的差值,與東西方向一起倒計時
  238.                                 P1=0x0a;  //南北黃燈亮起,南北綠燈關閉
  239.                                 tab=1;        //標志位
  240.                         }       
  241.                 }
  242.                 if(!tab)                   //黃燈閃爍三秒
  243.                 {
  244.                         if(time1==2&&time2==2)
  245.                                 P1=0x01;
  246.                         if(time1==1&&time2==1)
  247.                                 P1=0x11;
  248.                 }
  249.                 if(tab)
  250.                 {
  251.                         if(time1==2&&time2==2)
  252.                                 P1=0x08;
  253.                         if(time1==1&&time2==1)
  254.                                 P1=0x0a;
  255.                 }       
  256.                 if(time1==0&&time2==0&&tab==0)  //東西倒計時結束
  257.                 {
  258.                         time1=t1;
  259.                         time2=t1+5;
  260.                         P1=0x0c;   //東西紅燈,南北綠燈
  261.                 }
  262.                 if(time1==0&&time2==0&&tab==1)  //南北倒計時結束
  263.                 {
  264.                         time1=t2+5;
  265.                         time2=t2;
  266.                         P1=0x21;   //南北紅燈,東西綠燈
  267.                 }       
  268.         }       
  269. }
復制代碼

以上代碼51hei提供下載:
123.docx (15.55 KB, 下載次數: 14)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av网站推荐| 亚洲一区二区三区四区五区中文 | 欧美二区三区 | 免费在线一区二区三区 | 国产精品久久久久久久久久久久久 | 91免费视频观看 | 国产精品久久久久久亚洲调教 | 五月天婷婷综合 | 99久久精品免费看国产四区 | 久在线| 成人精品视频在线观看 | 欧美精品在欧美一区二区少妇 | 国产精品二区三区 | 麻豆changesxxx国产 | 成年女人免费v片 | 国产激情视频在线 | 麻豆精品国产免费 | 青青草这里只有精品 | 国产精品一区二区久久 | 欧美日韩成人 | 懂色av蜜桃av | 成人性生交大片免费看r链接 | 色婷婷久久久亚洲一区二区三区 | www.4567| 亚洲国产精品99久久久久久久久 | 久久久久亚洲精品国产 | 婷婷久久综合 | 日韩精品久久久 | 一级国产精品一级国产精品片 | 日韩精品不卡 | 天久久| 欧美亚洲国产一区二区三区 | 成人精品国产一区二区4080 | 亚洲国产精品久久 | 国产欧美在线 | 国内精品一区二区 | 国产精品久久久久久久久免费丝袜 | 一区二区高清在线观看 | 日韩精品在线视频 | 国产激情小视频 | 久久综合国产 |