|
基于STC89C52的温湿度检测,一个很经典的传感器测试代码,需要的朋友自己下载哦
//main.c
#include<reg52.h>
#include<intrins.h>
#include "HW_LCD1602.h"
#include "Sys_Define.h"
sbit TRH = P2^2;
int TH_temp,TL_temp,RH_temp,RL_temp,CK_temp,respond,com_data,temp;
void delay(unsigned int i)
{
while(i--);
}
void delay_ms(unsigned int i)
{
while(i--)
delay(90);
}
void Delay18ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 194;
k = 159;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay10u()
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 24;
while (--i);
}
//-------dht11函数区---------
char DHT11_rec_byte()
{
char i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
Delay10u();
Delay10u();
Delay10u();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/************************************************************
****************/
//湿度读取子程序
//温度高8位== TH_data
//温度低8位== TL_data
//湿度高8位== RH_data
//湿度低8位== RL_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/************************************************************
***************/
void DHT11_receive()
{
//主机拉低18ms
TRH=0;
Delay18ms();
TRH=1;
//DATA总线由上拉电阻拉高 主机延时50us
Delay10u();
Delay10u();
//delay_us();delay_us();delay_us();delay_us();
//主机设为输入 判断从机响应信号
TRH=1;
//判断DHT11是否有低电平响应信号 如不响应则跳出,
//响应则向下运行
if(!TRH)
{
respond=2;
//判断DHT11发出 80us 的低电平响应信号是否
//结束
while((!TRH)&& respond++);
respond=2;
//判断从机是否发出 80us 的高电平,如发出则
//进入数据接收状态
while(TRH && respond++);
//数据接收状态
RH_temp = DHT11_rec_byte();
RL_temp = DHT11_rec_byte();
TH_temp = DHT11_rec_byte();
TL_temp = DHT11_rec_byte();
CK_temp = DHT11_rec_byte();
TRH=1;
}
}
void LCD_DisTemAndHum(u16 Tem,u16 Hum)
{
u8 T_Decade=0,T_Digtal=0;
u8 H_Decade=0,H_Digtal=0;
T_Decade = Tem/10;
T_Digtal = Tem%10;
H_Decade = Hum/10;
H_Digtal = Hum%10;
Write_Com(0x80+5);
Write_Date(0x30+T_Decade);
Write_Date(0x30+T_Digtal);
Write_Com(0x80+13);
Write_Date(0x30+H_Decade);
Write_Date(0x30+H_Digtal);
}
void main(void)
{
LCD_Init();
Dis_Init();
DHT11_receive(); //温湿度读取
Delays(200);
while(1)
{
LCD_DisTemAndHum(TH_temp,RH_temp);
DHT11_receive(); //温湿度读取
Delays(100);
}
}
|
|