zoukankan      html  css  js  c++  java
  • ONE WIRE

    以温度温度传感器为例

    由三根线,分别为电源,信号,地线

    使用GPIO口对信号线进行读操作

    //初始化GPIO PC0端口
    void dht11_init()
    {
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOC, &GPIO_InitStruct);

    //延迟100ms
    delay_ms(100);
    }

     下面是取设置的数据操作

    原理就是搞懂时序是怎么回事,

    开始:至少拉低18ms 在拉高 20~40us,然后得到确认码(低电平小于100US) 然后接收数据时序(取35US时返回的数据)


    //起始信号 是由主机产生,输出模式
    void dht11_start()
    {
    DHT11_OUT; //输出模式
    PCout(0) = 0;
    delay_ms(20); //至少拉低18ms
    PCout(0) = 1;
    delay_us(30); //拉高 20~40us
    }

    //dht11响应 输入模式
    //如果dht11一直为高 或者一直为低
    //都表明DHT11没有响应,电路有问题
    //返回值
    //1 无响应 0 表示有响应
    u8 dht11_ack()
    {
    int ret =0;
    DHT11_IN; //输入模式
    //循环计算 大致的时间

    while(0 == PCin(0))
    {
    ret++;
    delay_us(1);
    if(ret == 100) return 1;
    }

    ret = 0;
    while(1 == PCin(0))
    {
    ret++;
    delay_us(1);
    if(ret == 100) return 1;
    }

    //如果能执行到这一行,说明有响应
    return 0;
    }


    //接收数据
    //统计高电平的时长, 0 1 低电平都一样
    u8 dht11_read_bit()
    {
    int ret=0; //用于统计高电平的时长
    //耗完低电平
    while(0==PCin(0));

    while(1==PCin(0))
    {
    ret++;
    delay_us(1);
    }

    if(ret < 50) return 0;
    else return 1;
    }

    //读取0 1 第二种实现方式
    u8 dht11_read_bit2()
    {
    //耗完高电平
    while(1==PCin(0));
    //耗完低电平
    while(0==PCin(0));
    delay_us(35); //延时一半的时间
    return PCin(0); //直接返回当前值
    }

    //读取一个字节
    u8 dht11_read_byte()
    {
    u8 i=0;
    u8 data = 0;
    for(;i<8;i++)
    {
    data<<=1;
    data += dht11_read_bit2();
    }

    return data;
    }

    //一次性读取40位
    void dht11_read_data(u8 *wendu, u8 *shidu)
    {
    u8 data[5] = {0};
    u8 i =0;
    dht11_start();//起始信号
    if(dht11_ack()) //反馈信号
    {
    printf("dht11 err ");
    }

    for(;i<5;i++)
    {
    data[i] = dht11_read_byte();
    }
    /*
    data[0] 温度整数部分
    data[1] 温度小数部分
    data[2] 温度整数部分
    data[3] 温度小数部分
    data[4] 校验码
    */

    //校验和
    if(data[0] + data[1] + data[2] + data[3] == data[4])
    {
    *wendu = data[2];
    *shidu = data[0];
    } else {
    printf("data err ");
    }


    }

  • 相关阅读:
    EL表达式学习
    IDEA maven项目创建速度慢
    c语言栈的链表实现
    c数据结构学习随笔
    自定义JSP中的Taglib标签之四自定义标签中的Function函数
    深入理解HTTP Session
    利用GeneratedKeyHolder获得新增数据主键值
    RBAC用户角色权限设计方案
    Fragment与Activity交互(使用接口)
    php session 自定义的设置测试
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6194508.html
Copyright © 2011-2022 走看看