標(biāo)題: 51單片機(jī)七鍵交通燈程序 緊急模式,夜間模式,時(shí)間設(shè)定,加時(shí)間,減時(shí)間,確定,復(fù)位 [打印本頁]

作者: hithy    時(shí)間: 2020-6-14 13:00
標(biāo)題: 51單片機(jī)七鍵交通燈程序 緊急模式,夜間模式,時(shí)間設(shè)定,加時(shí)間,減時(shí)間,確定,復(fù)位
七個(gè)按鍵分別實(shí)現(xiàn),緊急模式,夜間模式,時(shí)間設(shè)定,加時(shí)間,減時(shí)間,確定,復(fù)位

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

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


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

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

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

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

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

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

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

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

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

  330. void delay(int ms)        //延時(shí)子程序
  331. {
  332.     uint j,k;
  333.     for(j=0;j<ms;j++)            //延時(shí)ms
  334.        for(k=0;k<124;k++);        //大約1毫秒的延時(shí)
  335. }
復(fù)制代碼

由于自己的水平有限,程序肯定還存在很多的問題,歡迎大家批評指正,大家一起提高技術(shù)水平:
交通燈程序改后.rar (280.39 KB, 下載次數(shù): 116)
2017單片機(jī)交通燈控制 .doc (1.76 MB, 下載次數(shù): 58)
參考資料:http://www.torrancerestoration.com/bbs/dpj-189417-1.html
http://www.torrancerestoration.com/bbs/dpj-81606-1.html



作者: 梨子栗子    時(shí)間: 2020-6-20 21:06
沒有圖···怎么知道是不是自己需要的
作者: 1144073284    時(shí)間: 2020-12-8 15:01
可以但是仿真運(yùn)行出錯(cuò)
作者: ning.112    時(shí)間: 2020-12-31 11:23
運(yùn)行顯示沒有錯(cuò)誤和警告但是仿真出來不是我們想要的結(jié)果




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1