1. 程式人生 > >安卓手機與藍芽模組聯合除錯(二)—— 微控制器藍芽控制LED燈亮滅(上)

安卓手機與藍芽模組聯合除錯(二)—— 微控制器藍芽控制LED燈亮滅(上)

系列博文:

忙裡偷閒,承接上一篇文章繼續

本篇將實現兩個例項,手頭正好有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。博文更新的話,可能因為工作原因會斷斷續續,希望大家見諒。如果覺得有幫助或者有設麼其他好的建議可以在博文下留言,讚賞碼沒有別的意思,這是個知識付費的時代,可能付費了才會更珍惜學習的不易,當然也是作者創作的動力所在,哈哈。