找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管系统交通灯程序

[复制链接]
ID:512872 发表于 2019-10-3 10:55 | 显示全部楼层 |阅读模式
甲乙主从通道实现,另外实现调节时间和暂停运行

单片机源程序如下:
  1. /***********************************************************
  2. 名称:基于AT89S52数码管系统交通灯程序
  3. 要求:红禄灯灯电路,数码管电路,独立式键盘电路,蜂鸣器电路,统一交通灯设计
  4. 作者:黄*
  5. 时间:2019年9月1日
  6. 电路描述:S1到S5一键一功能;S1开始,S2暂停,S3调整时间加,S4调整时间减,S5进入紧急状态;
  7. ************************************************************/
  8. #include<reg52.h>
  9. #include<intrins.h>
  10. #define uint unsigned int
  11. #define uchar unsigned char

  12. sbit S1=P1^0;  //开始运行按键
  13. sbit S2=P1^1;  //暂停运行按键
  14. sbit S3=P1^2;  //调整时间加按键
  15. sbit S4=P1^3;  //调整时间减按键
  16. sbit S5=P1^4;  //进入紧急状态按键
  17. sbit red1=P3^2;  //甲通道红灯
  18. sbit green1=P3^3;  //甲通道禄灯
  19. sbit yellow1=P3^4;  //甲通道黄灯
  20. sbit red2=P3^5;  //乙通道红灯
  21. sbit green2=P3^6;  //乙通道禄灯
  22. sbit yellow2=P3^7;  //乙通道黄灯
  23. sbit beep=P3^1;          //蜂鸣器报警控制端

  24. uchar code discode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};        //送段码0-9
  25. uchar code discode1[]={0x92,0x92,0x88,0x8C,0x8C,0xC0,0x87,0x92}; //送段码STOP PASS
  26. uchar disbitcode[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                                   //送位码
  27. uchar disbuf[2]={0,0};                                                      //显示缓冲区
  28. uchar cent,second1=60,second=60,second2=30,a;

  29. /*函数申明*/
  30. void display(void);                       
  31. void ini(void);
  32. void t0(void);
  33. void stop(void);

  34. /*************延时程序**************/                                                                                         
  35. void delay(uint m)                 
  36.   {
  37.           while(--m);
  38.   }

  39. /*************初始化程序**************/
  40. void ini(void)                               
  41.          {
  42.                      TMOD=0x01;
  43.                   TH0=(65536-46082)/256;
  44.                   TL0=(65536-46082)%256;
  45.                   ET0=1;
  46.                   EA=1;
  47.          }
  48. /*************显示紧急通道程序**************/
  49. void stop(void)                  
  50.   {
  51.           uchar i;
  52.           for(i=0;i<8;i++)
  53.          {
  54.                 P0=discode1[i];
  55.                 P2=disbitcode[i];
  56.                 delay(100);       
  57.                 P2=0X00;
  58.         }
  59.   }
  60. /*************显示程序**************/
  61. void display(void)                  
  62.   {
  63.           uchar i;
  64.           for(i=0;i<2;i++)
  65.          {
  66.                 P0=discode[disbuf[i]];
  67.                 P2=disbitcode[i];
  68.                 delay(100);       
  69.                 P2=0X00;
  70.         }
  71.   }

  72. /*************中断程序**************/
  73. void t0(void) interrupt 1 using 0     //用第0组寄存器
  74.          {
  75.                  cent++;
  76.                  if(cent==20)
  77.                          {
  78.                            cent=0;
  79.                            second--;
  80.                            if(second==0&&a==0)
  81.                                         {
  82.                                           second=3;
  83.                                           a=1;
  84.                                         }
  85.                                 if(second==0&&a==1)
  86.                                         {
  87.                                           second=second2;
  88.                                           a=2;
  89.                                         }
  90.                                 if(second==0&&a==2)
  91.                                         {
  92.                                           second=3;
  93.                                           a=3;
  94.                                         }
  95.                                 if(second==0&&a==3)
  96.                                         {
  97.                                           second=second1;
  98.                                           a=0;
  99.                                         }        
  100.                         }
  101.                                 disbuf[0]=second%10;  //更新显示缓冲区
  102.                             disbuf[1]=second/10;  
  103.                         TH0=(65536-46082)/256;
  104.                         TL0=(65536-46082)%256;
  105.          }       
  106. /*************键扫描程序**************/
  107. uchar keyscan()
  108. {
  109. uchar tmp;                         //列号,行号
  110. P1=0xff;               //发全行0扫描码
  111. if((P1&0xff)!=0xff)     //若有键按下
  112.   {
  113.    delay(1000);          // 延时去抖   
  114.    if((P1&0xff)!=0xff)          //有键按下
  115.        {
  116.                 tmp=(P1&0xff);
  117.             do{}while((P1&0xff)!=0xff);
  118.                 tmp=~tmp;                  
  119.         return (tmp);                         //还回键值
  120.                            }                        
  121.     }                                                                                                                       
  122.    return (0);                                //无键按下,还回0
  123. }  
  124. /*************主程序**************/

  125. void main(void)
  126.    {
  127.             uchar v,b=0;
  128.          ini();
  129.          v=keyscan();
  130.          while(v==0)
  131.           {
  132.            P0=0X0C;
  133.            P2=0X01;
  134.            P3=0XFF;
  135.            v=keyscan();                           
  136.           }
  137.          if(v==1||v==16)
  138.          {
  139.          while(1)
  140.          {       
  141.      switch(v)
  142.            {
  143.             case 1:          
  144.                           TR0=1;
  145.                           while(v==1||v==0)
  146.                               {
  147.                                   if(a==0)
  148.                                            {
  149.                                 loop1:                yellow2=1;                                               
  150.                                                 red1=1;
  151.                                             green1=0;
  152.                                             red2=0;
  153.                                            }
  154.                                           if(a==1)
  155.                                            {
  156.                                             yellow1=0;
  157.                                                 green1=1;
  158.                                                 delay(100);
  159.                                             yellow1=1;               
  160.                                            }
  161.                                    if(a==2)
  162.                                            {
  163.                                 loop2:            red1=0;
  164.                                                 red2=1;
  165.                                             green2=0;
  166.                                                 yellow1=1;
  167.                                            }
  168.                                           if(a==3)
  169.                                            {
  170.                                             green2=1;
  171.                                                 yellow2=0;
  172.                                                 delay(100);
  173.                                                 yellow2=1;                                                        
  174.                                            }
  175.                                            display();          
  176.                                           v=keyscan();                 //调键扫描程序
  177.                                         }
  178.                                    break;

  179.                  case 2:   
  180.                         while(v==2||v==0)
  181.                          {
  182.                                    TR0=0;
  183.                                    display();          
  184.                                    v=keyscan();
  185.                                  }
  186.                                    break;
  187.                  case 4:   
  188.                                    b++;
  189.                    v=keyscan();
  190.                                    break;         
  191.                  case 8:         
  192.                                  if(b%2==0)
  193.                                  {
  194.                           second1++;
  195.                                    if(second1==100)
  196.                                       second1=0;
  197.                                   disbuf[0]=second1%10;  //更新显示缓冲区
  198.                               disbuf[1]=second1/10;
  199.                                   }
  200.                                 else
  201.                                  {
  202.                           second2++;
  203.                                    if(second2==100)
  204.                                       second2=0;
  205.                                   disbuf[0]=second2%10;  //更新显示缓冲区
  206.                               disbuf[1]=second2/10;
  207.                                   }                                  
  208.                                   display();          
  209.                                   v=keyscan();
  210.                                  break;
  211.          
  212.            case 16:       
  213.                      if(b%2==0)
  214.                                  {                        
  215.                           second1--;
  216.                                    if(second1==0)
  217.                                        second1=99;
  218.                                   disbuf[0]=second1%10;  //更新显示缓冲区
  219.                               disbuf[1]=second1/10;
  220.                                  }  
  221.                      else
  222.                                  {                        
  223.                           second2--;
  224.                                    if(second2==0)
  225.                                        second2=99;
  226.                                   disbuf[0]=second2%10;  //更新显示缓冲区
  227.                               disbuf[1]=second2/10;
  228.                                  }                                                                               
  229.                                   display();          
  230.                                   v=keyscan();
  231.                                   break;

  232.           case 32:       
  233.                     while(v==32||v==0)                   /*显示八个8*/
  234.                            {
  235.                                    P3=0XFF;
  236.                                    red1=0;
  237.                                    red2=0;
  238.                                    beep=0;
  239.                                    stop();
  240.                                    delay(10000);
  241.                                    beep=1;
  242.                                    v=keyscan();                            //调键扫描程序
  243.                  }
  244.                                    break;
  245.          case 64:
  246.                                    second=60;
  247.                                    P3=0XFF;
  248.                                    a=0;
  249.                        goto loop1;
  250.                                     break;
  251.          case 128:
  252.                                    second=30;
  253.                                    P3=0XFF;
  254.                                    a=2;
  255.                        goto loop2;
  256.                                     break;
  257.         }
  258.                                   display();          
  259.                                   v=keyscan();
  260.     }
  261. }
  262. }
复制代码

所有资料51hei提供下载:
交通灯.zip (29.72 KB, 下载次数: 8)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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