找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3453|回复: 0
收起左侧

基于51单片机的交通灯c程序代码,带人行道指示灯,紧急状态,时间控制

[复制链接]
ID:330822 发表于 2018-5-15 21:53 | 显示全部楼层 |阅读模式
电路图如下所示: TIM图片20180515215031.png 0.jpg
流程图:
流程图_页面_1.jpg
单片机源程序如下:
  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)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表