找回密码
 立即注册
查看: 2720|回复: 18

数组的应用——利用数组做个交通灯@32G12K128

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-05-08 07:33:49

9

主题

85

回帖

1670

积分

金牌会员

积分
1670
发表于 2024-2-29 23:05:53 | 显示全部楼层 |阅读模式
数组的应用——利用数组做个交通灯@32G12K128

在1~7集中,学习了数组的应用,因此就萌生了用数组来做个交通灯,利用交通灯切换有规律,用2组IO口搭配for循环,就可以实现东西南北红绿灯的切换了。今天时间太晚,明天还要上班,就先上传下成功的图片和视频,后面再来慢慢介绍编程思路和方法



交通灯洞洞板

交通灯洞洞板

自制开发板

自制开发板
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
永远相信美好的事情即将发生!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:491
  • 最近打卡:2025-05-09 08:05:06
已绑定手机

23

主题

589

回帖

2841

积分

金牌会员

积分
2841
发表于 2024-3-1 07:55:28 | 显示全部楼层
不停地学习
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:407
  • 最近打卡:2025-05-09 06:44:00

2

主题

170

回帖

228

积分

中级会员

积分
228
发表于 2024-3-1 09:33:53 来自手机 | 显示全部楼层
挺厉害的,我当初学数组搞的挺头大的…不过一维数组还是挺好理解的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-05-08 07:33:49

9

主题

85

回帖

1670

积分

金牌会员

积分
1670
发表于 2024-3-1 10:18:53 | 显示全部楼层
第1集

先讲下我的动手思路
1.第1步动手前先在纸上写好,我用单片机要实现1个什么样的功能,程序动作的流程是怎么样运转的,我大概用什么样的语句或逻辑去编写这个过程,要先把握这个大的方向。
所以第1步是先将程序流程图画出来,并通过流程图分析,是不是都能实现我想要的功能。——流程图
第2步就是要列好我要用的所有硬件,我准备怎么去分配IO,大概需要多少点位,这样单片机的型号也能算出来哪种能满足我的要求。——规划硬件,分配IO
第3步作为1个实用主义者,不是把程序写得多么花里胡哨,而是用最简单的语句和逻辑把要实现的功能表达清楚,让单片机初学者都能看懂。——编写程序
第4步搭配电路,测试并修改程序。——硬件与功能调试


流程图:
假设有1个十字路口,分为东,南,西,北4个方向的红绿灯,当然先不考虑有左转与直行的单独红绿灯情况,我们只考虑有1个绿灯,绿灯亮就可以左转或直行,右转我们就假设有专用车道吧。
红绿黄灯亮起的时序是,先亮绿灯,绿灯亮起一定时间后熄灭,再是黄灯亮起,黄灯亮完后再是红灯,黄灯在绿灯与红灯之间作一个缓冲。
我写的第一版程序是北、南两个方向绿灯同时亮、西、东两个方向绿灯同时亮,
《时序流程图》
北绿-南绿-西红-东红    延时5S  南北绿灯点亮5S,东西红灯5S

北黄-南黄-西红-东红    延时1S  南北黄灯点亮1S

北红-南红-西绿-东绿    延时5S  南北红灯点亮5S,东西绿灯5S

北红-南红-西黄-东黄    延时1S  东西黄灯点亮1S



大概执行4次就可以模拟一次十字路口红绿灯工作情况。
《IO分配》把南北方向红绿黄灯分配为P2口,共6个灯,占用6个IO口
                                                        南                                北                               
                                                红        绿        黄                红        绿        黄        0有效点亮       
                                      P2.7  P2.6  P2.5  P2.4  P2.3 P2.2  P2.1  P2.0        Hex        延时
北绿-南绿-西红-东红                1        1        0        1        1        1        0        1        DD        5
北黄-南黄-西红-东红                1        1        1        0        1        1        1        0        EE        1
北红-南红-西绿-东绿                1        0        1        1        1        0        1        1        BB        5
北红-南红-西黄-东黄                1        0        1        1        1        0        1        1        BB        1
把东西方向红绿黄灯分配为P0口,共6个灯,占用6个IO口


                                                        东                                西                               
                                                 红        绿        黄                红        绿        黄        0有效点亮       
                                      P0.7  P0.6  P0.5  P0.4  P0.3 P0.2  P0.1  P0.0        Hex        延时
北绿-南绿-西红-东红                1        0        1        1        1        0        1        1        BB        5
北黄-南黄-西红-东红                1        0        1        1        1        0        1        1        BB        1
北红-南红-西绿-东绿                1        1        0        1        1        1        0        1        DD        5
北红-南红-西黄-东黄                1        1        1        0        1        1        1        0        EE        1


现在想下怎么循环,把P2口编为1个数组,P0口编为1个数组,把P2和P0口同步循环:

u8 NS_LED[4]  = {0xDD,0xEE,0xBB,0xBB};                // 南北向,绿,黄,红,红
u8 WE_LED[4]  = {0xBB,0xBB,0xDD,0xEE};                // 东西向,红,红,绿,黄
u16 time[4] =         {5000,1000,5000,1000};             // 延时设定,


可以看下上面的程序总共执行4步,用1个循环4次就搞定了。是不是非常简单。

                for(a = 0; a<4; a++)
                {
                        P2 = NS_LED[a];
                        P0 = WE_LED[a];
                        b = time[a];
                        delay_ms(b);
                }




这样的编程等于是说把P口想要执行的动作,提前编辑好在数组里,只能按步就班的顺序执行,并且每一步执行时间还要一样。
当然这只是个最基础的,2个方向绿灯同时亮这是会发生交通事故的,但可以在这个基础上我们引用这个执行思路继续完善红绿灯功能。
完整程序代码在下面。
  1. /*--------------------------------------------------------------------------------------
  2.         1个十字路口交通灯演示:
  3.         分为北、南、西、东4个方向,每个方向有红绿黄3个LED灯,绿灯亮7s后转黄灯亮2s,
  4.         每次只许1个方向变绿灯,工作顺序:
  5.         1.北绿-南红-西红-东红        延时7s        由南往北为绿灯,可左转,直行,右转
  6.         2.北黄-南红-西红-东红        延时2s  黄灯亮2s后转红灯
  7.         3.北红-南绿-西红-东红        延时7s        由北往南为绿灯,可左转,直行,右转
  8.         4.北红-南黄-西红-东红        延时2s  黄灯亮2s后转红灯
  9.         5.北红-南红-西绿-东红        延时7s        由东往西为绿灯,可左转,直行,右转
  10.         6.北红-南红-西黄-东红        延时2s        黄灯亮2s后转绿灯
  11.         7.北红-南红-西红-东绿        延时7s        由西往东为绿灯,可左转,真行,右转
  12.         8.北红-南红-西红-东黄        延时2s        黄灯亮2s后转到1依次循环。
  13.        
  14.         IO分配:每个IO串联1个4.7K给LED限流电阻
  15.         P2.7        P2.6        P2.5        P2.4        P2.3        P2.2        P2.1        P2.0
  16.         无                南-红        南-绿        南-黄        无                北-红        北-绿        北-黄
  17.        
  18.         P0.7        P0.6        P0.5        P0.4        P0.3        P0.2        P0.1        P0.0
  19.         无                东-红        东-绿        东-黄        无                西-红        西-绿        西-黄                       
  20.        
  21.         编写日期:2024年2月28日                版本:V01        开发者:dumon
  22.         版本更新记录:
  23.         2024-02-28 :        南北方向绿灯同时亮,东西方向绿灯同时亮。
  24. --------------------------------------------------------------------------------------*/
  25. #include <STC32G.H>
  26. #include "comm/stc32_stc8_usb.h"
  27. #define MAIN_Fosc 24000000UL                // 定义1个主时钟为24MHz
  28. // 流水灯相关说明,P2.0~P2.7为共阳极连接,P4.5接三极管基极,为低电平时发射极与基极接通,
  29. // 电流饱合后,发射极到集电极接通,LED得到高电平,P2.0~P2.7输出低电平即可点灯。
  30. sbit ON_LED = P4^5;                // 点灯总开关,三极管是小电流控制大电流的开关
  31. sbit LED_1        = P2^0;                // 流水灯LED1
  32. sbit LED_2        = P2^1;                // 流水灯LED2
  33. sbit LED_3        = P2^2;                // 流水灯LED3
  34. sbit LED_4        = P2^3;                // 流水灯LED4
  35. sbit LED_5        = P2^4;                // 流水灯LED5
  36. sbit LED_6        = P2^5;                // 流水灯LED6
  37. sbit LED_7        = P2^6;                // 流水灯LED7
  38. sbit LED_8        = P2^7;                // 流水灯LED8
  39. // 数码管相关说明,P0.0~P0.7为数码管的8个段码,P1.0,P1.1,P1.3为3个位码,共阴极数码管
  40. // 位码要接低电平、段码接高电平,共阳极数码管位码要接高电平、段码接低电平
  41. sbit DIG_A        = P0^0;                // 数码管段码‘A’
  42. sbit DIG_B        = P0^1;                // 数码管段码‘B’
  43. sbit DIG_C        = P0^2;                // 数码管段码‘C’
  44. sbit DIG_D        = P0^3;                // 数码管段码‘D’
  45. sbit DIG_E        = P0^4;                // 数码管段码‘E’
  46. sbit DIG_F        = P0^5;                // 数码管段码‘F’
  47. sbit DIG_G        = P0^6;                // 数码管段码‘G’
  48. sbit DIG_P        = P0^7;                // 数码管段码‘dP’
  49. sbit SEG_1        = P1^0;                // 第1位数码管位码
  50. sbit SEG_2        = P1^1;                // 第2位数码管位码
  51. sbit SEG_3        = P1^3;                // 第3位数码管位码
  52. // 蜂鸣器参照STC32G实验箱V9.4增加,P5.4输出低电平接三极管基极,同流水灯控制原理,
  53. // 在蜂鸣器负责两端并联反接1个二极管,防止短路
  54. sbit BEEP        = P5^4;                // 蜂鸣器端口
  55. // 数组变量                                                          
  56. u8 NS_LED[4]  = {0xDD,0xEE,0xBB,0xBB};                // 绿,黄,红,红
  57. u8 WE_LED[4]  = {0xBB,0xBB,0xDD,0xEE};                // 红,红,绿,黄
  58. u16 time[4] =         {5000,1000,5000,1000};
  59. u16 a,b,c,d;                                                                // 循环计数变量       
  60.                                          
  61. void delay_ms(u16 ms)                                                // 自定义延时函数
  62. {
  63.         u16 i;
  64.         do{
  65.                 i = MAIN_Fosc/6000;
  66.                 while(--i);
  67.         } while(--ms);
  68. }       
  69. void main()
  70. {
  71.         WTST = 1;
  72.         // IO口模式配置
  73.         P0M1 = 0x00;        P0M0 = 0x00;
  74.         P1M1 = 0x00;        P1M0 = 0x00;
  75.         P2M1 = 0x00;        P2M0 = 0x00;
  76.         P3M1 = 0x00;        P3M0 = 0x00;
  77.         P4M1 = 0x00;        P4M0 = 0x00;
  78.         P5M1 = 0x00;        P5M0 = 0x00;
  79.                
  80.         while(1)
  81.         {
  82.                 for(a = 0; a<4; a++)
  83.                 {
  84.                         P2 = NS_LED[a];
  85.                         P0 = WE_LED[a];
  86.                         b = time[a];
  87.                         delay_ms(b);
  88.                 }
  89.                
  90.         }
  91. }
复制代码





截图202403010959441960.jpg
截图202403011013523431.jpg
截图202403011014202808.jpg

用面包板搭建电路

用面包板搭建电路
永远相信美好的事情即将发生!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:528
  • 最近打卡:2025-05-09 08:05:09

109

主题

1923

回帖

5338

积分

论坛元老

积分
5338
发表于 2024-3-1 13:52:16 | 显示全部楼层
新思路,不错!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-05-08 07:33:49

9

主题

85

回帖

1670

积分

金牌会员

积分
1670
发表于 2024-3-3 22:04:09 | 显示全部楼层
V2版,更新4个方向,单次只有1个方向亮起绿灯,保证车辆安全。
更新的地方在于蓝色标注的部分。

演示视频如下:



  1. /*--------------------------------------------------------------------------------------
  2.         1个十字路口交通灯演示:
  3.         分为北、南、西、东4个方向,每个方向有红绿黄3个LED灯,绿灯亮7s后转黄灯亮2s,
  4.         每次只许1个方向变绿灯,工作顺序:
  5.         1.北绿-南红-西红-东红        延时7s        由[apoyl_aliyunvideo]83[/apoyl_aliyunvideo]南往北为绿灯,可左转,直行,右转
  6.         2.北黄-南红-西红-东红        延时2s  黄灯亮2s后转红灯
  7.         3.北红-南绿-西红-东红        延时7s        由北往南为绿灯,可左转,直行,右转
  8.         4.北红-南黄-西红-东红        延时2s  黄灯亮2s后转红灯
  9.         5.北红-南红-西绿-东红        延时7s        由东往西为绿灯,可左转,直行,右转
  10.         6.北红-南红-西黄-东红        延时2s        黄灯亮2s后转绿灯
  11.         7.北红-南红-西红-东绿        延时7s        由西往东为绿灯,可左转,真行,右转
  12.         8.北红-南红-西红-东黄        延时2s        黄灯亮2s后转到1依次循环。
  13.        
  14.         IO分配:每个IO串联1个4.7K给LED限流电阻
  15.         P2.7        P2.6        P2.5        P2.4        P2.3        P2.2        P2.1        P2.0
  16.         无                南-红        南-绿        南-黄        无                北-红        北-绿        北-黄
  17.        
  18.         P0.7        P0.6        P0.5        P0.4        P0.3        P0.2        P0.1        P0.0
  19.         无                东-红        东-绿        东-黄        无                西-红        西-绿        西-黄                       
  20.        
  21.         编写日期:2024年2月28日                版本:V01        开发者:dumon
  22.         版本更新记录:
  23.         2024-02-28 :        每个路口方向只亮1个绿灯,不会出现南北,东西2个绿灯同时亮起。
  24. --------------------------------------------------------------------------------------*/
  25. #include <STC32G.H>
  26. #include "comm/stc32_stc8_usb.h"
  27. #define MAIN_Fosc 24000000UL                // 定义1个主时钟为24MHz
  28. // 流水灯相关说明,P2.0~P2.7为共阳极连接,P4.5接三极管基极,为低电平时发射极与基极接通,
  29. // 电流饱合后,发射极到集电极接通,LED得到高电平,P2.0~P2.7输出低电平即可点灯。
  30. sbit ON_LED = P4^5;                // 点灯总开关,三极管是小电流控制大电流的开关
  31. sbit LED_1        = P2^0;                // 流水灯LED1
  32. sbit LED_2        = P2^1;                // 流水灯LED2
  33. sbit LED_3        = P2^2;                // 流水灯LED3
  34. sbit LED_4        = P2^3;                // 流水灯LED4
  35. sbit LED_5        = P2^4;                // 流水灯LED5
  36. sbit LED_6        = P2^5;                // 流水灯LED6
  37. sbit LED_7        = P2^6;                // 流水灯LED7
  38. sbit LED_8        = P2^7;                // 流水灯LED8
  39. // 数码管相关说明,P0.0~P0.7为数码管的8个段码,P1.0,P1.1,P1.3为3个位码,共阴极数码管
  40. // 位码要接低电平、段码接高电平,共阳极数码管位码要接高电平、段码接低电平
  41. sbit DIG_A        = P0^0;                // 数码管段码‘A’
  42. sbit DIG_B        = P0^1;                // 数码管段码‘B’
  43. sbit DIG_C        = P0^2;                // 数码管段码‘C’
  44. sbit DIG_D        = P0^3;                // 数码管段码‘D’
  45. sbit DIG_E        = P0^4;                // 数码管段码‘E’
  46. sbit DIG_F        = P0^5;                // 数码管段码‘F’
  47. sbit DIG_G        = P0^6;                // 数码管段码‘G’
  48. sbit DIG_P        = P0^7;                // 数码管段码‘dP’
  49. sbit SEG_1        = P1^0;                // 第1位数码管位码
  50. sbit SEG_2        = P1^1;                // 第2位数码管位码
  51. sbit SEG_3        = P1^3;                // 第3位数码管位码
  52. // 蜂鸣器参照STC32G实验箱V9.4增加,P5.4输出低电平接三极管基极,同流水灯控制原理,
  53. // 在蜂鸣器负责两端并联反接1个二极管,防止短路
  54. sbit BEEP        = P5^4;                // 蜂鸣器端口
  55. // 数组变量                                                          
  56. <font color="#0000ff">u8 NS_LED[8]  = {0xBD,0xBE,0xDB,0xEB,0xBB,0xBB,0xBB,0xBB};                // 南北方向红绿灯为1个数组
  57. u8 WE_LED[8]  = {0xBB,0xBB,0xBB,0xBB,0xBD,0xBE,0xDB,0xEB};                // 东西方向红绿灯为1个数组
  58. u16 time[8] =         {7000,2000,7000,2000,7000,2000,7000,2000};                // 延时</font>
  59. u16 a,b,c,d;                                                                // 循环计数变量       
  60.                                          
  61. void delay_ms(u16 ms)                                                // 自定义延时函数
  62. {
  63.         u16 i;
  64.         do{
  65.                 i = MAIN_Fosc/6000;
  66.                 while(--i);
  67.         } while(--ms);
  68. }       
  69. void main()
  70. {
  71.         WTST = 1;
  72.         // IO口模式配置
  73.         P0M1 = 0x00;        P0M0 = 0x00;
  74.         P1M1 = 0x00;        P1M0 = 0x00;
  75.         P2M1 = 0x00;        P2M0 = 0x00;
  76.         P3M1 = 0x00;        P3M0 = 0x00;
  77.         P4M1 = 0x00;        P4M0 = 0x00;
  78.         P5M1 = 0x00;        P5M0 = 0x00;       
  79.        
  80.         while(1)
  81.         {
  82.                 // 根据红绿灯运行时序,制作1个循环完成动作演示。
  83.                 for(a = 0; a<8; a++)
  84.                 {
  85.                         P2 = NS_LED[a];
  86.                         P0 = WE_LED[a];
  87.                         delay_ms(time[a]);
  88.                 }               
  89.         }
  90. }
复制代码



永远相信美好的事情即将发生!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-05-08 07:33:49

9

主题

85

回帖

1670

积分

金牌会员

积分
1670
发表于 2024-3-4 14:00:00 | 显示全部楼层
V3版,由绿灯转为黄灯时,黄灯为闪烁状况,黄灯闪烁后切为红灯。


注意,分别增加了4个自定义函数用来控制东、西、南、北的黄灯闪烁。何时执行则由在for循环里当a=奇数值判定执行。

请看具体语句内容。

void Northyellow_Blinker(u16 ms,u16 times) 这里定义了2个参数,ms为闪烁间隔,times为闪烁次数。通过调整这2个参数就可以控制黄灯闪烁频率和次数。定义4个不同函数则可以将东西南北4个黄灯设定不同的闪烁频率与次数,做到区别化。



那简单了,怎么让黄灯闪烁起来,不就是第6集里面最简单的点灯吗,先将黄灯的Pn.n口赋0值,延时ms后,再将Pn.n口赋1值,再延时ms,不就闪烁起来了。


这样是不是一步步接近现实生活中红绿灯的工作状态了。

  1. /*--------------------------------------------------------------------------------------
  2.         1个十字路口交通灯演示:
  3.         分为北、南、西、东4个方向,每个方向有红绿黄3个LED灯,绿灯亮7s后转黄灯亮2s,
  4.         每次只许1个方向变绿灯,让“黄灯闪烁起来”,工作顺序:
  5.         1.北绿-南红-西红-东红        延时7s        由南往北为绿灯,可左转,直行,右转
  6.         2.北黄-南红-西红-东红        延时2s  黄灯亮2s后转红灯
  7.         3.北红-南绿-西红-东红        延时7s        由北往南为绿灯,可左转,直行,右转
  8.         4.北红-南黄-西红-东红        延时2s  黄灯亮2s后转红灯
  9.         5.北红-南红-西绿-东红        延时7s        由东往西为绿灯,可左转,直行,右转
  10.         6.北红-南红-西黄-东红        延时2s        黄灯亮2s后转绿灯
  11.         7.北红-南红-西红-东绿        延时7s        由西往东为绿灯,可左转,直行,右转
  12.         8.北红-南红-西红-东黄        延时2s        黄灯亮2s后转到1依次循环。
  13.                                        
  14.         编写日期:2024年2月28日                版本:V01        开发者:dumon
  15.         IO分配:每个IO串联1个4.7K给LED限流电阻
  16.         P2.7        P2.6        P2.5        P2.4        P2.3        P2.2        P2.1        P2.0
  17.         无                南-红        南-绿        南-黄        无                北-红        北-绿        北-黄
  18.        
  19.         P0.7        P0.6        P0.5        P0.4        P0.3        P0.2        P0.1        P0.0
  20.         无                东-红        东-绿        东-黄        无                西-红        西-绿        西-黄                       
  21.        
  22.         编写日期:2024年2月28日                版本:V02        开发者:dumon
  23.         版本更新记录:
  24.         2024-02-28 :        每个路口方向只亮1个绿灯,不会出现南北,东西2个绿灯同时亮起。
  25.         2024-02-28 :        绿灯转黄灯,黄灯会闪烁后再切换为红灯。
  26. --------------------------------------------------------------------------------------*/
  27. #include <STC32G.H>
  28. #include "comm/stc32_stc8_usb.h"
  29. #define MAIN_Fosc 24000000UL                // 定义1个主时钟为24MHz
  30. // 流水灯相关说明,P2.0~P2.7为共阳极连接,P4.5接三极管基极,为低电平时发射极与基极接通,
  31. // 电流饱合后,发射极到集电极接通,LED得到高电平,P2.0~P2.7输出低电平即可点灯。
  32. sbit ON_LED = P4^5;                // 点灯总开关,三极管是小电流控制大电流的开关
  33. sbit LED_1        = P2^0;                // 流水灯LED1
  34. sbit LED_2        = P2^1;                // 流水灯LED2
  35. sbit LED_3        = P2^2;                // 流水灯LED3
  36. sbit LED_4        = P2^3;                // 流水灯LED4
  37. sbit LED_5        = P2^4;                // 流水灯LED5
  38. sbit LED_6        = P2^5;                // 流水灯LED6
  39. sbit LED_7        = P2^6;                // 流水灯LED7
  40. sbit LED_8        = P2^7;                // 流水灯LED8
  41. // 数码管相关说明,P0.0~P0.7为数码管的8个段码,P1.0,P1.1,P1.3为3个位码,共阴极数码管
  42. // 位码要接低电平、段码接高电平,共阳极数码管位码要接高电平、段码接低电平
  43. sbit DIG_A        = P0^0;                // 数码管段码‘A’
  44. sbit DIG_B        = P0^1;                // 数码管段码‘B’
  45. sbit DIG_C        = P0^2;                // 数码管段码‘C’
  46. sbit DIG_D        = P0^3;                // 数码管段码‘D’
  47. sbit DIG_E        = P0^4;                // 数码管段码‘E’
  48. sbit DIG_F        = P0^5;                // 数码管段码‘F’
  49. sbit DIG_G        = P0^6;                // 数码管段码‘G’
  50. sbit DIG_P        = P0^7;                // 数码管段码‘dP’
  51. sbit SEG_1        = P1^0;                // 第1位数码管位码
  52. sbit SEG_2        = P1^1;                // 第2位数码管位码
  53. sbit SEG_3        = P1^3;                // 第3位数码管位码
  54. // 蜂鸣器参照STC32G实验箱V9.4增加,P5.4输出低电平接三极管基极,同流水灯控制原理,
  55. // 在蜂鸣器负责两端并联反接1个二极管,防止短路
  56. sbit BEEP        = P5^4;                // 蜂鸣器端口
  57. // 数组变量                                                          
  58. u8 NS_LED[8]  = {0xBD,0xBE,0xDB,0xEB,0xBB,0xBB,0xBB,0xBB};                // 南北方向红绿灯为1个数组
  59. u8 WE_LED[8]  = {0xBB,0xBB,0xBB,0xBB,0xBD,0xBE,0xDB,0xEB};                // 东西方向红绿灯为1个数组
  60. u16 time[8] =         {10000,20,10000,20,10000,20,10000,20};                // 延时,time[1],time[3],time[5],time[7]的时间缩短,主要由闪烁函数来执行。
  61. u16 a,b,c,d;                                                                // 循环计数变量       
  62.                                          
  63. void delay_ms(u16 ms)                                                // 自定义延时函数
  64. {
  65.         u16 i;
  66.         do{
  67.                 i = MAIN_Fosc/6000;
  68.                 while(--i);
  69.         } while(--ms);
  70. }
  71. void Northyellow_Blinker(u16 ms,u16 times)  // 定义北向黄灯闪烁频率与次数
  72. {
  73.         for(c=0; c<times; c++)
  74.         {
  75.                 P2 = 0xBE;
  76.                 delay_ms(ms);
  77.                 P2 = 0xBF;
  78.                 delay_ms(ms);
  79.         }
  80. }
  81. void Southyellow_Blinker(u16 ms,u16 times) // 定义南向黄灯闪烁频率与次数
  82. {
  83.         for(c=0; c<times; c++)
  84.         {
  85.                 P2 = 0xEB;
  86.                 delay_ms(ms);
  87.                 P2 = 0xFB;
  88.                 delay_ms(ms);
  89.         }
  90. }
  91. void Westyellow_Blinker(u16 ms,u16 times) // 定义西向黄灯闪烁频率与次数
  92. {
  93.         for(c=0; c<times; c++)
  94.         {
  95.                 P0 = 0xBE;
  96.                 delay_ms(ms);
  97.                 P0 = 0xBF;
  98.                 delay_ms(ms);
  99.         }
  100. }
  101. void Eastyellow_Blinker(u16 ms,u16 times) // 定义东向黄灯闪烁频率与次数
  102. {
  103.         for(c=0; c<times; c++)
  104.         {
  105.                 P0 = 0xEB;
  106.                 delay_ms(ms);
  107.                 P0 = 0xFB;
  108.                 delay_ms(ms);
  109.         }
  110. }
  111. void main()
  112. {
  113.         WTST = 1;
  114.         // IO口模式配置
  115.         P0M1 = 0x00;        P0M0 = 0x00;
  116.         P1M1 = 0x00;        P1M0 = 0x00;
  117.         P2M1 = 0x00;        P2M0 = 0x00;
  118.         P3M1 = 0x00;        P3M0 = 0x00;
  119.         P4M1 = 0x00;        P4M0 = 0x00;
  120.         P5M1 = 0x00;        P5M0 = 0x00;       
  121.        
  122.         while(1)
  123.         {
  124.                 // 根据红绿灯运行时序,制作1个循环完成动作演示。
  125.                 for(a = 0; a<8; a++)
  126.                 {
  127.                         P2 = NS_LED[a];
  128.                         P0 = WE_LED[a];       
  129.                         delay_ms(time[a]);  
  130.                         if(a == 1)  // 执行北向黄灯闪烁函数
  131.                         {
  132.                                 Northyellow_Blinker(500,5);
  133.                         }
  134.                         if(a == 3)  // 执行南向黄灯闪烁函数
  135.                         {
  136.                                 Southyellow_Blinker(500,5);
  137.                         }
  138.                         if(a == 5)  // 执行西向黄灯闪烁函数
  139.                         {
  140.                                 Westyellow_Blinker(500,5);
  141.                         }
  142.                         if(a == 7)  // 执行东向黄灯闪烁函数
  143.                         {
  144.                                 Eastyellow_Blinker(500,5);
  145.                         }
  146.                 }               
  147.         }
  148. }
复制代码


永远相信美好的事情即将发生!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-05-08 07:33:49

9

主题

85

回帖

1670

积分

金牌会员

积分
1670
发表于 2024-3-4 14:20:07 | 显示全部楼层
补充下图表说明:

蓝底白字填充部分是黄灯状态,想让哪个黄灯闪烁就将其状态由0改为1并循环几次就能达到闪烁显示效果。

参照图片,比照下面语句就能理解了。

void Northyellow_Blinker(u16 ms,u16 times)        // 定义北向黄灯闪烁频率与次数
{
        for(c=0; c<times; c++)
        {
                P2 = 0xBE;
                delay_ms(ms);
                P2 = 0xBF;
                delay_ms(ms);
        }
}

注意看蓝底白字填充和粗黑框部分,这是黄灯闪烁

注意看蓝底白字填充和粗黑框部分,这是黄灯闪烁
永远相信美好的事情即将发生!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:249
  • 最近打卡:2025-05-08 10:30:49

3

主题

155

回帖

551

积分

高级会员

积分
551
发表于 2024-3-4 20:30:09 | 显示全部楼层
学习了
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-05-08 07:33:49

9

主题

85

回帖

1670

积分

金牌会员

积分
1670
发表于 2024-3-5 10:12:48 | 显示全部楼层
V4 版,增加黄灯与红灯一起闪烁,比如当前北向是黄灯,南向是红灯,则让北向黄灯与南向红灯一起闪烁,用于提示下面哪个路口是绿灯。并且闪烁的时候增加蜂鸣器短响。

也许你跟我用的开发板不一样,分配来执行的P口也不一样,所以不要完全照搬我的程序,但是可以参照我的思路。

STC8H,STC32F,STC32G可以把工程复制过来,确认好用的头文件就可以。





  1. /*--------------------------------------------------------------------------------------
  2.         1个十字路口交通灯演示:
  3.         分为北、南、西、东4个方向,每个方向有红绿黄3个LED灯,绿灯亮7s后转黄灯亮2s,
  4.         每次只许1个方向变绿灯,让“黄灯闪烁起来”,工作顺序:
  5.         1.北绿-南红-西红-东红        延时7s        由南往北为绿灯,可左转,直行,右转
  6.         2.北黄-南红-西红-东红        延时2s  黄灯亮2s后转红灯
  7.         3.北红-南绿-西红-东红        延时7s        由北往南为绿灯,可左转,直行,右转
  8.         4.北红-南黄-西红-东红        延时2s  黄灯亮2s后转红灯
  9.         5.北红-南红-西绿-东红        延时7s        由东往西为绿灯,可左转,直行,右转
  10.         6.北红-南红-西黄-东红        延时2s        黄灯亮2s后转绿灯
  11.         7.北红-南红-西红-东绿        延时7s        由西往东为绿灯,可左转,直行,右转
  12.         8.北红-南红-西红-东黄        延时2s        黄灯亮2s后转到1依次循环。
  13.        
  14.         IO分配:每个IO串联1个4.7K给LED限流电阻
  15.         P2.7        P2.6        P2.5        P2.4        P2.3        P2.2        P2.1        P2.0
  16.         无                南-红        南-绿        南-黄        无                北-红        北-绿        北-黄
  17.        
  18.         P0.7        P0.6        P0.5        P0.4        P0.3        P0.2        P0.1        P0.0
  19.         无                东-红        东-绿        东-黄        无                西-红        西-绿        西-黄                       
  20.        
  21.         编写日期:2024年2月28日                版本:V03        开发者:dumon
  22.         版本更新记录:
  23.         2024-02-28 :        每个路口方向只亮1个绿灯,不会出现南北,东西2个绿灯同时亮起。
  24.         2024-02-28 :        绿灯转黄灯,黄灯会闪烁后再切换为黄灯。
  25.         2024-02-28 :        增加黄灯与红灯一起闪烁,北黄与南红一起闪,南黄与西红一起闪,西黄与东红一起闪
  26.                                         北红与东黄一起闪。或者理解为黄灯与下个要切换绿灯的灯一起闪,并且闪烁的时候增加蜂鸣器短响。
  27. --------------------------------------------------------------------------------------*/
  28. #include <STC32G.H>
  29. #include "comm/stc32_stc8_usb.h"
  30. #define MAIN_Fosc 24000000UL                // 定义1个主时钟为24MHz
  31. // 流水灯相关说明,P2.0~P2.7为共阳极连接,P4.5接三极管基极,为低电平时发射极与基极接通,
  32. // 电流饱合后,发射极到集电极接通,LED得到高电平,P2.0~P2.7输出低电平即可点灯。
  33. sbit ON_LED = P4^5;                // 点灯总开关,三极管是小电流控制大电流的开关
  34. sbit LED_1        = P2^0;                // 流水灯LED1
  35. sbit LED_2        = P2^1;                // 流水灯LED2
  36. sbit LED_3        = P2^2;                // 流水灯LED3
  37. sbit LED_4        = P2^3;                // 流水灯LED4
  38. sbit LED_5        = P2^4;                // 流水灯LED5
  39. sbit LED_6        = P2^5;                // 流水灯LED6
  40. sbit LED_7        = P2^6;                // 流水灯LED7
  41. sbit LED_8        = P2^7;                // 流水灯LED8
  42. // 数码管相关说明,P0.0~P0.7为数码管的8个段码,P1.0,P1.1,P1.3为3个位码,共阴极数码管
  43. // 位码要接低电平、段码接高电平,共阳极数码管位码要接高电平、段码接低电平
  44. sbit DIG_A        = P0^0;                // 数码管段码‘A’
  45. sbit DIG_B        = P0^1;                // 数码管段码‘B’
  46. sbit DIG_C        = P0^2;                // 数码管段码‘C’
  47. sbit DIG_D        = P0^3;                // 数码管段码‘D’
  48. sbit DIG_E        = P0^4;                // 数码管段码‘E’
  49. sbit DIG_F        = P0^5;                // 数码管段码‘F’
  50. sbit DIG_G        = P0^6;                // 数码管段码‘G’
  51. sbit DIG_P        = P0^7;                // 数码管段码‘dP’
  52. sbit SEG_1        = P1^0;                // 第1位数码管位码
  53. sbit SEG_2        = P1^1;                // 第2位数码管位码
  54. sbit SEG_3        = P1^3;                // 第3位数码管位码
  55. // 蜂鸣器参照STC32G实验箱V9.4增加,P5.4输出低电平接三极管基极,同流水灯控制原理,
  56. // 在蜂鸣器负责两端并联反接1个二极管,防止短路
  57. sbit BEEP        = P5^4;                // 蜂鸣器端口
  58. // 数组变量                                                          
  59. u8 NS_LED[8]  = {0xBD,0xBE,0xDB,0xEB,0xBB,0xBB,0xBB,0xBB};                // 南北方向红绿灯为1个数组
  60. u8 WE_LED[8]  = {0xBB,0xBB,0xBB,0xBB,0xBD,0xBE,0xDB,0xEB};                // 东西方向红绿灯为1个数组
  61. u16 time[8] =         {10000,20,10000,20,10000,20,10000,20};                // 延时
  62. u16 a,b,c,d;                                                                // 循环计数变量       
  63.                                          
  64. void delay_ms(u16 ms)                                                // 自定义延时函数
  65. {
  66.         u16 i;
  67.         do{
  68.                 i = MAIN_Fosc/6000;
  69.                 while(--i);
  70.         } while(--ms);
  71. }
  72. void Northyellow_Blinker(u16 ms,u16 times)        // 北黄和南红一起闪
  73. {
  74.         for(c=0; c<times; c++)
  75.         {
  76.                 P2 = 0xBE;
  77.                 delay_ms(ms);
  78.                 BEEP = 0;
  79.                 delay_ms(3);
  80.                 BEEP = 1;
  81.                 delay_ms(3);
  82.                 P2 = 0xFF;
  83.                 delay_ms(ms);
  84.                
  85.         }
  86. }
  87. void Southyellow_Blinker(u16 ms,u16 times)        // 南黄和西红一起闪
  88. {
  89.         for(c=0; c<times; c++)
  90.         {
  91.                 P2 = 0xEB;
  92.                 P0 = 0xBB;
  93.                 delay_ms(ms);
  94.                 BEEP = 0;
  95.                 delay_ms(3);
  96.                 BEEP = 1;
  97.                 delay_ms(3);
  98.                 P2 = 0xFB;
  99.                 P0 = 0xBF;
  100.                 delay_ms(ms);
  101.                
  102.         }
  103. }
  104. void Westyellow_Blinker(u16 ms,u16 times)        // 西黄和东红一起闪
  105. {
  106.         for(c=0; c<times; c++)
  107.         {
  108.                 P0 = 0xBE;
  109.                 delay_ms(ms);
  110.                 BEEP = 0;
  111.                 delay_ms(3);
  112.                 BEEP = 1;
  113.                 delay_ms(3);
  114.                 P0 = 0xFF;
  115.                 delay_ms(ms);
  116.                
  117.         }
  118. }
  119. void Eastyellow_Blinker(u16 ms,u16 times)        //东黄和北红一起闪
  120. {
  121.         for(c=0; c<times; c++)
  122.         {
  123.                 P0 = 0xEB;
  124.                 P2 = 0xBB;
  125.                 delay_ms(ms);
  126.                 BEEP = 0;
  127.                 delay_ms(3);
  128.                 BEEP = 1;
  129.                 delay_ms(3);
  130.                 P0 = 0xFB;
  131.                 P2 = 0xBF;
  132.                 delay_ms(ms);
  133.                
  134.         }
  135. }
  136. void main()
  137. {
  138.         WTST = 1;
  139.         // IO口模式配置
  140.         P0M1 = 0x00;        P0M0 = 0x00;
  141.         P1M1 = 0x00;        P1M0 = 0x00;
  142.         P2M1 = 0x00;        P2M0 = 0x00;
  143.         P3M1 = 0x00;        P3M0 = 0x00;
  144.         P4M1 = 0x00;        P4M0 = 0x00;
  145.         P5M1 = 0x00;        P5M0 = 0x00;       
  146.        
  147.         while(1)
  148.         {
  149.                 // 根据红绿灯运行时序,制作1个循环完成动作演示。
  150.                 for(a = 0; a<8; a++)
  151.                 {
  152.                         P2 = NS_LED[a];
  153.                         P0 = WE_LED[a];       
  154.                         delay_ms(time[a]);                       
  155.                         if(a == 1)
  156.                         {
  157.                                 Northyellow_Blinker(500,5);
  158.                         }
  159.                         if(a == 3)
  160.                         {
  161.                                 Southyellow_Blinker(500,5);
  162.                         }
  163.                         if(a == 5)
  164.                         {
  165.                                 Westyellow_Blinker(500,5);
  166.                         }
  167.                         if(a == 7)
  168.                         {
  169.                                 Eastyellow_Blinker(500,5);
  170.                         }
  171.                 }               
  172.         }
  173. }
复制代码




IMAG0102.jpg
IMAG0103.jpg
永远相信美好的事情即将发生!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 09:26 , Processed in 1.220637 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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