找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助单片机交通灯,数码管的数值如何跟交通灯连接起来呢

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次(中奖概率 20%)
跳转到指定楼层
楼主
看了好多别人的作品可还是搞不清楚要怎么把这两个联系起来

单片机源程序如下:
  1. #include <reg51.h>                                                                                                               
  2. #define uchar unsigned char
  3. #define  uint unsigned int
  4. sbit RED_A=P0^0;                         //定义东西方向红灯
  5. sbit YELLOW_A=P0^1;                         //定义东西方向黄灯
  6. sbit GREEN_A=P0^2;                         //定义东西方向绿灯
  7. sbit RED_B=P0^3;                         //定义南北方向红灯
  8. sbit YELLOW_B=P0^4;                         //定义南北方向黄灯
  9. sbit GREEN_B=P0^5;                         //定义南北方向绿灯
  10. sbit add=P3^3;                                 //定义东西绿灯时间加按键
  11. sbit sub=P3^4;                                 //定义东西绿灯时间减按键
  12. sbit K1=P3^2;                                 //定义设定时间按键
  13. sbit add2=P3^5;                             //定义调南北绿灯时间加按键
  14. sbit sub2=P3^6;                             //定义调南北绿灯时间减按键
  15. int time_1=2000,time_2=2000; //定义东西和南北绿灯亮时可调变量并赋予初值2S
  16. uchar Flash_Count=0;                 //黄灯闪烁次数初始为0
  17. Operation_Type=1;                         //从模式1开始
  18. void DelayMS(uint x);                 //延时子函数声明
  19. void Traffic_lignt();                 //交通灯循环亮子程序声明
  20. /*主函数*/
  21. void main()
  22. {
  23.         P3=0xff;                                 //预读先写1
  24.         EA=1;                                         //打开总中断
  25.         EX0=1;                                         //打开外部中断0
  26.         IT0=0;                                         //触发方式为低电平触发
  27.   
  28.                 while(1)
  29.                 {
  30.                    Traffic_lignt();        
  31.                 }
  32. }
  33. /*延时子程序*/
  34. void DelayMS(uint x)                  //延时ms
  35. {
  36.     uchar t;
  37.     while(x--)
  38.     {
  39.         for(t=120;t>0;t--);
  40.     }
  41. }
  42. /*交通灯循环亮程序**/
  43. void Traffic_lignt()                 
  44. {
  45.          switch(Operation_Type)
  46.         {
  47.                  case 1:
  48.                         RED_A=1;YELLOW_A=1;GREEN_A=0;                 //东西方向红灯和黄灯灭,绿灯亮
  49.                         RED_B=0;YELLOW_B=1;GREEN_B=1;                 //南北方向绿灯和黄灯灭,红灯亮
  50.                         DelayMS(time_1);                                         //东西方向绿灯延时时间
  51.                         while(K1==0);                                                 //产生中断时可靠停止
  52.                         Operation_Type = 2;                                         //转到模式2
  53.                         break;
  54.                 case 2:
  55.                         GREEN_A=1;                                                         //东西方向绿灯灭
  56.                         DelayMS(200);                                                 //黄灯延时时间
  57.                         while(K1==0);                                                 //产生中断时可靠停止
  58.                         YELLOW_A=~YELLOW_A;                                         //黄灯闪烁
  59.                         if(++Flash_Count !=10)                                  //闪烁10次(亮5次灭5次)
  60.                                 return;
  61.                         Flash_Count=0;                                                 //黄灯闪烁次数清零
  62.                         Operation_Type = 3;                                         //转到模式3
  63.                         break;
  64.                 case 3:
  65.                         RED_A=0;YELLOW_A=1;GREEN_A=1;                 //东西方向仅红灯亮
  66.                         RED_B=1;YELLOW_B=1;GREEN_B=0;                 //南北方向仅绿灯亮
  67.                         DelayMS(time_2);                                     //南北方向绿灯延时时间
  68.                         while(K1==0);                                                 //产生中断时可靠停止
  69.                         Operation_Type = 4;                                         //转到模式4
  70.                         break;        
  71.                 case 4:
  72.                         GREEN_B=1;                                                         //南北方向绿灯灭
  73.                         DelayMS(200);                                                 //黄灯延时时间
  74.                         while(K1==0);                                                 //产生中断时可靠停止
  75.                         YELLOW_B=~YELLOW_B;                                         //黄灯闪烁
  76.                         if(++Flash_Count !=10)                                  //闪烁10次(亮5次灭5次)
  77.                                 return;
  78.                         Flash_Count=0;                                                 //黄灯闪烁次数清零
  79.                         Operation_Type = 1;                                         //转到模式1
  80.                         break;        
  81.         }
  82. }
  83. /*外部中断0子程序*/
  84. void exter_0() interrupt 0
  85. {
  86.         while(!(add&&sub&&add2&&sub2))                        //扫描是否有按键按下
  87.                 {
  88.                 while(add==0)                                    //如果第一个按键按下东西方向绿灯延续时间加1秒
  89.                                         {
  90.                                             DelayMS(10);
  91.                                                 while(add==0);
  92.                                                 time_1=time_1+1000;
  93.                                                 if(time_1>60000)   //当时间超过60秒将时间置为60秒
  94.                                                 {time_1=60000;}
  95.                                         }
  96.                         while(sub==0)                                   //如果第二个按键按下东西方向绿灯延续时间减1秒
  97.                                         {        
  98.                                                 DelayMS(10);
  99.                                                 while(sub==0);
  100.                                                 time_1=time_1-1000;
  101.                                                 if(time_1<=0)           //当时间减到小于或等于0时将时间置为1秒
  102.                                                 {time_1=1000;}
  103.                                         }
  104.                     while(add2==0)                                   //如果第三个按键按下南北方向绿灯延续时间加1秒
  105.                                         {        
  106.                                                 DelayMS(10);
  107.                                                 while(add2==0);
  108.                                                 time_2=time_2+1000;
  109.                                                 if(time_2>60000)   //当时间超过60秒将时间置为60秒
  110.                                                 {time_2=60000;}
  111.                                         }
  112.                         while(sub2==0)                                   //如果第四个按键按下南北方向绿灯延续时间减1秒
  113.                                         {                                          
  114.                                                 DelayMS(10);
  115.                                                 while(sub2==0);
  116.                                                 time_2=time_2-1000;
  117.                                                 if(time_2<=0)           //当时间减到小于或等于0时将时间置为1秒
  118.                                                 {time_2=1000;}
  119.                                         }
  120.            }
  121. }
复制代码


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

使用道具 举报

沙发
ID:863590 发表于 2021-12-11 21:04 | 只看该作者
就是不知道display函数要怎么设计呢,怎么才能跟红绿灯的倒计时联系起来,
回复

使用道具 举报

板凳
ID:863590 发表于 2021-12-11 21:04 | 只看该作者
有大佬指导一下吗
回复

使用道具 举报

地板
ID:332444 发表于 2021-12-12 15:02 | 只看该作者
回复

使用道具 举报

5#
ID:332444 发表于 2021-12-12 15:03 | 只看该作者
回复

使用道具 举报

6#
ID:89515 发表于 2021-12-12 15:29 | 只看该作者
没有写过这个,但是我想你的红绿灯总得有个参考吧!用定时器把倒计时程序写出来做时间参考,同时送显。计时参数由相应灯的时间规则决定,各色的灯做个标志以参数形式写入时间函数,同时控制定时器的开关。这个难点就在于规则不在显示上啊。我从新看了你的程序,时间相关程序用软件模拟虽然不严谨但没问题,可是时间变量直接耦合根本没法显示了,时间设置部分可以解决,关键的倒计时部分没戏了。个人认为必须得从新写。
display(灯标志,延时时间)
{
         灯标志=?;//确定是那个灯的延时;
         写入定时器延时参数;
         参数送显示;//数码管显示函数
         开启定时器;
         注意时间参数清零时关闭定时器,为下一次定时做准备。
         哪个地方需要延时就放在那个地方。
         如果确实需要更改时间参数,可将其设定为全局变量,再用按键去控制就行了。
         
         
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:863590 发表于 2021-12-12 23:44 | 只看该作者
mengzhixinheng 发表于 2021-12-12 15:29
没有写过这个,但是我想你的红绿灯总得有个参考吧!用定时器把倒计时程序写出来做时间参考,同时送显。计时 ...

谢谢你,我感觉我好像能理解到你的意思,我去试试试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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