求大神指导一下,这个是湿度传感器DHT11的程序,用1602显示
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^7;
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit TRH=P1^0;
uchar TH_data,TL_data,RH_data,RL_data,CK_data;
uchar TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
uchar com_data,untemp,temp,respond;
uchar str1[]="";
uchar str2[]="";
//10us延时程序
void delay_nop()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//1ms延时程序
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
// 测试LCD忙碌状态
//lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。
bit lcd_busy()
{
bit result;
lcdrs=0;
lcdrw=1;
lcden=1;
delay_nop();
result=(bit)(P0&0x80);
lcden=0;
return result;
}
//写指令
void write_cmd(uchar cmd)
{
while(lcd_busy());
lcdrs=0;
lcdrw=0;
lcden=0;
delay_nop();
P0=cmd;
delay_nop();
lcden=1;
delay_nop();
lcden=0;
}
//写数据
void write_data(uchar dat)
{
while(lcd_busy());
lcdrs=1;
lcdrw=0;
lcden=0;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//初始化
void init()
{
delay(15);
write_cmd(0x38); //16*2显示,5*7点阵,8位数据
delay(5);
write_cmd(0x08);
delay(5);
write_cmd(0x0c); //显示开,关光标
delay(5);
write_cmd(0x06); //写入数据后光标右移
delay(5);
}
//设定LCD显示位置
void lcd_dis_pos(uchar pos)
{
write_cmd(pos|0x80); //数据指针=80+地址变量
}
//接收数据
char receive()
{
uchar i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_nop();
delay_nop();
delay_nop();
//delay_nop();
//delay_nop();
//delay_nop();
//delay_nop();
//delay_nop();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
{
temp=0;
com_data=com_data<<1;
com_data|=temp;
}
}
return(com_data);
}
//湿度读取子程序
//温度高8位== TH_data
//温度低8位== TL_data
//湿度高8位== RH_data
//湿度低8位== RL_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay(20);
TRH=1;
//DATA总线由上拉电阻拉高 主机延时20us
delay_nop();
delay_nop();
//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[0]=0x52; //"R"
str1[1]=0x48; //"H"
str1[2]=0x3A; //:
str1[3]=(char)(0x30+RH_data/10); //湿度整数部分
str1[4]=(char)(0x30+RH_data%10);
str1[5]=0x2e; //小数点
str1[6]=(char)(0x30+RL_data/10); //湿度小数部分
str1[7]=0x25; //"%"
str2[0]=0x54; //T
str2[1]=0x3A; //:
//str2[2]=0x20; //空格
str2[2]=(char)(0x30+TH_data/10); //温度整数部分
str2[3]=(char)(0x30+TH_data%10);
str2[4]=0x2e; //小数点
str2[5]=(char)(0x30+TL_data/10); //温度小数部分
str2[6]=0x27; //"'"
str2[7]=0x43; //"C"
}
void main()
{
uchar i,m;
init();
delay_nop();
while(1)
{
read_TRH();
m=0x00; //写湿度数据
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
write_data(str1[i]);
delay(10);
m++;
}
//delay(10);
m=0x40; //写温度数据
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
write_data(str2[i]);
delay(10) ;
m++;
}
delay(100) ;//延时
}
}
为什么显示出来的结果中第二个字符串是正常的,而第一个字符串从第二个字符开始显示的就是第二个字符串的内容。 |