DHT11温湿度和STC12C5A60S2的程序,读出来的数据有问题,求教用过的高手!
时间:10-02
整理:3721RD
点击:
程序如下:
#include<reg52.h>
#include<intrins.h>
sbit dat=P1^0;
sbit P1_2=P1^2;
unsigned char rh_z,rh_x,th_z,th_x,xy;
void delay20ms(void) //误差 -0.000000000002us
{
unsigned char a,b,c;
for(c=14;c>0;c--)
for(b=168;b>0;b--)
for(a=22;a>0;a--);
}
void delay40us(void) //误差 -0.033275462963us
{
unsigned char a,b;
for(b=43;b>0;b--)
for(a=1;a>0;a--);
}
void delay80us(void) //误差 -0.066550925926us
{
unsigned char a;
for(a=218;a>0;a--);
}
void delay28us(void) //误差 0us
{
unsigned char a;
for(a=81;a>0;a--);
}
void delay1s(void) //误差 -0.000000000056us
{
unsigned char a,b,c;
for(c=182;c>0;c--)
for(b=164;b>0;b--)
for(a=99;a>0;a--);
}
void delay50us(void) //误差 0us
{
unsigned char a;
for(a=147;a>0;a--);
}
void init_dht11() //dht11程序初始化
{
unsigned char x=0;
do{
dat=1;
dat=0;
delay20ms();
dat=1;
delay40us();
x=dat;
}while(x);
dat=1;
delay80us();
}
unsigned char readbyte() //读取一个字节数据(8位数据)
{
unsigned char da=0;
unsigned char a=0,temp;
for(a=0;a<8;a++)
{
loop1:
dat=0;
delay50us();
dat=1;
temp=dat;
if(temp==0)
{
goto loop1;
}
delay28us();
if(dat)
{
da|=dat;
dat=0;
}
da<<=1;
}
return(da);
}
void re_dht() //读取32位数据
{
init_dht11();
rh_z=readbyte();
rh_x=readbyte();
th_z=readbyte();
th_x=readbyte();
xy=readbyte();
dat=1;
}
void main()
{
unsigned char a=0;
unsigned char e[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x80,0xf8,0x80,0x90};
while(1)
{
re_dht();
P0=e[th_z/10];
P2=0xef;
delay1s();
P0=e[th_z%10];
P2=0xdf;
delay1s();
}
}
我先做了一个读取温度的,结果温度显示不正确,求教,哪里出了问题,怎么保证数据读取正确,谢谢。
STC12C5A60S2是单时钟的单片机。
P0端口是数码管段选,P2端口是数码管位选。
#include<reg52.h>
#include<intrins.h>
sbit dat=P1^0;
sbit P1_2=P1^2;
unsigned char rh_z,rh_x,th_z,th_x,xy;
void delay20ms(void) //误差 -0.000000000002us
{
unsigned char a,b,c;
for(c=14;c>0;c--)
for(b=168;b>0;b--)
for(a=22;a>0;a--);
}
void delay40us(void) //误差 -0.033275462963us
{
unsigned char a,b;
for(b=43;b>0;b--)
for(a=1;a>0;a--);
}
void delay80us(void) //误差 -0.066550925926us
{
unsigned char a;
for(a=218;a>0;a--);
}
void delay28us(void) //误差 0us
{
unsigned char a;
for(a=81;a>0;a--);
}
void delay1s(void) //误差 -0.000000000056us
{
unsigned char a,b,c;
for(c=182;c>0;c--)
for(b=164;b>0;b--)
for(a=99;a>0;a--);
}
void delay50us(void) //误差 0us
{
unsigned char a;
for(a=147;a>0;a--);
}
void init_dht11() //dht11程序初始化
{
unsigned char x=0;
do{
dat=1;
dat=0;
delay20ms();
dat=1;
delay40us();
x=dat;
}while(x);
dat=1;
delay80us();
}
unsigned char readbyte() //读取一个字节数据(8位数据)
{
unsigned char da=0;
unsigned char a=0,temp;
for(a=0;a<8;a++)
{
loop1:
dat=0;
delay50us();
dat=1;
temp=dat;
if(temp==0)
{
goto loop1;
}
delay28us();
if(dat)
{
da|=dat;
dat=0;
}
da<<=1;
}
return(da);
}
void re_dht() //读取32位数据
{
init_dht11();
rh_z=readbyte();
rh_x=readbyte();
th_z=readbyte();
th_x=readbyte();
xy=readbyte();
dat=1;
}
void main()
{
unsigned char a=0;
unsigned char e[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x80,0xf8,0x80,0x90};
while(1)
{
re_dht();
P0=e[th_z/10];
P2=0xef;
delay1s();
P0=e[th_z%10];
P2=0xdf;
delay1s();
}
}
我先做了一个读取温度的,结果温度显示不正确,求教,哪里出了问题,怎么保证数据读取正确,谢谢。
STC12C5A60S2是单时钟的单片机。
P0端口是数码管段选,P2端口是数码管位选。
具体问题?你试过对显示模块进行修改?