STM32学习记录:通过蓝牙控制LED点亮效果

 

文章目录

  • 前言
  • 一、学习目的
  • 二、模块介绍
  • 三、代码记录
  • 四、实际操作

  • 前言

    今天记录一个蓝牙模块的简单应用,有关蓝牙的AT指令模式的设置在前面的记录中已经详细记录过,如果忘记了可以看看下面的文章。

    HC-05蓝牙模块的使用_KAIs32的博客-CSDN博客


    一、学习目的

            本次学习的目的是通过手机连接蓝牙模块,并实现用手机控制LED的亮灭。我使用的是STM32F103C8T6核心板,LED的引脚是PC13。如果有兴趣可以自己通过蓝牙实现其他功能,例如控制舵机转动和控制OLED屏的显示。

    二、模块介绍

     

           我使用的依旧是HC-05蓝牙模块,并将蓝牙设置为从机。由于我使用的是最小系统板,而最小系统板的PA9和PA10引脚需要连接USB转TTL模块来为单片机烧录代码。  所以在接线方面有如下调整:RXD–PA2,TXD–PA3,VCC–5V,GND–GND。

    其中PA2和PA3是我自己定义的,将RXD对应端口设置为复用推挽输出模式(GPIO_Mode_AF_PP),TXD对应端口设置为浮空输入模式(GPIO_Mode_IN_FLOATING)即可。端口可以根据需求更改。

    三、代码记录

    hc05.h

    #ifndef __HCSR_H
    #define __HCSR_H
    #include "sys.h"
    
    
    void My_USART2_Init(void);
    void USART2_IRQHandler(void);
    
    #endif
    
    

    hc05.c    

    该文件中主要是初始化了两个GPIO口(PA2,PA3)供蓝牙模块连接使用。初始化了串口2作为蓝牙模块接受和发送信号的通道(手机通过串口发送信息给蓝牙模块,蓝牙模块接受信息并发送给单片机),并且定义了一个变量res作为信号传递大使。

    #include "hc05.h"
    
    u8 res;  			
    void My_USART2_Init(void)  
    {  
        GPIO_InitTypeDef GPIO_InitStrue;  
        USART_InitTypeDef USART_InitStrue;  
        NVIC_InitTypeDef NVIC_InitStrue;  
          
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); 
          
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;  
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
        GPIO_Init(GPIOA,&GPIO_InitStrue);
          
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
        GPIO_Init(GPIOA,&GPIO_InitStrue); 
          
        USART_InitStrue.USART_BaudRate=9600;  
        USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  
        USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;  
        USART_InitStrue.USART_Parity=USART_Parity_No;  
        USART_InitStrue.USART_StopBits=USART_StopBits_1;  
        USART_InitStrue.USART_WordLength=USART_WordLength_8b;  
          
        USART_Init(USART2,&USART_InitStrue);
          
        USART_Cmd(USART2,ENABLE);
          
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
          
        NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;  
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;  
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;  
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;  
        NVIC_Init(&NVIC_InitStrue);  
          
    }  
      
    void USART2_IRQHandler(void)  
    {  
    
         if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)  
     {  
         res= USART_ReceiveData(USART2); 	 
    //     USART_SendData(USART2,res);  
      }  
    }  
    
    

    led.h

    #ifndef __LED_H
    #define __LED_H
    
    void LED_Init(void);
    
    #define LED0 PCout(13)
    
    
    
    #endif
    
    

    led.c

    使能核心板上自带的LED,引脚是PC13,如果需要使用其他引脚,直接更改即可。

    #include "LED.h"
    #include "stm32f10x.h"
    
    void LED_Init(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;  
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    
    	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
    	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(GPIOC,&GPIO_InitStructure);
    	GPIO_SetBits(GPIOC,GPIO_Pin_13);
    }
    
    

     main.c

    通过用手机发送信号传递大使(res),控制LED亮灭。

    #include "led.h"
    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    #include "hc05.h"
    #include "led.h"
    
    extern u8 res;					
     int main(void)
     {		 
    	int i;
    	char a[]="abcdefg";
    	delay_init();
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	uart_init(115200);	 					
    	My_USART2_Init(); 
    	NVIC_Configuration();
    	LED_Init();
     	while(1)
    	{
    		if(res==01)
    		{
    			LED0=0;
    			for(i=0;i<7;i++)
    			{
    				USART_SendData(USART2, a[i]);		
    		while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
    			}
    			res=0;
    		}
    		 if(res==02)
    		{
                LED0=1;
    			res=0;
    	  }	 
      }
    }
    
    

    四、实际操作

    打开手机上的串口调试助手,我使用的是下面这款,其他的也是可以的。

    17ccb5ed875a4d45bb306a1c3c447cde.jpeg

     选择之前更改过名字的蓝牙,并输入密码

    3aa4c7f2b23143e5abd19a643b78c97a.jpeg

     发送res设置的值,就可以看见单片机上LED的变化了。

    bd915402b58b4e74b73551927bff6e00.jpeg

     ec4cc330409b436fbc3af532fa9c68a3.jpeg

    f8c99b37425b4d4684390848e8a3fd2c.jpeg

     

     

    作者:KAIs32

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32学习记录:通过蓝牙控制LED点亮效果

    发表评论