2021年STM32課程設計


描述

基於正點原子STM32F103戰艦開發板,實現功能:

  1. 光敏傳感器采集環境光線強度,單片機通過PWM輸出控制LED亮度
  2. DHT11傳感器采集環境溫濕度,顯示在LCD屏幕上和通過藍牙模塊發送
  3. 藍牙模塊無線控制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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM