視頻教程::https://www.bilibili.com/video/BV1xb4y187rF
#include
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^2;
sbit LCD1602_RW=P2^1;
sbit LCD1602_RS=P2^0;
sbit Data=P3^0; //定義數(shù)據(jù)線
uchar T_RH,T_TH;
/*******************************************************************************
* 函 數(shù) 名 : Lcd1602_Delay1ms
* 函數(shù)功能 : 延時函數(shù),延時1ms
* 輸 入 : c
* 輸 出 : 無
* 說 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //誤差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 數(shù) 名 : LcdWriteCom
* 函數(shù)功能 : 向LCD寫入一個字節(jié)的命令
* 輸 入 : com
* 輸 出 : 無
*******************************************************************************/
void LcdWriteCom(uchar com) //寫入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //選擇發(fā)送命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_E = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : LcdWriteData
* 函數(shù)功能 : 向LCD寫入一個字節(jié)的數(shù)據(jù)
* 輸 入 : dat
* 輸 出 : 無
*******************************************************************************/
void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數(shù)據(jù)
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_E = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : LcdInit()
* 函數(shù)功能 : 初始化LCD屏
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //開顯示
LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
LcdWriteCom(0x06); //寫一個指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
X |= 0x80; // 算出指令碼
LcdWriteCom(X); //這里不檢測忙信號,發(fā)送地址碼
LcdWriteData(DData);
}
//按指定位置顯示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>=0x20) //若到達(dá)字串尾則退出
{
if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
ListLength++;
X++;
}
}
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i?>0;i--)
for(j=110;j>0;j--);
}
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(30); //延時18ms以上
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一個字節(jié)
{
uchar i,dat=0;
for(i=0;i8;i++) //從高到低依次接收8位數(shù)據(jù)
{
while(!Data); ////等待50us低電平過去
DHT11_delay_us(8); //延時60us,如果還為高則數(shù)據(jù)為1,否則為0
dat<=1; //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時直接移位
if(Data==1) //數(shù)據(jù)為1時,使dat加1來接收數(shù)據(jù)1
dat+=1;
while(Data); //等待數(shù)據(jù)線拉低
}
return dat;
}
void DHT11_receive() //接收40位的數(shù)據(jù)
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延時80us
R_H=DHT11_rec_byte(); //接收濕度高八位
R_L=DHT11_rec_byte(); //接收濕度低八位
T_H=DHT11_rec_byte(); //接收溫度高八位
T_L=DHT11_rec_byte(); //接收溫度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //結(jié)束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
T_RH = RH;
T_TH = TH;
}
}
void main()
{
LcdInit();
DisplayListChar(0,0,"asd");
while(1)
{
DHT11_receive();
DisplayOneChar(0,1,(char)(T_RH/10 + '0'));
DisplayOneChar(1,1,(char)(T_RH%10 + '0'));
DisplayOneChar(5,1,(char)(T_TH/10 + '0'));
DisplayOneChar(6,1,(char)(T_TH%10 + '0'));
Lcd1602_Delay1ms(100);
}
}
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
傳感器
+關(guān)注
關(guān)注
2548文章
50664瀏覽量
751939 -
Proteus
+關(guān)注
關(guān)注
79文章
1692瀏覽量
106371 -
DHT11
+關(guān)注
關(guān)注
19文章
277瀏覽量
57542
發(fā)布評論請先 登錄
相關(guān)推薦
采用STMCubeMX+Proteus仿真DHT11的方法
本文說明開發(fā)工具:STM32CubeMX+Keil5開發(fā)芯片:STM32F103R6采溫模塊:DHT11數(shù)顯屏幕:LCD1602仿真軟件:Proteus 8.12項目目標(biāo):DHT11讀取
發(fā)表于 11-30 08:03
如何通過控制DHT11模塊時序來對DHT11傳感器進(jìn)行控制和數(shù)據(jù)的讀取?
如何通過控制DHT11模塊時序來對DHT11傳感器進(jìn)行控制和數(shù)據(jù)的讀取?
發(fā)表于 01-17 06:40
dht11的工作原理_dht11接線圖
本文介紹了DHT11技術(shù)參數(shù)、DHT11的特性與dht11典型應(yīng)用電路,其次詳細(xì)的介紹了dht11工作原理與引腳說明,最后介紹了dht11溫
發(fā)表于 01-22 16:11
?23.6w次閱讀
DHT11的使用注意事項
本文介紹了DHT11傳感器性能參數(shù)、DHT11傳感器電氣特性以及 DHT11封裝形式及接口說明,最后詳細(xì)用例子來說明DHT11的使用以及DHT11
發(fā)表于 01-26 14:27
?6.2w次閱讀
為什么加入dht11的例程讀取不到dht11的數(shù)據(jù)應(yīng)該如何解決
最近遇到了一個十分坑爹的問題,就是在調(diào)試我的畢業(yè)設(shè)計時候。在加入dht11的例程時,怎么都讀取不到dht11的數(shù)據(jù)。
發(fā)表于 07-02 17:42
?24次下載
STMCubeMX+Proteus仿真DHT11(LCD1602顯示)
本文說明開發(fā)工具:STM32CubeMX+Keil5開發(fā)芯片:STM32F103R6采溫模塊:DHT11數(shù)顯屏幕:LCD1602仿真軟件:Proteus 8.12項目目標(biāo):DHT11讀取
發(fā)表于 11-21 14:06
?49次下載
DHT11溫濕度傳感器(詳細(xì))
DHT11溫度傳感器——使用LCD1602顯示先上效果圖,以及簡單的和室內(nèi)溫度對比圖,相交而言測量的值還是非常準(zhǔn)的。原理講解◎外設(shè)讀取步驟主機(jī)和從機(jī)之間的通信可通過如下幾個步驟完成(外設(shè)(如微處理器
發(fā)表于 12-02 21:06
?85次下載
Stm32 DHT11
DHT11 數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性。Stm32 驅(qū)動DHT11讀取環(huán)境溫濕度
發(fā)表于 12-17 18:23
?80次下載
FPGA在OLED上顯示DHT11數(shù)據(jù)
這是FPGA之旅設(shè)計的第十三例啦,本例是一個綜合性的例程,基于OLED屏幕顯示,和DHT11溫濕度采集,將DHT11采集到的溫濕度顯示到OLED屏幕上。
用Arduino讀取DHT22(或DHT11)
電子發(fā)燒友網(wǎng)站提供《用Arduino讀取DHT22(或DHT11).zip》資料免費(fèi)下載
發(fā)表于 11-16 11:02
?1次下載
如何使用Blynk從DHT11讀取溫度和濕度
電子發(fā)燒友網(wǎng)站提供《如何使用Blynk從DHT11讀取溫度和濕度.zip》資料免費(fèi)下載
發(fā)表于 02-07 13:56
?0次下載
Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環(huán)境溫濕度數(shù)據(jù)及 OLED顯示
Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環(huán)境溫濕度數(shù)據(jù)及 OLED顯示
評論