标题: 单片机交通信号灯程序黄灯闪烁实现,请大神帮忙看看 [打印本页]

作者: 孙铭阳    时间: 2023-6-30 23:37
标题: 单片机交通信号灯程序黄灯闪烁实现,请大神帮忙看看
编写交通灯程序,下面程序能够实现红绿灯显示及对应流水灯的显示,但是怎么实现在黄灯时间流水灯闪烁不知道怎么调试了尝试过黄灯流水灯亮时直接加入延时函数发现数码管闪烁了,求大神指点实现黄灯闪烁。

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit  EW_LED2=P0^3;                //东西数码管十位
  5. sbit  EW_LED1=P0^2;                //东西数码管个位
  6. sbit  SN_LED2=P0^1;                //南北数码管十位
  7. sbit  SN_LED1=P0^0;                //南北数码管个位

  8. sbit  SN_red=P1^2;    //南北红灯
  9. sbit  SN_yellow=P1^3;        //南北黄灯
  10. sbit  SN_green=P1^4;        //南北绿灯
  11. sbit  EW_red=P1^5;                //东西红灯
  12. sbit  EW_yellow=P1^6;        //东西黄灯
  13. sbit  EW_green=P1^7;        //东西绿灯

  14. char  Time_EW;                                //东西数码管显示时间
  15. char  Time_SN;                                //南北数码管显示时间
  16. uchar EW=5,SN=10;                //南北通行状态数码管初始化
  17. uchar EW1=10,SN1=5;        //南北通行状态数码管初始化
  18. uchar code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9数码管端段码(共阳极)
  19. void delay_ms(uint x)//延时函数
  20. {
  21.         uint i,j;
  22.         for(i=x;i>0;i--)
  23.         for(j=110;j>0;j--);
  24. }
  25. void Display(void)                //数码管显示函数
  26. {
  27.         char h,l;
  28.         h=Time_EW/10;
  29.         l=Time_EW%10;
  30.         P3=table[l];EW_LED2=1;delay_ms(1);EW_LED2=0;
  31.         P3=table[h];EW_LED1=1;delay_ms(1);EW_LED1=0;//东西方向数码管秒数显示
  32.         
  33.         h=Time_SN/10;
  34.         l=Time_SN%10;
  35.         P2=table[l];SN_LED2=1;delay_ms(1);SN_LED2=0;
  36.         P2=table[h];SN_LED1=1;delay_ms(1);SN_LED1=0;//南北方向数码管秒数显示
  37. }
  38. void main(void)
  39. {
  40.         EA=1;
  41.         ET0=1;
  42.         TMOD=0x01;
  43.         TL0=0xb0;
  44.         TH0=0x3c;
  45.         TR0=1;
  46.         while(1)
  47. //状态1:东西绿灯5秒,南北红灯10秒
  48.         {
  49.                 Time_EW=EW;        //数码管赋初值
  50.                 Time_SN=SN;
  51.                 while(Time_SN>=6)
  52.                 {
  53.                         SN_yellow=0;        //南北黄灯灭
  54.                         SN_red=1;                        //南北红灯亮
  55.                         SN_green=0;                //南北绿灯灭
  56.                         EW_yellow=0;        //东西黄灯灭
  57.                         EW_red=0;                        //东西红灯灭
  58.                         EW_green=1;                //东西绿灯亮
  59.                         Display();                //数码管显示
  60.                 }
  61. //状态2:东西黄灯5秒,南北红灯5秒
  62.                 P1=0x00;                                 //清除灯的显示
  63.                 if(Time_SN==5)
  64.                          Time_EW=5;
  65.                 while(Time_SN>=1)
  66.                 {
  67.                         SN_yellow=0;        //南北黄灯灭
  68.                         SN_red=1;                        //南北红灯亮
  69.                         SN_green=0;                //南北绿灯灭
  70.                         EW_yellow=1;        //东西黄灯亮
  71.                         EW_red=0;                        //东西红灯灭
  72.                         EW_green=0;                //东西绿灯灭
  73.                         Display();                //数码管显示
  74.                 }
  75. //状态3:东西红灯10秒,南北绿灯5秒
  76.                 Time_EW=EW1;        //数码管赋初值
  77.                 Time_SN=SN1;
  78.                 while(Time_EW>=6)
  79.                 {
  80.                         SN_yellow=0;        //南北黄灯灭
  81.                         SN_red=0;                        //南北红灯灭
  82.                         SN_green=1;                //南北绿灯亮
  83.                         EW_yellow=0;        //东西黄灯灭
  84.                         EW_red=1;                        //东西红灯亮
  85.                         EW_green=0;                //东西绿灯灭
  86.                         Display();                //数码管显示
  87.                 }
  88. //状态4:东西红灯5秒,南北黄灯5秒
  89.                 P1=0x00;                                 //清除灯的显示
  90.                 if(Time_EW==5)
  91.                         Time_SN=5;
  92.                 while(Time_EW>=1)
  93.                 {
  94.                         SN_yellow=1;        //南北黄灯亮
  95.                         SN_red=0;                        //南北红灯灭
  96.                         SN_green=0;                //南北绿灯灭
  97.                         EW_yellow=0;        //东西黄灯灭
  98.                         EW_red=1;                        //东西红灯亮
  99.                         EW_green=0;                //东西绿灯灭
  100.                         Display();                //数码管显示
  101.                 }
  102.         }
  103. }
  104. void timer0() interrupt 1
  105. {
  106.         uchar count;
  107.         TL0=0xb0;
  108.         TH0=0x3c;
  109.         count++;
  110.         if(count==20)
  111.         {
  112.                 Time_EW--;
  113.                 Time_SN--;
  114.                 count=0;
  115.         }
  116. }
复制代码


作者: chxelc    时间: 2023-7-1 09:17
有原理图吗?个人思路:优先保证数码管显示扫描时间间隔满足不闪烁的要求。可以在数码管显示函数里面加入红绿灯和黄灯的判定,利用数码管扫描的间隔时间处理判定逻辑。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1