找回密码
 立即注册
楼主: dumon

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:450
  • 最近打卡:2025-05-09 09:31:28

9

主题

85

回帖

1674

积分

金牌会员

积分
1674
发表于 2024-3-6 14:33:20 | 显示全部楼层
终章————
将面包板电路优化焊接到洞洞板上做成1个成品,增加数码管用于黄灯闪烁计时,同时伴有短促蜂鸣声,声光提醒。

这个交通灯案例集成了冲哥视频5~10集所用的部分知识,主要是加深自己对单片机IO口的调用(前面主要是把IO口设置为准双向口,准双向口是即可以输出电流,也可以灌入电流,简单理解就是即可以读取电平(返回值0或1),也可以输出电平(5v或0v))。把这些知识点汇总来用,在做这个案例的同时可以固定加深自己所学。多动手才能学以致用。
大家不妨在学习视频的同时自己找个简单案例来做一下。
在这里推荐一下论坛: https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4830   一灯大师这个文章内容,如果大家想用单片机做些简单驱动电路,比如说用单片机来模拟PLC的功能,做2个气缸的简单动作,完成将物品由A点搬运到B点这个过程,正常来说我们单片机是不能直接在负载端驱动气缸电磁阀的24V,并且输出大电流的。而我们单片机是5V电源,电流才几十mA,所以我们需要利用光耦和三极管和继电器才能完成电磁阀的24V驱动,达到以小电流驱动大电流,5V驱动24V的目的,这是一篇很好的文章,告诉我们IO口不同的电源规格时硬件应该怎么搭配。如果想自己用单片机开发不一样的功能的可以参照下这篇文章。


最后附上用数组制作交通灯的最终版本程序,提醒大家,不要完全复制我的程序,学习我的思路。我的程序是根据我自做开发板来分配IO的,你手上的追风剑、或屠龙刀也许不一样,自己重新分配一下,当然程序无止境,还有更多功能可待开发,仅供参考!




  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.         P1.7        P1.6        P1.5        P1.4        P1.3        P1.2        P1.1        P1.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 Number[11] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};        // 数码管数字显示
  60. u8 NS_LED[8]  = {0xBD,0xBE,0xDB,0xEB,0xBB,0xBB,0xBB,0xBB};                // 南北方向红绿灯为1个数组
  61. u8 WE_LED[8]  = {0x6E,0x6E,0x6E,0x6E,0x76,0x7C,0xAE,0xCE};                // 东西方向红绿灯为1个数组
  62. u16 time[8] =         {10000,20,10000,20,10000,20,10000,20};                // 延时
  63. u16 a,b,c,d;                                                                // 循环计数变量       
  64.                                          
  65. void delay_ms(u16 ms)                                                // 自定义延时函数
  66. {
  67.         u16 i;
  68.         do{
  69.                 i = MAIN_Fosc/6000;
  70.                 while(--i);
  71.         } while(--ms);
  72. }
  73. void Northyellow_Blinker(u16 ms,u16 times)        // 北黄和南红一起闪
  74. {
  75.         u16 time_display = times;                // 数字计时
  76.         for(c=0; c<times; c++)
  77.         {
  78.                 BEEP = 0;
  79.                 delay_ms(15);
  80.                 BEEP = 1;
  81.                 P2 = 0xBE;
  82.                 P0 = Number[time_display];        // 数码管显示数字
  83.                 delay_ms(ms);               
  84.                 P2 = 0xFF;                               
  85.                 delay_ms(ms);
  86.                 time_display--;                                // 自减1               
  87.         }
  88.         P0 = Number[10];        //        关闭数码管显示
  89. }
  90. void Southyellow_Blinker(u16 ms,u16 times)        // 南黄和西红一起闪
  91. {
  92.         u16 time_display = times;
  93.         for(c=0; c<times; c++)
  94.         {
  95.                
  96.                 BEEP = 0;
  97.                 delay_ms(15);
  98.                 BEEP = 1;
  99.                 P2 = 0xEB;
  100.                 P1 = 0x6E;
  101.                 P0 = Number[time_display];
  102.                 delay_ms(ms);                               
  103.                 P2 = 0xFB;
  104.                 P1 = 0x7F;
  105.                 delay_ms(ms);
  106.                 time_display--;
  107.                
  108.         }
  109.         P0 =Number[10];
  110. }
  111. void Westyellow_Blinker(u16 ms,u16 times)        // 西黄和东红一起闪
  112. {
  113.         u16 time_display = times;
  114.         for(c=0; c<times; c++)
  115.         {
  116.                 BEEP = 0;
  117.                 delay_ms(15);
  118.                 BEEP = 1;
  119.                 P1 = 0x7C;
  120.                 P0 = Number[time_display];
  121.                 delay_ms(ms);                       
  122.                 P1 = 0xFE;
  123.                 delay_ms(ms);
  124.                 time_display--;
  125.                
  126.         }
  127.         P0 = Number[10];
  128. }
  129. void Eastyellow_Blinker(u16 ms,u16 times)        //东黄和北红一起闪
  130. {
  131.         u16 time_display = times;
  132.         for(c=0; c<times; c++)
  133.         {
  134.                 BEEP = 0;
  135.                 delay_ms(15);
  136.                 BEEP = 1;
  137.                 P1 = 0xCE;
  138.                 P2 = 0xBB;
  139.                 P0 = Number[time_display];
  140.                 delay_ms(ms);               
  141.                 P1 = 0xEE;
  142.                 P2 = 0xBF;
  143.                 delay_ms(ms);
  144.                 time_display--;               
  145.         }
  146.         P0 = Number[10];
  147. }
  148. void main()
  149. {
  150.         WTST = 1;
  151.         // IO口模式配置
  152.         P0M1 = 0x00;        P0M0 = 0x00;
  153.         P1M1 = 0x00;        P1M0 = 0x00;
  154.         P2M1 = 0x00;        P2M0 = 0x00;
  155.         P3M1 = 0x00;        P3M0 = 0x00;
  156.         P4M1 = 0x00;        P4M0 = 0x00;
  157.         P5M1 = 0x00;        P5M0 = 0x00;       
  158.         P0 = 0x00;
  159.        
  160.         while(1)
  161.         {
  162.                 // 根据红绿灯运行时序,制作1个循环完成动作演示。
  163.                 for(a = 0; a<8; a++)
  164.                 {
  165.                         P2 = NS_LED[a];
  166.                         P1 = WE_LED[a];       
  167.                         delay_ms(time[a]);                       
  168.                         if(a == 1)
  169.                         {
  170.                                 Northyellow_Blinker(500,5);
  171.                         }
  172.                         if(a == 3)
  173.                         {
  174.                                 Southyellow_Blinker(500,5);
  175.                         }
  176.                         if(a == 5)
  177.                         {
  178.                                 Westyellow_Blinker(500,5);
  179.                         }
  180.                         if(a == 7)
  181.                         {
  182.                                 Eastyellow_Blinker(500,5);
  183.                         }
  184.                 }               
  185.         }
  186. }
复制代码



自制开发板实物图片,可完成按键点灯,流水灯,数码管,蜂鸣器等多个实验,采用硬件USB下载,实乃学习单片 ...

自制开发板实物图片,可完成按键点灯,流水灯,数码管,蜂鸣器等多个实验,采用硬件USB下载,实乃学习单片 ...

红绿灯模块板,12个LED为共阳极接VCC,每个LED串接5.1K限流电阻P口输出低电口点亮对应LED, ...

红绿灯模块板,12个LED为共阳极接VCC,每个LED串接5.1K限流电阻P口输出低电口点亮对应LED, ...

自制开发板电路图

自制开发板电路图

交通灯.xlsx

30.09 KB, 下载次数: 86

模拟红绿灯运行时序逻辑

单片机自制开发板STC32G.dwg

95.63 KB, 下载次数: 84

开发板CAD图档

红绿灯终章程序.zip

81.96 KB, 下载次数: 94

程序源代码

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

使用道具 举报 送花

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

34

主题

459

回帖

2297

积分

金牌会员

积分
2297
发表于 2024-3-13 10:27:24 | 显示全部楼层
回复

使用道具 举报 送花

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

4

主题

512

回帖

2017

积分

金牌会员

积分
2017
发表于 2024-4-7 09:18:22 | 显示全部楼层
没左转呀
回复

使用道具 举报 送花

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

9

主题

85

回帖

1674

积分

金牌会员

积分
1674
发表于 2024-4-8 08:35:58 | 显示全部楼层

受限于IO口的数量,没有做单独的左转与直行区分。
程序里是保障4个方向只有1个方向是绿灯,绿灯亮时可直行可左转。
IO口多的可以尝试下把左转与直行做下区分。
永远相信美好的事情即将发生!
回复 支持 反对

使用道具 举报 送花

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

4

主题

512

回帖

2017

积分

金牌会员

积分
2017
发表于 2024-4-9 08:30:18 | 显示全部楼层
dum*** 发表于 2024-4-8 08:35
受限于IO口的数量,没有做单独的左转与直行区分。
程序里是保障4个方向只有1个方向是绿灯,绿灯亮时可直 ...

现实中,应该对向是绿灯呀
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:288
  • 最近打卡:2025-05-09 07:30:44

2

主题

52

回帖

914

积分

高级会员

积分
914
发表于 2024-7-31 11:05:33 | 显示全部楼层
交通灯这么多的版本,真的是用心在不断改进~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2025-04-03 11:26:38

4

主题

138

回帖

631

积分

高级会员

积分
631
发表于 2024-8-14 17:00:23 | 显示全部楼层
厉害,非常的棒!学习了!!!!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:257
  • 最近打卡:2025-05-02 09:32:20

5

主题

51

回帖

599

积分

高级会员

积分
599
发表于 2024-9-21 12:06:26 | 显示全部楼层
666,学到了『交通灯』的原理,强👍
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-08 11:47:57

6

主题

220

回帖

368

积分

中级会员

积分
368
发表于 2024-9-22 09:54:36 | 显示全部楼层
值得学习,让我的爬行稍快点!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-9 09:41 , Processed in 0.605979 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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