打印
[AVR单片机]

求看看DHT11的这段程序 为什么采集不到数据。在示波器上也看不到输出波形

[复制链接]
2985|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
巨坑无比货|  楼主 | 2015-4-24 11:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define DATA_IN DDRE &= ~(1 << PE0)
#define DATA_OUT DDRE |= (1 << PE0)
#define DATA_CLR PORTE &= ~(1 << PE0)
#define DATA_SET PORTE |= (1 << PE0)
#define DATA_READ PINE & (1 <<PE0)

char DHT_byte(unsigned char *p)
{
unsigned char j,time_flag,DHT_byte_value=0,temp;
for(j=0;j<8;j++)
{
time_flag=2;
while((!(DATA_READ))&&time_flag++);
if(time_flag==1) //超时终止
{
*p=0x01;
break;
}
delay_us(40);
temp=0;

if(DATA_READ)temp=1;
time_flag=2;
while((DATA_READ)&&time_flag++);
if(time_flag==1)
{
*p=0x01;
break;
}

DHT_byte_value<<=1;
DHT_byte_value|=temp;
}
return DHT_byte_value;
}
//--------------------------------
//-----温湿度读取子程序 ------------
//--------------------------------
//----湿度高8位== DHT_value[0]-----
//----湿度低8位== DHT_value[1]-----
//----温度高8位== DHT_value[2]------
//----温度低8位== DHT_value[3]------
//----校验 8位 == DHT_value[4]-----
//--------------------------------
void DHT_read(unsigned char *p)
{
unsigned char i,time_flag,DHT_v_temp[5],temp1=0;
//主机拉低18ms
DATA_OUT;
DATA_CLR;
delay_ms(18);
//设置为输入,总线由上拉电阻拉高主机延时20-40us
DATA_IN;
DATA_SET;
delay_us(40);
if(DATA_READ) time_flag=1;
while(!(DATA_READ))
{
time_flag=2;
while((!(DATA_READ))&&time_flag++); //
if(time_flag==1) break;
time_flag=2;
while((DATA_READ)&&time_flag++);
if(time_flag==1) break;

for(i=0;i<5;i++)
{
DHT_v_temp[i]=DHT_byte(&time_flag);
if(time_flag==1)break;
if(i<4) temp1 += DHT_v_temp[i];
}
}
DATA_IN;
DATA_SET;
//数据校验
if(temp1==DHT_v_temp[4])
{
for(i=0;i<5;i++)
{
*(p+i)=DHT_v_temp[i];
}
}
}

相关帖子

沙发
巨坑无比货|  楼主 | 2015-4-24 11:55 | 只看该作者
是基于ATME128的

使用特权

评论回复
板凳
巨坑无比货|  楼主 | 2015-4-25 09:46 | 只看该作者
有经验的人来指导下啊。谢谢了

使用特权

评论回复
地板
cimtjx| | 2015-5-14 15:42 | 只看该作者
记得要拉低几十毫秒,传感器才有响应。

使用特权

评论回复
5
巨坑无比货|  楼主 | 2015-5-16 11:00 | 只看该作者
cimtjx 发表于 2015-5-14 15:42
记得要拉低几十毫秒,传感器才有响应。

有拉低18ms的

使用特权

评论回复
6
小强强12138| | 2015-6-21 15:46 | 只看该作者
#define B_IN        DDRB&=~(1<<0)                /*设置输入*/
#define B_OUT        DDRB|=(1<<0)                /*设置输出*/
#define B_CLR        PORTB&=~(1<<0)        /*置低电平*/
#define B_SET        PORTB|=(1<<0)                /*置高电平*/
#define B_R                (PINB&0x01)        /*读了电平*/
uchar dht_t1=14,dht_t2=0;        //依次为温度整数部分和温度小数部分
uchar dht_d1=23,dht_d2=0;        //依次为湿度整数部分和湿度小数部分
uchar dht_chk=0;                //和校验
uchar dht_num=0;

uchar dht_readat()        //接收一个8位数据,先高位后低位
{
        uchar i=0,dat=0;
        for(i=0;i<8;i++)
        {
                dht_num=2;
                while((!B_R)&&(dht_num++));
                _delay_us(40);
                dat=dat<<1;
                if(B_R)
                {
                        dht_num=2;
                        dat=dat|0x01;
                        while((B_R)&&(dht_num++));
                }
        }
        return dat;
}

void dht_getdat()         //给DHT11一个开始信号,然后读取一次数据,共五个8位字节
{
        uchar i=0;

        B_OUT;
        B_CLR;
        _delay_ms(20);
        B_IN;
        B_SET;         //单片机给起始脉冲信号
        _delay_us(50);
        B_IN;
        B_SET;          //稍作延时,等待DHT11返回响应(响应为低电平)

        if(!B_R)        //有响应才接收数据,否则不作处理
        {
                dht_num=2;while((!B_R)&&(dht_num++));
                dht_num=2;while((B_R)&&(dht_num++));
                dht_d1=dht_readat();
                dht_d2=dht_readat();
                dht_t1=dht_readat();
                dht_t2=dht_readat();
                dht_chk=dht_readat();        //一次读出五个数据
                write_yrsfm(10,dht_d1);
                write_yrsfm(14,dht_t1);
        }
        B_IN;
        B_SET;        //释放总线
        _delay_ms(100);        //稍作延时
}

void dht_init()        //DHT11的初始化函数
{
        _delay_ms(1000);        //DHT11上电前准备时间,大概1s
        B_IN;
        B_SET;        //总线准备
}

int main()
{
        DDRA = 0xff;PORTA = 0xff;
        DDRB = 0x00;PORTB = 0xff;
        dht_init();
        nit();
        huitu_clear();
        init();
        while(1)
        {
                dht_getdat();
        }
}

用12864显示的,原程序过大,这是温度读取部分,测试过,是可以用的。

使用特权

评论回复
7
SD10A| | 2015-6-24 17:41 | 只看该作者
本帖最后由 SD10A 于 2015-6-24 17:51 编辑

/数据校验  出了问题   是四个数据之和
DATA_IN;
DATA_SET;  对调下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝