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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的交通燈c程序代碼,帶人行道指示燈,緊急狀態,時間控制

[復制鏈接]
跳轉到指定樓層
樓主
電路圖如下所示:
流程圖:

單片機源程序如下:
  1. #include <STC12.H>

  2. #define u8 unsigned char
  3. #define u16 unsigned int

  4. sbit LED_NBS=P2^0;//南北數碼管位選腳
  5. sbit LED_NBG=P2^1;//南北數碼管位選腳
  6. sbit LED_DXS=P2^2;//東西數碼管位選腳
  7. sbit LED_DXG=P2^3;//東西數碼管位選腳

  8. sbit GNB=P3^0;//綠/南北
  9. sbit YNB=P3^1;//黃/南北
  10. sbit RNB=P3^2;//紅/南北
  11. sbit GDX=P3^3;//綠/東西
  12. sbit YDX=P3^4;//黃/東西
  13. sbit RDX=P3^5;//紅/東西

  14. sbit GRNB=P2^4;//綠/南北人行道
  15. sbit RRNB=P2^5;//紅/南北人行道
  16. sbit GRDX=P2^6;//綠/東西人行道
  17. sbit RRDX=P2^7;//紅/東西人行道

  18. sbit RADD=P1^0;//加/紅燈
  19. sbit RSUB=P1^1;//減/紅燈
  20. sbit GADD=P1^2;//加/綠燈
  21. sbit GSUB=P1^3;//減/綠燈
  22. sbit JJ=P3^6;//緊急
  23. sbit YJ=P3^7;//夜間

  24. #define Time_Y_Save 5//黃燈間隔時間

  25. code u8 seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  26.                                                   0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};         //斷碼        
  27. u16 Time=0;//定時器中斷計數
  28. int Time_NB=20;//南北倒計時時間
  29. int Time_DX=30;//東西倒計時時間
  30. int Time_Y=Time_Y_Save;//黃燈倒計時時間
  31. int Time_NB_Save=20;//調整后北通行倒計時時間
  32. int Time_DX_Save=30;//調整后通行倒計時時間
  33. u8 Run_Flag=0;//運行記錄標志

  34. /******定時器初始化******/
  35. void Time0_Init()
  36. {
  37.   TMOD=0X01;//工作模式
  38.   EA=1;//開總中斷
  39.   TR0=1;//開啟定時器0計時
  40.   ET0=1;//開定時器0中斷
  41.   TH0=0X3C;//初值
  42.   TL0=0XB0;
  43. }

  44. /******************************************************************
  45. 延時函數
  46. ******************************************************************/
  47. void delay(u16 t)
  48. {
  49.   u8 j;
  50.   while(t--)
  51.            for(j=100;j>0;j--);
  52. }
  53. /**********************************************************************
  54.                 南北數碼管動態掃描
  55. *********************************************************************/
  56. void Display_NB(u16 Data) //顯示函數
  57. {
  58.   u8 s,g;

  59.   s=Data/10;                 //求十位
  60.   g=Data%10;             //求個位
  61.   P0=seg7code[s];//送十位段選值
  62.   LED_NBG=1;//關閉個位顯示
  63.   LED_NBS=0;//開啟十位顯示
  64.   delay(10);
  65.   LED_NBG=1;//關閉個位顯示
  66.   LED_NBS=1;//關閉十位顯示

  67.   P0=seg7code[g];//送個位段選值
  68.   LED_NBG=0;//開啟個位顯示
  69.   LED_NBS=1;//關閉十位顯示
  70.   delay(10);
  71.   LED_NBG=1;//關閉個位顯示
  72.   LED_NBS=1;//關閉十位顯示
  73. }
  74. /**********************************************************************
  75.                 東西數碼管動態掃描
  76. *********************************************************************/
  77. void Display_DX(u16 Data) //顯示函數
  78. {
  79.   u8 s,g;

  80.   s=Data/10;                 //求十位
  81.   g=Data%10;             //求個位
  82.   P0=seg7code[s];
  83.   LED_DXG=1;
  84.   LED_DXS=0;
  85.   delay(10);
  86.   LED_DXG=1;
  87.   LED_DXS=1;

  88.   P0=seg7code[g];
  89.   LED_DXG=0;
  90.   LED_DXS=1;
  91.   delay(10);
  92.   LED_DXG=1;
  93.   LED_DXS=1;
  94. }
  95. /******************************************************************
  96.                    特殊模式函數
  97. ******************************************************************/
  98. void TS_Mode()
  99. {
  100.   while(JJ==0)//緊急模式/全亮紅燈
  101.         {
  102.           P0=1;//關閉數碼管
  103.           GNB=1;//南北綠燈滅
  104.           YNB=1;//南北黃燈滅
  105.                 RNB=0;//南北紅燈亮
  106.                 GRNB=1;//南北人行道綠燈滅
  107.                 RRNB=0;//南北人行道紅燈亮

  108.           GDX=1;//東西綠燈滅
  109.           YDX=1;//東西黃燈滅
  110.                 RDX=0;//東西紅燈亮
  111.                 GRDX=1;//東西人行道綠燈滅
  112.                 RRDX=0;//東西人行道紅燈亮
  113.         }        

  114.   while(YJ==0)//夜間模式/黃燈閃爍
  115.         {
  116.           P0=1;//關閉數碼管
  117.                 GRNB=1;//南北人行道綠燈滅
  118.                 RRNB=1;//南北人行道紅燈滅
  119.                 GRDX=1;//東西人行道綠燈滅
  120.                 RRDX=1;//東西人行道紅燈滅                        
  121.           if(Time<=10)
  122.                 {
  123.                   GNB=1;//南北綠燈滅
  124.                   YNB=1;//南北黃燈滅
  125.                         RNB=1;//南北紅燈滅

  126.                   GDX=1;//東西綠燈滅
  127.                   YDX=1;//東西黃燈滅
  128.                         RDX=1;//東西紅燈滅
  129.                 }
  130.                 else if(Time<=20)
  131.                 {
  132.                   GNB=1;//南北綠燈滅
  133.                   YNB=0;//南北黃燈亮
  134.                         RNB=1;//南北紅燈滅        
  135.                   GDX=1;//東西綠燈滅
  136.                   YDX=0;//東西黃燈亮
  137.                         RDX=1;//東西紅燈滅
  138.                 }
  139.         }                                                               
  140. }
  141. /******************************************************************
  142.                   按鍵調整函數
  143. ******************************************************************/
  144. void Key_Adjust()
  145. {
  146.   u16 count=0;//循環計次

  147.         if(RADD==0)//增加東西通行時間
  148.         {
  149.                 Time_DX_Save++;
  150.                 if(Time_DX_Save>=99)
  151.                   Time_DX_Save=99;
  152.                 EA=0;//關中斷
  153.                 for(count=0;count<20;count++)
  154.                 {
  155.                         LED_NBG=1;//南北數碼管不顯示
  156.       LED_NBS=1;
  157.                         Display_DX(Time_DX_Save);//調整的東西數碼管顯示時間
  158.                 }
  159.                 EA=1;//開中斷
  160.         }
  161.         if(RSUB==0)//減少東西通行時間
  162.         {
  163.                 Time_DX_Save--;
  164.                 if(Time_DX_Save<=0)
  165.                   Time_DX_Save=0;
  166.                 EA=0;//關中斷
  167.                 for(count=0;count<20;count++)
  168.                 {
  169.                         LED_NBG=1;//南北數碼管不顯示
  170.       LED_NBS=1;
  171.                         Display_DX(Time_DX_Save);//調整的東西數碼管顯示時間
  172.                 }
  173.                 EA=1;//開中斷
  174.         }

  175.         if(GADD==0)//增加南北通行時間
  176.         {
  177.                 Time_NB_Save++;
  178.                 if(Time_NB_Save>=99)
  179.                   Time_NB_Save=99;
  180.                 EA=0;//關中斷
  181.                 for(count=0;count<20;count++)
  182.                 {
  183.                         Display_NB(Time_NB_Save);//調整的南北數碼管顯示時間
  184.                         LED_DXG=1;//東西數碼管不顯示
  185.       LED_DXS=1;
  186.                 }
  187.                 EA=1;//開中斷
  188.         }
  189.         if(GSUB==0)//減少南北通行時間
  190.         {
  191.                 Time_NB_Save--;
  192.                 if(Time_NB_Save<=0)
  193.                   Time_NB_Save=0;
  194.                 EA=0;//關中斷

  195.                 for(count=0;count<20;count++)
  196.                 {
  197.                         Display_NB(Time_NB_Save);//調整的南北數碼管顯示時間
  198.                         LED_DXG=1;//東西數碼管不顯示
  199.       LED_DXS=1;
  200.                 }
  201.                 EA=1;//開中斷
  202.         }
  203. }
  204. /******************************************************************
  205.                   主函數
  206. ******************************************************************/
  207. void main()         
  208. {         
  209.   Time0_Init();
  210.   while(1)
  211.   {
  212.           if(Run_Flag==0)//南北綠燈東西紅燈
  213.                 {
  214.                         Time_NB=Time_NB_Save;//獲取南北綠燈倒計時時間
  215.                         Time_DX=Time_NB_Save+Time_Y_Save;//獲取東西紅燈倒計時時間
  216.                         Time=0;//初始化計時時間
  217.                         while(1)
  218.                         {
  219.                           TS_Mode();//特殊模式檢測
  220.                                 Key_Adjust();//按鍵調整時間檢測
  221.                           GNB=0;//南北綠燈亮
  222.                           YNB=1;//南北黃燈滅
  223.                                 RNB=1;//南北紅燈滅
  224.                                 GRNB=0;//南北人行道綠燈亮
  225.                                 RRNB=1;//南北人行道紅燈滅

  226.                           GDX=1;//東西綠燈滅
  227.                           YDX=1;//東西黃燈滅
  228.                                 RDX=0;//東西紅燈亮
  229.                                 GRDX=1;//東西人行道綠燈滅
  230.                                 RRDX=0;//東西人行道紅燈亮
  231.                           if(GADD!=0&&GSUB!=0&&RADD!=0&&RSUB!=0)//無按鍵按下
  232.                                 {
  233.                                         Display_NB(Time_NB);//南北數碼管顯示時間
  234.                                   Display_DX(Time_DX);//東西數碼管顯示時間
  235.                                 }
  236.                                 if(Time_NB==0)
  237.                                 {
  238.                                   Run_Flag=1;//即將進入南北黃燈東西黃燈
  239.                                   break;
  240.                                 }
  241.                         }
  242.                 }

  243.                 if(Run_Flag==1)//南北黃燈東西紅燈
  244.                 {
  245.                         Time_Y=Time_Y_Save;//黃燈倒計時時間
  246.                   Time=0;//初始化計時時間
  247.                         while(1)
  248.                         {
  249.                           TS_Mode();//特殊模式檢測
  250.                                 Key_Adjust();//按鍵調整時間檢測
  251.                           GNB=1;//南北綠燈滅
  252.                           YNB=0;//南北黃燈亮
  253.                                 RNB=1;//南北紅燈滅
  254.                                 GRNB=1;//南北人行道綠燈滅
  255.                                 RRNB=0;//南北人行道紅燈亮

  256.                           GDX=1;//東西綠燈滅
  257.                           YDX=1;//東西黃燈滅
  258.                                 RDX=0;//東西紅燈亮
  259.                                 GRDX=1;//東西人行道綠燈滅
  260.                                 RRDX=0;//東西人行道紅燈亮
  261.                                 Display_NB(Time_Y);//南北數碼管顯示時間
  262.                           Display_DX(Time_Y);//東西數碼管顯示時間
  263.                                 if(Time_Y==0)
  264.                                 {
  265.                                   Run_Flag=2;//即將進入南北紅燈東西綠燈
  266.                                   break;
  267.                                 }
  268.                         }
  269.                 }

  270.           if(Run_Flag==2)//東西綠燈南北紅燈
  271.                 {
  272.                         Time_DX=Time_DX_Save;//獲取東西綠燈倒計時時間
  273.                         Time_NB=Time_DX_Save+Time_Y_Save;//獲取南北紅燈倒計時時間
  274.                         Time=0;//初始化計時時間
  275.                         while(1)
  276.                         {
  277.                           TS_Mode();//特殊模式檢測
  278.                                 Key_Adjust();//按鍵調整時間檢測
  279.                           GNB=1;//南北綠燈滅
  280.                           YNB=1;//南北黃燈滅
  281.                                 RNB=0;//南北紅燈亮
  282.                                 GRNB=1;//南北人行道綠燈滅
  283.                                 RRNB=0;//南北人行道紅燈亮

  284.                           GDX=0;//東西綠燈亮
  285.                           YDX=1;//東西黃燈滅
  286.                                 RDX=1;//東西紅燈滅
  287.                                 GRDX=0;//東西人行道綠燈亮
  288.                                 RRDX=1;//東西人行道紅燈滅
  289.                           if(GADD!=0&&GSUB!=0&&RADD!=0&&RSUB!=0)//無按鍵按下
  290.                                 {
  291.                                   Display_DX(Time_DX);//東西數碼管顯示時間
  292.                             Display_NB(Time_NB);//南北數碼管顯示時間
  293.                                 }
  294.                                 if(Time_DX==0)
  295.                                 {
  296.                                   Run_Flag=3;//即將進入南北黃燈東西黃燈
  297.                                   break;
  298.                                 }
  299.                         }
  300.                 }

  301.                 if(Run_Flag==3)//東西黃燈南北紅燈
  302.                 {
  303.                         Time_Y=Time_Y_Save;//黃燈倒計時時間
  304.                   Time=0;//初始化計時時間
  305.                         while(1)
  306.                         {
  307.                           TS_Mode();//特殊模式檢測
  308.                                 Key_Adjust();//按鍵調整時間檢測
  309.                           GNB=1;//南北綠燈滅
  310.                           YNB=1;//南北黃燈滅
  311.                                 RNB=0;//南北紅燈亮
  312.                                 GRNB=1;//南北人行道綠燈滅
  313.                                 RRNB=0;//南北人行道紅燈亮
  314.         
  315.                           GDX=1;//東西綠燈滅
  316.                           YDX=0;//東西黃燈亮
  317.                                 RDX=1;//東西紅燈滅
  318.                                 GRDX=1;//東西人行道綠燈滅
  319.                                 RRDX=0;//東西人行道紅燈亮
  320.                                 Display_NB(Time_Y);//南北數碼管顯示時間
  321.                           Display_DX(Time_Y);//東西數碼管顯示時間
  322.                                 if(Time_Y==0)
  323.                                 {
  324.                                   Run_Flag=0;//即將進入南北綠燈東西紅燈
  325.                                   break;
  326.                                 }
  327.                         }
  328.                 }                                          
  329.         }  
  330. }

  331. /*********定時器中斷**********/
  332. void Timer0() interrupt 1
  333. {
  334.   TH0=0X3C;//重裝初值
  335.   TL0=0XB0;

  336.   Time++;//中斷計次,每進一次中斷50ms
  337.   if(Time==20)//計時1秒
  338.   {
  339.           Time=0;
  340.                 if(JJ!=0&&YJ!=0)//非緊急模式或者夜間模式
  341.                 {
  342.                   if(Run_Flag==0)//南北綠燈東西紅燈
  343.                         {
  344.                     Time_NB--;//南北綠燈時間倒計時
  345.                                 Time_DX--;//東西紅燈時間倒計時
  346.                                 if(Time_NB<=0)
  347.                                 {
  348.                                         Time_NB=0;
  349.                                 }
  350.                         }
  351.                         else if(Run_Flag==1)//南北黃燈東西紅燈
  352.                         {
  353.                     Time_Y--;//黃燈時間倒計時
  354.                                 Time_DX--;//東西紅燈時間倒計時
  355.                                 if(Time_Y<=0)
  356.                                 {
  357.                                         Time_Y=0;
  358.                                 }                                                  
  359.                         }
  360.                         else if(Run_Flag==2)//南北黃燈東西黃燈
  361.                         {
  362.                     Time_DX--;//東西綠燈時間倒計時
  363.                                 Time_NB--;//南北紅燈時間倒計時
  364.                                 if(Time_DX<=0)
  365.                                 {
  366.                                         Time_DX=0;
  367.                                 }                                                  
  368.                         }
  369.                         else if(Run_Flag==3)//東西黃燈南北紅燈
  370.                         {
  371.                     Time_Y--;//黃燈時間倒計時
  372.                                 Time_NB--;//南北紅燈時間倒計時
  373.                                 if(Time_Y<=0)
  374.                                 {
  375.                                         Time_Y=0;
  376.                                 }                                                  
  377.                         }
  378.                 }
  379.   }
  380. }

復制代碼

附件包括源代碼和仿真文件。
交通燈.zip (257.17 KB, 下載次數: 85)



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本精品一区二区在线观看 | 亚洲免费一区二区 | 亚洲精品在线看 | 日韩在线精品视频 | 国产综合久久 | 中文字幕视频一区二区 | av 一区二区三区 | 国产精品久久久久久238 | 羞羞网站免费观看 | a级大片免费观看 | 男人的天堂久久 | 久精品久久 | 看一级毛片视频 | 亚洲一区三区在线观看 | 91视频免费视频 | 精品一区精品二区 | 亚洲精选一区二区 | 中文字幕精品一区 | 色婷婷狠狠 | 久久久久国色av免费观看性色 | 午夜a√ | 成人在线视频观看 | 精品国产鲁一鲁一区二区张丽 | 国产高清自拍视频在线观看 | 亚洲免费网址 | 欧美精品一区二区蜜桃 | 国产一极毛片 | a在线视频 | 免费在线一区二区 | 亚洲人成人一区二区在线观看 | 伊人成人免费视频 | 91色网站| 国内精品伊人久久久久网站 | 国产精品黄色 | 欧洲高清转码区一二区 | 鸡毛片| 国产成人99久久亚洲综合精品 | 91国内产香蕉 | 91精品久久久久久久久久小网站 | 精品亚洲一区二区 | 视频在线亚洲 |