基于stm32的温湿度检测案例串口通信屏显示(二)
生活随笔
收集整理的這篇文章主要介紹了
基于stm32的温湿度检测案例串口通信屏显示(二)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
前言
一、串口通信屏幕
二、DHT11測(cè)試效果與說(shuō)明
?三、讀入數(shù)據(jù)
四、串口及中斷配置
五、屏幕上顯示數(shù)據(jù)
5.1、屏幕內(nèi)嵌指令
5.2、靜態(tài)數(shù)據(jù)
5.3、動(dòng)態(tài)數(shù)據(jù)
六、效果
前言
因?yàn)閟tm32f042最小單片機(jī)系統(tǒng)外部引腳資源較少,故選取另外一款最小單片機(jī)系統(tǒng)stm32f103c8t6,承接前一章基于stm32的溫濕度檢測(cè)案例(一),加入串口通信屏幕將DHT11采集的數(shù)據(jù)在串口屏幕上顯示。使用USART2向屏幕發(fā)送數(shù)據(jù),屏幕將接收到的數(shù)據(jù)解析并顯示。
一、串口通信屏幕
1.44 寸集成串口屏是一款串口屏模塊,點(diǎn)陣分辨率是 128x128。其內(nèi)置國(guó)標(biāo)一級(jí)、二級(jí)簡(jiǎn) 體中文字庫(kù)和英文 ASCII 字符集,同時(shí)開(kāi)放內(nèi)部點(diǎn)陣 DDRAM,能夠在屏幕上的任意位置顯示 圖片及圖形。硬件上它提供 UART 接口方式,接線簡(jiǎn)單。二、DHT11測(cè)試效果與說(shuō)明
DHT11溫度濕度檢測(cè)模塊,是檢測(cè)不到溫濕度的小數(shù)位滴。
?三、讀入數(shù)據(jù)
#include "public.h"/*********************************************局部方法聲明*********************************************/ void DHT11_GPIO_Out(void); void DHT11_GPIO_In(void); void DHT11_StructInit(void); st_u8 DHT11_ReadByte ( void );/*********************************************方法定義*********************************************/ /*********************************************初始化部分*********************************************/ void DHT11_StructInit(void) {DHT11_Data.humi_int=0x00;DHT11_Data.humi_deci = 0x00;DHT11_Data.humi_int = 0x00;DHT11_Data.temp_deci=0x00;DHT11_Data.check_sum = 0x00; }void DHT11_Init(void) {DHT11_StructInit();DHT11_GPIO_Out();//GPIOSet(Debug1_DHT11_PORT, Debug1_DHT11_PIN,1);DHT11_H; } /*********************************************方法定義*********************************************/ // 輸出配置 void DHT11_GPIO_Out(void) {// 時(shí)鐘 端口 引腳 輸出模式 通用推挽輸出 GPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_Out_PP); }// 輸入配置 void DHT11_GPIO_In(void) {// 時(shí)鐘 端口 引腳 輸入模式 GPIO_Mode_IN_FLOATING// GPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_IN_FLOATING);// GPIO_Mode_IPUGPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_IPU); }/* * 從DHT11讀取一個(gè)字節(jié),MSB先行*/st_u8 DHT11_ReadByte ( void ) {st_u8 i, temp=0;for(i=0;i<8;i++) { /*每bit以50us低電平標(biāo)置開(kāi)始,輪詢(xún)直到從機(jī)發(fā)出 的50us 低電平 結(jié)束*/ while(DHT11_Input==Bit_RESET);/*DHT11 以26~28us的高電平表示“0”,以70us高電平表示“1”,*通過(guò)檢測(cè) x us后的電平即可區(qū)別這兩個(gè)狀 ,x 即下面的延時(shí) */delay_us(40); //延時(shí)x us 這個(gè)延時(shí)需要大于數(shù)據(jù)0持續(xù)的時(shí)間即可 if(DHT11_Input==Bit_SET)/* x us后仍為高電平表示數(shù)據(jù)“1” */{/* 等待數(shù)據(jù)1的高電平結(jié)束 */while(DHT11_Input==Bit_SET);temp|=(st_u8)(0x01<<(7-i)); //把第7-i位置1,MSB先行 }else // x us后為低電平表示數(shù)據(jù)“0”{ temp&=(st_u8)~(0x01<<(7-i)); //把第7-i位置0,MSB先行 高位先出。 高位 1111 1111 地位 左邊高位,右邊地位 }}return temp; }/** 一次完整的數(shù)據(jù)傳輸為40bit,高位先出* 8bit 濕度整數(shù) + 8bit 濕度小數(shù) + 8bit 溫度整數(shù) + 8bit 溫度小數(shù) + 8bit 校驗(yàn)和 */ st_u8 DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data) { /*輸出模式*/DHT11_GPIO_Out();/*主機(jī)拉低*/DHT11_L;/*延時(shí)18ms*/delay_ms(18);/*總線拉高 主機(jī)延時(shí)30us*/DHT11_H; delay_us(30); //延時(shí)30us/*主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)*/ DHT11_GPIO_In();/*判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行*/ if(DHT11_Input==Bit_RESET) {/*輪詢(xún)直到從機(jī)發(fā)出 的80us 低電平 響應(yīng)信號(hào)結(jié)束*/ while(DHT11_Input==Bit_RESET);/*輪詢(xún)直到從機(jī)發(fā)出的 80us 高電平 標(biāo)置信號(hào)結(jié)束*/while(DHT11_Input==Bit_SET);/*開(kāi)始接收數(shù)據(jù)*/ DHT11_Data->humi_int= DHT11_ReadByte();DHT11_Data->humi_deci= DHT11_ReadByte();DHT11_Data->temp_int= DHT11_ReadByte();DHT11_Data->temp_deci= DHT11_ReadByte();DHT11_Data->check_sum= DHT11_ReadByte();/*讀取結(jié)束,引腳改為輸出模式*/DHT11_GPIO_Out();/*主機(jī)拉高*/DHT11_H;/*檢查讀取的數(shù)據(jù)是否正確*/// 一次完整的數(shù)據(jù)傳輸為40bit,高位先出。數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)和if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)return SUCCESS;else return ERROR;}elsereturn ERROR; } /*********************************************測(cè)試部分*********************************************/ void DHT11_Test1(void) {//int humi_buf[3]; // 濕度//int temp_buf[3]; // 溫度/*調(diào)用DHT11_Read_TempAndHumidity讀取溫濕度,若成功則輸出該信息*/if( DHT11_Read_TempAndHumidity (&DHT11_Data) == SUCCESS){//printf("\r\n讀取DHT11成功!\r\n\r\n濕度為%d.%d %RH ,溫度為 %d.%d℃ \r\n",\// DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci);// 濕度轉(zhuǎn) 十六進(jìn)制轉(zhuǎn)換為十進(jìn)制//humi_buf[0]= DHT11_Data.humi_int/100+0x30;//humi_buf[0]= DHT11_Data.humi_int/10+0x30;// humi_buf[1]= DHT11_Data.humi_int%10+0x30;//humi_buf[2]= '0';printf("濕度:%d\r\n 溫度:%d\r\n",DHT11_Data.humi_int,DHT11_Data.temp_int);// 濕度 十六進(jìn)制轉(zhuǎn)換為十進(jìn)制//temp_buf[0]= DHT11_Data.humi_int/100+0x30;//temp_buf[1]= DHT11_Data.humi_int/10+0x30;//temp_buf[2]= DHT11_Data.humi_int%10+0x30;//printf("溫度:%d\r\n",DHT11_Data.humi_int);} else{printf("Read DHT11 ERROR!\r\n");}delay_ms(20000); }四、串口及中斷配置
/********************************************* 中斷優(yōu)先級(jí)配置*********************************************/ // 中斷分組配置 NVIC_PriorityGroupConfig void NVIC_PG_Config(st_u32 PG) { /*中斷分組號(hào) 搶占式優(yōu)先級(jí) 子優(yōu)先級(jí)配置/響應(yīng)式優(yōu)先級(jí) 分配位數(shù)0 0 0-15 搶0bit 響4bit(1111)1 0~1 0~7 搶1bit 響3bit(0111) 2 0~3 0~3 搶2bit 響2bit(0011)3 0~7 0~1 搶3bit 響1bit(0001)4 0~15 0 搶4bit 響0bit(0000)特征:在搶占式優(yōu)先級(jí)相同的情況下,高響應(yīng)優(yōu)先級(jí)的中斷優(yōu)先被響應(yīng)。搶占式優(yōu)先級(jí)數(shù)值越小,優(yōu)先級(jí)越高*/if(PG==NVIC_PriorityGroup_0){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);}else if(PG==NVIC_PriorityGroup_1){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);}else if(PG==NVIC_PriorityGroup_2) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);} else if(PG==NVIC_PriorityGroup_3){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);}else if(PG==NVIC_PriorityGroup_4){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);}else{printf("%s","沒(méi)有使用中斷分組\r\n");} } // 中斷優(yōu)先級(jí)配置 void NVIC_Config(st_u8 IRQn,st_u8 IRQChannelPriority,st_u8 IRQChannelSubPriority) {NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =IRQChannelPriority; // 搶占式優(yōu)先級(jí) 0~15NVIC_InitStructure.NVIC_IRQChannelSubPriority =IRQChannelSubPriority ; // 子優(yōu)先級(jí) 0~15NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); }/*********************************************串口配置*********************************************/ void USART_Config(st_u32 BaudRate,USART_TypeDef* USARTx) {USART_InitTypeDef USART_InitStructure;if(USARTx==USART1)RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);if(USARTx==USART2)RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);/* USART1工作模式配置 */USART_InitStructure.USART_BaudRate = BaudRate; //波特率設(shè)置:USART_InitStructure.USART_WordLength = USART_WordLength_8b; //數(shù)據(jù)位數(shù)設(shè)置:8位USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位設(shè)置:1位USART_InitStructure.USART_Parity = USART_Parity_No ; //是否奇偶校驗(yàn):無(wú)USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制模式設(shè)置:沒(méi)有使能USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接收與發(fā)送都使能USART_Init(USARTx, &USART_InitStructure); //初始化USART1// 使能串口接收中斷USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); // 使能中斷發(fā)送USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);USART_Cmd(USARTx, ENABLE); // USART使能 }五、屏幕上顯示數(shù)據(jù)
5.1、屏幕內(nèi)嵌指令
// 清屏背景顏色 void LCD_CLR(void) {st_u8 LCDDIR[]={"CLR(15);"};LCDUSART2_TX(LCDDIR);delay_ms(100); }// 背景顏色 void LCD_SBC(void) {st_u8 LCDSBC[] = {"SBC(15);"};LCDUSART2_TX(LCDSBC);delay_ms(100); }// 設(shè)置背景燈光的亮度 void LCDBL(void) {// 0~255 0亮度最高 255 關(guān)閉顯示st_u8 LCDBL[]={"BL(30);"};LCDUSART2_TX(LCDBL);delay_ms(100); }5.2、靜態(tài)數(shù)據(jù)
// 靜態(tài)數(shù)據(jù) void TempHumi_static(void) {//unsigned char i;// 指令設(shè)置 清除背景內(nèi)容 豎向布局 白色背景顏色unsigned char PreInit[] = {"CLR(15);DIR(0);SBC(15)"};unsigned char PreInit1[] = {"CLR(15);DIR(0);SBC(15)"};LCDUSART2_TX(PreInit);delay_ms(100);LCDUSART2_TX(PreInit1);delay_ms(100);// TempHumi_STPE(0x09); // delay_ms(100); // // TempHumi_STPE(0x0A); // delay_ms(100); // // TempHumi_STPE(0x0B); // delay_ms(100); // // TempHumi_STPE(0x0C); // delay_ms(100); // // TempHumi_STPE(0x0D); // delay_ms(100); // // TempHumi_STPE(0x0E); // delay_ms(100); // // TempHumi_STPE(0x0F); // delay_ms(100);for(unsigned char i=0x09;i<=0x0F;i++){TempHumi_STPE(i);delay_ms(100);} } // 溫濕度界面 靜態(tài) void TempHumi_STPE(st_u8 TempHumi_SINFO) {unsigned char Style[] = {"PL(0,62,127,62,1);PL(60,0,60,128,1)"}; unsigned char HD_V[] = {"DC16(0,0,'HD_V:',1)"};unsigned char SF_V[] = {"DC16(64,0,'SF_V:',1)"};unsigned char Temp[] = {"DC16(0,64,'溫度:',1)"};unsigned char Temp_unit[] ={"DC16(20,84,'℃',1)"};unsigned char Humi[] = {"DC16(64,64,'濕度:',1)"};unsigned char Humi_unit[] = {"DC16(100,84,'%',1)"};switch(TempHumi_SINFO) {case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x09: // 濕度單位LCDUSART2_TX(Humi_unit);TempHumi_SINFO++;break;case 0x0A: // 溫度單位LCDUSART2_TX(Temp_unit);TempHumi_SINFO++;break;case 0x0B: // 樣式LCDUSART2_TX(Style);TempHumi_SINFO++;break;case 0x0C: // 硬件版本//LCDUSART2_TX("DC16(0,0,'HD_V:',1);");LCDUSART2_TX(HD_V);TempHumi_SINFO++;break;case 0x0D: // 軟件版本LCDUSART2_TX(SF_V); TempHumi_SINFO++;break;case 0x0E: // 溫度LCDUSART2_TX(Temp);TempHumi_SINFO++;break;case 0x0F: // 濕度LCDUSART2_TX(Humi);TempHumi_SINFO++;break;default://LCD_Show=TempHumi_State;break;} }5.3、動(dòng)態(tài)數(shù)據(jù)
// 動(dòng)態(tài)數(shù)據(jù) void TempHumi_Dynamic_Step(st_u8 Debug_Data) {switch(Debug_Data){case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x09:case 0x0A:case 0x0B:case 0x0C: // 硬件版本顯示GetHD_ID(ChipUniqueID[0],0,20);break;case 0x0D: // 軟件版本LCDDisSfVersion();break;case 0x0E: // 溫度顯示// TempHumi_Value(0,84,DHT11_Data.temp_int); // TempHumi_Data_DC16Boxf(DHT11_Data.temp_int,0,84);TempHumi_Data_DC16Boxf(Thic.Temp,0,84); break;case 0x0F: // 濕度顯示// TempHumi_Data_DC16Boxf(Thic.Humi,64,84); // TempHumi_Data_DC16Boxf(Thic.Humi,64,84);// TempHumi_Value(64,84,DHT11_Data.humi_int);Data_Show_Position(Thic.Humi,64,84);break;default:break;} } // 動(dòng)態(tài)數(shù)據(jù) void TempHumi_Dynamic(void) {TempHumi_Dynamic_Step(0x0C); // 硬件版本號(hào)delay_ms(100);TempHumi_Dynamic_Step(0x0D); // 軟件件版本號(hào)delay_ms(100);TempHumi_Dynamic_Step(0x0E); // 溫度顯示delay_ms(1000); // 延時(shí)太短只上一個(gè)數(shù)據(jù)TempHumi_Dynamic_Step(0x0F); // 濕度顯示delay_ms(1000);// for(unsigned char i=0x0C;i<=0x0F;i++) // { // TempHumi_Dynamic_Step(i); // delay_ms(100); // }}六、效果
效果視頻
總結(jié)
以上是生活随笔為你收集整理的基于stm32的温湿度检测案例串口通信屏显示(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 银河麒麟服务器修改ip,银河麒麟配置DN
- 下一篇: 32/64位处理器、操作系统、应用程序和