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

}

时间: 2025-01-02 04:18:14

ONE WIRE的相关文章

[转载][FPGA]如何使用SignalTap观察wire与reg值

原文链接:http://www.cnblogs.com/oomusou/archive/2008/10/17/signaltap_ii_reg_wire.html Abstract撰寫Verilog時,雖然每個module都會先用ModelSim或Quartus II自帶的simulator仿真過,但真的將每個module合併時,一些不可預期的『run-time』問題可能才一一浮現,這時得靠SignalTap II來幫忙debug. Introduction使用環境:Quartus II 8.0

Reg于Wire的不同点

Reg 比喻为“相机” Reg型,是always中被赋值的信号,往往代表触发器,但不一定是触发器 Wire 比喻为“镜子” Wrie型,assign指定的组合逻辑的信号 好好想想 ,还是能有个大致的概念的~带着这个概念实战继续深入理解...

全面拥抱移动测试,Mobile JSON Wire Protocol Specification文档翻译

Selenium3已经宣布不支持移动化测试.对于老牌测试工具selenium来说这是以退为进,因为移动自动化测试工具的标准还在selenium团队手上. 本文轻度翻译了这个标准,看得懂的人不用翻译也能看懂,看不懂的人翻的天花乱坠也是一头雾水. 注意,这个规格是给工具的开发者定义的条条框框,对于使用者来说,只要知道哪些是必须工具必须支持的,且支持的细节是什么就可以了,其他可以不去深究. 这个标题就不翻译了 Mobile JSON Wire Protocol Specification 源地址 DR

Hijacking FM Radio with a Raspberry Pi &amp; Wire

转载:https://null-byte.wonderhowto.com/how-to/hack-radio-frequencies-hijacking-fm-radio-with-raspberry-pi-wire-0177007/ In our first part on software-defined radio and signals intelligence, we learned how to set up a radio listening station to find and

verilog中wire与reg类型的区别

每次写verilog代码时都会考虑把一个变量是设置为wire类型还是reg类型,因此把网上找到的一些关于这方面的资料整理了一下,方便以后查找. wire表示直通,即只要输入有变化,输出马上无条件地反映:reg表示一定要有触发,输出才会反映输入. 不指定就默认为1位wire类型.专门指定出wire类型,可能是多位或为使程序易读.wire只能被assign连续赋值,reg只能在initial和always中赋值.wire使用在连续赋值语句中,而reg使用在过程赋值语句中. 在连续赋值语句中,表达式右

使用Arduino Wire Library读取温湿度传感器AM2321

AM2321是采用I2C总线或单总线通讯的国产温湿度传感器.在AM2321手册中,当采用I2C通讯时,手册指定了多处需要主机等待的时间间隔,包括: (1)唤醒传感器时,从机不回复ACK,但主机主要等待800us~3ms再发送STOP信号: (2)主机发送读/写指令后,需等待至少1.5ms再发送读取时序: (3)读返回数据时,主机发送I2C地址后,需等待至少30us以上才能发送下一个串行时钟. 由于Arduino标准库Wire中的函数不支持指定(1)和(3)中的等待间隔,因此在之前的日志中,采用关

P2885 [USACO07NOV]电话线Telephone Wire

题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to replace the old telephone wire with new, more efficient wire. The new wiring will utilize N (2 ≤ N ≤ 100,000) already-installed telephone poles, each wit

POJ3612——Telephone Wire

Telephone Wire Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2662   Accepted: 970 Description Farmer John's cows are getting restless about their poor telephone service; they want FJ to replace the old telephone wire with new, more eff

Introduction to Cortex Serial Wire Debugging

Serial Wire Debug (SWD) provides a debug port for severely pin limited packages, often the case for small package microcontrollers but also complex ASICs where limiting pin-count is critical and can be the controlling factor in device costs. SWD repl

wire routing 网格寻址

问题描述:找A----B的路径: 算法: 1. 搜索过程 * 先从位置a(3,2)开始, 把a可到达的相邻方格都表为1( 表示与a相距为1). 注意: 具体实现时, 将a位置置为2, 其它相邻方格为a位置的值+1 * 然后把标记为1的方格可到达的相邻方格都标记为2( 表示与a相距为2). 这里需要什么数据结构? * 标记过程继续进行下去, 直至到达b或找不到可到达的相邻方格为止. 本例中, 当到达b时, b上的表记为9(实现时为9+2=11) 2. 构造a---?b的路径. 从b回溯到a . 这