建设部网站园林绿化资质标准,织梦网站优化教程,app订制开发公司,西安百度爱采购推广在嵌入式系统或微控制器项目中#xff0c;LED流水灯是一种常见的实验项目#xff0c;它不仅能够展示基本的GPIO#xff08;通用输入输出#xff09;控制#xff0c;还能通过不同的模式增加趣味性。本文将探讨四种不同的流水灯效果#xff0c;并通过代码示例展示如何实现它…在嵌入式系统或微控制器项目中LED流水灯是一种常见的实验项目它不仅能够展示基本的GPIO通用输入输出控制还能通过不同的模式增加趣味性。本文将探讨四种不同的流水灯效果并通过代码示例展示如何实现它们。
效果1依次亮循环
这种效果是最基本的流水灯效果LED灯按照顺序依次亮起当最后一个LED灯亮起后又从头开始循环。这种效果可以通过一个简单的for循环实现循环中依次设置每个LED灯为高电平亮然后延时一段时间再设置为低电平灭。随后下一个LED灯被点亮如此循环。
代码实现
#include Config.h
#include STC8G_H_GPIO.h
#include STC8G_H_Delay.h// 每个LED灯 所代表的引脚
#define LED1 P27
#define LED2 P26
#define LED3 P15
#define LED4 P14
#define LED5 P23
#define LED6 P22
#define LED7 P21
#define LED8 P20
#define LED_SW P45// GPIO配置 输入/输出
void GPIO_config(void) {// 总开关 P4 端口下的5号引脚 推挽模式GPIO_InitTypeDef GPIO_InitStructure; //结构定义GPIO_InitStructure.Pin GPIO_Pin_5; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P4, GPIO_InitStructure);//初始化// P1端口下的 4、5号引脚 准双向口模式GPIO_InitStructure.Pin GPIO_Pin_4 | GPIO_Pin_5; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P1, GPIO_InitStructure);//初始化// P2端口下的 0 到 7 号引脚 准双向口模式GPIO_InitStructure.Pin GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P2, GPIO_InitStructure);//初始化
}int main() {int i; // 定义for循环初始化下标变量// 1. 配置8个灯和总开关SW的引脚工作模式GPIO_config();// 2. 开启总中断EA 1;// 4. 开启总开关LED_SW 0;// 5. 开启流水灯while(1) {// 依次亮for(i 0; i 8; i) {// i:1,2,3,4,5,6,7,8LED1 i 0 ? 0 : 1; // 第一个灯亮其他灯不亮LED2 i 1 ? 0 : 1; // 第二个灯亮其他灯不亮LED3 i 2 ? 0 : 1; // 以此类推LED4 i 3 ? 0 : 1;LED5 i 4 ? 0 : 1;LED6 i 5 ? 0 : 1;LED7 i 6 ? 0 : 1;LED8 i 7 ? 0 : 1;delay_ms(100); // 延迟100ms}}}
效果2依次亮顺序逆序
在效果1的基础上这种效果增加了逆序循环的部分。即当LED灯按照顺序依次亮起并熄灭后会按照逆序再次亮起并熄灭。实现这一效果需要在原有的for循环基础上增加一个逆序的循环。
代码实现
#define LED3 P15
#define LED4 P14
#define LED5 P23
#define LED6 P22
#define LED7 P21
#define LED8 P20
#define LED_SW P45// GPIO配置 输入/输出
void GPIO_config(void) {// 总开关 P4 端口下的5号引脚 推挽模式GPIO_InitTypeDef GPIO_InitStructure; //结构定义GPIO_InitStructure.Pin GPIO_Pin_5; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P4, GPIO_InitStructure);//初始化// P1端口下的 4、5号引脚 准双向口模式GPIO_InitStructure.Pin GPIO_Pin_4 | GPIO_Pin_5; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P1, GPIO_InitStructure);//初始化// P2端口下的 0 到 7 号引脚 准双向口模式GPIO_InitStructure.Pin GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P2, GPIO_InitStructure);//初始化
}int main() {int i; // 定义for循环初始化下标变量// 1. 配置8个灯和总开关SW的引脚工作模式GPIO_config();// 2. 开启总中断EA 0;// 4. 开启总开关LED_SW 0;// 5. 开启流水灯while(1) {// 依次亮 顺序for(i 0; i 8; i) {// i:1,2,3,4,5,6,7,8LED1 i 0 ? 0 : 1; // 第一个灯亮其他灯不亮LED2 i 1 ? 0 : 1; // 第二个灯亮其他灯不亮LED3 i 2 ? 0 : 1; // 以此类推LED4 i 3 ? 0 : 1;LED5 i 4 ? 0 : 1;LED6 i 5 ? 0 : 1;LED7 i 6 ? 0 : 1;LED8 i 7 ? 0 : 1;delay_ms(100); // 延迟100ms}// 逆序for(i 8; i 0; i--) {// i:8,7,6,5,4,3,2,1LED1 i 0 ? 0 : 1; // 第一个灯亮其他灯不亮LED2 i 1 ? 0 : 1; // 第二个灯亮其他灯不亮LED3 i 2 ? 0 : 1; // 以此类推LED4 i 3 ? 0 : 1;LED5 i 4 ? 0 : 1;LED6 i 5 ? 0 : 1;LED7 i 6 ? 0 : 1;LED8 i 7 ? 0 : 1;delay_ms(100); // 延迟100ms}}}
效果3逐渐亮
这种效果要求LED灯从第一个开始逐个亮起直到所有LED灯都亮起然后再逐个熄灭直到所有LED灯都熄灭。这种效果可以通过两个嵌套的for循环实现第一个循环控制亮起的LED灯的数量第二个循环则用于设置对应数量的LED灯为高电平。在第一个循环结束后再通过一个类似的循环将LED灯逐个熄灭。
代码实现
#include Config.h
#include STC8G_H_GPIO.h
#include STC8G_H_Delay.h// 每个LED灯 所代表的引脚
#define LED1 P27
#define LED2 P26
#define LED3 P15
#define LED4 P14
#define LED5 P23
#define LED6 P22
#define LED7 P21
#define LED8 P20
#define LED_SW P45// GPIO配置 输入/输出
void GPIO_config(void) {// 总开关 P4 端口下的5号引脚 推挽模式GPIO_InitTypeDef GPIO_InitStructure; //结构定义GPIO_InitStructure.Pin GPIO_Pin_5; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P4, GPIO_InitStructure);//初始化// P1端口下的 4、5号引脚 准双向口模式GPIO_InitStructure.Pin GPIO_Pin_4 | GPIO_Pin_5; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P1, GPIO_InitStructure);//初始化// P2端口下的 0 到 7 号引脚 准双向口模式GPIO_InitStructure.Pin GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P2, GPIO_InitStructure);//初始化
}int main() {int i; // 定义for循环初始化下标变量// 1. 配置8个灯和总开关SW的引脚工作模式GPIO_config();// 2. 开启总中断EA 1;// 4. 开启总开关LED_SW 0;// 5. 开启逐渐亮流水灯while(1) {// 逐渐亮for(i 8; i 0; i--) {// 依次点亮前i个灯LED1 i 1; // 如果i 1则LED1亮()否则不亮LED2 i 2; // 如果i 2则LED2亮否则不亮LED3 i 3; // 以此类推LED4 i 4;LED5 i 5;LED6 i 6;LED7 i 7;LED8 i 8;delay_ms(100); // 延迟100ms}// 逐渐灭for(i 0; i 8; i) {// 依次点亮前i个灯LED1 i 1; // 如果i 1则LED1亮否则不亮LED2 i 2; // 如果i 2则LED2亮否则不亮LED3 i 3; // 以此类推LED4 i 4;LED5 i 5;LED6 i 6;LED7 i 7;LED8 i 8;delay_ms(100); // 延迟100ms}}}
效果4奇偶亮
这种效果要求LED灯按照奇偶顺序亮起。首先所有奇数编号的LED灯如1、3、5、7亮起然后熄灭接着所有偶数编号的LED灯如2、4、6、8亮起然后熄灭。这种效果可以通过两个独立的循环实现一个用于控制奇数LED灯另一个用于控制偶数LED灯。
代码实现
#include Config.h
#include STC8G_H_GPIO.h
#include STC8G_H_Delay.h// 每个LED灯 所代表的引脚
#define LED1 P27
#define LED2 P26
#define LED3 P15
#define LED4 P14
#define LED5 P23
#define LED6 P22
#define LED7 P21
#define LED8 P20
#define LED_SW P45// GPIO配置 输入/输出
void GPIO_config(void) {// 总开关 P4 端口下的5号引脚 推挽模式GPIO_InitTypeDef GPIO_InitStructure; //结构定义GPIO_InitStructure.Pin GPIO_Pin_5; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P4, GPIO_InitStructure);//初始化// P1端口下的 4、5号引脚 准双向口模式GPIO_InitStructure.Pin GPIO_Pin_4 | GPIO_Pin_5; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P1, GPIO_InitStructure);//初始化// P2端口下的 0 到 7 号引脚 准双向口模式GPIO_InitStructure.Pin GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO,GPIO_InitStructure.Mode GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P2, GPIO_InitStructure);//初始化
}int main() {int i; // 定义for循环初始化下标变量// 1. 配置8个灯和总开关SW的引脚工作模式GPIO_config();// 2. 开启总中断EA 1;// 4. 开启总开关LED_SW 0;// 5. 开启奇偶流水灯 while(1) { // 奇数LED亮1, 3, 5, 7 for(i 1; i 8; i 2) { // 从1开始每次增加2 LED1 (i 1); LED3 (i 3); LED5 (i 5); LED7 (i 7); LED2 LED4 LED6 LED8 0; // 确保其他LED关闭 delay_ms(100); // 延迟100ms } // 偶数LED亮2, 4, 6, 8 for(i 2; i 8; i 2) { // 从2开始每次增加2 LED2 (i 2); LED4 (i 4); LED6 (i 6); LED8 (i 8); LED1 LED3 LED5 LED7 0; // 确保其他LED关闭 delay_ms(100); // 延迟100ms } }
}
总结
通过以上四种流水灯效果的实现我们可以看到微控制器在控制LED灯方面的强大能力。这些效果不仅展示了基本的GPIO控制技术还通过不同的模式增加了项目的趣味性和实用性。在实际应用中我们可以根据具体需求选择合适的流水灯效果并通过调整参数和添加功能来进一步优化项目。