dht11温湿度传感器程序(急求用stc12c5a60s2单片机显示dht11温湿度传感器程序,基本的读取和时序程序就行)

本文目录
- 急求用stc12c5a60s2单片机显示dht11温湿度传感器程序,基本的读取和时序程序就行
- DHT11温湿度传感器的问题
- 求单片机程序关于温湿度传感器采用DHT11,按键四个可以设置温湿度的上下限,显示用lcd1602,超限报警
- 100分,求温湿度传感器SHT11的源程序(51单片机语言)
- DHT11检测温湿度求教
- 这是个无线温湿度控制的毕设,图中是DHT11和LCD1602的工作流程,能用文字描述下吗
急求用stc12c5a60s2单片机显示dht11温湿度传感器程序,基本的读取和时序程序就行
sbit DHT11_1 = P2^4 ;
void COM1()
{
U8 i;
for(i=0;i《8;i++)
{
U8FLAG=2;
while((!DHT11_1)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DHT11_1)U8temp=1;
U8FLAG=2;
while((DHT11_1)&&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 RH1()
{
//主机拉低18ms
DHT11_1=0;
Delay(180);
DHT11_1=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
DHT11_1=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!DHT11_1) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!DHT11_1)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((DHT11_1)&&U8FLAG++);
//数据接收状态
COM1();
U8RH_data_H_temp=U8comdata;
COM1();
U8RH_data_L_temp=U8comdata;
COM1();
U8T_data_H_temp=U8comdata;
COM1();
U8T_data_L_temp=U8comdata;
COM1();
U8checkdata_temp=U8comdata;
DHT11_1=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;
}//fi
}//fi
}
DHT11温湿度传感器的问题
您的程序整体可能没有错,但是这个对时序的要求很高,或许您的时序错了。只有时序不对时,读取出来的数据全部是0,所以,你的改变对它无效,而且这个传感器无法PROTEUS中仿真,当初我做这个项目的时候,也是使用了半天才调试出来的,也是开始出现0
0
0
0的情况。
求单片机程序关于温湿度传感器采用DHT11,按键四个可以设置温湿度的上下限,显示用lcd1602,超限报警
#include 《reg52.h》
#include 《intrins.h》
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char unint8; //unint8 代替undigned char 提高可移植性
typedef unsigned char unint16;
unsigned char str1={“ “};
unsigned char str2={“ “};
unsigned char code dis1 = {“ Xh RH: “}; //定义数组
unsigned char code dis2 = {“ DO T: “};
sbit buz=P1^0;
sbit TRH = P1^7;//温湿度传感器DHT11数据接入
sbit LCD_RS = P1^1;
sbit LCD_RW = P1^2;
sbit LCD_EN = P1^3;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void initcom()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void send(unsigned char temp)
{
//send biao zi
SBUF=temp;
while(!TI);
TI=0;
}
void sendwd()
{
//send wen du
uint w_d ;
w_d=TH_data+128;
SBUF=w_d;
while(!TI);
TI=0;
}
void sendsd()
{
//send shi du
SBUF=RH_data;
while(!TI);
TI=0;
}
/*********************************************************************************/
void delayNOP() //延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************/
/*********************************************************************************/
// 毫秒级延时子程序
/*********************************************************************************/
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i《 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************************************/
/*********************************************************************************/
//5us级延时程序
/*********************************************************************************/
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************************/
/********************************************************************************/
// 测试LCD忙碌状态
//lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。
/********************************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************************/
/*******************************************************************************/
// 写入指令数据到LCD
/*******************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*****************************************************************************/
/*****************************************************************************/
//写显示数据到LCD
//RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。
/*****************************************************************************/
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/****************************************************************************/
/****************************************************************************/
//LCD初始化设定
/****************************************************************************/
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(5);
lcd_wcmd(0x06); //移动光标
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除
//delay_ms(5);
}
/****************************************************************************/
/****************************************************************************/
//设定LCD显示位置
/****************************************************************************/
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/****************************************************************************/
/****************************************************************************/
//收发信号检测,数据读取
/****************************************************************************/
char receive()
{
unint8 i;
com_data=0;
for(i=0;i《=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data《《=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/
/****************************************************************************/
//湿度读取子程序
//温度高8位== TL_data
//温度低8位== TH_data
//湿度高8位== RH_data
//湿度低8位== RH_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA总线由上拉电阻拉高 主机延时20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//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 = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//数据校验
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//湿度整数部分
str1 = (char)(0X30+RH_data/10);
str1 = (char)(0X30+RH_data%10);
str1 = 0x2e; //小数点
//湿度小数部分
str1 = (char)(0X30+RL_data/10);
str1 = 0X25; //“%“
str1 = 0X52; //“R“
str1 = 0X48; //“H“
//温度整数部分
str2 = (char)(0X30+TH_data/10);
str2 = (char)(0X30+TH_data%10);
str2 = 0x2e; //小数点
//温度小数部分
str2 = (char)(0X30+TL_data/10);
str2 = 0X27; //“’“
str2 = 0X43; //“C“
}
/****************************************************************************/
//冬天适宜温湿度 夏天适宜温湿度
//湿度:30%--80% 30%--60%
//温度:18℃--25℃ 23℃--28℃
/****************************************************************************/
void baoj()//报警函数
{
if(RH_data》=80) //湿度上限80%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(RH_data《=30) //湿度下限30%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data》=25) //温度上限25℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data《=18) //温度下限18℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else
{
buz=1;
}
}
/****************************************************************************/
//主函数
//TH,TL,RH,RL分别代表温湿度的整数和小数部分
/****************************************************************************/
void main()
{
lcd_init();
initcom();
delay_us();
while(1)
{
unsigned char i,n=0x40,m;
read_TRH();
//写字符
for(i=0;i《=7;i++)
{
lcd_dis_pos(i); //显示字符
lcd_wdata(dis1[i]);
lcd_dis_pos(n+i); //显示字符
lcd_wdata(dis2[i]);
}
//写湿度数据
m=0x08;
for(i=0;i《=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str1[i]);
m++;
}
//写温度数据
m=0x48;
for(i=0;i《=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str2[i]);
m++;
}
//延时
delay_ms(500);
baoj();//报警
send(0xff);//wsd flags
//delay_ms(10);
sendwd();
//delay_ms(10);
sendsd();
//delay_ms(10);
}
}
100分,求温湿度传感器SHT11的源程序(51单片机语言)
#include 《reg52.h》
#define uchar unsigned char
#define uint unsigned int
//数码管位定义
sbit dula = P2^6;
sbit wela = P2^7;
#define OK 1
#define ERROR 0
#define NUMBER 20
#define SIZE 5
sbit dht11 = P2^0;
uchar status;
//存放五字节数据的数组
uchar value_array[SIZE];
/*可在其他的文件引用温湿度值,实际是温度的整数的10 倍
如dht11 读回的温度是26,则temp_value = 260, 湿度同理*/
uchar flag;
//数码管编码
uchar code array= {
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f
};
int temp_value, humi_value;
void InitTime(void);
//void Delay_1ms(uint ms);
void SMG_Display(uint value);
void Delay_1ms(uint ms)
{
uint x, y;
for(x = ms; x 》 0; x--)
{
for(y = 124; y 》 0; y--);
}
}
void Delay_10us(void)
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/*读一个字节的数据*/
uchar ReadValue(void)
{
uchar count, value = 0, i;
status = OK; //设定标志为正常状态
for(i = 8; i 》 0; i--)
{
//高位在先
value 《《= 1;
count = 0;
//每一位数据前会有一个50us 的低电平时间.等待50us 低电平结束
while(dht11 == 0 && count++ 《 NUMBER);
if(count 》= NUMBER)
{
status = ERROR; //设定错误标志
return 0; //函数执行过程发生错误就退出函数
}
//26-28us 的高电平表示该位是0,为70us 高电平表该位1
Delay_10us();
Delay_10us();
Delay_10us();
//延时30us 后检测数据线是否还是高电平
if(dht11 != 0)
{
//进入这里表示该位是1
value++;
//等待剩余(约40us)的高电平结束
while(dht11 != 0 && count++ 《 NUMBER)
{
dht11 = 1;
}
if(count 》= NUMBER)
{
status = ERROR; //设定错误标志
return 0;
}
}
}
return (value);
}
//读一次的数据,共五字节
uchar ReadTempAndHumi(void)
{
uchar i = 0, check_value = 0,count = 0;
EA = 0;
dht11 = 0; //拉低数据线大于18ms 发送开始信号
Delay_1ms(20); //需大于18 毫秒
dht11 = 1; //释放数据线,用于检测低电平的应答信号
//延时20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线80us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
if(dht11 != 0) //检测应答信号,应答信号是低电平
{
//没应答信号
EA = 1;
return ERROR;
}
else
{
//有应答信号
while(dht11 == 0 && count++ 《 NUMBER); //等待应答信号结束
if(count 》= NUMBER) //检测计数器是否超过了设定的范围
{
dht11 = 1;
EA = 1;
return ERROR; //读数据出错,退出函数
}
count = 0;
dht11 = 1;//释放数据线
//应答信号后会有一个80us 的高电平,等待高电平结束
while(dht11 != 0 && count++ 《 NUMBER);
if(count 》= NUMBER)
{
dht11 = 1;
EA = 1;
return ERROR; //退出函数
}
//读出湿.温度值
for(i = 0; i 《 SIZE; i++)
{
value_array[i] = ReadValue();
if(status == ERROR)//调用ReadValue()读数据出错会设定status 为ERROR
{
dht11 = 1;
EA = 1;
return ERROR;
}
//读出的最后一个值是校验值不需加上去
if(i != SIZE - 1)
{
//读出的五字节数据中的前四字节数据和等于第五字节数据表示成功
check_value += value_array[i];
}
}//end for
//在没用发生函数调用失败时进行校验
if(check_value == value_array[SIZE - 1])
{
//将温湿度扩大10 倍方便分离出每一位
humi_value = value_array * 10;
temp_value = value_array * 10;
dht11 = 1;
EA = 1;
return OK; //正确的读出dht11 输出的数据
}
else
{
//校验数据出错
EA = 1;
return ERROR;
}
}
}
void main(void)
{
uchar mark = 0;
//先等上电稳定
Delay_1ms(1000);
//因为读一次数据dht11 才会触发一次采集数据.
//即在先使用数据时采集一次数据
ReadTempAndHumi();
//因为在两次采集数据需一定的时间间隔,这里还可减少
Delay_1ms(3000);
//设定定时器
InitTime();
while(1)
{
//三秒读一次温湿度
if(flag == 60)
{
flag = 0;
mark++;
/*
//读温湿度,可检测函数调用是否失败,
//函数返回OK(1)表示成功,返回ERROR(0)表示失败
//OK和ERROR是在DHT11.H中定义的宏
*/
ReadTempAndHumi();
}
if(mark % 2 == 0)
{
//显示温度
SMG_Display(temp_value);
}
else
{
//显示湿度
SMG_Display(humi_value);
}
}
}
//设定定时器
void InitTime(void)
{
TH0 = (65535 - 50000)/256;
TL0 = (65535 - 50000)%256 ;
TMOD = 0X01;
TR0 = 1;
ET0 = 1;
EA = 1;
}
//数码管显示函数
void SMG_Display(uint value)
{
uchar ge, bai, shi;
ge = value % 10;
shi = value % 100 / 10;
bai = value % 1000 / 100;
wela=1;
P0 = 0XFE;
wela=0;
P0 = 0XFF;
dula=1;;
P0 = array[bai];
dula=0;
Delay_1ms(2);
wela=1;
P0 = 0XFD;
wela=0;
P0 = 0XFF;
dula=1;
P0 = array[shi];
P0 |= 0x80; /*显示小数点*/
dula=0;
Delay_1ms(2);
wela=1;
P0 = 0XFB;
wela=0;
P0 = 0XFF;
dula=1;
P0 = array[ge];
dula=0;
Delay_1ms(2);
}
//中断函数
void timer(void) interrupt 1
{
TH0 = (65535 - 50000)/256;
TL0 = (65535 - 50000)%256;
flag++;
}
DHT11检测温湿度求教
使用51单片机,12M晶振,LCD1206液晶显示屏显示
DHT11使用SPI单总线通讯协议进行通信,对延时程序的精度要求较高,如果得不到结果的话大部分都是延时有问题。
#include“reg52.h“ //头文件
#define uint unsigned int
#define uchar unsigned char
int humi,temp,check;
uchar n,Readflag; //定义全局变量
sbit SPI = P1^1;
sbit RS = P2^4;
sbit RW = P2^5;
sbit EN = P2^6; //定义端口
void delayms(uchar ms);
void Init_Timer0(void); //函数声明
void write_com(uchar com) //LCD1206端口写函数
{
RS=0;
P0=com;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
void write_data(uchar date) //LCD1206数据写函数
{
RS=1;
P0=date;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
void LCD1602_init() //LCD1206初始化函数
{
RW=0;
EN=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void Display_Humi(int v,unsigned char position) ////////////湿度显示函数
{
int shu;
write_com(position);
write_data(’R’);
write_data(’H’);
shu=v%100/10;
write_data(shu+’0’);
shu=v%10;
write_data(shu+’0’);
write_data(’%’);
}
void Display_Temp(int v,unsigned char position) ///////////温度显示函数
{
int shu;
write_com(position);
write_data(’T’);
write_data(’e’);
write_data(’m’);
write_data(’p’);
write_data(’:’);
shu=v%100/10;
write_data(shu+’0’);
shu=v%10;
write_data(shu+’0’);
write_data(0xdf);
write_data(’C’);
}
void Display_Check(int v,uchar position) //校验位显示函数
{
int shu;
write_com(position);
write_data(’C’);
write_data(’h’);
write_data(’e’);
write_data(’c’);
write_data(’k’);
write_data(’:’);
shu=v/100;
write_data(shu+’0’);
shu=v%100/10;
write_data(shu+’0’);
shu=v%10;
write_data(shu+’0’);
}
void delayms(uchar ms) //精确延时毫秒级函数
{
uchar i;
while(ms--)
{
for(i=0;i《120;i++);
}
}
void delayus(uchar us) //精确延时微秒级函数
{
while(us--);
}
void DHT_Rst() //DHT11启动函数
{
SPI=0; //主机拉低总线18ms以上
delayms(20);
SPI=1; //主机拉高总线约30us
delayus(14);/// 20-40us
while(SPI); //等待DHT11响应
while(!SPI); //等待DHT11拉高总线
}
uchar Readbit() //读一位程序
{
while(SPI);//等待总线变为低电平
while(!SPI);//等待总线变为高电平
delayus(5);//等待10us,执行下几条程序使用约20us
if(SPI)
return 1;
else
return 0; //////判断SPI总线状态,返回0或1
}
uchar Readbyte() //读一个字节程序
{
uchar i,dat;
dat=0;
for(i=0;i《8;i++) //重复读取8位数据
{
dat=dat《《1; //dat左移一次,总共8次
dat=Readbit()|dat; //dat和返回值,按位或
}
return dat; //返回dat
}
void ReadDHT() //读DHT11温湿度传感器
{
uchar buf,i; //定义临时变量
DHT_Rst(); //初始化传感器
for(i=0;i《5;i++) //读5字节,共40位
buf[i]=Readbyte();
SPI=1; //通讯结束,拉高总线
if(buf+buf+buf+buf==buf)//数据校验
{
humi=buf;//湿度值
temp=buf;//温度值
check=buf;//校验位值,校验位=湿度值+温度值(小数位为零)
}
}
void main() //主函数
{
Init_Timer0(); //初始化定时器
Readflag=0; //读标志位为0
LCD1602_init(); //初始化LCD1602液晶显示屏
while(1) //主循环
{
if(Readflag==1) //验证是否读
{
Readflag=0; //重置读标志位
ReadDHT(); //读一次DHT11
}
Display_Temp(temp,0x80);
Display_Humi(humi,0x8A);
Display_Check(check,0xc0); /////显示值
}
}
void Init_Timer0(void) //定时器初始化函数
{
TMOD |= 0x01; //使用模式1,16位定时器,使用“|“符号可以在使用多个定时器时不受影响
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1 //定时器中断服务程序
{
static unsigned int num;
TH0=(65536-10000)/256; //重新赋值 10ms
TL0=(65536-10000)%256;
num++;
if(num==20) //大致200ms
{
num=0;
Readflag=1; //激活读命令
}
}
纯手打,望采纳
这是个无线温湿度控制的毕设,图中是DHT11和LCD1602的工作流程,能用文字描述下吗
首先对外接dht111温湿度传感器进行初始化,设置好精度,读取数据的频率(将源码注释搬过来就行),使能操作后开始读取数据,将其通过无线协议(不知道你的是啥协议)发送至LCD1602显示端,显示端读出数据后按设定好的的延时,每隔一段时间读取数据并将其反馈至显示屏上。

本文相关文章:
win32应用程序(电脑显示不是有效的win32应用程序怎么办)
2026年10月1日 10:00
mapreduce过程(MapReduce程序在运行过程中所启动的Reduce任务数量由什么因素决定)
2026年9月17日 17:20
socket中文乱码(C# SOCKET程序,中文乱码情况)
2026年9月3日 06:00
linux下socket编程(在Linux系统下编写一个socket程序)
2026年7月2日 18:50
visual studio新手教程(如何使用 Visual Studio.Net 编译和执行 C# 程序,步骤是)
2026年6月29日 15:10
更多文章:
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00






