终章————
将面包板电路优化焊接到洞洞板上做成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个十字路口交通灯演示:
- 分为北、南、西、东4个方向,每个方向有红绿黄3个LED灯,绿灯亮7s后转黄灯亮2s,
- 每次只许1个方向变绿灯,让“黄灯闪烁起来”,工作顺序:
- 1.北绿-南红-西红-东红 延时7s 由南往北为绿灯,可左转,直行,右转
- 2.北黄-南红-西红-东红 延时2s 黄灯亮2s后转红灯
- 3.北红-南绿-西红-东红 延时7s 由北往南为绿灯,可左转,直行,右转
- 4.北红-南黄-西红-东红 延时2s 黄灯亮2s后转红灯
- 5.北红-南红-西绿-东红 延时7s 由东往西为绿灯,可左转,直行,右转
- 6.北红-南红-西黄-东红 延时2s 黄灯亮2s后转绿灯
- 7.北红-南红-西红-东绿 延时7s 由西往东为绿灯,可左转,直行,右转
- 8.北红-南红-西红-东黄 延时2s 黄灯亮2s后转到1依次循环。
-
- IO分配:每个IO串联1个4.7K给LED限流电阻
- P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
- 无 南-红 南-绿 南-黄 无 北-红 北-绿 北-黄
-
- P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
- 东-红 东-绿 东-黄 西-红 西-绿 无 西-黄 数码管
-
- 编写日期:2024年2月28日 版本:V03 开发者:dumon
- 版本更新记录:
- 2024-02-28 : 每个路口方向只亮1个绿灯,不会出现南北,东西2个绿灯同时亮起。
- 2024-02-28 : 绿灯转黄灯,黄灯会闪烁后再切换为黄灯。
- 2024-02-28 : 增加黄灯与红灯一起闪烁,北黄与南红一起闪,南黄与西红一起闪,西黄与东红一起闪
- 北红与东黄一起闪。或者理解为黄灯与下个要切换绿灯的灯一起闪,并且闪烁的时候增加蜂鸣器短响。
-
- --------------------------------------------------------------------------------------*/
-
- #include <STC32G.H>
- #include "comm/stc32_stc8_usb.h"
-
- #define MAIN_Fosc 24000000UL // 定义1个主时钟为24MHz
-
- // 流水灯相关说明,P2.0~P2.7为共阳极连接,P4.5接三极管基极,为低电平时发射极与基极接通,
- // 电流饱合后,发射极到集电极接通,LED得到高电平,P2.0~P2.7输出低电平即可点灯。
- sbit ON_LED = P4^5; // 点灯总开关,三极管是小电流控制大电流的开关
- sbit LED_1 = P2^0; // 流水灯LED1
- sbit LED_2 = P2^1; // 流水灯LED2
- sbit LED_3 = P2^2; // 流水灯LED3
- sbit LED_4 = P2^3; // 流水灯LED4
- sbit LED_5 = P2^4; // 流水灯LED5
- sbit LED_6 = P2^5; // 流水灯LED6
- sbit LED_7 = P2^6; // 流水灯LED7
- sbit LED_8 = P2^7; // 流水灯LED8
-
- // 数码管相关说明,P0.0~P0.7为数码管的8个段码,P1.0,P1.1,P1.3为3个位码,共阴极数码管
- // 位码要接低电平、段码接高电平,共阳极数码管位码要接高电平、段码接低电平
- sbit DIG_A = P0^0; // 数码管段码‘A’
- sbit DIG_B = P0^1; // 数码管段码‘B’
- sbit DIG_C = P0^2; // 数码管段码‘C’
- sbit DIG_D = P0^3; // 数码管段码‘D’
- sbit DIG_E = P0^4; // 数码管段码‘E’
- sbit DIG_F = P0^5; // 数码管段码‘F’
- sbit DIG_G = P0^6; // 数码管段码‘G’
- sbit DIG_P = P0^7; // 数码管段码‘dP’
-
- sbit SEG_1 = P1^0; // 第1位数码管位码
- sbit SEG_2 = P1^1; // 第2位数码管位码
- sbit SEG_3 = P1^3; // 第3位数码管位码
-
- // 蜂鸣器参照STC32G实验箱V9.4增加,P5.4输出低电平接三极管基极,同流水灯控制原理,
- // 在蜂鸣器负责两端并联反接1个二极管,防止短路
- sbit BEEP = P5^4; // 蜂鸣器端口
-
- // 数组变量
- u8 Number[11] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; // 数码管数字显示
- u8 NS_LED[8] = {0xBD,0xBE,0xDB,0xEB,0xBB,0xBB,0xBB,0xBB}; // 南北方向红绿灯为1个数组
- u8 WE_LED[8] = {0x6E,0x6E,0x6E,0x6E,0x76,0x7C,0xAE,0xCE}; // 东西方向红绿灯为1个数组
- u16 time[8] = {10000,20,10000,20,10000,20,10000,20}; // 延时
-
- u16 a,b,c,d; // 循环计数变量
-
- void delay_ms(u16 ms) // 自定义延时函数
- {
- u16 i;
- do{
- i = MAIN_Fosc/6000;
- while(--i);
- } while(--ms);
- }
-
- void Northyellow_Blinker(u16 ms,u16 times) // 北黄和南红一起闪
- {
- u16 time_display = times; // 数字计时
- for(c=0; c<times; c++)
- {
- BEEP = 0;
- delay_ms(15);
- BEEP = 1;
- P2 = 0xBE;
- P0 = Number[time_display]; // 数码管显示数字
- delay_ms(ms);
- P2 = 0xFF;
- delay_ms(ms);
- time_display--; // 自减1
- }
- P0 = Number[10]; // 关闭数码管显示
- }
-
- void Southyellow_Blinker(u16 ms,u16 times) // 南黄和西红一起闪
- {
- u16 time_display = times;
- for(c=0; c<times; c++)
- {
-
- BEEP = 0;
- delay_ms(15);
- BEEP = 1;
- P2 = 0xEB;
- P1 = 0x6E;
- P0 = Number[time_display];
- delay_ms(ms);
- P2 = 0xFB;
- P1 = 0x7F;
- delay_ms(ms);
- time_display--;
-
- }
- P0 =Number[10];
- }
-
- void Westyellow_Blinker(u16 ms,u16 times) // 西黄和东红一起闪
- {
- u16 time_display = times;
- for(c=0; c<times; c++)
- {
- BEEP = 0;
- delay_ms(15);
- BEEP = 1;
- P1 = 0x7C;
- P0 = Number[time_display];
- delay_ms(ms);
- P1 = 0xFE;
- delay_ms(ms);
- time_display--;
-
- }
- P0 = Number[10];
- }
-
- void Eastyellow_Blinker(u16 ms,u16 times) //东黄和北红一起闪
- {
- u16 time_display = times;
- for(c=0; c<times; c++)
- {
- BEEP = 0;
- delay_ms(15);
- BEEP = 1;
- P1 = 0xCE;
- P2 = 0xBB;
- P0 = Number[time_display];
- delay_ms(ms);
- P1 = 0xEE;
- P2 = 0xBF;
- delay_ms(ms);
- time_display--;
- }
- P0 = Number[10];
- }
-
- void main()
- {
- WTST = 1;
- // IO口模式配置
- P0M1 = 0x00; P0M0 = 0x00;
- P1M1 = 0x00; P1M0 = 0x00;
- P2M1 = 0x00; P2M0 = 0x00;
- P3M1 = 0x00; P3M0 = 0x00;
- P4M1 = 0x00; P4M0 = 0x00;
- P5M1 = 0x00; P5M0 = 0x00;
- P0 = 0x00;
-
- while(1)
- {
- // 根据红绿灯运行时序,制作1个循环完成动作演示。
- for(a = 0; a<8; a++)
- {
- P2 = NS_LED[a];
- P1 = WE_LED[a];
- delay_ms(time[a]);
- if(a == 1)
- {
- Northyellow_Blinker(500,5);
- }
- if(a == 3)
- {
- Southyellow_Blinker(500,5);
- }
- if(a == 5)
- {
- Westyellow_Blinker(500,5);
- }
- if(a == 7)
- {
- Eastyellow_Blinker(500,5);
- }
-
-
- }
- }
- }
复制代码
|