急求一份DHT11+STC89C52Rc十LCD1602程序(c语言)你能发给我一份吗?谢谢5

573438492@QQ.com
2024-12-23 11:53:04
推荐回答(4个)
回答1:

#include "reg52.h"
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit DHTIO = P2^7; //管脚定义,DHT11总线输入输出;
sbit LCDRS = P2^3; //管脚定义,1602液晶RS控制端;
sbit LCDWR = P2^4; //管脚定义,1602液晶W/R控制端;
sbit LCDEN = P2^5; //管脚定义,1602液晶EN使能端;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
uchar data_byte;
uchar Tem_Z,Tem_X,Hum_Z,Hum_X,Check;
void LCD_Init(); //声明LCD_Init液晶初始化函数;
void LCD_Display(); //声明LCD_Display液晶显示函数;
void Rec_DHT(); //声明Rec_DHT,DHT11接收数据函数;

//主函数
void main()
{
LCD_Init();
while(1)
{
Rec_DHT();
LCD_Display();
}
}
/*********延时函数********/
void delay(uchar ms)
{
uchar i ;
while(ms--)
{
for(i=0;i<250;i++);
}
}
/***延时10us***/
void delay1()
{
uchar i;
i--;i--;i--;
i--;i--;i--;
}

/********主机发出开始信号*******/
void DHT11_Start() //请结合时序图分析
{
DHTIO=1;
delay1();
DHTIO=0;
delay(20); //保持电平时间大于18ms
DHTIO=1;
delay1(); //延迟等待20-40us
delay1();
delay1();
delay1();
delay1();
}
/********DHT11接收一个字节数据*******/
uchar receive_data()
{
uchar i,temp,count;
data_byte=0;
for(i=0;i<8;i++)
{
count=2;
while((!DHTIO)&&count++);//等待50us低电平结束
temp=0;
delay1();delay1();delay1();delay1();
if(DHTIO==1)
{
temp=1;
count=2;
while((DHTIO)&&count++);
}
if(count==1) break;
data_byte<<=1;
data_byte|=temp;
}
return data_byte;
}
/********DHT11接收数据*******/
void Rec_DHT()
{
uchar flag;
DHT11_Start();//主机发出开始信号
DHTIO=1; //拉高等待DHT11响应
if(!DHTIO) //从机发出响应信号
{
flag = 2;
while((!DHTIO) && flag++);
//判断从机是否发出 80us 的低电平响应信号是否结束
flag = 2;
while(DHTIO && flag++);
//判断从机是否发出 80us 的高电平,若发出则开始采集数据
Tem_Z = receive_data(); //采集湿度整数部分
Tem_X = receive_data(); //采集湿度小数部分
Hum_Z = receive_data(); //采集温度整数部分
Hum_X = receive_data(); //采集温度小数部分
Check = receive_data(); //采集校验位
DHTIO = 1;
}
}
/*******指令码*******/
void write_com(uchar com)
{
com=((com&0x01)<<7)|((com&0x02)<<5)|((com&0x04)<<3)|((com&0x08)<<1)|((com&0x10)>>1)|((com&0x20)>>3)|((com&0x40)>>5)|((com&0x80)>>7); //注:此部分因采用的最小系统板电路设计原因,需要将字节信息逆置;
LCDRS=0;
LCDEN=0;
delay(2);
LCDEN=1;
P0=com;
delay(2);
LCDEN=0;
}
/*******数据码*******/
void write_data(uchar date)
{
date=((date&0x01)<<7)|((date&0x02)<<5)|((date&0x04)<<3)|((date&0x08)<<1)|((date&0x10)>>1)|((date&0x20)>>3)|((date&0x40)>>5)|((date&0x80)>>7); //注:此部分因采用的最小系统板电路设计原因,需要将字节信息逆置;
LCDRS=1;
LCDEN=0;
delay(2);
LCDEN=1;
P0=date;
delay(2);
LCDEN=0;
}
/*********************/
/********1602液晶显示初始化*******/
void LCD_Init()
{
LCDEN=0; //使能低电平
LCDWR=0;
write_com(0x38); //显示模式设置,设置16*2显示,5*7点阵,8位数据接口
delay(2);
write_com(0x0c); //显示开关及光标设置
delay(2);
write_com(0x06);
delay(2);
write_com(0x01); //清屏
delay(2);
}
/**********1602液晶显示*********/
void LCD_Display()
{
//液晶显示第一行:温度显示;
write_com(0x0c);
write_com(0x81);delay(2);
write_data('T');delay(2);
write_data('e');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0x86);delay(2);
write_data(table[(Tem_Z/10)]);delay(2); //输出温度的十位
write_data(table[(Tem_Z%10)]);delay(2); //输出温度的个位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0x8c);delay(2);
write_data(0xdf);delay(2); //输出℃
write_data(0x43);delay(2);
//液晶第二行:湿度显示;
write_com(0xc1);delay(2);
write_data('H');delay(2);
write_data('u');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0xc6);delay(2);
write_data(table[(Hum_Z/10)]);delay(2); //输出湿度的十位
write_data(table[(Hum_Z%10)]);delay(2); //输出湿度的个位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0xcc);delay(2);
write_data('%');delay(2);
}

回答2:

?不会,要是C++的话我可以

回答3:

给一份DS18B20做参考

回答4:

呵呵呵