找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机交通信号灯程序黄灯闪烁实现,请大神帮忙看看

[复制链接]
跳转到指定楼层
楼主
ID:1086252 发表于 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. }
复制代码

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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