日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于stm32的温湿度检测案例串口通信屏显示(二)

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于stm32的温湿度检测案例串口通信屏显示(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

前言

一、串口通信屏幕

二、DHT11測試效果與說明

?三、讀入數據

四、串口及中斷配置

五、屏幕上顯示數據

5.1、屏幕內嵌指令

5.2、靜態數據

5.3、動態數據

六、效果


前言

因為stm32f042最小單片機系統外部引腳資源較少,故選取另外一款最小單片機系統stm32f103c8t6,承接前一章基于stm32的溫濕度檢測案例(一),加入串口通信屏幕將DHT11采集的數據在串口屏幕上顯示。使用USART2向屏幕發送數據,屏幕將接收到的數據解析并顯示。

一、串口通信屏幕

1.44 寸集成串口屏是一款串口屏模塊,點陣分辨率是 128x128。其內置國標一級、二級簡 體中文字庫和英文 ASCII 字符集,同時開放內部點陣 DDRAM,能夠在屏幕上的任意位置顯示 圖片及圖形。硬件上它提供 UART 接口方式,接線簡單。

二、DHT11測試效果與說明

DHT11溫度濕度檢測模塊,是檢測不到溫濕度的小數位滴。

?三、讀入數據

#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) {// 時鐘 端口 引腳 輸出模式 通用推挽輸出 GPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_Out_PP); }// 輸入配置 void DHT11_GPIO_In(void) {// 時鐘 端口 引腳 輸入模式 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讀取一個字節,MSB先行*/st_u8 DHT11_ReadByte ( void ) {st_u8 i, temp=0;for(i=0;i<8;i++) { /*每bit以50us低電平標置開始,輪詢直到從機發出 的50us 低電平 結束*/ while(DHT11_Input==Bit_RESET);/*DHT11 以26~28us的高電平表示“0”,以70us高電平表示“1”,*通過檢測 x us后的電平即可區別這兩個狀 ,x 即下面的延時 */delay_us(40); //延時x us 這個延時需要大于數據0持續的時間即可 if(DHT11_Input==Bit_SET)/* x us后仍為高電平表示數據“1” */{/* 等待數據1的高電平結束 */while(DHT11_Input==Bit_SET);temp|=(st_u8)(0x01<<(7-i)); //把第7-i位置1,MSB先行 }else // x us后為低電平表示數據“0”{ temp&=(st_u8)~(0x01<<(7-i)); //把第7-i位置0,MSB先行 高位先出。 高位 1111 1111 地位 左邊高位,右邊地位 }}return temp; }/** 一次完整的數據傳輸為40bit,高位先出* 8bit 濕度整數 + 8bit 濕度小數 + 8bit 溫度整數 + 8bit 溫度小數 + 8bit 校驗和 */ st_u8 DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data) { /*輸出模式*/DHT11_GPIO_Out();/*主機拉低*/DHT11_L;/*延時18ms*/delay_ms(18);/*總線拉高 主機延時30us*/DHT11_H; delay_us(30); //延時30us/*主機設為輸入 判斷從機響應信號*/ DHT11_GPIO_In();/*判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行*/ if(DHT11_Input==Bit_RESET) {/*輪詢直到從機發出 的80us 低電平 響應信號結束*/ while(DHT11_Input==Bit_RESET);/*輪詢直到從機發出的 80us 高電平 標置信號結束*/while(DHT11_Input==Bit_SET);/*開始接收數據*/ 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();/*讀取結束,引腳改為輸出模式*/DHT11_GPIO_Out();/*主機拉高*/DHT11_H;/*檢查讀取的數據是否正確*/// 一次完整的數據傳輸為40bit,高位先出。數據格式:8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據+8bit校驗和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; } /*********************************************測試部分*********************************************/ void DHT11_Test1(void) {//int humi_buf[3]; // 濕度//int temp_buf[3]; // 溫度/*調用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);// 濕度轉 十六進制轉換為十進制//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);// 濕度 十六進制轉換為十進制//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); }

四、串口及中斷配置

/********************************************* 中斷優先級配置*********************************************/ // 中斷分組配置 NVIC_PriorityGroupConfig void NVIC_PG_Config(st_u32 PG) { /*中斷分組號 搶占式優先級 子優先級配置/響應式優先級 分配位數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)特征:在搶占式優先級相同的情況下,高響應優先級的中斷優先被響應。搶占式優先級數值越小,優先級越高*/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","沒有使用中斷分組\r\n");} } // 中斷優先級配置 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; // 搶占式優先級 0~15NVIC_InitStructure.NVIC_IRQChannelSubPriority =IRQChannelSubPriority ; // 子優先級 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; //波特率設置:USART_InitStructure.USART_WordLength = USART_WordLength_8b; //數據位數設置:8位USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位設置: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(USARTx, &USART_InitStructure); //初始化USART1// 使能串口接收中斷USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); // 使能中斷發送USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);USART_Cmd(USARTx, ENABLE); // USART使能 }

五、屏幕上顯示數據

5.1、屏幕內嵌指令

// 清屏背景顏色 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); }// 設置背景燈光的亮度 void LCDBL(void) {// 0~255 0亮度最高 255 關閉顯示st_u8 LCDBL[]={"BL(30);"};LCDUSART2_TX(LCDBL);delay_ms(100); }

5.2、靜態數據

// 靜態數據 void TempHumi_static(void) {//unsigned char 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);} } // 溫濕度界面 靜態 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、動態數據

// 動態數據 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;} } // 動態數據 void TempHumi_Dynamic(void) {TempHumi_Dynamic_Step(0x0C); // 硬件版本號delay_ms(100);TempHumi_Dynamic_Step(0x0D); // 軟件件版本號delay_ms(100);TempHumi_Dynamic_Step(0x0E); // 溫度顯示delay_ms(1000); // 延時太短只上一個數據TempHumi_Dynamic_Step(0x0F); // 濕度顯示delay_ms(1000);// for(unsigned char i=0x0C;i<=0x0F;i++) // { // TempHumi_Dynamic_Step(i); // delay_ms(100); // }}

六、效果

效果視頻

總結

以上是生活随笔為你收集整理的基于stm32的温湿度检测案例串口通信屏显示(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。