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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的交通信號燈程序設計

[復制鏈接]
跳轉到指定樓層
樓主
這是我的《微處理器與接口技術》的設計,交通信號燈 C語言版,可在proteus上仿真,用時一周才完成的。分享此設計的目的在與相互學習,其中有不足的地方請大家多多指教!
設計說明:
1、交通燈單片機設計。
2、數碼管倒計時顯示時間。
3、東西和南北方向各有兩個數碼管,分別顯示時間,東西和南北的時間是不一樣的,要相差黃燈的時間才是正確的。。
4、有緊急模式,可以特種車輛優先通行或交通事故應急處理。
操作說明:
按鍵依次功能:黃燈長亮(深夜模式)、紅燈長亮(禁行)、確定調時時間、時間加、時間減、切換調時方向(東西和南北均可以分別設置通行時間)。單獨的是復位按鍵。
電路原理:


單片機源程序如下:
  1. #include <reg51.h>                                //頭文件
  2. #define uchar unsigned char
  3. #define uint  unsigned int                //宏定義

  4. uchar data buf[4];                                        //秒顯示的變量
  5. uchar data sec_dx=20;                          //東西數默認
  6. uchar data sec_nb=30;                        //南北默認值
  7. uchar data set_timedx=20;                //設置東西方向的時間
  8. uchar data set_timenb=30;                //設置南北方向的時間
  9. int n;
  10. uchar data countt0,countt1;//定時器0中斷次數
  11. //定義6組開關
  12. sbit  k4=P3^7;      //切換方向
  13. sbit  k1=P3^5;                //時間加
  14. sbit  k2=P3^6;                //時間減
  15. sbit  k3=P3^4;                //確認
  16. sbit  k5=P3^1;                //禁止
  17. sbit  k6=P1^5;                //夜間模式


  18. sbit Red_nb=P2^6;                //南北紅燈標志
  19. sbit Yellow_nb=P2^5;        //南北黃燈標志
  20. sbit Green_nb=P2^4;     //南北綠燈標志

  21. sbit Red_dx=P2^3;                //東西紅燈標志
  22. sbit Yellow_dx=P2^2;        //東西黃燈標志
  23. sbit Green_dx=P2^1;                //東西綠燈標志
  24.                
  25. bit set=0;                                //調時方向切換鍵標志 =1時,南北,=0時,東西
  26. bit dx_nb=0;                        //東西南北控制位
  27. bit shanruo=0;                        //閃爍標志位
  28. bit yejian=0;                        //夜間黃燈閃爍標志位

  29. uchar code table[11]={        //共陰極字型碼
  30.         0x3f,  //--0
  31.         0x06,  //--1
  32.         0x5b,  //--2
  33.         0x4f,  //--3
  34.         0x66,  //--4
  35.         0x6d,  //--5
  36.         0x7d,  //--6
  37.         0x07,  //--7
  38.         0x7f,  //--8
  39.         0x6f,  //--9
  40.         0x00   //--NULL
  41. };

  42. //函數的聲明部分
  43. void delay(int ms);                        //延時子程序
  44. void key();                                        //按鍵掃描子程序
  45. void key_to1();                                //鍵處理子程序
  46. void key_to2();
  47. void key_to3();
  48. void display();                                //顯示子程序
  49. void logo();                                   //開機LOGO
  50. void Buzzer();
  51. //主程序
  52. void main()
  53. {
  54.         TMOD=0X11;                                           //定時器設置
  55.         TH1=0X3C;               
  56.         TL1=0XB0;
  57.         TH0=0X3C;                                        //定時器0置初值 0.05S
  58.         TL0=0XB0;
  59.         EA=1;                                                //開總中斷
  60.         ET0=1;                                                //定時器0中斷開啟
  61.         ET1=1;                                           //定時器1中斷開啟
  62.         TR0=1;                                                //啟動定時0
  63.         TR1=0;                                                         //關閉定時1
  64.     logo();                                                //開機初始化
  65.         P2=0Xc3;                                        // 開始默認狀態,東西綠燈,南北黃燈   
  66.     sec_nb=sec_dx+5;                         //默認南北通行時間比東西多5秒
  67.         while(1)                                          //主循環
  68.         {         
  69.                 key();                                         //調用按鍵掃描程序
  70.                 display();                                 //調用顯示程序
  71.         }      
  72. }
  73. //函數的定義部分
  74. void key(void)        //按鍵掃描子程序
  75. {         
  76.         if(k1!=1)                                                        //當K1(時間加)按下時
  77.         {
  78.                 display();                                       //調用顯示,用于延時消抖
  79.                 if(k1!=1)                                                        //如果確定按下
  80.                 {
  81.                           TR0=0;                                               //關定時器      
  82.                         shanruo=0;                                        //閃爍標志位關
  83.                         P2=0x00;                                        //滅顯示
  84.                         TR1=0;                                                        //啟動定時1
  85.                         if(set==0)                                        //設置鍵按下
  86.                                 set_timedx++;                   //南北加1S
  87.                         else
  88.                                 set_timenb++;                    //東西加1S
  89.                         if(set_timenb==100)
  90.                                 set_timenb=1;
  91.                         if(        set_timedx==100)
  92.                                 set_timedx=1;                   //加到100置1
  93.                         sec_nb=set_timenb ;                 //設置的數值賦給東西南北
  94.                         sec_dx=set_timedx;                       
  95.                           do
  96.                          {
  97.                                 display();                                 //調用顯示,用于延時
  98.                         }
  99.                         while(k1!=1);                         //等待按鍵釋放
  100.                 }
  101.         }

  102.         if(k2!=1)                                                        //當K2(時間減)按鍵按下時
  103.         {               
  104.                 display();                                       //調用顯示,用于延時消抖  
  105.                 if(k2!=1)                                                //如果確定按下
  106.                 {      
  107.                          TR0=0;                                         //關定時器0      
  108.                         shanruo=0;                                        //閃爍標志位關
  109.                         P2=0x00;                                        //滅顯示
  110.                         TR1=0;                                                //關定時器1      
  111.                         if(set==0)
  112.                                 set_timedx--;                          //南北減1S
  113.                         else
  114.                                 set_timenb--;                          //東西減1S
  115.                         if(set_timenb==0)
  116.                                 set_timenb=99;      
  117.                         if(        set_timedx==0 )
  118.                                 set_timedx=99;                   //減到1重置99
  119.                         sec_nb=set_timenb ;                         //設置的數值賦給東西南北
  120.                         sec_dx=set_timedx;
  121.                           do      
  122.                     {
  123.                                 display();                       //調用顯示,用于延時
  124.                         }
  125.                         while(k2!=1);                           //等待按鍵釋放
  126.                 }
  127.         }

  128.         if(k3!=1)                                                        //當K3(確認)鍵按下時
  129.         {      
  130.                 display();                                       //調用顯示,用于延時消抖
  131.                 if(k3!=1)                                                //如果確定按下
  132.                 {
  133.                         TR0=1;                                                  //啟動定時器0
  134.                         sec_nb=set_timenb;                                //從中斷回復,仍顯示設置過的數值
  135.                         sec_dx=set_timedx;                                //顯示設置過的時間
  136.                         TR1=0;                                                        //關定時器1      
  137.                         if(set==0)                                                //時間倒時到0時
  138.                         {
  139.                                 P2=0X00;                                         //滅顯示
  140.                                 Green_dx=1;                                                //東西綠燈亮
  141.                                 Red_nb=1;                                        //南北紅燈亮
  142.                                 sec_nb=sec_dx+5;                         //回到初值
  143.                         }
  144.                         else
  145.                         {
  146.                                 P2=0x00;                                        //南北綠燈,東西紅燈
  147.                                 Green_nb=1;
  148.                                 Red_dx=1;
  149.                                 sec_dx=sec_nb+5;
  150.                         }
  151.                 }
  152.         }
  153.          
  154.         if(k4!=1)                                                        //當K4(切換)鍵按下
  155.     {
  156.                 display();                                       //調用顯示,用于延時消抖
  157.                 if(k4!=1)                                                //如果確定按下
  158.                 {  
  159.                          TR0=0;                                                //關定時器0      
  160.                         set=!set;                                        //取反set標志位,以切換調節方向
  161.                         TR1=0;                                                //關定時器1
  162.                         dx_nb=set;
  163.                         do
  164.                         {
  165.                                 display();                            //調用顯示,用于延時
  166.                         }                              
  167.                         while(k4!=1);                          //等待按鍵釋放
  168.                 }
  169.         }      

  170.         if(k5!=1)                                                        //當K5(禁止)鍵按下時
  171.         {
  172.                    display();                                       //調用顯示,用于延時消抖
  173.                    if(k5!=1)                                                //如果確定按下
  174.                    {        
  175.                     TR0=0;                                                //關定時器
  176.                         P2=0x00;                                        //滅顯示
  177.                         Red_dx=1;
  178.                         Red_nb=1;                                        //全部置紅燈
  179.                         TR1=0;
  180.                         sec_dx=00;                                        //四個方向的時間都為00
  181.                         sec_nb=00;
  182.                         do
  183.                         {
  184.                                 display();                                 //調用顯示,用于延時
  185.                         }      
  186.                         while(k5!=1);                        //等待按鍵釋放      
  187.                    }
  188.         }
  189.         if(k6!=1)                                                        //當K6(夜間模式)按下
  190.         {
  191.                    display();                                       //調用顯示,用于延時消抖
  192.                    if(k6!=1)                                                //如果確定按下
  193.                    {        
  194.                     TR0=0;                                                //關定時器
  195.                         P2=0x00;
  196.                         TR1=1;
  197.                         sec_dx=00;                                        //四個方向的時間都為00
  198.                         sec_nb=00;
  199.                         do
  200.                         {
  201.                                 display();                           //調用顯示,用于延時
  202.                         }      
  203.                         while(k6!=1);                        //等待按鍵釋放      
  204.                    }
  205.         }
  206. }
  207. void display(void) //顯示子程序
  208. {               
  209.         buf[1]=sec_nb/10;                 //第1位 東西秒十位
  210.         buf[2]=sec_nb%10;                 //第2位 東西秒個位
  211.         buf[3]=sec_dx/10;                 //第3位 南北秒十位
  212.         buf[0]=sec_dx%10;                 //第4位 南北秒個位               
  213.         P1=0xff;                          // 初始燈為滅的
  214.         P0=0x00;                                 ////滅顯示
  215.         P1=0xfe;                           //片選LED1
  216.         P0=table[buf[1]];                //送東西時間十位的數碼管編碼                       
  217.         delay(1);                                //延時
  218.         P1=0xff;                                //關顯示
  219.         P0=0x00;                                //滅顯示
  220.                                                   
  221.         P1=0xfd;                     //片選LED2
  222.         P0=table[buf[2]];                 //送東西時間個位的數碼管編碼
  223.         delay(1);                                 //延時
  224.         P1=0xff;                                //關顯示
  225.         P0=0x00;                                //關顯示
  226.         P1=0Xfb;                                  //片選LED3
  227.         P0=table[buf[3]];                //送南北時間十位的數碼管編碼
  228.         delay(1);                                //延時
  229.         P1=0xff;                                 //關顯示
  230.         P0=0x00;                                 //關顯示
  231.         P1=0Xf7;                                 //片選LED4      
  232.         P0=table[buf[0]];                //送南北時間個位的數碼管編碼
  233.         delay(1);                                //延時
  234. }

  235. void time0(void) interrupt 1 using 1          //定時中斷子程序
  236. {
  237.         TH0=0X3C;                                                        //重賦初值
  238.         TL0=0XB0;                                                        //12m晶振50ms//重賦初值
  239.         TR0=1;                                                                //重新啟動定時器
  240.         countt0++;                                                        //軟件計數加1
  241.         if(countt0==10)                                                //加到10也就是半秒
  242.         {
  243.                 if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1))                  //東西黃燈閃               
  244.         {
  245.                         Green_dx=0;
  246.                         Yellow_dx=0;
  247.                 }                                                  
  248.             if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1))                  //南北黃燈閃               
  249.         {  
  250.                         Green_nb=0;
  251.                         Yellow_nb=0;
  252.                 }      
  253.         }
  254.                
  255.         if(countt0==20)                                  // 定時器中斷次數=20時(即1秒時)
  256.         {        countt0=0;                                                //清零計數器
  257.                 sec_dx--;                                                //東西時間減1
  258.                 sec_nb--;                                                //南北時間減1

  259.                 if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1))                  //東西黃燈閃               
  260.         {
  261.                         Green_dx=0;
  262.                         Yellow_dx=1;
  263.                 }                                                  
  264.             if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1))                  //南北黃燈閃               
  265.         {  
  266.                         Green_nb=0;
  267.                         Yellow_nb=1;
  268.                 }                                                               
  269.                 if(sec_dx==0&&sec_nb==5)                 //當東西倒計時到0時,重置5秒,用于黃燈閃爍時間   
  270.                 {
  271.                         sec_dx=5;
  272.                         shanruo=1;
  273.                 }
  274.                 if(sec_nb==0&&sec_dx==5)                //當南北倒計時到0時,重置5秒,用于黃燈閃爍時間   
  275.                 {
  276.                         sec_nb=5;
  277.                         shanruo=1;
  278.                 }
  279.                 if(dx_nb==0&&sec_nb==0)                        //當黃燈閃爍時間倒計時到0時,
  280.                 {
  281.                         P2=0x00;                                        //重置東西南背方向的紅綠燈
  282.                         Green_nb=1;
  283.                         Red_dx=1;
  284.                         dx_nb=!dx_nb;
  285.                         shanruo=0;
  286.                         sec_nb=set_timenb;                        //重賦南北方向的起始值
  287.                         sec_dx=set_timenb+5;                //重賦東西方向的起始值
  288.                 }               
  289.                 if(dx_nb==1&&sec_dx==0)                        //當黃燈閃爍時間到
  290.                 {
  291.                         P2=0X00;                                        //重置東西南北的紅綠燈狀態
  292.                         Green_dx=1;                                         //東西綠燈亮
  293.                         Red_nb=1;                                         //南北紅燈亮
  294.                         dx_nb=!dx_nb;                                 //取反
  295.                         shanruo=0;                                        //閃爍
  296.                         sec_dx=set_timedx;                        //重賦東西方向的起始值
  297.                         sec_nb=set_timedx+5;                //重賦南北方向的起始值
  298.                 }
  299.         }      
  300. }
  301. void time1(void) interrupt 3         //定時中斷子程序
  302. {
  303.         TH1=0X3C;                                                        //重賦初值
  304.         TL1=0XB0;                                                        //12m晶振50ms//重賦初值
  305.         countt1++;                                                        //軟件計數加1
  306.         if(countt1==10)                                           // 定時器中斷次數=10時(即0.5秒)
  307.         {
  308.                         Yellow_nb=0;                                //南北黃燈滅
  309.                         Yellow_dx=0;                                //東西黃燈滅
  310.         }
  311.         if(countt1==20)                                  // 定時器中斷次數=20時(即1秒時)
  312.         {        countt1=0;                                                //清零計數器
  313.                         Yellow_nb=1;                                        //南北黃燈亮
  314.                         Yellow_dx=1;                                  //東西黃燈亮
  315.         }      
  316. }

  317. void logo()//開機的Logo  "- - - -"
  318. {
  319.         for(n=0;n<50;n++)        //循環顯示----50次
  320.            {
  321.             P0=0x40;  //送形“-”
  322.             P1=0xfe;        //第一位顯示
  323.                 delay(1);        //延時
  324.             P1=0xfd;        //第二位顯示
  325.                 delay(1);        //延時
  326.                 P1=0Xfb;        //第三位顯示
  327.                 delay(1);        //延時
  328.                 P1=0Xf7;        //第四位顯示
  329.                 delay(1);        //延時
  330.             P1 = 0xff;        //滅顯示
  331.         }
  332. }

  333. void delay(int ms)                //延時子程序
  334. {
  335.         uint j,k;
  336.         for(j=0;j<ms;j++)                        //延時ms
  337.            for(k=0;k<124;k++);                //大約1毫秒的延時
  338. }
復制代碼




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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区在线观看 | 亚洲精品免费视频 | 国产精品久久久久久婷婷天堂 | 日日噜噜噜夜夜爽爽狠狠视频, | 中文av字幕 | 久久99精品久久久97夜夜嗨 | 免费网站国产 | 欧美中文字幕一区二区三区亚洲 | 国产欧美一区二区三区免费 | 91青娱乐在线 | 久久伊 | 亚洲一二三在线 | 免费毛片网 | 国产欧美在线播放 | 国产一区二区电影 | 国产欧美一区二区三区在线播放 | 久久久久久精 | 中文字幕亚洲在线 | 香蕉视频91 | 国产精品视频一二三区 | 国产精品一区二区在线播放 | 欧美激情一区二区三级高清视频 | 国产在线97 | 毛片大全| 又黄又爽的网站 | 国产农村一级片 | 最新国产福利在线 | 久久久久久久久久久久久久国产 | 欧美中文字幕一区二区三区亚洲 | 嫩草视频在线 | 一区在线视频 | 欧美自拍网站 | 亚洲综合在线播放 | 91久久国产综合久久 | 开操网| 在线激情视频 | 爱草视频| 羞羞视频在线观看 | 在线亚洲欧美 | 天天爽夜夜爽精品视频婷婷 | 在线观看黄视频 |