寫的atmega16 驅動dht11,一直不好使,求大神指點
#define F_CPU 8000000
#include <avr/io.h>
#include "12864.h"
#define TRH0 PORTA&=~(1<<0)
#define TRH1 PORTA|=(1<<0)
#define TRH_read (PINA&(1<<0))
#define SET_IN DDRA&=~(1<<0)
#define SET_OUT DDRA|=(1<<0)
#define u8 unsigned char
u8 date[5];
u8 fengle[5];
u8 humi,humi1,temp,temp1;
static uchar flag;
void mcu_init(void) //起始信號
{
SET_OUT ;//輸出模式
TRH0;
_delay_ms(20);
TRH1;
_delay_us(30);
}
u8 dht_init(void)
{
u8 i=0;
SET_IN;//輸入模式
while(TRH_read&&(i<100))//判斷dht11拉低電平
{
i++;
//_delay_us(1);
}
if(i>=100)return 1;
else i=0;
while((!TRH_read)&&(i<100)) //判斷拉高電平
{
i++;
//_delay_us(1);
}
if(i>=100)return 1;
else return 0; //響應成功返回
}
u8 send_one_bit(void)
{
u8 i=0;
while(TRH_read&&(i<100))// 等待拉低電平,等100us不拉低,退出循環
{
i++;
//_delay_us(1);
}
i=0;
while((!TRH_read)&&(i<100))// 等待拉高電平
{
i++;
//_delay_us(1);
}
_delay_us(30);
if(TRH_read) return 1; //延時40us,如果輸出仍為高電平,表示信號為高電平,返回電平1
else return 0; //
}
u8 send_one_byte(void)
{
u8 i,dat=0;
for(i=0;i<8;i++)
{
dat<<=1;
dat|=send_one_bit();
}
return dat;
}
void send_date()
{
u8 i;
mcu_init();//起始信號
if(dht_init()==0) //收到響應信號
{
for(i=0;i<5;i++) //發數據
{
date[i]=send_one_byte();
}
if(date[0]+date[1]+date[2]+date[3]==date[4])
{
flag++;
fengle[0]=date[0];
fengle[1]=date[1];
fengle[2]=date[2];
fengle[3]=date[3];
}
}
}
void display()
{ send_cmd(0x80);
send_data(0x30+fengle[0]/10);
send_data(0x30+fengle[1]%10);
send_cmd(0x98);
send_data(0x30+fengle[2]/10);
send_data(0x30+fengle[3]%10);
send_cmd(0x88);
send_data(0x30+flag/10);
send_data(0x30+flag%10);
}
void main()
{
init_12864();
while(1)
{
send_date();
display();
}
}
|