标题: atmega16 驱动dht11,一直不好使,求大神指点 [打印本页]

作者: 45555mkkl    时间: 2016-3-19 19:56
标题: atmega16 驱动dht11,一直不好使,求大神指点
写的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();
}

}








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1