蓝牙控制开发板LED灯(蓝牙+串口+LCD显示)

因为想做一个蓝牙控制的小车,跑通电机驱动程序了,但还缺少一个蓝牙控制,所以想着做一个简单的控制实验。

实验目的:手机端发送数据后,不仅能在开发板显示屏上显示数据内容,还可以控制LED灯的开关。

硬件需求:一个正点原子的开发板(带显示屏),一个蓝牙模块

硬件连接:将蓝牙模块的收发引脚与开发板上USART1的发收引脚相连接

软件需求:在手机上下载一个“蓝牙调试器”APP,提前让其与蓝牙模块相连

需求分解:

(1)在STM32开发板上接收到手机端通过蓝牙发送的信息

主函数如下图所示:

将代码下载到开发板上,运行效果如下图所示:

 

(2)将接收到的信息显示到LCD屏幕上

直接利用正点原子套件中写得lcd驱动代码,然后利用lcd_show_string()函数,这部分代码如下:

 结合(1)中的代码,整体效果如下:

(3)根据显示信息(开发板接收到的信息)进行LED控制

这部分的代码如下:

 

 

 此时的实验结果时:输入b后,LED0快速闪烁,输入非b值后,LED0灯关闭。

以下为详细代码

 main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/USART_SELF/usart_self.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"


int main(void)
{
	HAL_Init();                                 /* 初始化HAL库 */
	sys_stm32_clock_init(RCC_PLL_MUL9);         /* 设置时钟,72M */
	delay_init(72);                             /* 初始化延时函数 */
	led_init();                                 /* 初始化LED */
	usart_init(9600);
	lcd_init();
	
	char ledCont = 'b';
	char bufDate;
	
	
    while(1)
    {
			if(g_usart_rx_flag == 1)
			{
				//printf("The char is:");
				
				//HAL_UART_Transmit(&usart_handle, (uint8_t *)g_rx_buffer, 1, 1000);
				
				while(__HAL_UART_GET_FLAG(&usart_handle, UART_FLAG_TC) != 1);
				
				g_usart_rx_flag = 0;
			}
			else
			{
				delay_ms(10);
			}
			
			lcd_show_string(10, 20, 240, 32, 32, "BlueConTest", BLACK);
			lcd_show_string(10, 60, 240, 24, 24, "The data is:", BLACK);
			lcd_show_string(160, 60, 240, 24, 24, (char *)g_rx_buffer, BLACK);
			
			bufDate = g_rx_buffer[0];
			
			if( bufDate == ledCont )
			{
				LED0_TOGGLE();
			}
			else
			{
				LED0(0);
			}
			
    }
		
}

usart_self.c(这是在正点原子的USART驱动代码的基础上写的)

void USART1_IRQHandler(void);
	
uint8_t g_rx_buffer[1];
uint8_t g_usart_rx_flag = 0;

UART_HandleTypeDef usart_handle;  

/* 串口1初始化 */
/* 设置串口参数,并初始化串口 */
void usart_init( uint32_t baudrate ) 
{
	usart_handle.Instance = USART1;
	usart_handle.Init.BaudRate = baudrate ;
	usart_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
	usart_handle.Init.Mode = UART_MODE_TX_RX;
	usart_handle.Init.Parity = UART_PARITY_NONE;
	usart_handle.Init.StopBits = UART_STOPBITS_1;
	usart_handle.Init.WordLength = UART_WORDLENGTH_8B;
	HAL_UART_Init(&usart_handle);
	
	HAL_UART_Receive_IT(&usart_handle, (uint8_t*)g_rx_buffer, 1);
	
}


/* 串口MSP回调函数 */
/* 什么是MSP? Main Stack Pointer:主堆栈指针 */
/* 使能串口、引脚时钟;初始化引脚;设置中断优先级并使能 */
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
	GPIO_InitTypeDef gpio_init_struct;
	
	if(huart -> Instance == USART1)
	{
		__HAL_RCC_USART1_CLK_ENABLE();
		__HAL_RCC_GPIOA_CLK_ENABLE();
		
		gpio_init_struct.Pin = GPIO_PIN_9;
		gpio_init_struct.Mode = GPIO_MODE_AF_PP;            
		gpio_init_struct.Pull = GPIO_PULLUP;	
		gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          
		HAL_GPIO_Init(GPIOA, &gpio_init_struct); 		
		
		gpio_init_struct.Pin = GPIO_PIN_10;                   
    gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          
    HAL_GPIO_Init(GPIOA, &gpio_init_struct);  	

    HAL_NVIC_SetPriority(USART1_IRQn, 2, 2);
		
		HAL_NVIC_EnableIRQ(USART1_IRQn);
	}
		
}


/* 串口1中断服务函数 */
void USART1_IRQHandler(void)
{
	HAL_UART_IRQHandler(&usart_handle);
	HAL_UART_Receive_IT(&usart_handle, (uint8_t*)g_rx_buffer, 1);
}


/* 串口数据接收完成回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	g_usart_rx_flag = 1;
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值