描述
基於正點原子STM32F103戰艦開發板,實現功能:
- 光敏傳感器采集環境光線強度,單片機通過PWM輸出控制LED亮度
- DHT11傳感器采集環境溫濕度,顯示在LCD屏幕上和通過藍牙模塊發送
- 藍牙模塊無線控制LED開關
硬件配置
DHT11
四腳的直接插入預留的DHT11接口,三腳的使用轉接線連接到接口,沒有連接到預留DHT11接口,程序是無法正常運行的
HC05
用杜邦線將HC05模塊連接到USB轉TTL
HC05 |
STATE | RXD | TXD | GND | VCC | EN |
---|---|---|---|---|---|---|
USB轉TTL | TXD | RXD | GND | 5V | 3.3V |
連接到安裝了CH340串口驅動的個人計算機。如果HC05的紅色指示燈長亮,閃爍間隔在1s左右,則說明模塊已進入AT模式。使用串口調試軟件,設定發送波特率為38400,發送AT指令,其中最關鍵的是設置波特率為9600,詳細內容附在鏈接當中
藍牙模塊連接,到開發板
HC05 |
STATE | RXD | TXD | GND | VCC | EN |
---|---|---|---|---|---|---|
開發板 | PA4 | PA3 | PA2 | GND | 5V | PC4 |
軟件設計
HC05
hc05.c
#include "hc05.h"
#include "usart2.h"
#include "delay.h"
#include "lcd.h"
//初始化HC05模塊
//返回值:0,成功;1,失敗
u8 HC05_Init(void) {
u8 t;
u8 retry = 10;
u8 temp = 1;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_EN|RCC_STATE,ENABLE); //使能PORTA C時鍾
GPIO_InitStructure.GPIO_Pin = STATE_Pin; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定參數初始化PA4
GPIO_InitStructure.GPIO_Pin = EN_Pin; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根據設定參數初始化PC4
GPIO_SetBits(GPIOC,EN_Pin);
USART2_Init(9600); //初始化串口2的波特率為:9600
delay_ms(1500);
while ( retry-- ) {
HC05_EN = 1; //PC4置高,進入AT模式
delay_ms(10);
u2_printf("AT\r\n"); //發送AT測試指令
HC05_EN = 0; //PC4拉低,退出AT模式
for ( t = 0; t < 10; t++ ) { //最長等待50ms,來接收HC05模塊的回應
if ( USART2_RX_STA & 0X8000 ) {
break;
}
delay_ms(5);
}
if ( USART2_RX_STA & 0X8000 ) { //接收到一次數據了
temp = USART2_RX_STA & 0X7FFF; //得到數據長度
USART2_RX_STA = 0;
if ( temp == 4 && USART2_RX_BUF[0] == 'O' && USART2_RX_BUF[1] == 'K' ) { //接收到OK響應
temp=0;
break;
}
}
}
if ( retry == 0 ) {
temp=1; //檢測失敗
}
return temp;
}
//獲取ATK-HC05模塊的角色
//返回值:0,從機;1,主機;0XFF,獲取失敗
u8 HC05_Get_Role(void)
{
u8 retry = 0X0F;
u8 temp;
u8 t;
while ( retry-- ) {
HC05_EN = 1; //KEY置高,進入AT模式
delay_ms(10);
u2_printf("AT+ROLE?\r\n"); //查詢角色
for( t = 0; t < 20; t++ ) { //最長等待200ms,來接收HC05模塊的回應
delay_ms(10);
if ( USART2_RX_STA & 0X8000 ) {
break;
}
}
HC05_EN = 0; //KEY拉低,退出AT模式
if ( USART2_RX_STA & 0X8000 ) { //接收到一次數據了
temp = USART2_RX_STA & 0X7FFF; //得到數據長度
USART2_RX_STA = 0;
if ( temp == 13 && USART2_RX_BUF[0] == '+' ) { //接收到正確的應答了
temp = USART2_RX_BUF[6] - '0'; //得到主從模式值
break;
}
}
}
if ( retry == 0 ) {
temp = 0XFF;//查詢失敗
}
return temp;
}
//ATK-HC05設置命令
//此函數用於設置ATK-HC05,適用於僅返回OK應答的AT指令
//atstr:AT指令串.比如:"AT+RESET"/"AT+UART=9600,0,0"/"AT+ROLE=0"等字符串
//返回值:0,設置成功;其他,設置失敗.
u8 HC05_Set_Cmd(u8* atstr)
{
u8 retry = 0X0F;
u8 temp;
u8 t;
while ( retry-- ) {
HC05_EN = 1; //PC4置高,進入AT模式
delay_ms(10);
u2_printf("%s\r\n",atstr); //發送AT字符串
HC05_EN = 0; //PC4拉低,退出AT模式
for ( t = 0; t < 20; t++ ) { //最長等待100ms,來接收HC05模塊的回應
if ( USART2_RX_STA & 0X8000 ) {
break;
}
delay_ms(5);
}
if ( USART2_RX_STA & 0X8000 ) { //接收到一次數據了
temp = USART2_RX_STA & 0X7FFF; //得到數據長度
USART2_RX_STA = 0;
if ( temp == 4 && USART2_RX_BUF[0] == 'O' ) { //接收到OK應答了
temp = 0;
break;
}
}
}
if ( retry == 0 ) {
temp = 0XFF;//設置失敗
}
return temp;
}
//顯示ATK-HC05模塊的主從狀態
void HC05_Role_Show(void)
{
if ( HC05_Get_Role() == 1 ) {
LCD_ShowString(30,150,200,16,16,(u8*)"ROLE:Master"); //主機
} else {
LCD_ShowString(30,150,200,16,16,(u8*)"ROLE:Slave "); //從機
}
}
//顯示ATK-HC05模塊的連接狀態
void HC05_Sta_Show(void)
{
if ( HC05_STATE ){ //檢測PA4引腳
LCD_ShowString(120,150,120,16,16,(u8*)"STA:Connected "); //連接成功
}else{
LCD_ShowString(120,150,120,16,16,(u8*)"STA:Disconnect"); //未連接
}
}
hc05.h
#ifndef __HC05_H
#define __HC05_H
#include "sys.h"
//連接模塊GPIO相關參數的一層封裝
//**********************************************************************************
#define RCC_STATE RCC_APB2Periph_GPIOA
#define RCC_EN RCC_APB2Periph_GPIOC
#define STATE_Pin GPIO_Pin_4
#define EN_Pin GPIO_Pin_4
//**********************************************************************************
#define HC05_EN PCout(4) //藍牙控制EN信號
#define HC05_STATE PAin(4) //藍牙連接狀態信號
u8 HC05_Init(void);
//void HC05_CFG_CMD(u8 *str);
u8 HC05_Get_Role(void);
u8 HC05_Set_Cmd(u8* atstr);
void HC05_Role_Show(void);
void HC05_Sta_Show(void);
#endif
USART2
usart2.c
#include "usart2.h"
//串口發送緩存區
__align(8) u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; //發送緩沖,最大USART2_MAX_SEND_LEN字節
#ifdef USART2_RX_EN //如果使能了接收
//串口接收緩存區
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //接收緩沖,最大USART2_MAX_RECV_LEN個字節.
//通過判斷接收連續2個字符之間的時間差不大於10ms來決定是不是一次連續的數據.
//如果2個字符接收間隔超過10ms,則認為不是1次連續數據.也就是超過10ms沒有接收到
//任何數據,則表示此次接收完畢.
//接收到的數據狀態
//[15]:0,沒有接收到數據;1,接收到了一批數據.
//[14:0]:接收到的數據長度
u16 USART2_RX_STA = 0;
void USART2_IRQHandler(void) //接收函數
{
u8 res;
if ( USART_GetITStatus( USART2, USART_IT_RXNE ) != RESET ) { //接收到數據 引起中斷
res = USART_ReceiveData(USART2); //從串口2讀取數據
if ( ( USART2_RX_STA & (1<<15) ) == 0 ) {
if ( USART2_RX_STA < USART2_MAX_RECV_LEN ) { //還可以接收數據
TIM_SetCounter(TIM4,0); //計數器清空
if ( USART2_RX_STA == 0 ) {
TIM4_Set(1); //使能定時器4的中斷
}
USART2_RX_BUF[USART2_RX_STA++] = res; //記錄接收到的值
} else {
USART2_RX_STA |= 1<<15; //強制標記接收完成
}
}
}
}
//初始化USART2
//bound:波特率
void USART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_USART,ENABLE);
RCC_APB2PeriphClockCmd(RCC_TX,ENABLE);
RCC_APB2PeriphClockCmd(RCC_RX,ENABLE);
USART_DeInit(USART); //復位串口
//UART2_TX PA.2
GPIO_InitStructure.GPIO_Pin=USART_TX_Pin;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//USART2_RX PA.3
GPIO_InitStructure.GPIO_Pin=USART_RX_Pin;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;//一般設置為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(USART,&USART_InitStructure); //初始化串口
USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE); //使能串口2的DMA發送
UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF);//DMA1通道7,外設為串口2,存儲器為USART2_TX_BUF
USART_Cmd(USART2, ENABLE); //使能串口
#ifdef USART2_RX_EN //如果使能了接收
//使能接收中斷
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//開啟中斷
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//搶占優先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器
TIM4_Init(99,7199); //10ms中斷
USART2_RX_STA = 0; //清零
TIM4_Set(0); //關閉定時器4
#endif
}
//arr:自動重裝值。
//psc:時鍾預分頻數
void TIM4_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //時鍾使能//TIM4時鍾使能
//定時器TIM4初始化
TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鍾頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鍾分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根據指定的參數初始化TIMx的時間基數單位
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中斷,允許更新中斷
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//搶占優先級1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子優先級2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器
}
//定時器4中斷服務程序
void TIM4_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET ) {
USART2_RX_STA |= 1<<15; //標記接收完成
TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除TIMx更新中斷標志
TIM4_Set(0); //關閉TIM4
}
}
//設置TIM4的開關
//sta:0,關閉;1,開啟;
void TIM4_Set(u8 sta)
{
if ( sta ) {
TIM_SetCounter(TIM4,0);//計數器清空
TIM_Cmd(TIM4, ENABLE); //使能TIMx
} else {
TIM_Cmd(TIM4, DISABLE);//關閉定時器4
}
}
//串口2,printf 函數
//確保一次發送數據不超過USART2_MAX_SEND_LEN字節
void u2_printf(char* fmt,...)
{
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART2_TX_BUF,fmt,ap);
va_end(ap);
while ( DMA_GetCurrDataCounter(DMA1_Channel7) != 0 ) {
;//等待通道7傳輸完成
}
UART_DMA_Enable(DMA1_Channel7,strlen((const char*)USART2_TX_BUF)); //通過dma發送出去
}
#endif
//DMA1的各通道配置
//這里的傳輸形式是固定的,這點要根據不同的情況來修改
//從存儲器->外設模式/8位數據寬度/存儲器增量模式
//DMA_CHx:DMA通道CHx
//cpar:外設地址
//cmar:存儲器地址
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA傳輸
DMA_DeInit(DMA_CHx); //將DMA的通道1寄存器重設為缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外設ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA內存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //數據傳輸方向,從內存讀取發送到外設
DMA_InitStructure.DMA_BufferSize = 0; //DMA通道的DMA緩存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設地址寄存器不變
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內存地址寄存器遞增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //數據寬度為8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //數據寬度為8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常緩存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x擁有中優先級
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x沒有設置為內存到內存傳輸
DMA_Init(DMA_CHx, &DMA_InitStructure); //根據DMA_InitStruct中指定的參數初始化DMA的通道USART1_Tx_DMA_Channel所標識的寄存器
}
//開啟一次DMA傳輸
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
{
DMA_Cmd(DMA_CHx, DISABLE ); //關閉 指示的通道
DMA_SetCurrDataCounter(DMA_CHx,len);//DMA通道的DMA緩存的大小
DMA_Cmd(DMA_CHx, ENABLE); //開啟DMA傳輸
}
usart2.h
#ifndef __USART2_H
#define __USART2_H
#include "sys.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
//對USART2相關參數的一層封裝
//**********************************************************************************
#define RCC_USART RCC_APB1Periph_USART2
#define RCC_TX RCC_APB2Periph_GPIOA
#define RCC_RX RCC_APB2Periph_GPIOA
#define USART USART2
#define USART_TX_Pin GPIO_Pin_2; //USART2_TX PA.2
#define USART_RX_Pin GPIO_Pin_3; //USART2_RX PA.3
//**********************************************************************************
#define USART2_MAX_RECV_LEN 200 //最大接收緩存字節數
#define USART2_MAX_SEND_LEN 200 //最大發送緩存字節數
#define USART2_RX_EN 1 //0,不接收;1,接收.
extern u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //接收緩沖,最大USART2_MAX_RECV_LEN字節
extern u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; //發送緩沖,最大USART2_MAX_SEND_LEN字節
extern u16 USART2_RX_STA; //接收數據狀態
void USART2_Init(u32 bound);
void TIM4_Set(u8 sta);
void TIM4_Init(u16 arr,u16 psc);
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar);
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len);
void u2_printf(char* fmt, ...);
#endif
main.c
主函數里面用到的一些例如delay
延時等,都是調用正點原子的編寫的庫函數,自行添加
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "adc.h"
#include "lsens.h"
#include "timer.h"
#include "dht11.h"
#include "string.h"
#include "hc05.h"
#include "usart2.h"
int main(void) {
u8 t; //計數器
u8 temperature; //溫度
u8 humidity; //濕度
u8 adcx; //光敏數值
u8 key; //按鍵信息
u8 sendmask = 0; //自動/開啟發送命令
u8 sendbuf[20]; //發送緩沖區
u8 reclen = 0;
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
uart_init(9600); //串口初始化為9600
LED_Init(); //初始化與LED連接的硬件接口
KEY_Init(); //初始化按鍵
LCD_Init(); //初始化LCD
Lsens_Init(); //初始化光敏傳感器
POINT_COLOR = RED; //設置LCD屏幕畫筆為紅色
LCD_ShowString(30,30,200,16,16,(u8*)"SMART WINE CABINET"); //顯示設計項目名字
//等待DHT11的回應
//返回1:未檢測到DHT11的存在
//返回0:存在
while ( DHT11_Init() ) {
LCD_ShowString(30,70,200,16,16,(u8*)"DHT11 Error"); //顯示錯誤信息
delay_ms(200);
LCD_Fill(30,70,239,130+16,WHITE); //清除錯誤信息 再次檢測DHT11是否存在
delay_ms(200);
}
LCD_ShowString(30,70,200,16,16,(u8*)"Ligh:"); //光強數值提示信息
LCD_ShowString(30,90,200,16,16,(u8*)"Temp: C"); //顯示溫度格式
LCD_ShowString(30,110,200,16,16,(u8*)"Humi: %"); //顯示濕度格式
TIM3_PWM_Init(899, 0); //初始化TIM3定時器 紅燈亮起
//不分頻 PWM頻率=72000000/900=80Khz
//初始化HC05模塊
//返回0 成功
//返回1 失敗
while ( HC05_Init() ) {
LCD_ShowString(30,150,200,16,16,(u8*)"HC05 Error!"); //顯示錯誤信息
delay_ms(500);
LCD_Fill(30,150,240,230,WHITE);
delay_ms(100);
}
POINT_COLOR = BLUE; //設置LCD畫筆為藍色
HC05_Role_Show(); //顯示藍牙工作模式
HC05_Sta_Show(); //顯示藍牙連接狀態
LCD_ShowString(30,170,200,16,16,(u8*)"Send:");
LCD_ShowString(30,190,200,16,16,(u8*)"Receive:");
delay_ms(100);
USART2_RX_STA = 0; //藍牙模塊初始化的時候 和串口是有通信的 預先將接收標志清零 避免誤處理AT設置信息
while ( 1 ) {
adcx = Lsens_Get_Val(); //獲取環境光線數值
LCD_ShowxNum(30+40,70,adcx,3,16,0); //顯示環境光線數值
if ( t % 10 == 0 ){
DHT11_Read_Data(&temperature,&humidity); //讀取溫濕度值
LCD_ShowNum(30+40,90,temperature,2,16); //顯示溫度
LCD_ShowNum(30+40,110,humidity,2,16); //顯示濕度
}
TIM_SetCompare2(TIM3,300-3*adcx); //PWM輸出控制LED0亮度
key = KEY_Scan(0); //按鍵處理函數 返回按鍵值
switch ( key ) {
case WKUP_PRES: //按下KEY_UP則切換藍牙工作模式
key = HC05_Get_Role(); //獲取當前藍牙模塊工作模式
if ( key != 0xFF ) { //如果key為0xff則說明工作模式獲取失敗
if ( key ) {
HC05_Set_Cmd((u8*)"AT+ROLE=0");//發送AT指令給藍牙模塊 設置為從模式
} else {
HC05_Set_Cmd((u8*)"AT+ROLE=1");//設置為主模式
}
}
HC05_Role_Show(); //顯示藍牙模塊當前的工作模式
HC05_Set_Cmd((u8*)"AT+RESET"); //復位HC05模塊
delay_ms(200);
break;
case KEY0_PRES:
sendmask = !sendmask; //開啟或關閉自動發送
if ( sendmask == 0 ) {
LCD_Fill(30+40,170,30+40+210,170+20,WHITE);//清除顯示
}
break;
default:
break;
}
if ( t == 10 ) { //定時發送
if ( sendmask ){ //自動發送開啟的時候
sprintf((char*)sendbuf,"G%dS%dW%d\r\n", adcx, humidity, temperature); //將格式字符串寫入發送緩沖區
LCD_ShowString(30+40,170,200,16,16,sendbuf); //顯示發送數據
u2_printf("G%uS%uW%u", adcx, humidity, temperature); //向串口2發送數據
}
HC05_Sta_Show(); //顯示HC05模塊的連接狀態
t = 0;
}
if ( USART2_RX_STA & 0X8000 ) { //接收到一次數據了
LCD_Fill(30,210,320,320,WHITE); //清除顯示
reclen = USART2_RX_STA & 0X7FFF; //得到數據長度
USART2_RX_BUF[reclen] = 0; //加入結束符
if ( reclen == 9 || reclen == 8 ) {
if ( strcmp((const char*)USART2_RX_BUF,"+LED1 ON") == 0 ) { //檢測到收到了開啟LED1的信息
LED1 = 0; //打開LED1
}
if ( strcmp((const char*)USART2_RX_BUF,"+LED1 OFF") == 0 ) { //檢測到收到了關閉LED1的信息
LED1 = 1; //關閉LED1
}
}
LCD_ShowString(30,210,200,16,16,USART2_RX_BUF); //顯示接收到的數據
USART2_RX_STA = 0; //接收標志清零
memset(USART2_RX_BUF, 0, USART2_MAX_RECV_LEN); //接收標志清零不夠 用memset把整個緩沖區置零
}
t++;
}
}
鏈接
https://gitee.com/wwiandmc/space/tree/master/smart wine cabinet