基于蓝牙模块HC05的手机控制灯开关的小项目 |
您所在的位置:网站首页 › 手机控制家里的灯开关灯 › 基于蓝牙模块HC05的手机控制灯开关的小项目 |
(第一次发文章,如果有问题请轻喷,谢谢!) 本人使用的蓝牙模块是在优信电子购买的HC05蓝牙模块JDY-31,刚开始想要参照正点原子的HC05模块教程去编写,但感觉之前没怎么了解过他家的编写思维,代码看起来很乱,所以就自己写了一个,结果半天发不出去信息,最后发现是自己的串口代码移植过来的时候配置时忘记把串口1改成串口2了.。。。 其实这款蓝牙模块的使用非常简单,只要你会配置串口1的相关函数,把他的函数拿过来,直接把串口1改成串口2就行,该蓝牙模块有VCC,GND,RXD, TXD,STATE, EN六个引脚,EN是浮空的,所以不用接线,state接不接都可以(所以我也不知道他有啥用,直接搞成四个脚不是更节省成本?) 以下是函数,如有问题欢迎指正 HC05相关函数 /*********************************************** *函数名 :usart2_init *函数功能 :串口1初始化配置函数 *函数参数 :u32 baud *函数返回值:无 *函数描述 :PA2-------Tx PA3------Rx ************************************************/ void usart2_init(void) { /*IO控制器配置*/ /*1、端口时钟使能*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 /*2、创建一个端口配置结构体*/ GPIO_InitTypeDef GPIO_InitStruct = {0};//清零 /*3、设置输出的端口*/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;//配置PA2/3 /*4、端口模式配置*/ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//配置为复用模式 /*5、端口输出类型配置*/ GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//配置为推挽类型 /*6、端口上下拉配置*/ GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//配置为无上下拉 /*7、端口输出速度配置*/ GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//50M输出速度 /*8、使用初始化函数配置*/ GPIO_Init(GPIOA, &GPIO_InitStruct); /*9、复用功能配置*/ GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); /*串口控制器配置*/ /*1、串口2时钟使能*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /*2、创建一个端口配置结构体*/ USART_InitTypeDef USART_InitStruct = {0};//清零 /*3、设置波特率*/ USART_InitStruct.USART_BaudRate = 9600; /*4、硬件流设置*/ USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流 /*5、模式设置*/ USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送接收 /*6、奇偶校验设置*/ USART_InitStruct.USART_Parity = USART_Parity_No;//无奇偶校验 /*7、停止位设置*/ USART_InitStruct.USART_StopBits = USART_StopBits_1;//一个停止位 /*8、字节长度设置*/ USART_InitStruct.USART_WordLength = USART_WordLength_8b;//8个字长 /*9、使用初始化函数配置*/ USART_Init(USART2, &USART_InitStruct); /*10、中断使能*/ USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//接收中断使能 USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//空闲中断使能 /*NVIC控制器配置*/ /*1、优先级分组*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组 /*2、创建一个端口配置结构体*/ NVIC_InitTypeDef NVIC_InitStruct = {0}; /*3、中断源设置*/ NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn; /*4、响应通道使能*/ NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; /*5、设置抢占优先级级别值*/ NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; /*6、设置响应优先级级别值*/ NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; /*7、使用初始化函数配置*/ NVIC_Init(&NVIC_InitStruct); //串口使能 USART_Cmd(USART2, ENABLE); } /*********************************************** *函数名 :hc05_init *函数功能 :串口1初始化配置函数 *函数参数 :u32 baud *函数返回值:无 *函数描述 :PA4——STATE ************************************************/ void hc05_init(void) { usart2_init(); } /*********************************************** *函数名 :usart2_send_byte *函数功能 :串口2发送一个字节函数 *函数参数 :u8 data *函数返回值:无 *函数描述 : ***********************************************/ void usart2_send_byte(u8 data) { //等待上一位发送完成 while(!USART_GetFlagStatus(USART2, USART_FLAG_TC ));//发送完成标志位为0 USART_SendData(USART2, data); } /*********************************************** *函数名 :usart2_send_str *函数功能 :串口2发送多字节函数 *函数参数 :u8 *str *函数返回值:无 *函数描述 : ***********************************************/ void usart2_send_str(u8 *str) { while(*str != '\0') { usart2_send_byte(*str); str++; } } /***************************************************** 函数功能:hc05接收数据 函数形参:void 函数返回值:void 函数说明: *****************************************************/ u8 usart2_rec_buff[20]; void USART2_IRQHandler(void) { static u8 i = 0; //判断是接收中断 if(USART_GetITStatus(USART2, USART_IT_RXNE)) { //清除中断标志位 USART_GetITStatus(USART2, USART_IT_RXNE); //紧急事件 usart2_rec_buff[i] = USART_ReceiveData(USART2); i++; } //判断是空闲中断 if(USART_GetITStatus(USART2, USART_IT_IDLE)) { //清除中断标志位 USART2->SR; USART2->DR; //紧急事件 usart2_rec_buff[i] = '\0'; i = 0;//清零 printf("接收到的字符串是%s\r\n", usart2_rec_buff); } } LED灯相关配置函数 /********************************** *函数名 :led_init *函数功能 :LED所用IO初始化配置 *函数参数 :无 *函数返回值:无 *函数描述 :PB8——LED_R/LED4 P89——LED_G/LED3 **********************************/ void led_init(void) { /*1、端口时钟使能*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOC时钟 /*2、创建一个端口配置结构体*/ GPIO_InitTypeDef GPIO_InitStruct = {0};//清零 /*3、设置输出的端口*/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//配置PC4/5/6/7 /*4、端口模式配置*/ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//配置为输出模式 /*5、端口输出类型配置*/ GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//配置为推挽输出类型 /*6、端口上下拉配置*/ GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//配置为无上下拉 /*7、端口输出速度配置*/ GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;//2M输出速度 /*8、使用初始化函数配置*/ GPIO_Init(GPIOC, &GPIO_InitStruct); /*9、配置输出数据寄存器*/ GPIO_SetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//配置为高电平,关灯 } /********************main函数***********************************/ int main() { // u8 key = 0; NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2); //优先级分组 led_init();//LED初始化 key_init();//按键初始化 usart1_init(9600);串口一初始化 hc05_init();//HC05初始化,其实就是串口2初始化 while(1) { if(strcmp(usart2_rec_buff,"on")==0)//接收的字符串有on就开灯 { LED1_ON;//这个是我自己定义的宏GPIO_ResetBits(GPIOC, GPIO_Pin_4) } if(strcmp(usart2_rec_buff,"off")==0)//接收的字符串有off就关灯 { LED1_OFF;//这个是我自己定义的宏GPIO_SetBits(GPIOC, GPIO_Pin_4) } } } 下载到板子后,下载厂家给你的蓝牙apk到手机上,搜索蓝牙名字连接,就可以收发数据了,发送数据就使用一下串口发送字符串函数就行,在这个基础上添加一些传感器配置,也可以发到手机上 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |