请选择 进入手机版 | 继续访问电脑版
查看: 3758|回复: 2

求购kw01外接dht11构件

[复制链接]

该用户从未签到

3

主题

6

帖子

0

新手上路

Rank: 1

积分
41
最后登录
2017-5-17
发表于 2017-5-10 11:12:02 | 显示全部楼层 |阅读模式
/*
* dth11.c
*
*/
#include"dht11.h"
#include"gpio.h"
//请根据自己的 dht11 接的 IO 口来改动位定义
uint32_t DTH11=gpio_init((PORTD)|(5),0,1);
//防止在与硬件通信时发生死循环的计数范围
#define NUMBER   20
#define SIZE 5
static unsigned char status;
//存放五字节数据的数组
static unsigned char value_array[SIZE];
/*可在其他的文件引用温湿度值,实际是温度的整数的 10 倍
如 dht11 读回的温度是 26,则 temp_value = 260,  湿度同理*/
int temp_value, humi_value;

static unsigned char ReadValue(void);
void DHT11_Rst(){
        Delay_ms(20);
        Delay_us(50);
}
/*读一个字节的数据*/
static unsigned char DHT11_ReadValue(void)
{
        unsigned char count, value = 0, i;
        status = OK;      //设定标志为正常状态
        for(i = 8; i > 0; i--)
        {
                //高位在先
                value<<= 1;
                count = 0;
                //每一位数据前会有一个 50us 的低电平时间.等待 50us 低电平结束
                while(dht11 == 0 && count++ < NUMBER);
                if(count>= NUMBER)
                {
                        status = ERROR;  //设定错误标志
                        return 0;//函数执行过程发生错误就退出函数
                }

                //26-28us 的高电平表示该位是 0,为 70us 高电平表该位 1
                DHT11_Delay_us(30);
                //延时 30us 后检测数据线是否还是高电平
                if(dht11 != 0)
                {
                        //进入这里表示该位是 1
                        value ++;
                        //等待剩余(约 40us)的高电平结束
                        while(dht11 != 0 && count++ < NUMBER)
                        {
                                dht11 = 1;
                        }
                        if(count>= NUMBER)
                        {
                                status = ERROR;       //设定错误标志
                                return 0;
                        }
                }
        }
        return(value);
}
//读温度和湿度函数,读一次的数据,共五字节,读出成功函数返回 OK,  错误返回 ERROR
unsigned char DHT11_ReadTempAndHumi(void)
{
        unsigned char i = 0, check_value = 0,count = 0;
        EA = 0;
        dht11 = 0; //拉低数据线大于 18ms 发送开始信号
        Delay_ms(20);   //需大于 18 毫秒
        dht11 = 1;
         //释放数据线,用于检测低电平的应答信号
        //延时 20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线 80us
        DHT11_Delay_us(10);
        DHT11_Delay_us(10);
        DHT11_Delay_us(10);
        DHT11_Delay_us(10);
        if(dht11 != 0)    //检测应答信号,应答信号是低电平
        {
                //没应答信号
                EA = 1;
                return ERROR;
        }
        else
        {
                //有应答信号
                while(dht11 == 0 && count++ < NUMBER);     //等待应答信号结束
                if(count>= NUMBER)   //检测计数器是否超过了设定的范围
                {
                        dht11 = 1;
                        EA = 1;
                }
                return ERROR;
                //读数据出错,退出函数
                count = 0;
                dht11 = 1;//释放数据线
                //应答信号后会有一个 80us 的高电平,等待高电平结束
                while(dht11 != 0 && count++ < NUMBER);
                if(count>= NUMBER)
                {
                        dht11 = 1;
                        EA = 1;
                        return ERROR;   //退出函数
                }
                //读出湿.温度值
                for(i = 0; i < SIZE; i++)
                {
                        value_array[i] = DHT11_ReadValue();
                        if(status== ERROR)//调用 ReadValue()读数据出错会设定 status 为 ERROR
                        {
                                dht11 = 1;
                                EA = 1;
                                return ERROR;
                        }
                        //读出的最后一个值是校验值不需加上去
                        if(i!= SIZE -1)
                        {
                                //读出的五字节数据中的前四字节数据和等于第五字节数据表示成功
                                check_value += value_array[i];
                        }
                }//end for

                //在没用发生函数调用失败时进行校验
                if(check_value == value_array[SIZE - 1])
                {
                        //将温湿度扩大 10 倍方便分离出每一位
                        humi_value= value_array[0] * 10;
                        temp_value= value_array[2] *10;
                        dht11 = 1;
                        EA = 1;
                        return humi_value,temp_value; //正确的读出 dht11 输出的数据
                }
                else
                {
                //校验数据出错
                EA = 1;
                return ERROR;
                }
        }
}这份构件无法使用,只能求购

回复

使用道具 举报

该用户从未签到

652

主题

6306

帖子

0

超级版主

Rank: 8Rank: 8

积分
19803
最后登录
2024-4-16
发表于 2017-5-10 16:28:32 | 显示全部楼层
非常感谢你的技术问题。我们建议您将此技术问题提交到NXP的英文论坛。网址是http://community.nxp.com/welcome谢谢。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

8

帖子

0

禁止发言

积分
50
最后登录
2019-12-18
发表于 2019-12-18 01:02:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-16 12:33 , Processed in 0.127007 second(s), 21 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表