基础的就不讲了,直接上配置文件,led.c led.h usart.c usart.h stm32f10x_it.c 延时函数这些都自己写吧,网上搜索一大把,本次用到的蓝牙模块为 不知什么系列,具体见文末图,蓝牙的RXD连接单片机的TXD,蓝牙的TXD连接单片机的RXD,还有两个口,VCC和GND,接5V电源,还有配套自己写的安卓app,文末贴上百度网盘下载地址,实现的功能就是手机蓝牙app里面发送‘A’字符到单片机灯亮,发送‘B’字符灯灭;
led.c文件所包含的内容:
void LED_Config(void){ //LED灯的接口初始化 GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStruct.GPIO_Pin =GPIO_Pin_8; //选择端口号(0~15或all) GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) GPIO_Init(GPIOA, &GPIO_InitStruct); }
led.h文件所包含的内容:
#ifndef __LED_H #define __LED_H #include "stm32f10x.h" void LED_Config(void);//初始化 #endif
usart.c文件所包含的内容:
static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; /* 配置USART为中断源 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 抢断优先级*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 子优先级 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 使能中断 */ /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); } void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 打开串口GPIO的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 打开串口外设的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 将USART Tx的GPIO配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 将USART Rx的GPIO配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置串口的工作参数 // 配置波特率 USART_InitStructure.USART_BaudRate = 9600; //蓝牙模块出厂默认9600 波特率 // 配置 针数据字长 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位 // 配置停止位 USART_InitStructure.USART_StopBits = USART_StopBits_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); // 串口中断优先级配置 NVIC_Configuration(); // 使能串口接收中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能串口 USART_Cmd(USART1, ENABLE); }
usart.h文件所包含的内容:
#ifndef __USART_H #define __USART_H #include "stm32f10x.h" void USART_Config(void); #endif
stm32f10x_it.c中编写中断服务函数为:
注意:stm32f10x_it.c 中需要包含某些头文件,比如 usart.h 和你调用的函数:延时函数,也可直接写在stm32f10x_it.c 文件中,但是不推荐,可以自己建立一个delay.c和delay.h,然后直接包含头文件即可
void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Receive_Data = 0; if(USART_GetITStatus(USART1, USART_IT_RXNE)) //由于只设置了一种接收中断,判断可以省略 { Receive_Data = USART_ReceiveData(USART1);//保存接收到的数据,RXNE自动清零 /*下面的语句就是自己想实现的功能,比如简单的灯亮灯灭程序,下面程序就是单片机收到 A 字符就灯亮,收到 B 字符就灯灭*/ if(Receive_Data==\'A\'){ GPIO_SetBits(GPIOA, GPIO_Pin_8); SysTick_Delay_ms(1000); } if(Receive_Data==\'B\'){ GPIO_ResetBits(GPIOA, GPIO_Pin_8); SysTick_Delay_ms(1000); } //USART_ClearFlag(USART1,USART_IT_RXNE); //手动清零 } }
手机蓝牙软件下载地址:
链接:https://pan.baidu.com/s/1kmt-AHwPHnqiELMrNLqPiQ
提取码:9cj4
自己写的蓝牙软件,可能安装的时候会误报为有病毒,可以放心使用,当然不保证所有的蓝牙芯片都能用,但是我写的串口程序是可以用的,可以自己在淘宝上买蓝牙芯片且附带蓝牙APP的。
简述一下蓝牙的使用步骤:先不打开我写的蓝牙APP,手机设置里面先和蓝牙模块配对成功后,打开蓝牙APP,点击蓝牙设备选择,选择配对时候的地址,就行了,蓝牙模块的灯常亮就是连接成功了。当然,退出软件的时候最好还是点击 断开连接 后再退出软件。
蓝牙APP软件截图:
注:图中的1~8按钮就是发送对应的数字给单片机,写中断程序的时候,进行相应的判断即可!
全家图:
蓝牙模块实图:
最后,作者也是第一次写博客,如有问题还请见谅并指出,以上纯属个人编程观点,如有疑问欢迎留言,谢谢!