Mình đang viết code cho 89C52 để đọc Nhiệt độ và ẩm độ của DHT11, do mới chuyển từ code ASM sang keil C nên chưa có kinh nghiệm.
Phần cứng như sau:
P0 nối với 7 đoạn led.
P2.0,P2.1,P2.2,P2.3 điều khiển nguồn 4 led.
P2.5 nối chân data của DHT11.
Mình làm hoài mà chương trình chỉ trả về lỗi 1, nghĩa là DHT không chịu nói chuyện với mình.
Kết nối tốt, vì cùng một mạch, nạp code ASM chạy OK, còn code Keil C thì không chạy.
Xin các bác Pro chỉ giúp mình, không biết có phải hàm delay không đúng, vì mình lấy trong hướng dẫn của trang BanLinhKien.
và không biết có lỗi nào nữa không mà không đọc được giá trị. Thanks!!
Code Keil C như sau:
#include <REGX52.H>
#define bat 1
#define tat 0
//dung trong hien thi
#define led0 P2_3
#define led1 P2_2
#define led2 P2_1
#define led3 P2_0
sbit Dht_Out=P2^5;
unsigned int buffer[5]={0,0,0,0,0};
unsigned char nhiet=0,am=0,dem0=99,loi=0;
char ma7doan[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
char ma7doan_n[ ]={0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x8 2};
void tre_ms(unsigned int x)
{
unsigned int i,j;
for(i=0;i<=x;i++)
{
for(j=0;j<=125;j++);
}
}
void tre_us(unsigned int x)
{ x=x/8;
while(x--);
}
void Hien_Thi(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4)
{
led0=bat;
P0=ma7doan[x4];
tre_us(200);
led0=tat;
led1=bat;
P0=ma7doan_n[x3];
tre_us(200);
led1=tat;
led2=bat;
P0=ma7doan[x2];
tre_us(200);
led2=tat;
led3=bat;
P0=ma7doan[x1];
tre_us(200);
led3=tat;
}
//========doc DHT11=======
bit Doc_Dht(void)
{ unsigned char i,ii;
unsigned int checksum;
Dht_Out=1;
tre_us(60);
Dht_Out=0;
tre_ms(45);//it nhat 18ms
Dht_Out=1;
tre_us(85);
if ((Dht_Out)) {loi=1;return 0;}
else while(!(Dht_Out));//doi data len 1
tre_us(60);
if(!(Dht_Out)){loi=2;return 0;}
else while((Dht_Out));//doi data ve 0
//bat dau doc
for (i=0;i<5;i++)
{ for(ii=0;ii<8;ii++)
{ while(!(Dht_Out));//doi data len 1
tre_us(50);
if((Dht_Out))
{buffer[i]|=(1<<(7-ii));
while((Dht_Out)); //doi data ve 0
}
}
}
//tinh check sum
checksum=buffer[0]+buffer[1]+buffer[2]+buffer[3];
if ((checksum)!=buffer[4]) {loi=3;return 0;}
else
{
return 1;
}
}
//chuong trinh chinh
void main(void)
{ while(1)
{ dem0++;
if ((dem0)==100)
{ dem0=0;
if((Doc_Dht()))
{
nhiet=buffer[0];
am=buffer[2];
}
else am=loi;
}
Hien_Thi(nhiet/10,nhiet%10,am/10,am%10);
}
}
Phần cứng như sau:
P0 nối với 7 đoạn led.
P2.0,P2.1,P2.2,P2.3 điều khiển nguồn 4 led.
P2.5 nối chân data của DHT11.
Mình làm hoài mà chương trình chỉ trả về lỗi 1, nghĩa là DHT không chịu nói chuyện với mình.
Kết nối tốt, vì cùng một mạch, nạp code ASM chạy OK, còn code Keil C thì không chạy.
Xin các bác Pro chỉ giúp mình, không biết có phải hàm delay không đúng, vì mình lấy trong hướng dẫn của trang BanLinhKien.
và không biết có lỗi nào nữa không mà không đọc được giá trị. Thanks!!
Code Keil C như sau:
#include <REGX52.H>
#define bat 1
#define tat 0
//dung trong hien thi
#define led0 P2_3
#define led1 P2_2
#define led2 P2_1
#define led3 P2_0
sbit Dht_Out=P2^5;
unsigned int buffer[5]={0,0,0,0,0};
unsigned char nhiet=0,am=0,dem0=99,loi=0;
char ma7doan[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
char ma7doan_n[ ]={0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x8 2};
void tre_ms(unsigned int x)
{
unsigned int i,j;
for(i=0;i<=x;i++)
{
for(j=0;j<=125;j++);
}
}
void tre_us(unsigned int x)
{ x=x/8;
while(x--);
}
void Hien_Thi(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4)
{
led0=bat;
P0=ma7doan[x4];
tre_us(200);
led0=tat;
led1=bat;
P0=ma7doan_n[x3];
tre_us(200);
led1=tat;
led2=bat;
P0=ma7doan[x2];
tre_us(200);
led2=tat;
led3=bat;
P0=ma7doan[x1];
tre_us(200);
led3=tat;
}
//========doc DHT11=======
bit Doc_Dht(void)
{ unsigned char i,ii;
unsigned int checksum;
Dht_Out=1;
tre_us(60);
Dht_Out=0;
tre_ms(45);//it nhat 18ms
Dht_Out=1;
tre_us(85);
if ((Dht_Out)) {loi=1;return 0;}
else while(!(Dht_Out));//doi data len 1
tre_us(60);
if(!(Dht_Out)){loi=2;return 0;}
else while((Dht_Out));//doi data ve 0
//bat dau doc
for (i=0;i<5;i++)
{ for(ii=0;ii<8;ii++)
{ while(!(Dht_Out));//doi data len 1
tre_us(50);
if((Dht_Out))
{buffer[i]|=(1<<(7-ii));
while((Dht_Out)); //doi data ve 0
}
}
}
//tinh check sum
checksum=buffer[0]+buffer[1]+buffer[2]+buffer[3];
if ((checksum)!=buffer[4]) {loi=3;return 0;}
else
{
return 1;
}
}
//chuong trinh chinh
void main(void)
{ while(1)
{ dem0++;
if ((dem0)==100)
{ dem0=0;
if((Doc_Dht()))
{
nhiet=buffer[0];
am=buffer[2];
}
else am=loi;
}
Hien_Thi(nhiet/10,nhiet%10,am/10,am%10);
}
}