LCD1602不能显示出DHT11的数据
#include<reg52.h>
typedef unsigned int uint; //对数据类型进行声明定义
typedef unsigned char uchar;
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit DHT_data=P3^6; //DHT11端口
uchar data_byte;
uchar RH,RL,TH,TL;
void Lcd1602_Delay1ms(uint c) //延时函数
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void delay1()
{
uchar i;
for(i=0;i<1;i++);
}
uchar LcdReadBusy() //判忙函数
{
//unchar LCD1602_DATAPINS;
LCD1602_RS = 0;
LCD1602_RW = 1;
LCD1602_E = 1;
LCD1602_DATAPINS=P0;
LCD1602_E = 0;
return(LCD1602_DATAPINS&0x80);
}
void LcdWriteCom(uchar com) //写入命令
{
while(LcdReadBusy());//判断状态是否处于忙碌
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
void DHTstart() //DHT11起始函数
{
DHT_data=1;
delay1();
DHT_data=0;
Lcd1602_Delay1ms(500); //延时18ms以上
DHT_data=1;
delay1();
delay1();
delay1();
}
uchar DHTreceivebyte() //接收一个字节
{
uchar i,temp;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!DHT_data);
//Lcd1602_Delay1ms(80);
delay1();
delay1();
delay1();
temp=0;
if(DHT_data==1)
temp=1;
while(DHT_data);
data_byte<<=1; //移位使正确接收8位收据,数据为0时直接移位
data_byte|=temp;
}
return data_byte;
}
void DHTreceive() //接收数据
{
uchar R_H,R_L,T_H,T_L,revise;
DHTstart(); //DHT起始化
DHT_data=1;
if(!DHT_data)
{
while(!DHT_data);
while(DHT_data);
Lcd1602_Delay1ms(300);
R_H=DHTreceivebyte(); //接收湿度高8位
R_L=DHTreceivebyte(); //接收湿度低8位
T_H=DHTreceivebyte(); //接收温度高8位
T_L=DHTreceivebyte(); //接收温度低8位
revise=DHTreceivebyte(); //接收校验位
DHT_data=0;
Lcd1602_Delay1ms(50);
if((R_H+R_L+T_H+T_L)==revise) // 判定数据是否正确
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
}
}
void LcdDisplay() //数据显示
{
uchar RH1,RH2,TH1,TH2;
DHTreceive();
RH1=(RH/10)|0x30; //0x30位置为'0',(RH/10)|0x30代表其所对应的数字
RH2=(RH%10)|0x30;
TH1=(TH/10)|0x30;
TH2=(TH%10)|0x30;
LcdWriteCom(0x80); //第一行
LcdWriteData('R');
Lcd1602_Delay1ms(20);
LcdWriteData(':');
Lcd1602_Delay1ms(20);
LcdWriteData(RH1);
Lcd1602_Delay1ms(20);
LcdWriteData(RH2 );
Lcd1602_Delay1ms(20);
LcdWriteData('%');
LcdWriteCom(0xc0); //第二行
LcdWriteData('T');
Lcd1602_Delay1ms(20);
LcdWriteData(':');
Lcd1602_Delay1ms(20);
LcdWriteData(TH1);
Lcd1602_Delay1ms(200);
LcdWriteData(TH2);
Lcd1602_Delay1ms(200);
LcdWriteData(0xdf); //以下两个为温度单位符号
LcdWriteData(0x43);
}
void main(void)
{
LcdInit();
while(1)
{
LcdDisplay();
}
}
江湖救急,问一下问什么我这个程序烧录到单片机上不能显示DHT11传输过来的数据,显示的结果是00