基于stm,遥控器控制蓝牙模块hc05代码
时间: 2023-12-13 15:04:00 浏览: 70
STM32+HC05蓝牙模块与手机之间实现数据传输-工程源代码.zip
5星 · 资源好评率100%
好的,这里给出一个基于STM32的遥控器控制HC-05蓝牙模块的代码实现:
```c
#include "stm32f10x.h"
#define USART1_DR_Base 0x40013804 //USART1数据寄存器地址
#define LED_ON GPIO_SetBits(GPIOC,GPIO_Pin_13); //LED亮
#define LED_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_13); //LED灭
//初始化函数
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//LED引脚初始化
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //LED引脚为PC13
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //速率50MHz
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC13
//USART1引脚初始化
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //USART1_TX引脚为PA9
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //速率50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //USART1_RX引脚为PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA10
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
//USART1初始化
USART_InitStructure.USART_BaudRate=9600; //波特率9600
USART_InitStructure.USART_WordLength=USART_WordLength_8b; //8位数据
USART_InitStructure.USART_StopBits=USART_StopBits_1; //1位停止位
USART_InitStructure.USART_Parity=USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //无硬件流控制
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //发送和接收模式
USART_Init(USART1,&USART_InitStructure); //初始化USART1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能接收中断
USART_Cmd(USART1,ENABLE); //使能USART1
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //中断分组
//USART1中断初始化
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn; //中断通道为USART1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
}
void Delay(__IO uint32_t nCount)
{
for(;nCount!=0;nCount--);
}
int main(void)
{
RCC_Configuration(); //时钟初始化
GPIO_Configuration(); //GPIO初始化
USART_Configuration(); //USART初始化
NVIC_Configuration(); //中断初始化
while(1)
{
LED_ON; //LED亮
Delay(0xFFFFF); //延时
LED_OFF; //LED灭
Delay(0xFFFFF); //延时
}
}
void USART1_IRQHandler(void)
{
u8 data;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) //判断USART1接收中断是否发生
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除USART1接收中断标志位
data=USART_ReceiveData(USART1); //读取USART1接收到的数据
if(data=='1') //接收到字符'1'
{
LED_ON; //LED亮
USART_SendData(USART1,'A'); //向遥控器回应字符'A'
}
else if(data=='0') //接收到字符'0'
{
LED_OFF; //LED灭
USART_SendData(USART1,'B'); //向遥控器回应字符'B'
}
}
}
```
代码实现分为几个部分:时钟初始化、GPIO初始化、USART初始化、中断初始化和主函数。其中,主函数中通过不断改变LED的状态来表示程序正在运行。
USART1中断服务函数中,首先判断是否有接收中断发生,然后读取接收到的数据,如果接收到字符'1',则点亮LED并向遥控器回应字符'A',如果接收到字符'0',则熄灭LED并向遥控器回应字符'B'。
需要注意的是,此代码只是基本实现,具体的硬件连接和蓝牙配置需要根据具体的场景进行调整。
阅读全文