找回密码
 立即注册
查看: 443|回复: 14

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

[复制链接]
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 108 天

    [LV.6]常住居民II

    5

    主题

    49

    回帖

    591

    积分

    高级会员

    积分
    591
    发表于 2024-2-29 23:05:53 | 显示全部楼层 |阅读模式

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

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



    交通灯洞洞板

    交通灯洞洞板

    自制开发板

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

    使用道具 举报

  • TA的每日心情
    无聊
    4 小时前
  • 签到天数: 134 天

    [LV.7]常住居民III

    17

    主题

    528

    回帖

    1213

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 14:57
  • 签到天数: 54 天

    [LV.5]常住居民I

    2

    主题

    106

    回帖

    464

    积分

    中级会员

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

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 108 天

    [LV.6]常住居民II

    5

    主题

    49

    回帖

    591

    积分

    高级会员

    积分
    591
     楼主| 发表于 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

    用面包板搭建电路

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

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 155 天

    [LV.7]常住居民III

    67

    主题

    835

    回帖

    2766

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 108 天

    [LV.6]常住居民II

    5

    主题

    49

    回帖

    591

    积分

    高级会员

    积分
    591
     楼主| 发表于 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. }
    复制代码



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

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 108 天

    [LV.6]常住居民II

    5

    主题

    49

    回帖

    591

    积分

    高级会员

    积分
    591
     楼主| 发表于 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. }
    复制代码


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

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 108 天

    [LV.6]常住居民II

    5

    主题

    49

    回帖

    591

    积分

    高级会员

    积分
    591
     楼主| 发表于 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);
            }
    }

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 12:13
  • 签到天数: 51 天

    [LV.5]常住居民I

    2

    主题

    148

    回帖

    191

    积分

    注册会员

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

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 108 天

    [LV.6]常住居民II

    5

    主题

    49

    回帖

    591

    积分

    高级会员

    积分
    591
     楼主| 发表于 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, 2024-4-30 12:27 , Processed in 0.982121 second(s), 72 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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