系列博文:
(1)安卓手机与蓝牙模块联合调试(一)——蓝牙模块的串口通讯
(2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上)
(3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下)
忙里偷闲,承接上一篇文章继续
安卓手机与蓝牙模块联合调试(一)——蓝牙模块的串口通讯 - CSDN博客
本篇将实现两个实例,手头正好有8位的单片机,索性就用来练手了。将会提供两个例子,一个是基于STM8的库函数实例,一个是基于STC89C52的实例。
1.首先了解下单片机串口通讯线的接法。这个比较重要,建议参考文章。
(1)HC-05初探 - 骑着蜗牛逛世界 - 博客园 https://www.cnblogs.com/LittleHann/p/5621937.html
(2)HC-05 蓝牙模块的调试与使用 - CSDN博客 https://blog.csdn.net/txf1984/article/details/46553715
2. 准备工作和单片机原理图。
首先看下我用到的硬件支持,一块STM8S103F2P6最小系统板,一个ST-Link下载器,一个HC-05的模块(暂时先调试HC-5的模块,CC2541单片机端的代码是一样的)
最小系统的原理图如下,大家按照上面两个博文中的接线方法接好单片机,特别注意蓝牙模块的TX/RX与单片机的TX/RX要交叉相接。
3. 单片机的代码,使用STM8库函数编写。
首先看下目录结构,本项目使用的是IAR编译器
下面贴出来main函数,注释在代码中已经描述的很清楚了,大家可以自行参考。
/*************
** Author : 江涛
** Date : 2018/08/28
** Describe : 蓝牙控制单片机开关灯
**************/
/* Includes -----------*/
#include "stm8s.h"
#include <string.h>
/********************************************
** TestLed PB5 测试LED
**********************************************/
/**串口1接收数据标志位**/
unsigned char Usart1_bufStart_or_bufSotp = 0 ;
/**串口1数据,这里10个字节够放命令了,大家可以根据实际需要调整数组长度**/
char Usart1BufData[10];
/**串口数据数目自增量,用来统计数目是否达到数组最大长度**/
char Usart1BufConst;
/****以下是定义的命令*****/
char LED_ON[10] = "ON\n";
char LED_OFF[10] = "OFF\n";
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
/*************
* 初始化串口UART1
**************/
void initUart1()
{
// 串口设置
UART1_DeInit();
// 9600波特率,8位数据位,一位停止位,
UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);//UART1_MODE_TX_ENABLE);
// 使能串口接收中断
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
}
/*********
* 端口配置
**************/
void initGPIO(){
// LED灯的GPIO口初始化
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteHigh(GPIOB , GPIO_PIN_5); // 关测试灯
}
/*****************
* 程序入口
*******************/
void main(void)
{
// 初始化系统时钟,
CLK_HSICmd(ENABLE);
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
//内部时钟16M,8分频
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);
initGPIO();
initUart1();
enableInterrupts(); // 使能中断
while (1)
{
if(Usart1_bufStart_or_bufSotp)
{
Usart1_bufStart_or_bufSotp = 0 ;
if(strcmp(Usart1BufData,LED_ON)==0)
{
GPIO_WriteLow(GPIOB , GPIO_PIN_5);
}
else if(strcmp(Usart1BufData,LED_OFF)==0)
{
GPIO_WriteHigh(GPIOB , GPIO_PIN_5);
}
Usart1BufConst = 0 ;
memset(Usart1BufData,0,10);//清0数组
}
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval : None
*/
void assert_failed(u8* file, u32 line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
项目中还有个it.c文件,内容如下:
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
/* Private typedef -----------------------------------------------------------*/
extern unsigned char Usart1_bufStart_or_bufSotp;
extern char Usart1BufData[10];
extern char Usart1BufConst;
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/* Public functions ----------------------------------------------------------*/
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S103) || \
defined(STM8S003) || defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8S903)
/**
* @brief UART1 TX Interrupt routine.
* @param None
* @retval None
*/
INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
}
/**
* @brief UART1 RX Interrupt routine.
* @param None
* @retval None
*/
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
Usart1BufData[Usart1BufConst]=UART1_ReceiveData8();
UART1_SendData8(UART1_ReceiveData8());
// 收到了结束符号
if(Usart1BufData[Usart1BufConst]==0x0A)
{
Usart1_bufStart_or_bufSotp=1;
}
else
Usart1BufConst++;
UART1_ClearITPendingBit(UART1_IT_RXNE); // 清除标志位
}
#endif /*STM8S208 or STM8S207 or STM8S103 or STM8S903 or STM8AF62Ax or STM8AF52Ax */
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
主要代码就是这些了,注释中已经写的很清楚了。
4.接好线看下运行的效果 。
过后放上一个视频连接,实在因为gif的效果不明显。
好了,STM8蓝牙控制LED亮灭的功能基本实现了,下一遍将实现蓝牙和STC89单片机的联调。
当这个系列结束之后我会将代码一并上传到Git。博文更新的话,可能因为工作原因会断断续续,希望大家见谅。如果觉得有帮助或者有设么其他好的建议可以在博文下留言,赞赏码没有别的意思,这是个知识付费的时代,可能付费了才会更珍惜学习的不易,当然也是作者创作的动力所在,哈哈。