找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2012|回复: 0
打印 上一主题 下一主题
收起左侧

基于计数器的交通灯应用

[复制链接]
跳转到指定楼层
楼主
本次分为两个版本:
基础版
加强版


基础版只是利用定时器去实现相应的功能模块

加强版使用了两个中断(功能:1,绿灯时,每按一下,时间+2s,最高9s,功能2:相反)

说明:
基础版和加强版可共用一个电路图,此帖只附加了加强版的压缩包,想要基础版的可留言+邮件地址,谢谢阅读!多多支持

电路图



基础版主函数代码
  1. #include <config.h>
  2. sbit RED_NANBEIZHI=P1^0;          //南北方向直行红灯
  3. sbit YELLOW_NANBEIZHI=P1^1;  //南北方向直行黄灯
  4. sbit GREEN_NANBEIZHI=P1^2;          //南北方向直行绿灯
  5. sbit RED_DONGXIZHI=P1^3;          //东西方向直行红灯
  6. sbit YELLOW_DONGXIZHI=P1^4;        //东西方向直行黄灯
  7. sbit GREEN_DONGXIZHI=P1^5;          //东西方向直行绿灯
  8. sbit RED_NANBEIZUO=P2^0;          //南北方向左转红灯
  9. sbit YELLOW_NANBEIZUO=P2^1;  //南北方向左转黄灯
  10. sbit GREEN_NANBEIZUO=P2^2;          //南北方向左转绿灯
  11. sbit RED_DONGXIZUO=P2^3;          //东西方向左转红灯
  12. sbit YELLOW_DONGXIZUO=P2^4;        //东西方向左转黄灯
  13. sbit GREEN_DONGXIZUO=P2^5;          //东西方向左转绿灯
  14. sbit NBZHI=P1^6;
  15. sbit NBZUO=P1^7;
  16. sbit DXZHI=P2^6;
  17. sbit DXZUO=P2^7;

  18. u16 n;
  19. u16 tt,bai,shi,ge,bb;       
  20. u8 code table[]={
  21. 0x3f,0x06,0x5b,0x4f,
  22. 0x66,0x6d,0x7d,0x07,
  23. 0x7f,0x6f};

  24. void delay_ms(u16 t);

  25. void xtimer0();
  26. //1
  27. void chushi0();
  28. //2
  29. void nbzhi1();
  30. void nbzhi2();
  31. void nbzhi3();
  32. //3
  33. void nbzuo2();
  34. void nbzuo3();
  35. void nbzuo4();
  36. //4
  37. void dxzhi1();
  38. void dxzhi2();
  39. void dxzhi3();
  40. //5
  41. void dxzuo2();
  42. void dxzuo3();
  43. void dxzuo4();


  44. void main()
  45. {
  46.    P0=0xff;
  47.    P1=0xc9;
  48.    P2=0xc0;
  49.    P3=0xff;
  50.    EA=1;
  51.    EX0=1;
  52.    IT0=0;
  53.    delay_ms(250);

  54.    chushi0();                // ①南北向直行绿灯亮,延时5秒

  55.    while(1)
  56.    {

  57.             //2 南北向直行:
  58.          nbzhi1(); // ②启动南北向左转数码管显示:倒计时6秒;同时南北向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  59.          nbzhi2(); // 然后南北向直行绿灯灭,南北向直行黄灯亮,延时3秒
  60.          nbzhi3(); // ③南北向左转数码管倒计时显示结束,关闭;同时南北向直行黄灯灭,南北向直行红灯亮    ①南北向左转绿灯亮,延时若干秒
  61. //         //3 南北向左转
  62.          nbzuo2(); // ②启动东西向直行数码管显示:倒计时6秒;同时南北向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  63.          nbzuo3(); // 然后南北向左转绿灯灭,南北向左转黄灯亮,延时3秒
  64.          nbzuo4();        //③东西向直行数码管倒计时显示结束,关闭;同时南北向左转黄灯灭,南北向左转红灯亮           ①东西向直行绿灯亮,延时若干秒
  65.          //4 东西向直行:
  66.          dxzhi1();        //②启动东西向左转数码管显示:倒计时6秒;同时东西向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  67.          dxzhi2();        //然后东西向直行绿灯灭,东西向直行黄灯亮,延时3秒
  68.          dxzhi3();        //③东西向左转数码管倒计时显示结束,关闭;同时东西向直行黄灯灭,东西向直行红灯亮          ①东西向左转绿灯亮,延时若干秒
  69.          //5 东西向左转:
  70.          dxzuo2();         //②启动南北向直行数码管显示:倒计时6秒;同时东西向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  71.          dxzuo3();         //然后东西向左转绿灯灭,东西向左转黄灯亮,延时3秒
  72.          dxzuo4();         //③南北向直行数码管倒计时显示结束,关闭;同时东西向左转黄灯灭,东西向左转红灯亮
  73.    }
  74. }
  75. ////////1、初始时:南北向、东西向直行左转均为红灯
  76. void chushi0()          // ①南北向直行绿灯亮,延时5秒
  77. {
  78.     u16 temp1;
  79.          temp1=5;
  80.          TMOD|=0x01;
  81.          TH0=(65535-50000)/256;
  82.          TL0=(65535-50000)%256;
  83.          EA=1;
  84.          ET0=1;
  85.          TR0=1;
  86.          while(1)
  87.          {
  88.                  RED_NANBEIZHI=0;         
  89.                  GREEN_NANBEIZHI=1;
  90.                                   
  91.                  if(tt==20)//20*50us=1s
  92.                  {
  93.                         tt=0;
  94.                         temp1--;         
  95.                  }
  96.                   
  97.              n=(temp1)%10;

  98.                  if(temp1==0)
  99.                  {
  100.                           temp1=5;
  101.                         break;
  102.                  }
  103.                  NBZHI=0;         //南北直行
  104.                  NBZUO=1;
  105.                  DXZHI=1;
  106.                  DXZUO=1;
  107.                  P0=table[n];
  108.                  delay_ms(5);
  109.          }
  110. }


  111. //////2、南北向直行:
  112. void nbzhi1()                 //②启动南北向左转数码管显示:倒计时6秒;同时南北向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  113. {                       
  114.         u16 temp1;       
  115.         temp1=6;
  116.         TMOD=0x01;
  117.         TH0=(65535-50000)/256;
  118.         TL0=(65535-50000)%256;
  119.         EA=1;
  120.         ET0=1;
  121.         TR0=1;
  122.         while(1)
  123.         {
  124.                  RED_NANBEIZHI=0;             
  125.                  RED_NANBEIZUO=1;          
  126.                  
  127.                  RED_DONGXIZUO=1;
  128.                 if(tt==20)
  129.                 {
  130.                          tt=0;
  131.                         temp1--;
  132.                         if(temp1>=2)
  133.                         {
  134.                         GREEN_NANBEIZHI=~GREEN_NANBEIZHI;
  135.                     }                               
  136.                 }
  137.                 n=(temp1)%10;
  138.                                                  
  139.                 if(temp1==3)
  140.                 {
  141.                  temp1=6;
  142.                  break;       
  143.                 }
  144.             NBZHI=1;         //南北左转
  145.                 NBZUO=0;
  146.                 DXZHI=1;
  147.                 DXZUO=1;
  148.                 P0=table[n];
  149.                 delay_ms(5);
  150.         }
  151. }

  152. void nbzhi2()                 // 然后南北向直行绿灯灭,南北向直行黄灯亮,延时3秒
  153. {                       
  154.         u16 temp1;       
  155.         temp1=3;
  156.         TMOD=0x01;
  157.         TH0=(65535-50000)/256;
  158.         TL0=(65535-50000)%256;
  159.         EA=1;
  160.         ET0=1;
  161.         TR0=1;
  162.         while(1)
  163.         {
  164.                  GREEN_NANBEIZHI=0;
  165.                  YELLOW_NANBEIZHI=1;
  166.                 if(tt==20)
  167.                 {
  168.                          tt=0;
  169.                         temp1--;
  170.                                                
  171.                        
  172.                        
  173.                 }
  174.                 n=(temp1)%10;
  175.                                                          
  176.                 if(temp1==0)
  177.                 {
  178.                  temp1=3;
  179.                  break;       
  180.                 }
  181.             NBZHI=1;         //南北左转
  182.                 NBZUO=0;
  183.                 DXZHI=1;
  184.                 DXZUO=1;
  185.                 P0=table[n];
  186.                 delay_ms(5);       
  187.         }
  188. }

  189. void nbzhi3()                 //③南北向左转数码管倒计时显示结束,关闭;同时南北向直行黄灯灭,南北向直行红灯亮    ①南北向左转绿灯亮,延时若干秒
  190. {                       
  191.         u16 temp1;       
  192.         temp1=5;
  193.         TMOD=0x01;
  194.         TH0=(65535-50000)/256;
  195.         TL0=(65535-50000)%256;
  196.         EA=1;
  197.         ET0=1;
  198.         TR0=1;
  199.         while(1)
  200.         {
  201.                  RED_NANBEIZHI=1;
  202.                  RED_NANBEIZUO=0;            
  203.                  GREEN_NANBEIZUO=1;;
  204.                  YELLOW_NANBEIZHI=0;

  205.                 if(tt==20)
  206.                 {
  207.                          tt=0;
  208.                         temp1--;
  209.                                 
  210.                 }
  211.                 n=(temp1)%10;                                                         
  212.                 if(temp1==0)
  213.                 {
  214.                  temp1=5;
  215.                  break;       
  216.                 }
  217.             NBZHI=1;         
  218.                 NBZUO=0;
  219.                 DXZHI=1;
  220.                 DXZUO=1;
  221.                 P0=table[n];
  222.                 delay_ms(5);
  223.         }       
  224. }

  225. ////////3、南北向左转:

  226. void nbzuo2()           //②启动东西向直行数码管显示:倒计时6秒;同时南北向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  227. {                       
  228.         u16 temp1,temp2;       
  229.         temp1=6;
  230.         temp2=3;
  231.         TMOD=0x01;
  232.         TH0=(65535-50000)/256;
  233.         TL0=(65535-50000)%256;
  234.         EA=1;
  235.         ET0=1;
  236.         TR0=1;
  237.         while(1)
  238.         {
  239.                  RED_DONGXIZHI=0;
  240.                  RED_DONGXIZHI=1;
  241.                  RED_DONGXIZUO=1;          
  242.                  GREEN_NANBEIZHI=0;
  243.                  YELLOW_NANBEIZHI=0;
  244.                 if(tt==20)
  245.                 {
  246.                          tt=0;
  247.                         temp1--;
  248.                         if(temp1>=2)
  249.                         {
  250.                         GREEN_NANBEIZUO=~GREEN_NANBEIZUO;
  251.                     }                       
  252.                          
  253.                        
  254.                 }
  255.                 n=(temp1)%10;                                                         
  256.                 if(temp1==3)
  257.                 {
  258.                  temp1=6;
  259.                  break;       
  260.                 }
  261.             NBZHI=1;         //南北左转
  262.                 NBZUO=1;
  263.                 DXZHI=0;
  264.                 DXZUO=1;
  265.                 P0=table[n];
  266.                 delay_ms(5);       
  267.         }       
  268. }

  269. void nbzuo3()           // 然后南北向左转绿灯灭,南北向左转黄灯亮,延时3秒
  270. {                       
  271.         u16 temp1;       
  272.         temp1=3;
  273.         TMOD=0x01;
  274.         TH0=(65535-50000)/256;
  275.         TL0=(65535-50000)%256;
  276.         EA=1;
  277.         ET0=1;
  278.         TR0=1;
  279.         while(1)
  280.         {
  281.                
  282.                  GREEN_NANBEIZUO=0;
  283.                  GREEN_DONGXIZUO=0;
  284.                  GREEN_DONGXIZHI=0;
  285.                  YELLOW_NANBEIZUO=1;
  286.                  YELLOW_DONGXIZHI=0;
  287.                  
  288.                 if(tt==20)
  289.                 {
  290.                          tt=0;
  291.                         temp1--;
  292.                                                
  293.                  
  294.                        
  295.                 }         
  296.                 n=(temp1)%10;
  297.                                                          
  298.                 if(temp1==0)
  299.                 {
  300.                  temp1=3;
  301.                  break;       
  302.                 }        
  303.             NBZHI=1;         //南北左转
  304.                 NBZUO=1;
  305.                 DXZHI=0;
  306.                 DXZUO=1;
  307.                 P0=table[n];
  308.                 delay_ms(5);       
  309.         }       
  310. }

  311. void nbzuo4()                   //③东西向直行数码管倒计时显示结束,关闭;同时南北向左转黄灯灭,南北向左转红灯亮           ①东西向直行绿灯亮,延时若干秒
  312. {                       
  313.         u16 temp1;       
  314.         temp1=5;
  315.         TMOD=0x01;
  316.         TH0=(65535-50000)/256;
  317.         TL0=(65535-50000)%256;
  318.         EA=1;
  319.         ET0=1;
  320.         TR0=1;
  321.         while(1)
  322.         {
  323.                  RED_NANBEIZHI=1;             
  324.                  RED_NANBEIZUO=1;
  325.                  RED_DONGXIZHI=0;          
  326.                  GREEN_DONGXIZHI=1;
  327.                  YELLOW_DONGXIZHI=0;
  328.                  YELLOW_NANBEIZUO=0;
  329.                         if(tt==20)
  330.                 {
  331.                          tt=0;
  332.                         temp1--;
  333.                         
  334.                 }
  335.                 n=(temp1)%10;                                                         
  336.                 if(temp1==0)
  337.                 {
  338.                  temp1=5;
  339.                  break;       
  340.                 }
  341.             NBZHI=1;         
  342.                 NBZUO=1;
  343.                 DXZHI=0;
  344.                 DXZUO=1;
  345.                 P0=table[n];
  346.                 delay_ms(5);
  347.         }       
  348. }

  349. ////////4、东西向直行:

  350. void dxzhi1()           //②启动东西向左转数码管显示:倒计时6秒;同时东西向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  351. {                       
  352.         u16 temp1;       
  353.         temp1=6;
  354.         TMOD=0x01;
  355.         TH0=(65535-50000)/256;
  356.         TL0=(65535-50000)%256;
  357.         EA=1;
  358.         ET0=1;
  359.         TR0=1;
  360.         while(1)
  361.         {
  362.                  RED_NANBEIZHI=1;            
  363.                  RED_NANBEIZUO=1;          
  364.                  RED_DONGXIZUO=1;
  365.                  RED_DONGXIZHI=0;
  366.                 if(tt==20)
  367.                 {
  368.                          tt=0;
  369.                         temp1--;
  370.                         if(temp1>=2)
  371.                         {
  372.                         GREEN_DONGXIZHI=~GREEN_DONGXIZHI;
  373.                     }                       
  374.                                 
  375.                 }
  376.                 n=(temp1)%10;                                 
  377.                 if(temp1==3)
  378.                 {
  379.                  temp1=6;
  380.                  break;       
  381.                 }
  382.             NBZHI=1;         //南北左转
  383.                 NBZUO=1;
  384.                 DXZHI=1;
  385.                 DXZUO=0;
  386.                 P0=table[n];
  387.                 delay_ms(5);
  388.         }       
  389. }

  390. void dxzhi2()                   //然后东西向直行绿灯灭,东西向直行黄灯亮,延时3秒
  391. {                       
  392.         u16 temp1;       
  393.         temp1=3;
  394.         TMOD=0x01;
  395.         TH0=(65535-50000)/256;
  396.         TL0=(65535-50000)%256;
  397.         EA=1;
  398.         ET0=1;
  399.         TR0=1;
  400.         while(1)
  401.         {
  402.                  RED_NANBEIZHI=1;            
  403.                  RED_NANBEIZUO=1;
  404.                  RED_DONGXIZHI=0;          
  405.                  GREEN_DONGXIZHI=0;
  406.                  YELLOW_DONGXIZHI=1;
  407.                 if(tt==20)
  408.                 {
  409.                          tt=0;
  410.                         temp1--;                                                       
  411.                 }
  412.                 n=(temp1)%10;                                                          
  413.                 if(temp1==0)
  414.                 {
  415.                  temp1=3;
  416.                  break;       
  417.                 }
  418.             NBZHI=1;         //南北左转
  419.                 NBZUO=1;
  420.                 DXZHI=1;
  421.                 DXZUO=0;
  422.                 P0=table[n];
  423.                 delay_ms(5);
  424.         }               
  425. }

  426. void dxzhi3()                //③东西向左转数码管倒计时显示结束,关闭;同时东西向直行黄灯灭,东西向直行红灯亮          ①东西向左转绿灯亮,延时若干秒
  427. {                       
  428.         u16 temp1;       
  429.         temp1=5;
  430.         TMOD=0x01;
  431.         TH0=(65535-50000)/256;
  432.         TL0=(65535-50000)%256;
  433.         EA=1;
  434.         ET0=1;
  435.         TR0=1;
  436.         while(1)
  437.         {
  438.                  RED_NANBEIZHI=0;             
  439.                  RED_DONGXIZHI=1;          
  440.                  RED_DONGXIZUO=0;
  441.                  GREEN_DONGXIZUO=1;
  442.                  YELLOW_DONGXIZHI=0;
  443.                 if(tt==20)
  444.                 {
  445.                          tt=0;
  446.                         temp1--;
  447.                                
  448.                 }
  449.                 n=(temp1)%10;                                                         
  450.                 if(temp1==0)
  451.                 {
  452.                  temp1=5;
  453.                  break;       
  454.                 }
  455.             NBZHI=1;         //南北左转
  456.                 NBZUO=1;
  457.                 DXZHI=1;
  458.                 DXZUO=0;
  459.                 P0=table[n];
  460.                 delay_ms(5);
  461.         }       
  462. }

  463. ////////5、东西向左转:

  464. void dxzuo2()                //②启动南北向直行数码管显示:倒计时6秒;同时东西向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  465. {                       
  466.         u16 temp1,temp2;       
  467.         temp1=6;
  468.         temp2=3;
  469.         TMOD=0x01;
  470.         TH0=(65535-50000)/256;
  471.         TL0=(65535-50000)%256;
  472.         EA=1;
  473.         ET0=1;
  474.         TR0=1;
  475.         while(1)
  476.         {
  477.              
  478.                  RED_NANBEIZUO=1;          

  479.                 if(tt==20)
  480.                 {
  481.                          tt=0;
  482.                         temp1--;
  483.                         if(temp1>=2)
  484.                         {
  485.                         GREEN_DONGXIZUO=~GREEN_DONGXIZUO;
  486.                     }        
  487.                 }  
  488.                 n=(temp1)%10;                                                          
  489.                 if(temp1==3)
  490.                 {
  491.                  temp1=6;
  492.                  break;       
  493.                 }
  494.             NBZHI=0;         //南北左转
  495.                 NBZUO=1;
  496.                 DXZHI=1;
  497.                 DXZUO=1;
  498.                 P0=table[n];
  499.                 delay_ms(5);                
  500.         }       
  501. }

  502. void dxzuo3()                 //然后东西向左转绿灯灭,东西向左转黄灯亮,延时3秒
  503. {                       
  504.         u16 temp1;       
  505.         temp1=3;
  506.         TMOD=0x01;
  507.         TH0=(65535-50000)/256;
  508.         TL0=(65535-50000)%256;
  509.         EA=1;
  510.         ET0=1;
  511.         TR0=1;
  512.         while(1)
  513.         {
  514.                  RED_NANBEIZHI=1;             
  515.                  RED_NANBEIZUO=1;
  516.                  GREEN_DONGXIZUO=0;          
  517.                  YELLOW_DONGXIZUO=1;
  518.                 if(tt==20)
  519.                 {
  520.                          tt=0;
  521.                         temp1--;
  522.                                                
  523.                          
  524.                        
  525.                 }
  526.                 n=(temp1)%10;                                 
  527.                 if(temp1==0)
  528.                 {
  529.                  temp1=3;
  530.                  break;       
  531.                 }
  532.             NBZHI=0;         //南北左转
  533.                 NBZUO=1;
  534.                 DXZHI=1;
  535.                 DXZUO=1;
  536.                 P0=table[n];
  537.                 delay_ms(5);       
  538.         }       
  539. }

  540. void dxzuo4()                  //③南北向直行数码管倒计时显示结束,关闭;同时东西向左转黄灯灭,东西向左转红灯亮          ①南北向直行绿灯亮,延时5秒
  541. {                       
  542.         u16 temp1;       
  543.         temp1=5;
  544.         TMOD=0x01;
  545.         TH0=(65535-50000)/256;
  546.         TL0=(65535-50000)%256;
  547.         EA=1;
  548.         ET0=1;
  549.         TR0=1;
  550.         while(1)
  551.         {         
  552.                  RED_NANBEIZHI=0;             
  553.                  RED_DONGXIZHI=1;
  554.                  RED_DONGXIZUO=1;
  555.                  GREEN_NANBEIZHI=1;
  556.                  YELLOW_DONGXIZUO=0;
  557.                         if(tt==20)
  558.                 {
  559.                          tt=0;
  560.                         temp1--;
  561.                                 
  562.                 }
  563.                 n=(temp1)%10;                                                         
  564.                 if(temp1==0)
  565.                 {
  566.                  temp1=5;
  567.                  break;       
  568.                 }
  569.             NBZHI=0;         //南北左转
  570.                 NBZUO=1;
  571.                 DXZHI=1;
  572.                 DXZUO=1;
  573.                 P0=table[n];
  574.                 delay_ms(5);
  575.         }       
  576. }

  577. void delay_ms(u16 t)
  578. {                       
  579.         u8 i,j;
  580.         for(i=0;i<t;i++)
  581.         for(j=0;j<110;j++);       
  582. }



  583. void xtimer1() interrupt 1
  584. {                       
  585.         TH0=(65535-50000)/256;
  586.         TL0=(65535-50000)%256;
  587.         tt++;
  588. }

复制代码



加强版主函数
  1. #include <config.h>
  2. sbit RED_NANBEIZHI=P1^0;          //南北方向直行红灯
  3. sbit YELLOW_NANBEIZHI=P1^1;  //南北方向直行黄灯
  4. sbit GREEN_NANBEIZHI=P1^2;          //南北方向直行绿灯
  5. sbit RED_DONGXIZHI=P1^3;          //东西方向直行红灯
  6. sbit YELLOW_DONGXIZHI=P1^4;        //东西方向直行黄灯
  7. sbit GREEN_DONGXIZHI=P1^5;          //东西方向直行绿灯
  8. sbit RED_NANBEIZUO=P2^0;          //南北方向左转红灯
  9. sbit YELLOW_NANBEIZUO=P2^1;  //南北方向左转黄灯
  10. sbit GREEN_NANBEIZUO=P2^2;          //南北方向左转绿灯
  11. sbit RED_DONGXIZUO=P2^3;          //东西方向左转红灯
  12. sbit YELLOW_DONGXIZUO=P2^4;        //东西方向左转黄灯
  13. sbit GREEN_DONGXIZUO=P2^5;          //东西方向左转绿灯
  14. sbit NBZHI=P1^6;
  15. sbit NBZUO=P1^7;
  16. sbit DXZHI=P2^6;
  17. sbit DXZUO=P2^7;
  18. u16 n,tt,temp1,temp=5;
  19. u8 code table[]={
  20. 0x3f,0x06,0x5b,0x4f,
  21. 0x66,0x6d,0x7d,0x07,
  22. 0x7f,0x6f};
  23. //函数
  24. void delay_ms(u16 t);
  25. void xtimer0();
  26. //1
  27. void chushi0();
  28. void chushi1();
  29. //2
  30. void nbzhi1();
  31. void nbzhi2();
  32. void nbzhi3();
  33. //3
  34. void nbzuo2();
  35. void nbzuo3();
  36. void nbzuo4();
  37. //4
  38. void dxzhi1();
  39. void dxzhi2();
  40. void dxzhi3();
  41. //5
  42. void dxzuo2();
  43. void dxzuo3();
  44. void dxzuo4();
  45. void sys_unit()
  46. {
  47.          TMOD|=0x01;
  48.          TH0=(65535-50000)/256;
  49.          TL0=(65535-50000)%256;
  50.             EA=1;
  51.          IT0=1;
  52.          IT1=1;         
  53.          ET0=1;
  54.          ET1=1;
  55.          EX0=1;
  56.          EX1=1;
  57.          TR0=1;
  58.          TR1=0;

  59. }

  60. void main()
  61. {  
  62.    P0=0xff;
  63.    P1=0xc9;
  64.    P2=0xc9;
  65.    P3=0xff;
  66.             
  67.    sys_unit();
  68.    chushi0();
  69.    chushi1();                // ①南北向直行绿灯亮,延时5秒
  70.    while(1)
  71.    {
  72.           
  73.             //2 南北向直行:
  74.          nbzhi1(); // ②启动南北向左转数码管显示:倒计时6秒;同时南北向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  75.          nbzhi2(); // 然后南北向直行绿灯灭,南北向直行黄灯亮,延时3秒
  76.          nbzhi3(); // ③南北向左转数码管倒计时显示结束,关闭;同时南北向直行黄灯灭,南北向直行红灯亮    ①南北向左转绿灯亮,延时若干秒
  77. //         //3 南北向左转
  78.          nbzuo2(); // ②启动东西向直行数码管显示:倒计时6秒;同时南北向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  79.          nbzuo3(); // 然后南北向左转绿灯灭,南北向左转黄灯亮,延时3秒
  80.          nbzuo4();        //③东西向直行数码管倒计时显示结束,关闭;同时南北向左转黄灯灭,南北向左转红灯亮           ①东西向直行绿灯亮,延时若干秒
  81.          //4 东西向直行:
  82.          dxzhi1();        //②启动东西向左转数码管显示:倒计时6秒;同时东西向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  83.          dxzhi2();        //然后东西向直行绿灯灭,东西向直行黄灯亮,延时3秒
  84.          dxzhi3();        //③东西向左转数码管倒计时显示结束,关闭;同时东西向直行黄灯灭,东西向直行红灯亮          ①东西向左转绿灯亮,延时若干秒
  85.          //5 东西向左转:
  86.          dxzuo2();         //②启动南北向直行数码管显示:倒计时6秒;同时东西向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  87.          dxzuo3();         //然后东西向左转绿灯灭,东西向左转黄灯亮,延时3秒
  88.          dxzuo4();         //③南北向直行数码管倒计时显示结束,关闭;同时东西向左转黄灯灭,东西向左转红灯亮
  89.    }
  90. }
  91. ////////1、初始时:南北向、东西向直行左转均为红灯
  92. void chushi0()          // ①红灯亮2秒
  93. {
  94.          temp1=5;
  95.          while(1)
  96.          {
  97.                  RED_NANBEIZHI=1;
  98.                  RED_NANBEIZUO=1;
  99.                  RED_DONGXIZHI=1;
  100.                  RED_DONGXIZUO=1;         
  101.                  if(tt==20)//20*50us=1s
  102.                  {
  103.                         tt=0;
  104.                         temp1--;         
  105.                  }
  106.                  if(temp1==3)
  107.                  {
  108.                           temp1=5;
  109.                         break;
  110.                  }
  111.          }
  112. }
  113. void chushi1()          // ①南北向直行绿灯亮,延时5秒
  114. {                 
  115.          while(1)
  116.          {                    
  117.                  RED_NANBEIZHI=0;         
  118.                  GREEN_NANBEIZHI=1;                                  
  119.                  if(tt==20)//20*50us=1s
  120.                  {
  121.                         tt=0;
  122.                         temp--;         
  123.                  }                   
  124.              n=temp%10;                 
  125.                  if(temp==0)
  126.                  {
  127.                           temp=5;
  128.                         break;
  129.                  }
  130.                  NBZHI=0;         //南北直行
  131.                  NBZUO=1;
  132.                  DXZHI=1;
  133.                  DXZUO=1;
  134.                  P0=table[n];
  135.                  delay_ms(5);
  136.          }
  137. }
  138. //////2、南北向直行:
  139. void nbzhi1()                 //②启动南北向左转数码管显示:倒计时6秒;同时南北向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  140. {                               
  141.         temp1=6;
  142.         while(1)
  143.         {
  144.                  RED_NANBEIZHI=0;             
  145.                  RED_NANBEIZUO=1;                  
  146.                  RED_DONGXIZUO=1;
  147.                 if(tt==20)
  148.                 {
  149.                          tt=0;
  150.                         temp1--;
  151.                         if(temp1>=2)
  152.                         {
  153.                         GREEN_NANBEIZHI=~GREEN_NANBEIZHI;
  154.                     }                               
  155.                 }
  156.                 n=temp1%10;                                                 
  157.                 if(temp1==3)
  158.                 {
  159.                  temp1=6;
  160.                  break;       
  161.                 }
  162.             NBZHI=1;         //南北左转
  163.                 NBZUO=0;
  164.                 DXZHI=1;
  165.                 DXZUO=1;
  166.                 P0=table[n];
  167.                 delay_ms(5);
  168.         }
  169. }

  170. void nbzhi2()                 // 然后南北向直行绿灯灭,南北向直行黄灯亮,延时3秒
  171. {                               
  172.         temp1=3;
  173.         while(1)
  174.         {
  175.                  GREEN_NANBEIZHI=0;
  176.                  YELLOW_NANBEIZHI=1;
  177.                 if(tt==20)
  178.                 {
  179.                          tt=0;
  180.                         temp1--;       
  181.                 }
  182.                 n=(temp1)%10;                                                         
  183.                 if(temp1==0)
  184.                 {
  185.                  temp1=3;
  186.                  break;       
  187.                 }
  188.             NBZHI=1;         //南北左转
  189.                 NBZUO=0;
  190.                 DXZHI=1;
  191.                 DXZUO=1;
  192.                 P0=table[n];
  193.                 delay_ms(5);       
  194.         }
  195. }

  196. void nbzhi3()                 //③南北向左转数码管倒计时显示结束,关闭;同时南北向直行黄灯灭,南北向直行红灯亮    ①南北向左转绿灯亮,延时若干秒
  197. {       
  198.         while(1)
  199.         {
  200.                  RED_NANBEIZHI=1;
  201.                  RED_NANBEIZUO=0;            
  202.                  GREEN_NANBEIZUO=1;;
  203.                  YELLOW_NANBEIZHI=0;
  204.                 if(tt==20)
  205.                 {
  206.                          tt=0;
  207.                         temp--;                                
  208.                 }
  209.                 n=temp%10;                                                         
  210.                 if(temp==0)
  211.                 {
  212.                  temp=5;
  213.                  break;       
  214.                 }
  215.             NBZHI=1;         
  216.                 NBZUO=0;
  217.                 DXZHI=1;
  218.                 DXZUO=1;
  219.                 P0=table[n];
  220.                 delay_ms(5);
  221.         }       
  222. }

  223. ////////3、南北向左转:
  224. void nbzuo2()           //②启动东西向直行数码管显示:倒计时6秒;同时南北向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  225. {                               
  226.         temp1=6;
  227.         while(1)
  228.         {
  229.                  RED_DONGXIZHI=0;
  230.                  RED_DONGXIZHI=1;
  231.                  RED_DONGXIZUO=1;          
  232.                  GREEN_NANBEIZHI=0;
  233.                  YELLOW_NANBEIZHI=0;
  234.                 if(tt==20)
  235.                 {
  236.                          tt=0;
  237.                         temp1--;
  238.                         if(temp1>=2)
  239.                         {
  240.                         GREEN_NANBEIZUO=~GREEN_NANBEIZUO;
  241.                     }               
  242.                 }
  243.                 n=temp1%10;                                                         
  244.                 if(temp1==3)
  245.                 {
  246.                  temp1=6;
  247.                  break;       
  248.                 }
  249.             NBZHI=1;         //南北左转
  250.                 NBZUO=1;
  251.                 DXZHI=0;
  252.                 DXZUO=1;
  253.                 P0=table[n];
  254.                 delay_ms(5);       
  255.         }       
  256. }

  257. void nbzuo3()           // 然后南北向左转绿灯灭,南北向左转黄灯亮,延时3秒
  258. {                               
  259.         temp1=3;
  260.         while(1)
  261.         {                         
  262.                  GREEN_NANBEIZUO=0;
  263.                  GREEN_DONGXIZUO=0;
  264.                  GREEN_DONGXIZHI=0;
  265.                  YELLOW_NANBEIZUO=1;
  266.                  YELLOW_DONGXIZHI=0;                 
  267.                 if(tt==20)
  268.                 {
  269.                          tt=0;
  270.                         temp1--;                                                       
  271.                 }         
  272.                 n=(temp1)%10;                                                         
  273.                 if(temp1==0)
  274.                 {
  275.                  temp1=3;
  276.                  break;       
  277.                 }        
  278.             NBZHI=1;         //南北左转
  279.                 NBZUO=1;
  280.                 DXZHI=0;
  281.                 DXZUO=1;
  282.                 P0=table[n];
  283.                 delay_ms(5);       
  284.         }       
  285. }
  286. void nbzuo4()                   //③东西向直行数码管倒计时显示结束,关闭;同时南北向左转黄灯灭,南北向左转红灯亮           ①东西向直行绿灯亮,延时若干秒
  287. {       
  288.         while(1)
  289.         {
  290.                  RED_NANBEIZHI=1;             
  291.                  RED_NANBEIZUO=1;
  292.                  RED_DONGXIZHI=0;          
  293.                  GREEN_DONGXIZHI=1;
  294.                  YELLOW_DONGXIZHI=0;
  295.                  YELLOW_NANBEIZUO=0;
  296.                 if(tt==20)
  297.                 {
  298.                          tt=0;
  299.                         temp--;                        
  300.                 }
  301.                 n=temp%10;                                                         
  302.                 if(temp==0)
  303.                 {
  304.                  temp=5;
  305.                  break;       
  306.                 }
  307.             NBZHI=1;         
  308.                 NBZUO=1;
  309.                 DXZHI=0;
  310.                 DXZUO=1;
  311.                 P0=table[n];
  312.                 delay_ms(5);
  313.         }       
  314. }

  315. ////////4、东西向直行:
  316. void dxzhi1()           //②启动东西向左转数码管显示:倒计时6秒;同时东西向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  317. {                               
  318.         temp1=6;
  319.         while(1)
  320.         {
  321.                  RED_NANBEIZHI=1;            
  322.                  RED_NANBEIZUO=1;          
  323.                  RED_DONGXIZUO=1;
  324.                  RED_DONGXIZHI=0;
  325.                 if(tt==20)
  326.                 {
  327.                          tt=0;
  328.                         temp1--;
  329.                         if(temp1>=2)
  330.                         {
  331.                         GREEN_DONGXIZHI=~GREEN_DONGXIZHI;
  332.                     }                
  333.                 }
  334.                 n=(temp1)%10;                                 
  335.                 if(temp1==3)
  336.                 {
  337.                  temp1=6;
  338.                  break;       
  339.                 }
  340.             NBZHI=1;         //南北左转
  341.                 NBZUO=1;
  342.                 DXZHI=1;
  343.                 DXZUO=0;
  344.                 P0=table[n];
  345.                 delay_ms(5);
  346.         }       
  347. }

  348. void dxzhi2()                   //然后东西向直行绿灯灭,东西向直行黄灯亮,延时3秒
  349. {                               
  350.         temp1=3;
  351.         while(1)
  352.         {
  353.                  RED_NANBEIZHI=1;            
  354.                  RED_NANBEIZUO=1;
  355.                  RED_DONGXIZHI=0;          
  356.                  GREEN_DONGXIZHI=0;
  357.                  YELLOW_DONGXIZHI=1;
  358.                 if(tt==20)
  359.                 {
  360.                          tt=0;
  361.                         temp1--;                                                       
  362.                 }
  363.                 n=(temp1)%10;                                                          
  364.                 if(temp1==0)
  365.                 {
  366.                  temp1=3;
  367.                  break;       
  368.                 }
  369.             NBZHI=1;         //南北左转
  370.                 NBZUO=1;
  371.                 DXZHI=1;
  372.                 DXZUO=0;
  373.                 P0=table[n];
  374.                 delay_ms(5);
  375.         }               
  376. }

  377. void dxzhi3()                //③东西向左转数码管倒计时显示结束,关闭;同时东西向直行黄灯灭,东西向直行红灯亮          ①东西向左转绿灯亮,延时若干秒
  378. {       
  379.         while(1)
  380.         {
  381.                  RED_NANBEIZHI=0;             
  382.                  RED_DONGXIZHI=1;          
  383.                  RED_DONGXIZUO=0;
  384.                  GREEN_DONGXIZUO=1;
  385.                  YELLOW_DONGXIZHI=0;
  386.                 if(tt==20)
  387.                 {
  388.                          tt=0;
  389.                         temp--;                               
  390.                 }
  391.                 n=temp%10;                                                         
  392.                 if(temp==0)
  393.                 {
  394.                  temp=5;
  395.                  break;       
  396.                 }
  397.             NBZHI=1;         //南北左转
  398.                 NBZUO=1;
  399.                 DXZHI=1;
  400.                 DXZUO=0;
  401.                 P0=table[n];
  402.                 delay_ms(5);
  403.         }       
  404. }

  405. ////////5、东西向左转:
  406. void dxzuo2()                //②启动南北向直行数码管显示:倒计时6秒;同时东西向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,
  407. {                               
  408.         temp1=6;
  409.         while(1)
  410.         {               
  411.                 RED_NANBEIZUO=1;          
  412.                 if(tt==20)
  413.                 {
  414.                          tt=0;
  415.                         temp1--;
  416.                         if(temp1>=2)
  417.                         {
  418.                         GREEN_DONGXIZUO=~GREEN_DONGXIZUO;
  419.                     }        
  420.                 }  
  421.                 n=(temp1)%10;                                                          
  422.                 if(temp1==3)
  423.                 {
  424.                  temp1=6;
  425.                  break;       
  426.                 }
  427.             NBZHI=0;         //南北左转
  428.                 NBZUO=1;
  429.                 DXZHI=1;
  430.                 DXZUO=1;
  431.                 P0=table[n];
  432.                 delay_ms(5);                
  433.         }       
  434. }

  435. void dxzuo3()                 //然后东西向左转绿灯灭,东西向左转黄灯亮,延时3秒
  436. {                               
  437.         temp1=3;
  438.         while(1)
  439.         {
  440.                  RED_NANBEIZHI=1;             
  441.                  RED_NANBEIZUO=1;
  442.                  GREEN_DONGXIZUO=0;          
  443.                  YELLOW_DONGXIZUO=1;
  444.                 if(tt==20)
  445.                 {
  446.                          tt=0;
  447.                         temp1--;       
  448.                 }
  449.                 n=(temp1)%10;                                 
  450.                 if(temp1==0)
  451.                 {
  452.                  temp1=3;
  453.                  break;       
  454.                 }
  455.             NBZHI=0;         //南北左转
  456.                 NBZUO=1;
  457.                 DXZHI=1;
  458.                 DXZUO=1;
  459.                 P0=table[n];
  460.                 delay_ms(5);       
  461.         }       
  462. }

  463. void dxzuo4()                  //③南北向直行数码管倒计时显示结束,关闭;同时东西向左转黄灯灭,东西向左转红灯亮          ①南北向直行绿灯亮,延时5秒
  464. {         
  465.         while(1)
  466.         {         
  467.                  RED_NANBEIZHI=0;             
  468.                  RED_DONGXIZHI=1;
  469.                  RED_DONGXIZUO=1;
  470.                  GREEN_NANBEIZHI=1;
  471.                  YELLOW_DONGXIZUO=0;
  472.                         if(tt==20)
  473.                 {
  474.                          tt=0;
  475.                         temp--;                                
  476.                 }
  477.                 n=temp%10;                                                         
  478.                 if(temp==0)
  479.                 {
  480.                  temp=5;
  481.                  break;       
  482.                 }
  483.             NBZHI=0;         //南北左转
  484.                 NBZUO=1;
  485.                 DXZHI=1;
  486.                 DXZUO=1;
  487.                 P0=table[n];
  488.                 delay_ms(5);
  489.         }       
  490. }

  491. void delay_ms(u16 t)
  492. {                       
  493.         u8 i,j;
  494.         for(i=0;i<t;i++)
  495.         for(j=0;j<110;j++);       
  496. }
  497. void int0() interrupt 0          //外部中断0
  498. {          
  499.         if(temp<10&&temp>=0)
  500.         {
  501.                   temp=temp+2;
  502.         }
  503. }
  504. void int1() interrupt 2          //外部中断1
  505. {
  506.         if(temp>=0&&temp<10)
  507.         {
  508.           temp=temp-2;
  509.         }
  510. }
  511. void xtimer1() interrupt 1
  512. {                       
  513.         TH0=(65535-50000)/256;
  514.         TL0=(65535-50000)%256;
  515.         tt++;
  516. }
复制代码



交通灯 - 加强版.zip

96.41 KB, 下载次数: 8, 下载积分: 黑币 -5

加强版

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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