页面载入中,请稍后...

点我安装PWA
您已拒绝通知
    广告广告

    【STM32最小系统板单片机入门实现点亮,闪烁,呼吸灯】

    qaq卟言2023-12-03 00:02:55 嵌入式C语言
    小人奔跑效果开始
    • STM32最小系统板单片机入门实现点亮,闪烁,呼吸灯1.png
    • 这个代码可以直接用于stm32f103C6T6以及stm32f103c8t6单片机,其他单片机连接的led灯改一下GPIO_InitStructure.GPIO_Pin设置的IO口就行了
    • 我们可以看见这个板子上自带了一个led灯(PC13指示灯)现在来点亮它
    • 操作
    • 我们只要控制单片机引脚输出高电平或低电平即可点亮led
    • 看一下这个板子的脚定义图
    • STM32最小系统板单片机入门实现点亮,闪烁,呼吸灯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;//熄灭
      }
      
    • STM32最小系统板单片机入门实现点亮,闪烁,呼吸灯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);
          }
      }
      
    • STM32最小系统板单片机入门实现点亮,闪烁,呼吸灯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;		
             }
           }
      }
    • STM32最小系统板单片机入门实现点亮,闪烁,呼吸灯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
      
    完结

    🔖本文来源:qaq卟言的个人博客网站声明如损害你的权益请联系我们

    ©️版权声明:本文为【qaq卟言】原创文章,写作不易,转载请您添加本文链接,谢谢您的合作!

    📜著作协议:《知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

    ⚠️部分文章图片来自网络,可能存在版权问题。如发现相关争议请联系qaq卟言处理!

    🔗

    广告广告

    随机文章

    该文章已经关闭评论,评论请前往留言信箱