找回密码
 立即注册

QQ登录

只需一步,快速开始

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

多种模式可调的交通指示灯程序

[复制链接]
ID:213273 发表于 2017-6-21 11:47 | 显示全部楼层 |阅读模式

对应的电路图如下:
交通灯.png

  1. #include<reg51.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. //共阴数码管编码
  5. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  6. // 南北四向数码管位选
  7. sbit b1 = P2^0;
  8. sbit b2 = P2^1;
  9. sbit n1 = P2^2;
  10. sbit n2 = P2^3;
  11. sbit d1 = P2^4;
  12. sbit d2 = P2^5;
  13. sbit x1 = P2^6;
  14. sbit x2 = P2^7;
  15. //南北四向12个LED灯
  16. sbit br = P3^0;
  17. sbit by = P3^1;
  18. sbit bg = P3^2;
  19. sbit nr = P3^3;
  20. sbit ny = P3^4;
  21. sbit ng = P3^5;
  22. sbit dr = P3^6;
  23. sbit dy = P3^7;
  24. sbit dg = P1^0;
  25. sbit xr = P1^1;
  26. sbit xy = P1^2;
  27. sbit xg = P1^3;
  28. //设置时间
  29. sbit SET = P1^6;
  30. sbit ADD = P1^5;
  31. sbit MINUS = P1^4;
  32. //蜂鸣器
  33. sbit buzz = P1^7;

  34. uchar Flash_Count=5, Operation_Type=1;                 //闪烁秒数,通行方向控制  1. B 2.N 3.D 4.X
  35. uchar NBsecond_SET = 30,Nsecond,Bsecond;        //南北向通行时间
  36. uchar DXsecond_SET = 20,Dsecond,Xsecond;        //东西向通行时间
  37. uchar second_i=1,num=0,RunType=1,flg=0;
  38. uchar key_can;         //按键值
  39. //菜单变量
  40. uchar menu_1=0,menu_2,key_new=1;
  41. void DelayMS(uint x)
  42. {  
  43.      uchar i;
  44.          while(x--)
  45.                  for(i=0;i<120;i++);
  46. }
  47. //初始化定时器
  48. void init()
  49. {
  50.         EA   = 1;                   //开总中断
  51.         TMOD = 0X11;          //定时器0、工作方式1
  52.         TH0 = 0x3c;
  53.         TL0 = 0xb0;     // 50ms
  54.         ET0  = 1;                  //开定时器0中断
  55.         TR0  = 1;                  //允许定时器0定时
  56. }
  57. //数码管显示  second:显示秒数   tpy: 1. B 2.N 3.D 4.X
  58. void displaySMG(uchar second, uchar tpy)
  59. {
  60.         uchar shi,ge;
  61.         shi = second/10;
  62.         ge  = second%10;
  63.         if(tpy==1)
  64.         {
  65.                 P2=0xff;
  66.                 b1 = 0;
  67.                 P0 = table[shi];
  68.                 DelayMS(5);
  69.                 P2=0xff;
  70.                 b2 = 0;
  71.                 P0 = table[ge];
  72.                 DelayMS(5);
  73.         }else if(tpy==2)
  74.         {
  75.                 P2=0xff;
  76.                 n1 = 0;
  77.                 P0 = table[shi];
  78.                 DelayMS(5);
  79.                 P2=0xff;
  80.                 n2 = 0;
  81.                 P0 = table[ge];
  82.                 DelayMS(5);
  83.         }else if(tpy==3)
  84.         {
  85.                 P2=0xff;
  86.                 d1 = 0;
  87.                 P0 = table[shi];
  88.                 DelayMS(5);
  89.                 P2=0xff;
  90.                 d2 = 0;
  91.                 P0 = table[ge];
  92.                 DelayMS(5);
  93.         }else if(tpy==4)
  94.         {
  95.                 P2=0xff;
  96.                 x1 = 0;
  97.                 P0 = table[shi];
  98.                 DelayMS(5);
  99.                 P2=0xff;
  100.                 x2 = 0;
  101.                 P0 = table[ge];
  102.                 DelayMS(5);
  103.         }
  104. }
  105. //运行模式1
  106. void modeONE()
  107. {
  108.         if(Operation_Type==1)
  109.         {
  110.                 Bsecond = NBsecond_SET-num;                                 // 北向绿灯时间
  111.                 Nsecond = NBsecond_SET-num;                                 // 南向红灯
  112.                 Dsecond = NBsecond_SET + NBsecond_SET-num;         // 东向红灯
  113.                 Xsecond = 2*NBsecond_SET + DXsecond_SET-num;// 西向红灯
  114.                 br = 1;
  115.                 nr = 0;
  116.                 ny = 1;
  117.                 ng = 1;
  118.                 dr = 0;
  119.                 dy = 1;
  120.                 dg = 1;
  121.                 xr = 0;
  122.                 xy = 1;
  123.                 xg = 1;
  124.                 if(Bsecond<=Flash_Count)
  125.                 {
  126.                         if(second_i%10==0)
  127.                                 by = ~by;
  128.                         bg = 1;
  129.                 }else
  130.                 {
  131.                         bg = 0;
  132.                         by = 1;
  133.                 }
  134.                 if(Bsecond==0)
  135.                 {
  136.                         Operation_Type=2;
  137.                         num=0;
  138.                 }
  139.                 displaySMG(Bsecond,1);
  140.                 displaySMG(Nsecond,2);
  141.                 displaySMG(Dsecond,3);
  142.                 displaySMG(Xsecond,4);
  143.         }else if(Operation_Type==2)
  144.         {
  145.                 Bsecond = NBsecond_SET + 2*DXsecond_SET-num;// 北向红灯
  146.                 Nsecond = NBsecond_SET - num;                                // 南向绿灯
  147.                 Dsecond = NBsecond_SET - num;                                // 东向红灯
  148.                 Xsecond = NBsecond_SET + DXsecond_SET-num;        // 西向红灯
  149.                 br = 0;
  150.                 by = 1;
  151.                 bg = 1;
  152.                 nr = 1;
  153.                 dr = 0;
  154.                 dy = 1;
  155.                 dg = 1;
  156.                 xr = 0;
  157.                 xy = 1;
  158.                 xg = 1;
  159.                 if(Nsecond<=Flash_Count)
  160.                 {
  161.                         if(second_i%10==0)
  162.                                 ny = ~ny;
  163.                         ng = 1;
  164.                 }else
  165.                 {
  166.                         ng = 0;
  167.                         ny = 1;
  168.                 }
  169.                 if(Nsecond==0)
  170.                 {
  171.                         Operation_Type=3;
  172.                         num=0;
  173.                 }
  174.                 displaySMG(Bsecond,1);
  175.                 displaySMG(Nsecond,2);
  176.                 displaySMG(Dsecond,3);
  177.                 displaySMG(Xsecond,4);
  178.         }else if(Operation_Type==3)
  179.         {
  180.                 Bsecond = 2*DXsecond_SET-num;                                         // 北向红灯
  181.                 Nsecond = 2*DXsecond_SET+NBsecond_SET-num;                // 南向红灯
  182.                 Dsecond = DXsecond_SET - num;                                        // 东向绿灯
  183.                 Xsecond = DXsecond_SET - num;                                        // 西向红灯
  184.                 br = 0;
  185.                 by = 1;
  186.                 bg = 1;
  187.                 nr = 0;
  188.                 ny = 1;
  189.                 ng = 1;
  190.                 dr = 1;
  191.                 xr = 0;
  192.                 xy = 1;
  193.                 xg = 1;
  194.                 if(Dsecond<=Flash_Count)
  195.                 {
  196.                         if(second_i%10==0)
  197.                                 dy = ~dy;
  198.                         dg = 1;
  199.                 }else
  200.                 {
  201.                         dg = 0;
  202.                         dy = 1;
  203.                 }
  204.                 if(Dsecond==0)
  205.                 {
  206.                         Operation_Type=4;
  207.                         num=0;
  208.                 }
  209.                 displaySMG(Bsecond,1);
  210.                 displaySMG(Nsecond,2);
  211.                 displaySMG(Dsecond,3);
  212.                 displaySMG(Xsecond,4);
  213.         }else if(Operation_Type==4)
  214.         {
  215.                 Bsecond = DXsecond_SET - num;                                         // 北向红灯
  216.                 Nsecond = DXsecond_SET + NBsecond_SET-num;                // 南向红灯
  217.                 Dsecond = DXsecond_SET + 2*NBsecond_SET-num;        // 东向红灯
  218.                 Xsecond = DXsecond_SET - num;                                        // 西向绿灯
  219.                 br = 0;
  220.                 by = 1;
  221.                 bg = 1;
  222.                 nr = 0;
  223.                 ny = 1;
  224.                 ng = 1;
  225.                 dr = 0;
  226.                 dy = 1;
  227.                 dg = 1;
  228.                 xr = 1;
  229.                 if(Xsecond<=Flash_Count)
  230.                 {
  231.                         if(second_i%10==0)
  232.                                 xy = ~xy;
  233.                         xg = 1;
  234.                 }else
  235.                 {
  236.                         xg = 0;
  237.                         xy = 1;
  238.                 }
  239.                 if(Xsecond==0)
  240.                 {
  241.                         Operation_Type=1;
  242.                         num=0;
  243.                 }
  244.                 displaySMG(Bsecond,1);
  245.                 displaySMG(Nsecond,2);
  246.                 displaySMG(Dsecond,3);
  247.                 displaySMG(Xsecond,4);
  248.         }
  249. }
  250. //运行模式2
  251. void modeTWO()
  252. {
  253.         if(Operation_Type==1)
  254.         {
  255.                 Bsecond = NBsecond_SET - num;                                 // 北向绿灯时间
  256.                 Nsecond = NBsecond_SET - num;                                 // 南向绿灯时间
  257.                 Dsecond = NBsecond_SET - num;                                 // 东向红灯
  258.                 Xsecond = NBsecond_SET - num;                                // 西向红灯
  259.                 br = 1;
  260.                 nr = 1;
  261.                 dr = 0;
  262.                 dy = 1;
  263.                 dg = 1;
  264.                 xr = 0;
  265.                 xy = 1;
  266.                 xg = 1;
  267.                 if(Bsecond<=Flash_Count)
  268.                 {
  269.                         if(second_i%10==0)
  270.                         {
  271.                                 by = ~by;
  272.                                 ny = ~ny;
  273.                         }
  274.                         bg = 1;
  275.                         ng = 1;
  276.                 }else
  277.                 {
  278.                         bg = 0;
  279.                         by = 1;
  280.                         ng = 0;
  281.                         ny = 1;
  282.                 }
  283.                 if(Bsecond==0)
  284.                 {
  285.                         Operation_Type=2;
  286.                         num=0;
  287.                 }
  288.                 displaySMG(Bsecond,1);
  289.                 displaySMG(Nsecond,2);
  290.                 displaySMG(Dsecond,3);
  291.                 displaySMG(Xsecond,4);
  292.         }else if(Operation_Type==2)
  293.         {
  294.                 Bsecond = DXsecond_SET - num;                                 // 北向绿灯时间
  295.                 Nsecond = DXsecond_SET - num;                                 // 南向绿灯时间
  296.                 Dsecond = DXsecond_SET - num;                                 // 东向红灯
  297.                 Xsecond = DXsecond_SET - num;                                // 西向红灯
  298.                 br = 0;
  299.                 by = 1;
  300.                 bg = 1;
  301.                 nr = 0;
  302.                 ny = 1;
  303.                 ng = 1;
  304.                 dr = 1;
  305.                 xr = 1;
  306.                 if(Dsecond<=Flash_Count)
  307.                 {
  308.                         if(second_i%10==0)
  309.                         {
  310.                                 dy = ~dy;
  311.                                 xy = ~xy;
  312.                         }
  313.                         dg = 1;
  314.                         xg = 1;
  315.                 }else
  316.                 {
  317.                         dy = 1;
  318.                         dg = 0;
  319.                         xy = 1;
  320.                         xg = 0;
  321.                 }
  322.                 if(Dsecond==0)
  323.                 {
  324.                         Operation_Type=1;
  325.                         num=0;
  326.                 }
  327.                 displaySMG(Bsecond,1);
  328.                 displaySMG(Nsecond,2);
  329.                 displaySMG(Dsecond,3);
  330.                 displaySMG(Xsecond,4);
  331.         }
  332. }
  333. /*************定时器0中断服务程序***************/
  334. void time0_int() interrupt 1
  335. {        
  336.         TH0 = 0x3c;
  337.         TL0 = 0xb0;     // 50ms
  338.         second_i++;
  339.         if (second_i==20) //1s
  340.         {
  341.                 second_i = 1;
  342.                 num++;
  343.         }
  344.         if(menu_1 == 0)
  345.         {
  346.                 if(RunType == 1)// 模式1
  347.                 {
  348.                         modeONE();
  349.                 }else if(RunType == 2)// 模式2
  350.                 {
  351.                         modeTWO();
  352.                 }
  353.         }
  354. }
  355. /********************独立按键程序*****************/
  356. void key()         //独立按键程序
  357. {
  358.         key_can = 20;                   //按键值还原
  359.         P1 |= 0x70;                     //对应的按键IO口输出为1
  360.         if((P1 & 0x70) != 0x70)                        //按键按下
  361.         {
  362.                 DelayMS(1);                                     //按键消抖动
  363.                 if(((P1 & 0x70) != 0x70) && (key_new == 1))
  364.                 {                                                        //确认是按键按下
  365.                         key_new = 0;
  366.                         num=0;
  367.                         flg=1;
  368.                         if(SET == 0)
  369.                                 key_can = 1;
  370.                         if(ADD == 0)
  371.                                 key_can = 2;
  372.                         if(MINUS == 0)
  373.                                 key_can = 3;
  374.                 }
  375.         }
  376.         else
  377.                 key_new = 1;
  378. }
  379. /**********************设置函数************************/
  380. void key_with()
  381. {
  382.         if(key_can == 1)        //设置键
  383.         {
  384.                 menu_1++;
  385.                 if(menu_1 == 1)          //设置南北向时间
  386.                 {
  387.                         menu_2 = 1;
  388.                 }
  389.                 if(menu_1 == 2)          //设置东西向时间
  390.                 {
  391.                         menu_2 = 2;
  392.                 }
  393.                 if(menu_1 == 3)          //设置运行模式
  394.                 {
  395.                         menu_2 = 3;
  396.                 }
  397.                 if(menu_1 > 3)    //回到正常显示
  398.                 {
  399.                         menu_1 = 0;
  400.                         flg=0;
  401.                 }
  402.         }
  403.         if(menu_2 == 1)                  //设置南北向时间
  404.         {
  405.                 if(key_can == 2)        //加
  406.                 {
  407.                         NBsecond_SET+=0x01;
  408.                 }
  409.                 if(key_can == 3)        //减
  410.                 {
  411.                         if(NBsecond_SET != 0x00)
  412.                                 NBsecond_SET -- ;
  413.                 }
  414.         }
  415.         if(menu_2 == 2)                  //设置东西向时间
  416.         {
  417.                 if(key_can == 2)        //加
  418.                 {
  419.                         DXsecond_SET+=0x01;
  420.                 }
  421.                 if(key_can == 3)        //减
  422.                 {
  423.                         if(DXsecond_SET != 0x00)
  424.                                 DXsecond_SET -- ;
  425.                 }
  426.         }
  427.         if(menu_2 == 3)                  //设置模式
  428.         {
  429.                 if(key_can == 2)        //加
  430.                 {
  431.                         RunType+=0x01;
  432.                 }
  433.                 if(key_can == 3)        //减
  434.                 {
  435.                         if(RunType > 1)
  436.                                 RunType -- ;
  437.                 }
  438.         }
  439.         if(flg==1)
  440.         {
  441.                 if(menu_1==1)
  442.                 {
  443.                         displaySMG(NBsecond_SET,1);
  444.                         displaySMG(NBsecond_SET,2);
  445.                 }else if(menu_1==2)
  446.                 {
  447.                         displaySMG(DXsecond_SET,3);
  448.                         displaySMG(DXsecond_SET,4);
  449.                 }else if(menu_1==3)
  450.                 {
  451.                         displaySMG(RunType,1);
  452.                         displaySMG(RunType,2);
  453.                         displaySMG(RunType,3);
  454.                         displaySMG(RunType,4);
  455.                 }
  456.         }        
  457. }
  458. //主程序
  459. void main()
  460. {
  461.         init();
  462.     while(1)
  463.         {
  464.                 key();                         //按键程序
  465.                 if(key_can < 10|flg==1)
  466.                 {
  467.                         key_with();
  468.                 }
  469.         }         
  470. }



复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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