什么做網(wǎng)站做個(gè)多少錢啊排名優(yōu)化seo
“智能檢測(cè),精準(zhǔn)把控。溫濕度檢測(cè)系統(tǒng),為您的生活帶來全方位的健康保障?!?非標(biāo)協(xié)議項(xiàng)目【上】
- 前言
- 預(yù)備知識(shí)
- 1溫濕度檢測(cè)系統(tǒng)需求
- 2.代碼整合
- 2.1找到`編程實(shí)現(xiàn)LCD1602顯示一行工程`,打開`代碼文件`,將所需的`LCD1602驅(qū)動(dòng)代碼`拷貝到`溫濕度檢測(cè)系統(tǒng)_1602顯示串口發(fā)送工程`內(nèi)。
- 2.2找到`串口編程03_PC發(fā)送指令控制LED`工程,打開`代碼文件`,將所需的`LCD1602驅(qū)動(dòng)代碼`拷貝到`溫濕度檢測(cè)系統(tǒng)_1602顯示串口發(fā)送工程`內(nèi)。
- 2.3找到`溫濕度通過串口傳到PC顯示`工程,打開`代碼文件`,將所需的`LCD1602驅(qū)動(dòng)代碼`拷貝到`溫濕度檢測(cè)系統(tǒng)_1602顯示串口發(fā)送工程`內(nèi)。
- 3.構(gòu)造DHT11溫濕度數(shù)據(jù)處理函數(shù)
- 3.1定義存放`溫度`的`字符數(shù)組`和存放`濕度`的`字符數(shù)組`
- 3.2在DHT11溫濕度數(shù)據(jù)處理函數(shù)內(nèi)將溫濕度數(shù)據(jù)存入相應(yīng)字符數(shù)組。
- 4.主函數(shù)調(diào)用API順序
- 4.1延時(shí)1秒,穩(wěn)定系統(tǒng)
- 4.2初始化串口
- 4.3初始化LCD1602
- 4.4延時(shí)2秒,穩(wěn)定DHT11模塊
- 4.5在`while(1)`死循環(huán)內(nèi)調(diào)用延時(shí)一秒函數(shù),實(shí)現(xiàn)每隔1秒刷新溫濕度數(shù)據(jù)
- 4.6在`while(1)`死循環(huán)內(nèi)調(diào)用讀取DHT11溫濕度函數(shù)
- 4.7在`while(1)`死循環(huán)內(nèi)調(diào)用DHT11溫濕度數(shù)據(jù)處理函數(shù)
- 4.8在`while(1)`死循環(huán)內(nèi)多次調(diào)用發(fā)送字符串函數(shù),實(shí)現(xiàn)向PC發(fā)送溫濕度數(shù)據(jù)
- 4.9在`while(1)`死循環(huán)內(nèi)多次調(diào)用LCD1602顯示一行字符函數(shù),實(shí)現(xiàn)在LCD1602上顯示溫濕度數(shù)據(jù)
- 5.完整工程代碼
- 6項(xiàng)目運(yùn)行結(jié)果
- 結(jié)束語
前言
??本篇博文介紹的是用51單片機(jī)的非標(biāo)準(zhǔn)寫協(xié)議項(xiàng)目溫濕度檢測(cè)系統(tǒng)【上】,包含溫濕度檢測(cè)系統(tǒng)需求,代碼整合,構(gòu)造DHT11溫濕度數(shù)據(jù)處理函數(shù),主函數(shù)調(diào)用API順序,完整工程代碼,項(xiàng)目運(yùn)行結(jié)果。看到這篇博文的朋友,可以先贊再看嗎?
預(yù)備知識(shí)
??一、基本電路標(biāo)識(shí)識(shí)別和接線,例如VCC,GND。
??二、電腦基本操作復(fù)制粘貼
??三、C變量
??四、基本輸入輸出
??五、流程控制
??六、函數(shù)
??七、指針
??八,字符串
??如果以上知識(shí)不清楚,請(qǐng)自行學(xué)習(xí)后再來瀏覽。如果我有沒例出的,請(qǐng)?jiān)谠u(píng)論區(qū)寫一下。謝謝啦!
1溫濕度檢測(cè)系統(tǒng)需求
- 能夠?qū)崟r(shí)通過51單片機(jī)串口發(fā)送溫濕度信息
- 能夠?qū)崟r(shí)通過51單片機(jī)驅(qū)動(dòng)LCD1602顯示溫濕度信息
2.代碼整合
2.1找到編程實(shí)現(xiàn)LCD1602顯示一行工程
,打開代碼文件
,將所需的LCD1602驅(qū)動(dòng)代碼
拷貝到溫濕度檢測(cè)系統(tǒng)_1602顯示串口發(fā)送工程
內(nèi)。
- LCD1602 IO口定義代碼
//數(shù)據(jù)線定義
//D0到D7 -- P0.1到P0.7
#define dataBuffer P0//控制線定義
/*
RS--P1.0
RW--P1.1
EN--P1.4
*/
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;
- LCD1602初始化必要延時(shí)代碼
void Delay15ms() //@11.0592MHz
{unsigned char i, j;i = 27;j = 226;do{while (--j);} while (--i);
}void Delay5ms() //@11.0592MHz
{unsigned char i, j;i = 9;j = 244;do{while (--j);} while (--i);
}
- 檢測(cè)LCD1602忙代碼
void checkBusy()
{char tmp = 0x80;dataBuffer = 0x80;while(tmp & 0x80) //只要dataBuffer中的第8位為1就為忙,因?yàn)锽F:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。{RS = 0; //根據(jù)手冊(cè)中指令表可知RS=0,RW=1RW = 1; //RW=1為讀的操作,所以需要配置讀的時(shí)序圖EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN開始為低電平_nop_(); //執(zhí)行空函數(shù)等待EN拉高EN = 1; //根據(jù)手冊(cè)中的讀時(shí)序圖,EN被拉高_nop_(); //執(zhí)行空函數(shù)等待tpw和tF高電平過程_nop_();tmp = dataBuffer; //讀取dataBuffer中的忙信號(hào)EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉低_nop_(); //根據(jù)手冊(cè)中的寫時(shí)序圖,讓EN保持一段時(shí)間的低電平}
}
- 向LCD1602寫地址也就是指令代碼和寫數(shù)據(jù)代碼
void writeCmd(char cmd)
{ checkBusy(); //檢測(cè)忙信號(hào)RS = 0; //RS等于零,是寫指令操作RW = 0; //RW在手冊(cè)中寫的時(shí)序圖是可以全程低電平EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN開始為低電平_nop_(); //執(zhí)行空函數(shù)等待EN拉高dataBuffer = cmd; //根據(jù)手冊(cè)中的寫時(shí)序圖,數(shù)據(jù)在EN還在低電平時(shí)就建立數(shù)據(jù)EN = 1; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉高_nop_(); //執(zhí)行空函數(shù)等待tpw和tF高電平過程_nop_();EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉低_nop_(); //根據(jù)手冊(cè)中的寫時(shí)序圖,讓EN保持一段時(shí)間的低電平
}void weiteData(char cData)
{checkBusy(); //檢測(cè)忙信號(hào)RS = 1; //RS等于1,是寫數(shù)據(jù)操作RW = 0; //RW在手冊(cè)中寫的時(shí)序圖是可以全程低電平EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN開始為低電平_nop_(); //執(zhí)行空函數(shù)等待EN拉高dataBuffer = cData; //根據(jù)手冊(cè)中的寫時(shí)序圖,數(shù)據(jù)在EN還在低電平時(shí)就建立數(shù)據(jù)EN = 1; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉高_nop_(); //執(zhí)行空函數(shù)等待tpw和tF高電平過程_nop_();EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉低_nop_(); //根據(jù)手冊(cè)中的寫時(shí)序圖,讓EN保持一段時(shí)間的低電平
}
- 初始化LCD1602代碼
void initLCD1602()
{
//(1) 延時(shí) 15msDelay15ms();
//(2) 寫指令 38H(不檢測(cè)忙信號(hào))writeCmd(0x38);
//(3) 延時(shí) 5msDelay5ms();
//(4) 以后每次寫指令,讀/寫數(shù)據(jù)操作均需要檢測(cè)忙信號(hào)
//(5) 寫指令 38H:顯示模式設(shè)置writeCmd(0x38);
//(6) 寫指令 08H:顯示關(guān)閉writeCmd(0x08);
//(7) 寫指令 01H:顯示清屏writeCmd(0x01);
//(8) 寫指令 06H:顯示光標(biāo)移動(dòng)設(shè)置writeCmd(0x06);
//(9) 寫指令 0CH:顯示開及光標(biāo)設(shè)置writeCmd(0x0C);
}
- 讓LCD1602顯示一行字符的代碼
void LCD1602ShowARow(char line,char column,char *str)
{switch(line) //選擇哪行顯示{case 1: //第一行顯示writeCmd(0x80 + column); //選擇哪個(gè)位置顯示,因?yàn)槲恢玫刂返淖罡呶槐仨殲?,所以0x80+列數(shù)while(*str) //判斷字符串指針變量不為空?qǐng)?zhí)行循環(huán),不用判斷字符串結(jié)束標(biāo)志{weiteData(*str); //發(fā)送字符串單個(gè)字符str++; //字符串指針變量偏移}break;case 2: //第二行顯示writeCmd(0x80 + 0x40 + column); //選擇哪個(gè)位置顯示,因?yàn)槲恢玫刂返淖罡呶槐仨殲?,所以0x80+列數(shù),又因?yàn)榈诙械牧袕?x40開始while(*str) //所以是從0x80 + 0x40 + 列數(shù)(特別注意){ weiteData(*str);str++;}break;}
}
- 最后將以上代碼整合到
溫濕度檢測(cè)系統(tǒng)_1602顯示串口發(fā)送工程
內(nèi)。
2.2找到串口編程03_PC發(fā)送指令控制LED
工程,打開代碼文件
,將所需的LCD1602驅(qū)動(dòng)代碼
拷貝到溫濕度檢測(cè)系統(tǒng)_1602顯示串口發(fā)送工程
內(nèi)。
- 串口初識(shí)化代碼
void UartInit(void) //自己配
{//配置串口工作方式為方式1,從只收不發(fā)改為能收能發(fā)SCON = 0x50;//配置輔助寄存器,減少電磁輻射,穩(wěn)定晶振頻率 AUXR = 0x01;//設(shè)置定時(shí)器工作方式為定時(shí)器1的8位自動(dòng)重裝TMOD &= 0x0F;TMOD |= 0x20;//設(shè)置串口波特率為9600,0誤差TH1 = 0xFD;TL1 = 0xFD;//打開定時(shí)器1TR1 = 1;
}
- 發(fā)送字節(jié)和發(fā)送字符串代碼
void sendByte(char data_mas)
{SBUF = data_mas;while(!TI);TI = 0; //一定要軟件置零,不然會(huì)出現(xiàn)亂序
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}
2.3找到溫濕度通過串口傳到PC顯示
工程,打開代碼文件
,將所需的LCD1602驅(qū)動(dòng)代碼
拷貝到溫濕度檢測(cè)系統(tǒng)_1602顯示串口發(fā)送工程
內(nèi)。
- 存放溫濕度數(shù)據(jù)代碼
char THdata[5]; //存放溫濕度數(shù)據(jù)變量
- 打開DHT11高速模式和讀取DHT11溫濕度數(shù)據(jù)必要延時(shí)代碼
void Delay30ms() //@11.0592MHz
{unsigned char i, j; i = 54;j = 199;do{while (--j);} while (--i);
}void Delay40us() //@11.0592MHz
{unsigned char i;_nop_();i = 15;while (--i);
}
- 打開DHT11高速模式代碼
void startDHT()
{Data = 1;Data = 0;//至少延時(shí)18ms,那么延時(shí)30msDelay30ms();Data = 1;//檢測(cè)d點(diǎn)while(Data);//檢測(cè)e點(diǎn)while(!Data);//檢測(cè)f點(diǎn)while(Data);
}
- 讀取DHT11溫濕度數(shù)據(jù)代碼
void readDHTData()
{char i; //輪次char j; //次數(shù)char flag;char tmp;//打開DHT11高速模式startDHT();for(i=0; i<5; i++){for(j=0; j<8; j++){//檢測(cè)G點(diǎn)while(!Data);//根據(jù)傳送1和0的時(shí)間不同,0是26us,1是70us。等待60us后,如果Data = 1,就傳1,Data = 0;就傳0//Delay60us(); 延時(shí)60微妙太長了,可能在讀0時(shí)讀到下一個(gè)發(fā)送序列了,延時(shí)40微妙Delay40us();if(Data == 1){flag = 1;while(Data); //傳1的時(shí)間比較久,所以要等傳1結(jié)束}else{flag = 0;}tmp = tmp << 1;tmp |= flag;}THdata[i] = tmp;}
}
3.構(gòu)造DHT11溫濕度數(shù)據(jù)處理函數(shù)
3.1定義存放溫度
的字符數(shù)組
和存放濕度
的字符數(shù)組
char Temperature[9]; //定義溫度字符數(shù)組
char Humidness[9]; //定義濕度字符數(shù)組
3.2在DHT11溫濕度數(shù)據(jù)處理函數(shù)內(nèi)將溫濕度數(shù)據(jù)存入相應(yīng)字符數(shù)組。
void THDataHandler()
{//濕度數(shù)據(jù)處理Humidness[0] = 'H';Humidness[1] = ':';Humidness[2] = THdata[0]/10 + 0x30;Humidness[3] = THdata[0]%10 + 0x30;Humidness[4] = '.';Humidness[5] = THdata[1]/10 + 0x30;Humidness[6] = THdata[1]%10 + 0x30;Humidness[7] = '%';Humidness[8] = '\0';//溫度處理Temperature[0] = 'T';Temperature[1] = ':';Temperature[2] = THdata[2]/10 + 0x30;Temperature[3] = THdata[2]%10 + 0x30;Temperature[4] = '.';Temperature[5] = THdata[3]/10 + 0x30;Temperature[6] = THdata[3]%10 + 0x30;Temperature[7] = 'C';Temperature[8] = '\0';
}
4.主函數(shù)調(diào)用API順序
4.1延時(shí)1秒,穩(wěn)定系統(tǒng)
Delay1000ms();
4.2初始化串口
UartInit();
4.3初始化LCD1602
initLCD1602();
4.4延時(shí)2秒,穩(wěn)定DHT11模塊
Delay1000ms(); //等待DHT模塊穩(wěn)定
Delay1000ms();
4.5在while(1)
死循環(huán)內(nèi)調(diào)用延時(shí)一秒函數(shù),實(shí)現(xiàn)每隔1秒刷新溫濕度數(shù)據(jù)
Delay1000ms();
4.6在while(1)
死循環(huán)內(nèi)調(diào)用讀取DHT11溫濕度函數(shù)
readDHTData();
4.7在while(1)
死循環(huán)內(nèi)調(diào)用DHT11溫濕度數(shù)據(jù)處理函數(shù)
THDataHandler();
4.8在while(1)
死循環(huán)內(nèi)多次調(diào)用發(fā)送字符串函數(shù),實(shí)現(xiàn)向PC發(fā)送溫濕度數(shù)據(jù)
//通過串口發(fā)送溫濕度數(shù)據(jù)
sendString(Humidness);
sendString("\r\n");
sendString(Temperature);
sendString("\r\n");
sendString("\r\n");
4.9在while(1)
死循環(huán)內(nèi)多次調(diào)用LCD1602顯示一行字符函數(shù),實(shí)現(xiàn)在LCD1602上顯示溫濕度數(shù)據(jù)
LCD1602ShowARow(1,4,Humidness);
LCD1602ShowARow(2,4,Temperature);
5.完整工程代碼
#include "reg52.h"
#include "intrins.h"//數(shù)據(jù)線定義
//D0到D7 -- P0.1到P0.7
#define dataBuffer P0sbit LED1 = P3^7; //用尾定義聲明LED1
sbit Data = P3^3; //把DHT11接在單片機(jī)的P1.0口
sfr AUXR = 0x8e; //聲明AUXR寄存器地址//控制線定義
/*
RS--P1.0
RW--P1.1
EN--P1.4
*/
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;char THdata[5]; //存放溫濕度數(shù)據(jù)變量
char Temperature[9]; //定義溫度字符數(shù)組
char Humidness[9]; //定義濕度字符數(shù)組void Delay15ms() //@11.0592MHz
{unsigned char i, j;i = 27;j = 226;do{while (--j);} while (--i);
}void Delay5ms() //@11.0592MHz
{unsigned char i, j;i = 9;j = 244;do{while (--j);} while (--i);
}void Delay30ms() //@11.0592MHz
{unsigned char i, j; i = 54;j = 199;do{while (--j);} while (--i);
}void Delay40us() //@11.0592MHz
{unsigned char i;_nop_();i = 15;while (--i);
}void Delay1000ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void checkBusy()
{char tmp = 0x80;dataBuffer = 0x80;while(tmp & 0x80) //只要dataBuffer中的第8位為1就為忙,因?yàn)锽F:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。{RS = 0; //根據(jù)手冊(cè)中指令表可知RS=0,RW=1RW = 1; //RW=1為讀的操作,所以需要配置讀的時(shí)序圖EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN開始為低電平_nop_(); //執(zhí)行空函數(shù)等待EN拉高EN = 1; //根據(jù)手冊(cè)中的讀時(shí)序圖,EN被拉高_nop_(); //執(zhí)行空函數(shù)等待tpw和tF高電平過程_nop_();tmp = dataBuffer; //讀取dataBuffer中的忙信號(hào)EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉低_nop_(); //根據(jù)手冊(cè)中的寫時(shí)序圖,讓EN保持一段時(shí)間的低電平}
}void writeCmd(char cmd)
{ checkBusy(); //檢測(cè)忙信號(hào)RS = 0; //RS等于零,是寫指令操作RW = 0; //RW在手冊(cè)中寫的時(shí)序圖是可以全程低電平EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN開始為低電平_nop_(); //執(zhí)行空函數(shù)等待EN拉高dataBuffer = cmd; //根據(jù)手冊(cè)中的寫時(shí)序圖,數(shù)據(jù)在EN還在低電平時(shí)就建立數(shù)據(jù)EN = 1; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉高_nop_(); //執(zhí)行空函數(shù)等待tpw和tF高電平過程_nop_();EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉低_nop_(); //根據(jù)手冊(cè)中的寫時(shí)序圖,讓EN保持一段時(shí)間的低電平
}void weiteData(char cData)
{checkBusy(); //檢測(cè)忙信號(hào)RS = 1; //RS等于1,是寫數(shù)據(jù)操作RW = 0; //RW在手冊(cè)中寫的時(shí)序圖是可以全程低電平EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN開始為低電平_nop_(); //執(zhí)行空函數(shù)等待EN拉高dataBuffer = cData; //根據(jù)手冊(cè)中的寫時(shí)序圖,數(shù)據(jù)在EN還在低電平時(shí)就建立數(shù)據(jù)EN = 1; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉高_nop_(); //執(zhí)行空函數(shù)等待tpw和tF高電平過程_nop_();EN = 0; //根據(jù)手冊(cè)中的寫時(shí)序圖,EN被拉低_nop_(); //根據(jù)手冊(cè)中的寫時(shí)序圖,讓EN保持一段時(shí)間的低電平
}void initLCD1602()
{
//(1) 延時(shí) 15msDelay15ms();
//(2) 寫指令 38H(不檢測(cè)忙信號(hào))writeCmd(0x38);
//(3) 延時(shí) 5msDelay5ms();
//(4) 以后每次寫指令,讀/寫數(shù)據(jù)操作均需要檢測(cè)忙信號(hào)
//(5) 寫指令 38H:顯示模式設(shè)置writeCmd(0x38);
//(6) 寫指令 08H:顯示關(guān)閉writeCmd(0x08);
//(7) 寫指令 01H:顯示清屏writeCmd(0x01);
//(8) 寫指令 06H:顯示光標(biāo)移動(dòng)設(shè)置writeCmd(0x06);
//(9) 寫指令 0CH:顯示開及光標(biāo)設(shè)置writeCmd(0x0C);
}void UartInit(void) //自己配
{//配置串口工作方式為方式1,從只收不發(fā)改為能收能發(fā)SCON = 0x50;//配置輔助寄存器,減少電磁輻射,穩(wěn)定晶振頻率 AUXR = 0x01;//設(shè)置定時(shí)器工作方式為定時(shí)器1的8位自動(dòng)重裝TMOD &= 0x0F;TMOD |= 0x20;//設(shè)置串口波特率為9600,0誤差TH1 = 0xFD;TL1 = 0xFD;//打開定時(shí)器1TR1 = 1;
}void sendByte(char data_mas)
{SBUF = data_mas;while(!TI);TI = 0; //一定要軟件置零,不然會(huì)出現(xiàn)亂序
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void startDHT()
{Data = 1;Data = 0;//至少延時(shí)18ms,那么延時(shí)30msDelay30ms();Data = 1;//檢測(cè)d點(diǎn)while(Data);//檢測(cè)e點(diǎn)while(!Data);//檢測(cè)f點(diǎn)while(Data);
}void LCD1602ShowARow(char line,char column,char *str)
{switch(line) //選擇哪行顯示{case 1: //第一行顯示writeCmd(0x80 + column); //選擇哪個(gè)位置顯示,因?yàn)槲恢玫刂返淖罡呶槐仨殲?,所以0x80+列數(shù)while(*str) //判斷字符串指針變量不為空?qǐng)?zhí)行循環(huán),不用判斷字符串結(jié)束標(biāo)志{weiteData(*str); //發(fā)送字符串單個(gè)字符str++; //字符串指針變量偏移}break;case 2: //第二行顯示writeCmd(0x80 + 0x40 + column); //選擇哪個(gè)位置顯示,因?yàn)槲恢玫刂返淖罡呶槐仨殲?,所以0x80+列數(shù),又因?yàn)榈诙械牧袕?x40開始while(*str) //所以是從0x80 + 0x40 + 列數(shù)(特別注意){ weiteData(*str);str++;}break;}
}void readDHTData()
{char i; //輪次char j; //次數(shù)char flag;char tmp;//打開DHT11高速模式startDHT();for(i=0; i<5; i++){for(j=0; j<8; j++){//檢測(cè)G點(diǎn)while(!Data);//根據(jù)傳送1和0的時(shí)間不同,0是26us,1是70us。等待60us后,如果Data = 1,就傳1,Data = 0;就傳0//Delay60us(); 延時(shí)60微妙太長了,可能在讀0時(shí)讀到下一個(gè)發(fā)送序列了,延時(shí)40微妙Delay40us();if(Data == 1){flag = 1;while(Data); //傳1的時(shí)間比較久,所以要等傳1結(jié)束}else{flag = 0;}tmp = tmp << 1;tmp |= flag;}THdata[i] = tmp;}
}void THDataHandler()
{//濕度數(shù)據(jù)處理Humidness[0] = 'H';Humidness[1] = ':';Humidness[2] = THdata[0]/10 + 0x30;Humidness[3] = THdata[0]%10 + 0x30;Humidness[4] = '.';Humidness[5] = THdata[1]/10 + 0x30;Humidness[6] = THdata[1]%10 + 0x30;Humidness[7] = '%';Humidness[8] = '\0';//溫度處理Temperature[0] = 'T';Temperature[1] = ':';Temperature[2] = THdata[2]/10 + 0x30;Temperature[3] = THdata[2]%10 + 0x30;Temperature[4] = '.';Temperature[5] = THdata[3]/10 + 0x30;Temperature[6] = THdata[3]%10 + 0x30;Temperature[7] = 'C';Temperature[8] = '\0';
}void main()
{LED1 = 1; //一上電就讓燈滅Delay1000ms();UartInit(); //初始化串口initLCD1602(); //初始化LCD1602Delay1000ms(); //等待DHT模塊穩(wěn)定Delay1000ms();while(1) //防止程序退出主函數(shù),導(dǎo)致LED1微弱閃爍{Delay1000ms(); //間隔1秒讀一次readDHTData(); //讀取DHT11溫濕度數(shù)據(jù)THDataHandler(); //將DHT11傳回的數(shù)據(jù)裝入溫濕度字符數(shù)組//通過串口發(fā)送溫濕度數(shù)據(jù)sendString(Humidness);sendString("\r\n");sendString(Temperature);sendString("\r\n");sendString("\r\n");LCD1602ShowARow(1,4,Humidness); LCD1602ShowARow(2,4,Temperature);}}
6項(xiàng)目運(yùn)行結(jié)果
結(jié)束語
??很高興您能看到這里,點(diǎn)個(gè)贊再走唄。謝謝您啦!!!