微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > DHT11检测温湿度

DHT11检测温湿度

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#include <intrins.h>
#define LCD_DB P0
unsigned int s1[5];
unsigned int s2[5];
sbit LCD_RS = P2^5;
sbit LCD_RW = P2^6;
sbit LCD_E = P2^7;
sbit P3_2 = P3^2;
sbit moshi = P3^4;
sbit INC = P3^5;
sbit DEC = P3^6;
sbit SPK = P1^5;
/******定义函数****************/
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char U8; // 无符号8位整型变量
typedef unsigned int U16; // 无符号16位整型变量
int count1=70,count2=35;
uchar moshicount=0;
U8 U8FLAG;
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 LCD_init(void);//初始化函数
void LCD_write_command(uchar command); //写指令函数
void LCD_write_data(uchar dat); //写数据函数
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
void delay_n40us(uint n);//延时函数
//*******液晶初始化函数***************//
void LCD_init(void)
{
LCD_write_command(0x38); //设置 8 位格式,2 行,5x7
LCD_write_command(0x0c); //整体显示,关光标,不闪烁
LCD_write_command(0x06); //设定输入方式,增量不移位
LCD_write_command(0x03); //清除屏幕显示
delay_n40us(100);
}

//******************************//
//******************************//
//********写指令函数************//
void LCD_write_command(uchar dat)
{
LCD_DB=dat;
LCD_RS=0;
LCD_RW=0;//写入
LCD_E=1;//允许
delay_n40us(1);
LCD_E=0;
delay_n40us(1);
}

//*******************************//
//********写数据函数*************//
void LCD_write_data(uchar dat)
{
LCD_DB=dat;
LCD_RS=1;//数据
LCD_RW=0;//写入
LCD_E=1;//允许
delay_n40us(1);
LCD_E=0;
delay_n40us(1);
}

//********************************//
//*******显示一个字符函数*********//
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}

//*******************************//
//********延时函数***************//
void delay_n40us(uint n)
{
uint i;
uchar j;
for(i=n;i>0;i--)
for(j=0;j<2;j++);
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
for(i=0;i<27;i++);
}

//**********************************//
//*******一字节数据传送函数*********//
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!P3_2)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P3_2)
U8temp=1;
U8FLAG=2;
while((P3_2)&&U8FLAG++);//超时则跳出for循环
if(U8FLAG==1)
break;//判断数据位是0还是1,如果高电平高过预定0高电平值则数据位为 1//
U8comdata<<=1;
U8comdata=U8temp; //0
}//rof
}
//--------------------------------//
//-----湿度读取子程序 ------------//
//--------------------------------//
//----以下变量均为全局变量--------//
//----温度高8位== U8T_data_H------//
//----温度低8位== U8T_data_L------//
//----湿度高8位== U8RH_data_H-----//
//----湿度低8位== U8RH_data_L-----//
//----校验 8位 == U8checkdata-----//
//----调用相关子程序如下----------//
//---- Delay();, Delay_10us();,COM();//
//--------------------------------//
void RH(void)
{
//主机拉低18ms
P3_2=0;
Delay(180);
P3_2=1;//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();//主机设为输入 判断从机响应信号
P3_2=1;//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!P3_2) //T !
{
U8FLAG=2; //判断从机是否发出 80us 的低电平响应信号是否结束
while((!P3_2)&&U8FLAG++);
U8FLAG=2;//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((P3_2)&&U8FLAG++);//数据接收状态
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;
P3_2=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;//湿度整数部分
{
//s1[0]=(int)(0X30+U8RH_data_H/10);
//s1[1]=(int)(0X30+U8RH_data_H%10); //湿度整数部分
//s1[2]=(int)(0X30+U8RH_data_L/10); //湿度小数部分
//s2[0]=(int)(0X30+U8T_data_H/10);
//s2[1]=(int)(0X30+U8T_data_H%10); //温度整数部分
//s2[2]=(int)(0X30+U8T_data_L/10); //温度小数部分
}
}//fi
}//fi
} //液晶显示函数
void disp()
{
LCD_disp_char(0,1,'s');
LCD_disp_char(1,1,'h');
LCD_disp_char(2,1,'i');
LCD_disp_char(3,1,'d');
LCD_disp_char(4,1,'u');
LCD_disp_char(5,1,':');
LCD_disp_char(6,1,0X30+U8RH_data_H/10);
LCD_disp_char(7,1,0X30+U8RH_data_H%10);
LCD_disp_char(8,1,'.');
LCD_disp_char(9,1,0X30+U8RH_data_L/10);
LCD_disp_char(10,1,'%');
LCD_disp_char(11,1,'R');
LCD_disp_char(12,1,'H');
LCD_disp_char(0,2,'w');
LCD_disp_char(1,2,'e');
LCD_disp_char(2,2,'n');
LCD_disp_char(3,2,'d');
LCD_disp_char(4,2,'u');
LCD_disp_char(5,2,':');
LCD_disp_char(6,2,0X30+U8T_data_H/10);
LCD_disp_char(7,2,0X30+U8T_data_H%10);
LCD_disp_char(8,2,'.');
LCD_disp_char(9,2,0X30+U8T_data_L/10);
LCD_disp_char(10,2,0xDF);
LCD_disp_char(11,2,'C');
}

//阈值设置函数
void shezhi()
{
s1[3] = (char)(0x30+count1/10);
s1[4] = (char)(0x30+count1%10);
s2[3] = (char)(0x30+count2/10);
s2[4] = (char)(0x30+count2%10);
if(moshi==0)
{
delay_n40us(10000);
moshicount++;
}
if(moshicount==1)
{
if(INC==0)
{
delay_n40us(10000);
count1++;
}
else if(DEC==0)
{
delay_n40us(10000);
count1--;
}
LCD_disp_char(14,1,' ');
LCD_disp_char(15,1,' ');
LCD_disp_char(14,2,' ');
LCD_disp_char(15,2,' ');
s1[3] = count1/10;
s1[4] = count1%10;
s2[3] = count2/10;
s2[4] = count2%10;
LCD_disp_char(14,1,s1[3]+0x30);
LCD_disp_char(15,1,s1[4]+0x30);
LCD_disp_char(14,2,s2[3]+0x30);
LCD_disp_char(15,2,s2[4]+0x30);
}
else if(moshicount==2)
{
if(INC==0)
{
delay_n40us(10000);
count2++;
}
else if(DEC==0)
{
delay_n40us(10000);
count2--;
}
LCD_disp_char(14,1,' ');
LCD_disp_char(15,1,' ');
LCD_disp_char(14,2,' ');
LCD_disp_char(15,2,' ');
s1[3] = count1/10;
s1[4] = count1%10;
s2[3] = count2/10;
s2[4] = count2%10;
LCD_disp_char(14,1,s1[3]+0x30);
LCD_disp_char(15,1,s1[4]+0x30);
LCD_disp_char(14,2,s2[3]+0x30);
LCD_disp_char(15,2,s2[4]+0x30);
}
else if(moshicount==3)
{
delay_n40us(10000);
LCD_disp_char(14,1,' ');
LCD_disp_char(15,1,' ');
LCD_disp_char(14,2,' ');
LCD_disp_char(15,2,' ');
moshicount=0;
}
}
//蜂鸣器报警程序
void laba()
{
if((U8RH_data_H>=count1)||(U8T_data_H>=count2))
{
SPK=0;
}
else
{
SPK=1;
}
}
//*********主函数*****************//

void main(void)
{
LCD_init();
Delay(4);
while(1)
{
delay_n40us(10000);
RH();
disp();
laba();
shezhi();
}
}
程序输出的结果怎么都是0?怎么改?

不要贴源代码 不要贴源代码  不要贴源代码  重要的事情说3遍

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top