以温度温度传感器为例

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

使用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\r\n");
}

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\r\n");
}

}

ONE WIRE的更多相关文章

  1. Reg于Wire的不同点

    Reg 比喻为“相机” Reg型,是always中被赋值的信号,往往代表触发器,但不一定是触发器 Wire 比喻为“镜子” Wrie型,assign指定的组合逻辑的信号 好好想想 ,还是能有个大致的概 ...

  2. wire与reg的区别?转载大神!

    本文转自:http://www.cnblogs.com/thymon/archive/2010/06/09/1754541.html //------------------------------- ...

  3. Android和Java的轻巧Wire协议缓冲器

    Wire协议缓冲器 一个人必须有一个代码! -奥马尔小 由于我们的团队和项目增长,数据的种类和数量也随之增加. 成功将您简单的数据模型转换为复杂的! 无论您的应用程序将数据存储到磁盘或网络传送信号,该 ...

  4. [USACO07NOV]电话线Telephone Wire

    [USACO07NOV]电话线Telephone Wire 时间限制: 1 Sec  内存限制: 128 MB 题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N &l ...

  5. 【USACO07NOV】电话线Telephone Wire

    题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N <= 100,000)根电线杆上, 第 i 根电线杆的高度为 height_i 米(1 <= heigh ...

  6. BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP

    BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是 ...

  7. reg 和wire 区别

    reg相当于存储单元,wire相当于物理连线 Verilog 中变量的物理数据分为线型和寄存器型.这两种类型的变量在定义时要设置位宽,缺省为1位.变量的每一位可以是0,1,X,Z.其中x代表一个未被预 ...

  8. Verilog中关于wire使用的一些小知识

    1.Verilog中如果wire连接到常量,而常量没有说明他的位宽,那么将会默认为32位 如: input [:] x ; wire [:] a; assign a = + x; 上述代码在综合的时候 ...

  9. 使用google wire解决依赖注入

    使用google wire解决依赖注入 google wire是golang的一个依赖注入解决的工具,这个工具能够自动生成类的依赖关系. 当我们写代码的时候,都希望,类都是一个个独立的结构,互不耦合, ...

  10. wire [7:0] regAddr; 理解

    首先要指出的是wire[7,0]a和wire[8,1]a这样的表达在verilog中是错误的,应该写成wire[7:0]a和wire[8:1]a wire[7:0]a表示定义了一个wire型数据,该数 ...

随机推荐

  1. jquery中each用法

    通用遍历方法,可用于遍历对象和数组.$().each(),回调函数拥有两个参数: 第一个为对象的成员或数组的索引,第二个为对应变量或内容.如需退出each循环可使回调函数返回false 现有如下两个s ...

  2. xml数据解析

    xml数据解析 在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.Kiss ...

  3. iOS 7 beta4 体验

    iOS 7 beta4终于来了,安装后感觉稳定了不少.下面列几点我个人感受比较深得地方. 1.锁屏界面有滑动方向箭头了,而且“滑动来解锁”几个字也有动态颜色变化,让人不再迷惑该往那边滑动了. 2.通知 ...

  4. JQuery实现分页程序代码

    JQuery实现分页程序代码 做Web开发的程序员,分页时在所难免的,微软GridView.AspPager等设置分页数据可以自动分页,但是这里浏览器会闪动,用户体验不是很友好,在此我整理了JQuer ...

  5. C Socket初探

    C Socket初探 前段时间写了个C# Socket初探,这次再写个C语言的Socket博文,运行效果如下: 实现步骤: 1. Server端 #include <stdio.h> // ...

  6. TOGAF架构内容框架之架构制品(上)

    TOGAF架构内容框架之架构制品(上) 4. 架构制品(Architectural Artifacts) 架构制品是针对某个系统或解决方案的模型描述,与架构交付物和构建块相比,架构制品既不是架构开发方 ...

  7. 先对数组排序,在进行折半查找(C++)

    第一步:输入15个整数 第二步:对这15个数进行排序 第三部:输入一个数,在后在排好序的数中进行折半查找,判断该数的位置 实现代码如下: 方法一: 选择排序法+循环折半查找法 #include< ...

  8. SharePoint Solutions Deployment-PowerShell

    之前群里有人问到了这个,项目一期开发结束后正好整理了一下,发上来分享一下,也是从谷歌搜索里面学来的,大家要用好搜索哈 $ver = $host | select version if ($ver.Ve ...

  9. Sybase数据库截断和清空日志的方法

    今天碰到一个奇怪的问题,当我打开应用程序的时候,开始的时候鼠标图标还显示程序正在启动,可是一会后,就没有任何反应了.重复了N多次都是这样,后来发现,每次打开应用程序的时候,任务管理器中都会相应的多一个 ...

  10. EL表达式学习

    EL表达式取值 1.EL表达式的语法格式很简单: 以前编写jsp代码时,如果要获取表单中的用户名,一般使用 <%=request.getParameter("name")%& ...