普中蓝牙模块使用
使用的是HC-06模塊
HC-06默認的波特率是9600,8位數據為,1位停止位,無校驗位
在使用串口助手調試的時候,需要勾選自動換行,這里選用的友善串口助手
修改藍牙的AT指令可以查看藍牙芯片手冊,AT指令
如果是上電長亮說明是直接進入了一個AT模式和配對模式,可以使用手機搜索到藍牙模塊,配對上,但是手機里面的藍牙系統是連接不上HC-06的,需要額外下載一個藍牙串口,在藍牙串口連接上模塊之后,模塊的指示燈常亮,這時可以進行通信
2020.3.11
在經過12號一天對LCD12864液晶顯示屏的后,繼續HC-06藍牙模塊的使用
- 目的:手機連接藍牙模塊控制LED的亮滅
藍牙模塊和單片機之間的通信是UART串口方式,使用的是圣芯的HC89S003F4單片機,連接好藍牙模塊和單片機,手機發送信息給藍牙模塊,藍牙模塊將接收到的信息通過UART轉發給單片機
無線信號UART手機藍牙模塊單片機只需要在單片機里面處理接受到的信號就可以了,所以說非常的簡單
接下來是代碼
main.c
#define ALLOCATE_EXTERN#include "lcd12864.H" #include "public.h" #include "time.h" #include "bt.h"void main(void) {WDTCCR = 0x00; CLKSWR = 0x51; //選擇內部高頻RC為系統時鐘,內部高頻RC 2分頻,Fosc=16MHzCLKDIV = 0x01; //Fosc 1分頻得到Fcpu,Fcpu=16MHz Lcd12864_Init();Timer_Init();Bt_Init();Lcd_Init();LCD_Clear();EA = 1; //使能總中斷while (1){Rx_Proc();} }bt.c
#include "time.H" #include "lcd12864.H"xdata uint8_t RecBuff[15] = {0}; xdata uint8_t RxCount = 0; bit Rx_Done = 0; bit Rx_Start = 0;/*** @name Bt_Init[藍牙初始化]*/ void Bt_Init(void) {/*LDE初始化*/P2M1 = P2M1&0xF0|0x08; //P22設置為推挽輸出LED = 1;P2M0 = P2M0&0x0F|0x80; //P21設置為推挽輸出P0M1 = P0M1&0x0F|0x20; //P03設置為上拉輸入TXD_MAP = 0x21; //TXD映射P21RXD_MAP = 0x03; //RXD映射P03T4CON = 0x06; //T4工作模式:UART1波特率發生器/*T4計數+1時間 = T4時鐘/T4分頻/16波特率+1信號時間 = 1/9600(波特率)---[9600波特率是每秒傳輸9600個0/1電平信號]初值 = T4計數+1時間/波特率+1信號時間*/TH4 = 0xFF;TL4 = 0x98; //波特率9600SCON2 = 0x02; //8位UART,波特率可變SCON = 0x10; //允許串行接收IE |= 0X10; //使能串口中斷 }/*** @name */ void UART1_Rpt(void) interrupt UART1_VECTOR {if(SCON & 0x01) //判斷接收中斷標志位{if (rx_timeout.flag) //超時return;else {rx_timeout.start = 1; //開啟超時rx_timeout._10ms = 10; //重置定時器時間Rx_Start = 1; //開始接收}RecBuff[RxCount++] = SBUF;//轉存8位串口接收數據if(RxCount >= 15){SCON &=~ 0x10; //失能UART1接收Rx_Done = 1;}SCON &=~ 0x01; //清除接收中斷標志位} }/*** @name Rx_Proc[接收包處理]*/ void Rx_Proc(void) {if (Rx_Start == 0)return;if (rx_timeout.flag) //接收超時,相當于接收完成,需要對接收準備復原{rx_timeout.flag = 0;RxCount = 0;Rx_Done = 1;SCON &=~ 0x10; //失能UART1接收Rx_Start = 0;}if(Rx_Done){LCD_Clear();if (strcmp((uint8_t*)RecBuff,"ON")==0){LCD_Display_Words(0, 0, "開燈:");LCD_Display_Words(0, 3, RecBuff);P2_2 = 0;}else if (strcmp((uint8_t*)RecBuff,"OFF")==0){LCD_Display_Words(0, 0, "關燈:");LCD_Display_Words(0, 3, RecBuff);P2_2 = 1;}else{LCD_Display_Words(0, 0, "未知命令:");LCD_Display_Words(0, 5, RecBuff);}Rx_Done = 0;RxCount = 0; //接收指針復位memset(RecBuff, 0, sizeof(RecBuff));SCON |= 0x10; //允許串行接收} }這里面的接收采用的是一個10ms的超時檢測,在收到第一個字節后開始10ms超時檢測,10ms后沒有收到字節認為接收完成,同時結合LCD顯示
bt.h
#ifndef _BT_H_ #define _BT_H_#include "public.h"#define LED P2_2extern xdata uint8_t RecBuff[15];void Bt_Init(void); void Rx_Proc(void);#endiftime.c[粗糙軟定時器]
#include "time.h"xdata RX_TIMEOUT rx_timeout;/*** @name Timer_Init[定時器初始化]*/ void Timer_Init(void) {TCON1 = 0x00; //Tx0定時器時鐘為FoscTMOD = 0x00; //16位重裝載定時器/計數器TH0 = (65536-1333) / 256; //256是0xFF,大于0xFF的都是256的商TL0 = (65536-1333) % 256; //T0定時時間1msIE |= 0x02; //打開T0中斷TCON |= 0x10; //使能T0rx_timeout.flag = 0; }/*** @name 定時器中斷*/ void TIMER0_Rpt(void) interrupt TIMER0_VECTOR {if (rx_timeout.start)rx_timeout._10ms--;if (rx_timeout._10ms == 0){rx_timeout.flag = 1;rx_timeout._10ms = 10;rx_timeout.start = 0;} }time.h
#ifndef _TIME_H_ #define _TIME_H_#include "public.h"typedef struct{uint8_t _10ms;uint8_t flag:1;uint8_t start:1; }RX_TIMEOUT;extern xdata RX_TIMEOUT rx_timeout;void Timer_Init(void);#endif基本上代碼就是這樣了,LCD顯示的代碼
總結
- 上一篇: 兔子生兔子循环python_python
- 下一篇: 服务器磁盘显示RAW,高手解决u盘盘符打