- 1.png
- 这个代码可以直接用于stm32f103C6T6以及stm32f103c8t6单片机,其他单片机连接的led灯改一下GPIO_InitStructure.GPIO_Pin设置的IO口就行了
- 我们可以看见这个板子上自带了一个led灯(PC13指示灯)现在来点亮它
- 操作
- 我们只要控制单片机引脚输出高电平或低电平即可点亮led灯
- 看一下这个板子的脚定义图
- 2.png
- 可以看到这个led灯接的是PC_13
- 连接的IO口知道了,那就配置一下配置GPIO引脚
- 创建一个PC13 LED IO初始化文件
- 这里我定义的pin脚为PC_13所以创建led_Pin_13.c的文件方便后期分辨
- led_Pin_13.c内容
#include "led_Pin_13.h" #include "stm32f10x.h" #include "delay.h" /** *名称:PC13 LED IO初始化 * *作用:初始化PC13为输出口.并使能这个口的时钟 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** *选择IO接口工作方式: *GPIO_Mode_AIN 模拟输入 *GPIO_Mode_IN_FLOATING 浮空输入 *GPIO_Mode_IPD 下拉输入 *GPIO_Mode_IPU 上拉输入 *GPIO_Mode_Out_PP 推挽输出 *GPIO_Mode_Out_OD 开漏输出 *GPIO_Mode_AF_PP 复用推挽输出 *GPIO_Mode_AF_OD 复用开漏输出 */ void Led_Pin_13_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //配置GPIO,使用GPIO初始化函数,函数得第二个参数是结构体,故定义结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟,必须使能时钟,STM32才能正常工作 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LED-->PC13 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式,推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) 一般50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化PC13 GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC13输出高 }
- led_Pin_13.h内容
#ifndef __LED_H #define __LED_H #include "sys.h" void Led_Pin_13_Init(void);//PC13 LED IO初始化 #endif
- 初始化完成了,现在来实现功能
- 点亮以及熄灭
- 一共有三种方法,选择其中一种就行
- main.c
/** *名称:PC13 LED 点亮 * *作用:STM32最小系统板单片机入门实现PC13 LED 点亮 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** */ #include "stm32f10x.h" #include "sys.h" #include "led.h" int main (void)//主程序 { Led_Pin_13_Init();//调用上面写的函数,目的让PC13 LED IO初始化 GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)(0)); //可理解为,在PC13引脚,写入0 点亮 //GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)(0)); //写入1 熄灭 }
/** *名称:PC13 LED 点亮 * *作用:STM32最小系统板单片机入门实现PC13 LED 点亮 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** */ #include "stm32f10x.h" #include "sys.h" #include "led.h" int main (void)//主程序 { Led_Pin_13_Init();//调用上面写的函数,目的让PC13 LED IO初始化 //PC13低电平,LED灯电亮,PC13高电平,LED灯熄灭 GPIO_ResetBits(GPIOC,GPIO_Pin_13);//使GPIO13置于低电平 //GPIO_SetBits(GPIOC,GPIO_Pin_13);//使GPIO13置于高电平 }
/** *名称:PC13 LED 点亮 * *作用:STM32最小系统板单片机入门实现PC13 LED 点亮 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** */ #include "stm32f10x.h" #include "sys.h" #include "led.h" int main (void)//主程序 { Led_Pin_13_Init();//调用上面写的函数,目的让PC13 LED IO初始化 PCout(13)=0;//位带操作,令PC 13输出位0 就会点亮 //PCout(13)=1;//输出为1 就会熄灭 }
- 上面这个操作也可以放入led_Pin_13.h中定义进行引用
#ifndef __LED_H #define __LED_H #include "sys.h" #define Led_Pin_13 PCout(13) // PC13 void Led_Pin_13_Init(void);//PC13 LED IO初始化 #endif
- 使用的时候只用设置数值就行
/** *名称:PC13 LED 点亮 * *作用:STM32最小系统板单片机入门实现PC13 LED 点亮 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** */ #include "stm32f10x.h" #include "sys.h" #include "led.h" int main (void)//主程序 { Led_Pin_13=0;//点亮 //Led_Pin_13=1;//熄灭 }
- 3.png
- 闪烁
- 点亮已经实现了,闪烁就简单了,先给点亮,延时几秒;再熄灭,延时几秒,如此反复就实现了闪灯操作😁
- 我们用上面的其中一个例子,然后加个延时,加个循环就行
/** *名称:PC13 LED 闪烁 * *作用:STM32最小系统板单片机入门实现PC13 LED 闪烁 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** */ #include "stm32f10x.h" #include "delay.h" #include "sys.h" #include "led.h" int main (void)//主程序 { Led_Pin_13_Init();//调用上面写的函数,目的让PC13 LED IO初始化 while(1)//死循环 { GPIO_ResetBits(GPIOC,GPIO_Pin_13);//点亮 delay_ms(500);//延时 GPIO_SetBits(GPIOC,GPIO_Pin_13);//熄灭 delay_ms(500); } }
- 4.gif
- 呼吸
- 闪烁完成了,呼吸灯就简单了
- 系统中的解释为在单位时间,通过GPIO口,给高电平的时间逐渐变长,给低电平时间逐渐变短,来实现灯逐渐变亮。反之,灯逐渐变暗
- 大白话具体一点的操作就是在固定的循环中快速的点亮熄灭
- 因为人眼的视觉暂留的原因,人是不能看到灯灭掉的,所以只要脉冲的宽度越宽,可以看到的灯也就越亮,反过来也是一样的
/** *名称:呼吸灯 * *作用:灯不断变亮,灯逐渐变暗 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** */ void Led_Pin_13_Breathe(void){ u16 i,t; u8 controls; controls = 0;//定义操作标记 0-灯不断变亮 1-灯逐渐变暗 t = 1; while(1) { //灯是低电平亮 //如果操作标记是1 控制输出低电平的时间从1不断增大,灯就会不断变亮 if(controls == 0) { for(i=0;i<10;i++)//每一个t的值都执行10次,执行10次后t+1 { GPIO_ResetBits(GPIOC,GPIO_Pin_13); delay_us(t); GPIO_SetBits(GPIOC,GPIO_Pin_13); delay_us(501-t); } t++; if(t == 500)controls = 1; } //如果操作标记是1 控制输出低电平的时间逐渐减小,灯就会逐渐变暗 if(controls == 1) { for(i=0;i<10;i++)//每一个t的值执行10次,执行10次后t减1 { GPIO_ResetBits(GPIOC,GPIO_Pin_13); delay_us(t); GPIO_SetBits(GPIOC,GPIO_Pin_13); delay_us(501-t); } t--; if(t == 1)controls = 0; } } }
- 5.gif
- 到此所有方法功能我们都实现了,为了方便使用现在将它们合并在一起,需要的时候直接调用就好了
- main.c
/** *名称:呼吸灯 * *作用:灯不断变亮,灯逐渐变暗 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** */ #include "sys.h" #include "delay.h" #include "led_Pin_13.h" int main(void) { delay_init();//延时函数初始化 Led_Pin_13_Init();//PC13 LED IO初始化 //LED13=1;//亮 //LED13=0;//灭 Led_Pin_13_Breathe();//呼吸灯 //Led_Pin_13_flicker();//闪烁灯 }
- led_Pin_13.c
#include "led_Pin_13.h" #include "stm32f10x.h" #include "delay.h" /** *名称:PC13 LED IO初始化 * *作用:初始化PC13为输出口.并使能这个口的时钟 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** *选择IO接口工作方式: *GPIO_Mode_AIN 模拟输入 *GPIO_Mode_IN_FLOATING 浮空输入 *GPIO_Mode_IPD 下拉输入 *GPIO_Mode_IPU 上拉输入 *GPIO_Mode_Out_PP 推挽输出 *GPIO_Mode_Out_OD 开漏输出 *GPIO_Mode_AF_PP 复用推挽输出 *GPIO_Mode_AF_OD 复用开漏输出 */ void Led_Pin_13_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //配置GPIO,使用GPIO初始化函数,函数得第二个参数是结构体,故定义结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟,必须使能时钟,STM32才能正常工作 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LED-->PC13 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式,推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) 一般50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化PC13 GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC13输出高 } /** *名称:呼吸灯 * *作用:灯不断变亮,灯逐渐变暗 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** */ void Led_Pin_13_Breathe(void){ u16 i,t; u8 controls; controls = 0;//定义操作标记 0-灯不断变亮 1-灯逐渐变暗 t = 1; while(1) { //灯是低电平亮 //如果操作标记是1 控制输出低电平的时间从1不断增大,灯就会不断变亮 if(controls == 0) { for(i=0;i<10;i++)//每一个t的值都执行10次,执行10次后t+1 { GPIO_ResetBits(GPIOC,GPIO_Pin_13); delay_us(t); GPIO_SetBits(GPIOC,GPIO_Pin_13); delay_us(501-t); } t++; if(t == 500)controls = 1; } //如果操作标记是1 控制输出低电平的时间逐渐减小,灯就会逐渐变暗 if(controls == 1) { for(i=0;i<10;i++)//每一个t的值执行10次,执行10次后t减1 { GPIO_ResetBits(GPIOC,GPIO_Pin_13); delay_us(t); GPIO_SetBits(GPIOC,GPIO_Pin_13); delay_us(501-t); } t--; if(t == 1)controls = 0; } } } /** *名称:闪烁灯 * *作用:给小灯一个高电平,延时几秒,再给小灯一个低电平,延时几秒,如此反复就实现了闪灯操作 *@author Bunyan<buyan@mail.qaqbuyan.com> *关于:https://qaqbuyan.com:88/关于乔安/ *@version 1.0 **************************************************************************************** * 版本 修改日期 描述 * **************************************************************************************** * 1.0 2023-11-25 16:21 创建此脚本 * **************************************************************************************** */ void Led_Pin_13_flicker(){ while(1) { GPIO_SetBits(GPIOC,GPIO_Pin_13);//设置高电平 delay_ms(500); GPIO_ResetBits(GPIOC,GPIO_Pin_13);//清除高电平 delay_ms(500); } }
- led_Pin_13.h
#ifndef __LED_H #define __LED_H #include "sys.h" #define Led_Pin_13 PCout(13)// PC13操作 Led_Pin_13=1; 0-亮 1-灭 void Led_Pin_13_Init(void);//PC13 LED IO初始化 void Led_Pin_13_Breathe(void);//呼吸灯 void Led_Pin_13_flicker(void);//闪烁灯 #endif
【STM32最小系统板单片机入门实现点亮,闪烁,呼吸灯】
开始
完结