找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 2227|回复: 1
收起左侧

基于89c51的交通灯

[复制链接]
ID:355655 发表于 2018-6-21 00:25 | 显示全部楼层 |阅读模式
基于89c51的交通灯
0.png

单片机源程序如下:
  1.           #include<reg52.h>

  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define ON 0
  5. #define OFF 1
  6.                                                                                
  7. sbit g1=P1^0;
  8. sbit y1=P1^1;
  9. sbit l1=P1^2;
  10. sbit g2=P1^3;
  11. sbit y2=P1^4;
  12. sbit l2=P1^5;

  13. uchar num,num1,key,a,b,c,d;
  14. uint t0,t1;        /*t0,t1,要大于255!!*/       
  15. uchar code table[]={
  16. 0x3f,0x06,0x5b,0x4f,
  17. 0x66,0x6d,0x7d,0x07,
  18. 0x7f,0x6f,0x77,0x7c,
  19. 0x39,0x5e,0x79,0x71,0};


  20. void init();                 //初值函数
  21. void display(uchar a,uchar b,uchar c,uchar d);                //显示程序
  22. void Keyscan();                //  按键

  23. void delay (uint z)           //延时函数
  24. {
  25.         uint x,y;
  26.         for(x=z;x>0;x--)
  27.                 for(y=110;y>0;y--);
  28. }
  29. void main()//主函数
  30. {       
  31.        
  32.         init();
  33.         while(1)
  34.         {
  35.                 display(a,b,c,d);
  36.                 Keyscan();
  37.                 if(key)                  //如果有按键按下,
  38.                 {
  39.                         TR0=0;
  40.                         TR1=0;                  //不计时
  41.                         P0=table[9];         //显示99
  42.                         P2=0;                         //全部显示
  43.                         if(key==1)                  //东西方向
  44.                         {
  45.                                 P1=0xde;          //LED状态
  46.                         }
  47.                         if(key==2)                  //南北方向
  48.                         {
  49.                                 P1=0xf3;        //LED状态
  50.                         }
  51.                
  52.                                        
  53.                         }
  54.                         while(key)
  55.                         {
  56.                                 Keyscan();           //等待按下正常
  57.                         }
  58.                
  59.                                
  60.                         TR0=1;
  61.                         TR1=1;
  62.                 }
  63.         }               

  64. void Keyscan()
  65. {
  66.         uchar temp;
  67.         temp=P3;
  68.         while(temp!=0xff)
  69.         {
  70.                 delay(5);                                //延时,消抖
  71.                 temp=P3;                                        //再次确认是否有健按下
  72.                 temp=temp&0xff;
  73.                 while(temp!=0xff)
  74.                 {
  75.                         temp=P3;

  76.                         switch(temp)
  77.                         {
  78.                                 case 0xfe:key=1;         //
  79.                                         break;
  80.                                 case 0xfd:key=2;
  81.                                         break;
  82.                                 case 0xfb:key=0;
  83.                                         break;
  84.                         }
  85.                         while(temp!=0xff)                        //松手检测
  86.                         {
  87.                                 temp=P3;
  88.                                 temp=temp&0xff;
  89.                         }
  90.                 }
  91.         }
  92. }
  93. void init()                 //改初值函数
  94. {
  95.         g1=ON;
  96.         y1=OFF;
  97.         l1=OFF;
  98.         g2=OFF;
  99.         y2=OFF;
  100.         l2=ON;
  101.         num=20;
  102.         num1=23;
  103.         a=num/10;
  104.         b=num%10;
  105.         c=num1/10;
  106.         d=num1%10;
  107.         TMOD=0x11;
  108.         TH0=(65536-50000)/256;
  109.         TL0=(65536-50000)%256;
  110.         TH1=(65536-50000)/256;
  111.         TL1=(65536-50000)%256;
  112.         EA=1;
  113.         ET0=1;
  114.         ET1=1;
  115.         TR0=1;
  116.         TR1=1;
  117. }
  118. void timer0() interrupt 1                 //定时器0中断              控制东西时间
  119. {
  120.         TH0=(65536-50000)/256;
  121.         TL0=(65536-50000)%256;
  122.         t0++;
  123.         if(t0%20==0)                  //每一秒进入 一次
  124.         {
  125.                 if(t0<=400)                 //绿灯        时间
  126.                 {
  127.                         num--;
  128.                         if(num==0)           //绿灯结束,开黄灯
  129.                         {
  130.                                 num=3;
  131.                                 g1=OFF;
  132.                                 y1=ON;
  133.                                 l1=OFF;
  134.                         }
  135.                 }
  136.                 if(t0>400&&t0<=460)         //黄灯时间
  137.                 {
  138.                         num--;
  139.                         if(num==0)                 //黄灯结束,开红灯
  140.                         {
  141.                                 num=23;
  142.                                 g1=OFF;
  143.                                 y1=OFF;
  144.                                 l1=ON;
  145.                         }
  146.                 }
  147.                 if(t0>460&&t0<=920)          //红灯时间
  148.                 {
  149.                         num--;
  150.                         if(num==0)                //红灯结束,开绿灯
  151.                         {
  152.                                 num=20;
  153.                                 g1=ON;
  154.                                 y1=OFF;
  155.                                 l1=OFF;
  156.                         }
  157.                 if(t0==920)
  158.                                 t0=0;       
  159.                 }
  160.                 a=num/10;
  161.                 b=num%10;
  162.         }
  163. }

  164. void timer1() interrupt 3                 //定时器1中断     控制南北时间     
  165. {
  166.         TH1=(65536-50000)/256;
  167.         TL1=(65536-50000)%256;
  168.         t1++;
  169.         if(t1%20==0)
  170.         {
  171.                 if(t1<=460)
  172.                 {                                             
  173.                         num1--;
  174.                         if(num1==0)
  175.                         {
  176.                                 num1=20;
  177.                                 g2=ON;
  178.                                 y2=OFF;
  179.                                 l2=OFF;
  180.                         }
  181.                 }
  182.                 if(t1>460&&t1<=860)
  183.                 {
  184.                         num1--;
  185.                         if(num1==0)
  186.                         {
  187.                                 num1=3;
  188.                                 g2=OFF;
  189.                                 y2=ON;
  190.                                 l2=OFF;
  191.                         }
  192.                 }
  193.                 if(t1>860&&t1<=920)
  194.                 {
  195.                         num1--;
  196.                         if(num1==0)
  197.                         {
  198.                                 num1=23;
  199.                                 g2=OFF;
  200.                                 y2=OFF;
  201.                                 l2=ON;
  202.                         }
  203.                         if(t1==920)
  204.                                 t1=0;
  205.                 }
  206.                 c=num1/10;
  207.                 d=num1%10;
  208.         }
  209. }
  210. /*void display(uchar a,uchar b,uchar c,uchar d)        //显示程序
  211. {
  212.       
  213.         P0=table[a];
  214.         P2=1;
  215.         delay(1);
  216.         P2=255;

  217.         P0=table[b];
  218.         P2=2;
  219.         delay(1);
  220.         P2=255;

  221.         P0=table[c];
  222.         P2=4;
  223.         delay(1);
  224.         P2=255;

  225.         P0=table[d];
  226.         P2=8;
  227.         delay(1);
  228.         P2=255;

  229. }
  230. */
  231. void display(uchar a,uchar b,uchar c,uchar d)        //显示程序
  232. {
  233.       
  234.         P0=table[a];
  235.         P2=0xfe;
  236.         delay(1);
  237.         P2=0xff;

  238.         P0=table[b];
  239.         P2=0xfd;
  240.         delay(1);
  241.         P2=0xff;

  242.         P0=table[c];
  243.         P2=0xfb;
  244.         delay(1);
  245.         P2=0xff;

  246.         P0=table[d];
  247.         P2=0xf7;
  248.         delay(1);
  249.         P2=0xff;

  250. }
复制代码

所有资料51hei提供下载:
王建宝.zip (62.96 KB, 下载次数: 23)


回复

举报

ID:1085175 发表于 2023-7-3 22:21 | 显示全部楼层
好厉害,也很全,谢谢分享我会学习的
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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