完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本篇将实现两个实例,手头正好有8位的单片机,索性就用来练手了。将会提供两个例子,一个是基于STM8的库函数实例,一个是基于STC89C52的实例。
1.首先了解下单片机串口通讯线的接法。 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] = “ONn”; char LED_OFF[10] = “OFFn”; 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 %drn”, 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.接好线看下运行的效果 。 好了,STM8蓝牙控制LED亮灭的功能基本实现了,下一遍将实现蓝牙和STC89单片机的联调。 当这个系列结束之后我会将代码一并上传到Git。博文更新的话,可能因为工作原因会断断续续,希望大家见谅。如果觉得有帮助或者有设么其他好的建议可以在博文下留言,赞赏码没有别的意思,这是个知识付费的时代,可能付费了才会更珍惜学习的不易,当然也是作者创作的动力所在,哈哈。 |
|
|
|
只有小组成员才能发言,加入小组>>
2512 浏览 0 评论
1082浏览 2评论
696浏览 1评论
452浏览 0评论
192浏览 0评论
326浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 12:27 , Processed in 1.136724 second(s), Total 49, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号