献上我的实验代码。
/****************************************************************
DHT21使用范例 单片机 : AT89S52 或 STC89C52RC
功能 :串口发送温湿度数据 晶振 11.0592M 波特率 9600
硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地
特别注意:两次采样间隔请大于2s!!
****************************************************************/
#include <STC12C5A60S2.h>
//#include <REG51.H>
#include <intrins.h>
#include "nokia_5110.h"
#include "bmp_pixel.h"
typedef unsigned char U8; // defined for unsigned 8-bits integer variable 无符号8位整型变量
typedef signed char S8; // defined for signed 8-bits integer variable 有符号8位整型变量
typedef unsigned int U16; // defined for unsigned 16-bits integer variable 无符号16位整型变量
typedef signed int S16; // defined for signed 16-bits integer variable 有符号16位整型变量
typedef unsigned long U32; // defined for unsigned 32-bits integer variable 无符号32位整型变量
typedef signed long S32; // defined for signed 32-bits integer variable 有符号32位整型变量
typedef float F32; // single precision floating point variable (32bits) 单精度浮点数(32位长度)
typedef double F64; // double precision floating point variable (64bits) 双精度浮点数(64位长度)
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
uint HUM[5]={1,1,1,1,0};//湿度整数+湿度小数+温度整数+温度小数
/**************************IO口定义区*****************************/
sbit P2_0 = P1^2 ; //DHT11湿度传感器OUT口
/**************************定义区*****************************/
U8 U8FLAG,k;//接收数据时用于标记
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata; //接受数据时用于临时存放数据
/****************************************************************************
延时程序
****************************************************************************/
void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
/****************************************************************************
短延时程序 10us
****************************************************************************/
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/****************************************************************************
数据接受函数,用于接收湿度模块发出的数据
****************************************************************************/
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
if(U8FLAG==1)break;//超时则跳出for循环//判断数据位是0还是1
U8comdata<<=1; // 如果高电平高过预定0高电平值则数据位为 1
U8comdata|=U8temp; //0
}
}
/****************************************************************************
湿度读取子程序
以下变量均为全局变量
温度高8位== U8T_data_H
温度低8位== U8T_data_L
湿度高8位== U8RH_data_H
湿度低8位== U8RH_data_L
校验 8位 == U8checkdata
****************************************************************************/
void RH(void) //湿度读取子程序
{
P2_0=0; //主机拉低18ms
Delay(180);
P2_0=1;
Delay_10us(); //总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
P2_0=1;//主机设为输入 判断从机响应信号
if(!P2_0) //T !判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
U8FLAG=2;
while((P2_0)&&U8FLAG++);//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
COM();//数据接收状态
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);//数据校验
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
}
}
/****************************************************************************
函数名:ReadHumidity
功能:将读取的温度数据装载给数组
****************************************************************************/
void ReadHumidity(void)
{
//RH(); //调用温湿度读取子程序
HUM[0]=U8RH_data_H;
HUM[1]=U8RH_data_L;
HUM[2]=U8T_data_H;
HUM[3]=U8T_data_L;
HUM[4]=U8checkdata;
}
void main()
{
while(1)
{
RH(); //调用温湿度读取子程序
ReadHumidity();
LCD_write_english_string(0,2,"TEM:");
LCD_write_char(*0*+HUM[0]/10%10);
LCD_write_char(*0*+HUM[0]%10);
LCD_write_char(*.*);
LCD_write_char(*0*+HUM[1]%10);
LCD_write_char(*C*);
LCD_write_english_string(0,3,"HUM:");
LCD_write_char(*0*+HUM[2]/10%10);
LCD_write_char(*0*+HUM[2]%10);
LCD_write_char(*%*);
Delay(25000);
}
}
/****************************************************************
DHT21使用范例 单片机 : AT89S52 或 STC89C52RC
功能 :串口发送温湿度数据 晶振 11.0592M 波特率 9600
硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地
特别注意:两次采样间隔请大于2s!!
****************************************************************/
#include <STC12C5A60S2.h>
//#include <REG51.H>
#include <intrins.h>
#include "nokia_5110.h"
#include "bmp_pixel.h"
typedef unsigned char U8; // defined for unsigned 8-bits integer variable 无符号8位整型变量
typedef signed char S8; // defined for signed 8-bits integer variable 有符号8位整型变量
typedef unsigned int U16; // defined for unsigned 16-bits integer variable 无符号16位整型变量
typedef signed int S16; // defined for signed 16-bits integer variable 有符号16位整型变量
typedef unsigned long U32; // defined for unsigned 32-bits integer variable 无符号32位整型变量
typedef signed long S32; // defined for signed 32-bits integer variable 有符号32位整型变量
typedef float F32; // single precision floating point variable (32bits) 单精度浮点数(32位长度)
typedef double F64; // double precision floating point variable (64bits) 双精度浮点数(64位长度)
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
uint HUM[5]={1,1,1,1,0};//湿度整数+湿度小数+温度整数+温度小数
/**************************IO口定义区*****************************/
sbit P2_0 = P1^2 ; //DHT11湿度传感器OUT口
/**************************定义区*****************************/
U8 U8FLAG,k;//接收数据时用于标记
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata; //接受数据时用于临时存放数据
/****************************************************************************
延时程序
****************************************************************************/
void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
/****************************************************************************
短延时程序 10us
****************************************************************************/
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/****************************************************************************
数据接受函数,用于接收湿度模块发出的数据
****************************************************************************/
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
if(U8FLAG==1)break;//超时则跳出for循环//判断数据位是0还是1
U8comdata<<=1; // 如果高电平高过预定0高电平值则数据位为 1
U8comdata|=U8temp; //0
}
}
/****************************************************************************
湿度读取子程序
以下变量均为全局变量
温度高8位== U8T_data_H
温度低8位== U8T_data_L
湿度高8位== U8RH_data_H
湿度低8位== U8RH_data_L
校验 8位 == U8checkdata
****************************************************************************/
void RH(void) //湿度读取子程序
{
P2_0=0; //主机拉低18ms
Delay(180);
P2_0=1;
Delay_10us(); //总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
P2_0=1;//主机设为输入 判断从机响应信号
if(!P2_0) //T !判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
U8FLAG=2;
while((P2_0)&&U8FLAG++);//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
COM();//数据接收状态
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);//数据校验
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
}
}
/****************************************************************************
函数名:ReadHumidity
功能:将读取的温度数据装载给数组
****************************************************************************/
void ReadHumidity(void)
{
//RH(); //调用温湿度读取子程序
HUM[0]=U8RH_data_H;
HUM[1]=U8RH_data_L;
HUM[2]=U8T_data_H;
HUM[3]=U8T_data_L;
HUM[4]=U8checkdata;
}
void main()
{
while(1)
{
RH(); //调用温湿度读取子程序
ReadHumidity();
LCD_write_english_string(0,2,"TEM:");
LCD_write_char(*0*+HUM[0]/10%10);
LCD_write_char(*0*+HUM[0]%10);
LCD_write_char(*.*);
LCD_write_char(*0*+HUM[1]%10);
LCD_write_char(*C*);
LCD_write_english_string(0,3,"HUM:");
LCD_write_char(*0*+HUM[2]/10%10);
LCD_write_char(*0*+HUM[2]%10);
LCD_write_char(*%*);
Delay(25000);
}
}
/****************************************************************
DHT21使用范例 单片机 : AT89S52 或 STC89C52RC
功能 :串口发送温湿度数据 晶振 11.0592M 波特率 9600
硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地
特别注意:两次采样间隔请大于2s!!
****************************************************************/
#include <STC12C5A60S2.h>
//#include <REG51.H>
#include <intrins.h>
#include "nokia_5110.h"
#include "bmp_pixel.h"
typedef unsigned char U8; // defined for unsigned 8-bits integer variable 无符号8位整型变量
typedef signed char S8; // defined for signed 8-bits integer variable 有符号8位整型变量
typedef unsigned int U16; // defined for unsigned 16-bits integer variable 无符号16位整型变量
typedef signed int S16; // defined for signed 16-bits integer variable 有符号16位整型变量
typedef unsigned long U32; // defined for unsigned 32-bits integer variable 无符号32位整型变量
typedef signed long S32; // defined for signed 32-bits integer variable 有符号32位整型变量
typedef float F32; // single precision floating point variable (32bits) 单精度浮点数(32位长度)
typedef double F64; // double precision floating point variable (64bits) 双精度浮点数(64位长度)
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
uint HUM[5]={1,1,1,1,0};//湿度整数+湿度小数+温度整数+温度小数
/**************************IO口定义区*****************************/
sbit P2_0 = P1^2 ; //DHT11湿度传感器OUT口
/**************************定义区*****************************/
U8 U8FLAG,k;//接收数据时用于标记
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata; //接受数据时用于临时存放数据
/****************************************************************************
延时程序
****************************************************************************/
void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
/****************************************************************************
短延时程序 10us
****************************************************************************/
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/****************************************************************************
数据接受函数,用于接收湿度模块发出的数据
****************************************************************************/
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
if(U8FLAG==1)break;//超时则跳出for循环//判断数据位是0还是1
U8comdata<<=1; // 如果高电平高过预定0高电平值则数据位为 1
U8comdata|=U8temp; //0
}
}
/****************************************************************************
湿度读取子程序
以下变量均为全局变量
温度高8位== U8T_data_H
温度低8位== U8T_data_L
湿度高8位== U8RH_data_H
湿度低8位== U8RH_data_L
校验 8位 == U8checkdata
****************************************************************************/
void RH(void) //湿度读取子程序
{
P2_0=0; //主机拉低18ms
Delay(180);
P2_0=1;
Delay_10us(); //总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
P2_0=1;//主机设为输入 判断从机响应信号
if(!P2_0) //T !判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
U8FLAG=2;
while((P2_0)&&U8FLAG++);//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
COM();//数据接收状态
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);//数据校验
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
}
}
/****************************************************************************
函数名:ReadHumidity
功能:将读取的温度数据装载给数组
****************************************************************************/
void ReadHumidity(void)
{
//RH(); //调用温湿度读取子程序
HUM[0]=U8RH_data_H;
HUM[1]=U8RH_data_L;
HUM[2]=U8T_data_H;
HUM[3]=U8T_data_L;
HUM[4]=U8checkdata;
}
void main()
{
while(1)
{
RH(); //调用温湿度读取子程序
ReadHumidity();
LCD_write_english_string(0,2,"TEM:");
LCD_write_char(*0*+HUM[0]/10%10);
LCD_write_char(*0*+HUM[0]%10);
LCD_write_char(*.*);
LCD_write_char(*0*+HUM[1]%10);
LCD_write_char(*C*);
LCD_write_english_string(0,3,"HUM:");
LCD_write_char(*0*+HUM[2]/10%10);
LCD_write_char(*0*+HUM[2]%10);
LCD_write_char(*%*);
Delay(25000);
}
}
/****************************************************************
DHT21使用范例 单片机 : AT89S52 或 STC89C52RC
功能 :串口发送温湿度数据 晶振 11.0592M 波特率 9600
硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地
特别注意:两次采样间隔请大于2s!!
****************************************************************/
#include <STC12C5A60S2.h>
//#include <REG51.H>
#include <intrins.h>
#include "nokia_5110.h"
#include "bmp_pixel.h"
typedef unsigned char U8; // defined for unsigned 8-bits integer variable 无符号8位整型变量
typedef signed char S8; // defined for signed 8-bits integer variable 有符号8位整型变量
typedef unsigned int U16; // defined for unsigned 16-bits integer variable 无符号16位整型变量
typedef signed int S16; // defined for signed 16-bits integer variable 有符号16位整型变量
typedef unsigned long U32; // defined for unsigned 32-bits integer variable 无符号32位整型变量
typedef signed long S32; // defined for signed 32-bits integer variable 有符号32位整型变量
typedef float F32; // single precision floating point variable (32bits) 单精度浮点数(32位长度)
typedef double F64; // double precision floating point variable (64bits) 双精度浮点数(64位长度)
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
uint HUM[5]={1,1,1,1,0};//湿度整数+湿度小数+温度整数+温度小数
/**************************IO口定义区*****************************/
sbit P2_0 = P1^2 ; //DHT11湿度传感器OUT口
/**************************定义区*****************************/
U8 U8FLAG,k;//接收数据时用于标记
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata; //接受数据时用于临时存放数据
/****************************************************************************
延时程序
****************************************************************************/
void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
/****************************************************************************
短延时程序 10us
****************************************************************************/
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/****************************************************************************
数据接受函数,用于接收湿度模块发出的数据
****************************************************************************/
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
if(U8FLAG==1)break;//超时则跳出for循环//判断数据位是0还是1
U8comdata<<=1; // 如果高电平高过预定0高电平值则数据位为 1
U8comdata|=U8temp; //0
}
}
/****************************************************************************
湿度读取子程序
以下变量均为全局变量
温度高8位== U8T_data_H
温度低8位== U8T_data_L
湿度高8位== U8RH_data_H
湿度低8位== U8RH_data_L
校验 8位 == U8checkdata
****************************************************************************/
void RH(void) //湿度读取子程序
{
P2_0=0; //主机拉低18ms
Delay(180);
P2_0=1;
Delay_10us(); //总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
P2_0=1;//主机设为输入 判断从机响应信号
if(!P2_0) //T !判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
U8FLAG=2;
while((P2_0)&&U8FLAG++);//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
COM();//数据接收状态
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);//数据校验
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
}
}
/****************************************************************************
函数名:ReadHumidity
功能:将读取的温度数据装载给数组
****************************************************************************/
void ReadHumidity(void)
{
//RH(); //调用温湿度读取子程序
HUM[0]=U8RH_data_H;
HUM[1]=U8RH_data_L;
HUM[2]=U8T_data_H;
HUM[3]=U8T_data_L;
HUM[4]=U8checkdata;
}
void main()
{
while(1)
{
RH(); //调用温湿度读取子程序
ReadHumidity();
LCD_write_english_string(0,2,"TEM:");
LCD_write_char(*0*+HUM[0]/10%10);
LCD_write_char(*0*+HUM[0]%10);
LCD_write_char(*.*);
LCD_write_char(*0*+HUM[1]%10);
LCD_write_char(*C*);
LCD_write_english_string(0,3,"HUM:");
LCD_write_char(*0*+HUM[2]/10%10);
LCD_write_char(*0*+HUM[2]%10);
LCD_write_char(*%*);
Delay(25000);
}
}