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\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的更多相关文章
- Reg于Wire的不同点
Reg 比喻为“相机” Reg型,是always中被赋值的信号,往往代表触发器,但不一定是触发器 Wire 比喻为“镜子” Wrie型,assign指定的组合逻辑的信号 好好想想 ,还是能有个大致的概 ...
- wire与reg的区别?转载大神!
本文转自:http://www.cnblogs.com/thymon/archive/2010/06/09/1754541.html //------------------------------- ...
- Android和Java的轻巧Wire协议缓冲器
Wire协议缓冲器 一个人必须有一个代码! -奥马尔小 由于我们的团队和项目增长,数据的种类和数量也随之增加. 成功将您简单的数据模型转换为复杂的! 无论您的应用程序将数据存储到磁盘或网络传送信号,该 ...
- [USACO07NOV]电话线Telephone Wire
[USACO07NOV]电话线Telephone Wire 时间限制: 1 Sec 内存限制: 128 MB 题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N &l ...
- 【USACO07NOV】电话线Telephone Wire
题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N <= 100,000)根电线杆上, 第 i 根电线杆的高度为 height_i 米(1 <= heigh ...
- BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP
BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是 ...
- reg 和wire 区别
reg相当于存储单元,wire相当于物理连线 Verilog 中变量的物理数据分为线型和寄存器型.这两种类型的变量在定义时要设置位宽,缺省为1位.变量的每一位可以是0,1,X,Z.其中x代表一个未被预 ...
- Verilog中关于wire使用的一些小知识
1.Verilog中如果wire连接到常量,而常量没有说明他的位宽,那么将会默认为32位 如: input [:] x ; wire [:] a; assign a = + x; 上述代码在综合的时候 ...
- 使用google wire解决依赖注入
使用google wire解决依赖注入 google wire是golang的一个依赖注入解决的工具,这个工具能够自动生成类的依赖关系. 当我们写代码的时候,都希望,类都是一个个独立的结构,互不耦合, ...
- 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型数据,该数 ...
随机推荐
- CSS属性合写
animation:[[ animation-name ] || [ animation-duration ] || [ animation-timing-function ] || [ animat ...
- YARN之上的大数据框架REEF:微软出品,是否值得期待?
YARN之上的大数据框架REEF:微软出品,是否值得期待? 摘要:微软即将开源大数据框架REEF,REEF运行于Hadoop新一代资源管理器YARN的上层.对于机器学习等在数据传输.任务监控和结果 ...
- asp.net MVC 路由系统
ASP.NET的路由系统是基于物理文件的路由注册,通过调用System.Routing.RouteTable的Routes(RouteCollection)属性的MapPageRoute()方法来完成 ...
- Linux kernel中网络设备的管理
kernel中使用net_device结构来描述网络设备,这个结构是网络驱动及接口层中最重要的结构.该结构不仅描述了接口方面的信息,还包括硬件信息,致使该结构很大很复杂.通过这个结构,内核在底层的网络 ...
- java动态加载配置文件
最近项目中需要做定时任务,即定时数据库的备份.定时时间用户可以在界面中配置,要求配置修改好立即生效. 想不到什么好办法.下面是一种实现思路 把用户配置的时间存到properties配置文件中,定时任务 ...
- 图的匹配问题与最大流问题(三)——最大流问题Ford-Fulkerson方法Java实现
上篇文章主要介绍了Ford-Fulkerson方法的理论基础,本篇给出一种Java的实现. 先借助伪代码熟悉下流程 FORD-FULKERSON(G,t,s) 1 for each edge(u,v) ...
- 12503 - Robot Instructions
Robot Instructions You have a robot standing on the origin of x axis. The robot will be given som ...
- Linux:备份
一.每日备份数据 该脚本backupday.sh用来每日备份你需要备份的文件或目录 使用办法 1)打开脚本修改要备份的目录或文件和备份到的目录(如从A备份到B) 2)修改后运行脚本 需要备份数据时,直 ...
- JVM参数设置、分析
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...
- 两行代码实现微信小程序联系人sidebar
话不多说,先给你们看看核心数据和结构: 一.数据: city的json array,letter的array (city的json array里的首字母是我手工放置进去的,你也可以通过for循环获得c ...