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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機七鍵交通燈程序 緊急模式,夜間模式,時間設定,加時間,減時間,確定,復位

[復制鏈接]
跳轉到指定樓層
樓主
ID:536280 發表于 2020-6-14 13:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
七個按鍵分別實現,緊急模式,夜間模式,時間設定,加時間,減時間,確定,復位

單片機源程序如下:
  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;              //東西數默認
  6. uchar data sec_nb=30;            //南北默認值
  7. uchar data set_timedx=30;        //設置東西方向的時間
  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 display();                //顯示子程序
  46. void logo();                   //開機LOGO
  47. void Buzzer();
  48. //主程序
  49. void main()
  50. {
  51.     TMOD=0X11;                       //定時器設置
  52.     TH1=0X3C;        
  53.     TL1=0XB0;
  54.     TH0=0X3C;                    //定時器0置初值 0.05S
  55.     TL0=0XB0;
  56.     EA=1;                        //開總中斷
  57.     ET0=1;                        //定時器0中斷開啟
  58.     ET1=1;                       //定時器1中斷開啟
  59.     TR0=1;                        //啟動定時0
  60.     TR1=0;                             //關閉定時1
  61.     logo();                        //開機初始化
  62.     P2=0Xc3;                    // 開始默認狀態,東西綠燈,南北黃燈   
  63.     sec_nb=sec_dx;             //默認南北通行時間比東西多5秒
  64.     while(1)                      //主循環
  65.     {     
  66.         key();                     //調用按鍵掃描程序
  67.         display();                 //調用顯示程序
  68.     }   
  69. }
  70. //函數的定義部分
  71. void key(void)    //按鍵掃描子程序
  72. {     
  73.     if(k1!=1)                            //當K1(時間加)按下時
  74.     {
  75.         display();                       //調用顯示,用于延時消抖
  76.         if(k1!=1)                            //如果確定按下
  77.         {
  78.               TR0=0;                           //關定時器   
  79.             shanruo=0;                    //閃爍標志位關
  80.             P2=0x00;                    //滅顯示
  81.             TR1=0;                            //啟動定時1
  82.             if(set==0)                    //設置鍵按下
  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 ;         //設置的數值賦給東西南北
  91.             sec_dx=set_timedx;            
  92.               do
  93.              {
  94.                 display();                 //調用顯示,用于延時
  95.             }
  96.             while(k1!=1);             //等待按鍵釋放
  97.         }
  98.     }

  99.     if(k2!=1)                            //當K2(時間減)按鍵按下時
  100.     {        
  101.         display();                       //調用顯示,用于延時消抖  
  102.         if(k2!=1)                        //如果確定按下
  103.         {   
  104.              TR0=0;                         //關定時器0   
  105.             shanruo=0;                    //閃爍標志位關
  106.             P2=0x00;                    //滅顯示
  107.             TR1=0;                        //關定時器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 ;             //設置的數值賦給東西南北
  117.             sec_dx=set_timedx;
  118.               do   
  119.             {
  120.                 display();               //調用顯示,用于延時
  121.             }
  122.             while(k2!=1);               //等待按鍵釋放
  123.         }
  124.     }

  125.     if(k3!=1)                            //當K3(確認)鍵按下時
  126.     {   
  127.         display();                       //調用顯示,用于延時消抖
  128.         if(k3!=1)                        //如果確定按下
  129.         {
  130.             TR0=1;                          //啟動定時器0
  131.             sec_nb=set_timenb;                //從中斷回復,仍顯示設置過的數值
  132.             sec_dx=set_timedx;                //顯示設置過的時間
  133.             TR1=0;                            //關定時器1   
  134.             if(set==0)                        //時間倒時到0時
  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)                            //當K4(切換)鍵按下
  152.     {
  153.         display();                       //調用顯示,用于延時消抖
  154.         if(k4!=1)                        //如果確定按下
  155.         {  
  156.              TR0=0;                        //關定時器0   
  157.             set=!set;                    //取反set標志位,以切換調節方向
  158.             TR1=0;                        //關定時器1
  159.             dx_nb=set;
  160.             do
  161.             {
  162.                 display();                //調用顯示,用于延時
  163.             }               
  164.             while(k4!=1);              //等待按鍵釋放
  165.         }
  166.     }   

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

  232. void time0(void) interrupt 1 using 1      //定時中斷子程序
  233. {
  234.     TH0=0X3C;                            //重賦初值
  235.     TL0=0XB0;                            //12m晶振50ms//重賦初值
  236.     TR0=1;                                //重新啟動定時器
  237.     countt0++;                            //軟件計數加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)                          // 定時器中斷次數=20時(即1秒時)
  253.     {    countt0=0;                        //清零計數器
  254.         sec_dx--;                        //東西時間減1
  255.         sec_nb--;                        //南北時間減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)         //當東西倒計時到0時,重置5秒,用于黃燈閃爍時間   
  269.         {
  270.             shanruo=1;
  271.         }
  272.         if(sec_nb==4&&sec_dx==4)        //當南北倒計時到0時,重置5秒,用于黃燈閃爍時間   
  273.         {
  274.             shanruo=1;
  275.         }
  276.         if(dx_nb==0&&sec_nb==0)            //當黃燈閃爍時間倒計時到0時,
  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)            //當黃燈閃爍時間到
  287.         {
  288.             P2=0X00;                    //重置東西南北的紅綠燈狀態
  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     //定時中斷子程序
  299. {
  300.     TH1=0X3C;                            //重賦初值
  301.     TL1=0XB0;                            //12m晶振50ms//重賦初值
  302.     countt1++;                            //軟件計數加1
  303.     if(countt1==10)                       // 定時器中斷次數=10時(即0.5秒)
  304.     {
  305.             Yellow_nb=0;                //南北黃燈滅
  306.             Yellow_dx=0;                //東西黃燈滅
  307.     }
  308.     if(countt1==20)                          // 定時器中斷次數=20時(即1秒時)
  309.     {    countt1=0;                        //清零計數器
  310.             Yellow_nb=1;                    //南北黃燈亮
  311.             Yellow_dx=1;                  //東西黃燈亮
  312.     }   
  313. }

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

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

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


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

使用道具 舉報

沙發
ID:731930 發表于 2020-6-20 21:06 | 只看該作者
沒有圖···怎么知道是不是自己需要的
回復

使用道具 舉報

板凳
ID:828032 發表于 2020-12-8 15:01 | 只看該作者
可以但是仿真運行出錯
回復

使用道具 舉報

地板
ID:870116 發表于 2020-12-31 11:23 | 只看該作者
運行顯示沒有錯誤和警告但是仿真出來不是我們想要的結果
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频一区二区三区 | 日韩久久久久 | 欧美午夜激情在线 | 一区二区电影网 | 欧美一级片 | www.99re| 亚洲精品一区av在线播放 | 欧美精品中文字幕久久二区 | 欧美一区二 | 男女羞羞视频在线看 | 亚洲aⅴ| 欧美xxxx在线 | 精品美女久久久 | 91天堂网 | 久久国产精品久久久久久 | 视频在线一区二区 | 99久久精品国产毛片 | 久久久av| 欧美三级网站 | 国产亚洲日本精品 | 一区二区三区在线免费观看 | 国产精品免费在线 | 亚洲热在线视频 | 成人免费观看网站 | 91精品欧美久久久久久久 | 日韩视频中文字幕 | 久久精品色欧美aⅴ一区二区 | 国产精品揄拍一区二区久久国内亚洲精 | 97caoporn国产免费人人 | 国产欧美一区二区三区久久手机版 | 亚洲一区二区精品视频 | 久久久久国产视频 | 中文字幕在线视频网站 | 日韩一区二区成人 | 亚洲电影免费 | 午夜欧美一区二区三区在线播放 | 国产91在线 | 欧美 | 欧美a∨| www.887色视频免费 | www精品| 欧美日韩一区二区三区不卡视频 |