歡迎訪問深圳市(shì)智有科技有限公司官網,我公司主要從事(shì)電子(zǐ)産品、電子(zǐ)設備的研發及銷售、傳感器(qì)的研發及銷售、國内貿易、貨物及技術進出口 www.zy-sensor.com
1、PHT11傳感器(qì)
PHT11 數字溫濕度傳感器(qì)是一(yī)款低(dī)成本高性價比的溫濕度傳感器(qì)。采用單總線數字通訊和12位ADC采樣溫濕度傳感技術,傳感器(qì)包括一(yī)個(gè)電阻式感濕元件和一(yī)個(gè)NTC測溫元件,并與一(yī)個(gè)高性能(néng) 8 位單片機相連接。因此該産品具有品質卓越、超快(kuài)響應、抗幹擾能(néng)力強、性價比極高等優點。
2、溫濕度讀取方式
單片機通過單根數據線與PHT11進行通訊,單片機拉低(dī)數據線的電平20ms後切換IO口為(wèi)輸入狀态,即可激活PHT11,緊接着連續讀取PHT11輸出的溫濕度數據,根據時(shí)序時(shí)間(jiān)進行采集判斷輸出的數據位是邏輯1還是邏輯0,然後再把讀取到的數據進行簡單轉換即可得到溫度值和濕度值,濕度範圍5%~95%,溫度範圍-20~60度。
3、C51例程參考
//------------------------------------------------
// STC15W系列
// 讀DHT11數據
// 晶振12MHZ
// 間(jiān)隔1s讀取溫濕度并發送到串口
//------------------------------------------------
//------------------------------------------------
// 頭文、宏定義
//------------------------------------------------
#define MAIN_Fosc 11059200L //定義主時(shí)鍾
#define BaudRate1 115200UL //選擇波特率
#include "STC15Fxxxx.H"
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 1 重裝值, 對應300KHZ
#define Timer2_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 2 重裝值, 對應300KHZ
/************* 本地變量聲明 **************/
//------------------------------------------------
// 端口定義、寄存器(qì)定義
//------------------------------------------------
sbit DIO = P1^0;
sbit LED = P5^5; //指示燈
uint timeout;
uchar read_data[10];
//------------------------------------------------
// 30us延時(shí)
//------------------------------------------------
void Delay30us() //@11.0592MHz
{
unsigned char i;
i = 80;
while (--i);
}
void Delay20ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//------------------------------------------------
// 100ms延時(shí)
//------------------------------------------------
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//------------------------------------------------
// 開始信号
//------------------------------------------------
void Strt_DHT()
{
DIO=0;
Delay20ms();
DIO=1;
}
//------------------------------------------------
// 應答(dá)信号 11.0592MHZ
//------------------------------------------------
uchar Ack()
{
timeout=0;
while(DIO)
{
if(++timeout>300)
return 0;
}
if(DIO==0)
{
timeout=0;
while(!DIO)
{
if(++timeout>167)
return 0;
}
timeout=0;
while(DIO)
{
if(++timeout>50)
return 0;
}
}
else
{
return 0;
}
return 1;
}
//------------------------------------------------
// 讀一(yī)個(gè)字節數據
//------------------------------------------------
uchar read_1byte()
{
uchar i;
uchar temp=0;
for(i=0;i<8;i++)
{
temp<<=1;
timeout=0;
while(!DIO)
{
if(++timeout>111)
break;
}
Delay30us();
if(DIO)
temp=temp|0x01;
timeout=0;
while(DIO)
{
if(++timeout>20)
break;
}
}
return temp;
}
void init()
{
P0M1 = 0; P0M0 = 0; //設置為(wèi)準雙向口
P1M1 = 0; P1M0 = 0; //設置為(wèi)準雙向口
P2M1 = 0; P2M0 = 0; //設置為(wèi)準雙向口 弱上(shàng)拉,應為(wèi)外部按鍵沒有上(shàng)拉電阻,所以需要配置端口上(shàng)拉不然那檢查不到,雖然複位寄存器(qì)是0,但(dàn)是還是要配置一(yī)遍才生(shēng)效。
P3M1 = 0; P3M0 = 0; //設置為(wèi)準雙向口
P4M1 = 0; P4M0 = 0; //設置為(wèi)準雙向口
P5M1 = 0; P5M0 = 0; //設置為(wèi)準雙向口
P6M1 = 0; P6M0 = 0; //設置為(wèi)準雙向口
P7M1 = 0; P7M0 = 0; //設置為(wèi)準雙向口
//----------------------------------------------串口1初始化(huà)
S1_8bit(); //8位數據
S1_USE_P30P31(); //UART1 使用P30 P31口 默認
AUXR &= ~(1<<4); //Timer stop 波特率使用Timer2産生(shēng)
AUXR |= 0x01; //S1 BRT Use Timer2;
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(Timer2_Reload >> 8);
TL2 = (u8)Timer2_Reload;
AUXR |= (1<<4); //Timer run enable
REN = 1; //允許接收
ES = 1; //允許中斷
TI=1; //發送中斷标志位,必須設置
EA = 1; //全局中斷
}
//========================================================================
// 函數: void main(void)
// 描述: 主函數。
// 參數: none.
// 返回: none.
// 版本: VER1.0
// 日期:
// 備注:
//========================================================================
void main(void)
{
float Temperature,Humidity;
uchar temp;
uchar i;
init();
DIO=1;
while(1)
{
LED=0;//指示燈亮
Strt_DHT();
if(Ack())
{
for(i=0;i<5;i++)
{
read_data[i]=read_1byte();
}
}
Humidity=read_data[0];
temp=read_data[3]&0x0f;
Temperature=temp/10.0;
Temperature=Temperature+read_data[2];
if((read_data[3]&0x80)==0x80) //判斷是否為(wèi)負溫度
{
Temperature=-Temperature;
}
printf("PHT:%0.1f,%0.0f ",Temperature,Humidity);
for(i=0;i<5;i++)
{
read_data[i]=0;
}
LED=1;//指示燈滅
for(i=0;i<10;i++)//延時(shí)1s
{
Delay100ms();
}
}
}