单总线通信

1、 485 CAN 单总线 SPI I2C :1、是什么 2、特点3、协议 4、使用方法 5、区别 6通信方式

概念

单总线是美国DALLAS公司推出的外围串行扩展总线技术。与SPI、I²C串行数据通信方式不同,它采用单根信号线传输。 这种协议由一个总线主节点、或多个从节点组成系统,通过单根信号线对从芯片进行数据的读取。

单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,通常情况下采用100Kbit/s以下的速率传输数据。主设备I/O口可直接驱动200m范围内的从设备,经过扩展后可达1km范围

DHT11单总线通信

HT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。 单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗, 信号传输距离可达20米以上, 使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。 连接方便, 特殊封装形式可根据用户需求而提供

通信过程

 

主机等待DHT11响应和DHT11回应

 

数据0表示方式

 数字1的表现

 代码实现

DHT11响应为微秒级别普通HAL库延时最小单位为毫秒所以需要收写延时函数

static uint32_t fac_us = 0; //us延时倍乘数
//系统时钟频率
void delay_init(uint8_t SYSCLK)
{
  fac_us = SYSCLK;
}

void delay_us(uint32_t nus)
{
  uint32_t ticks;
  uint32_t told, tnow, tcnt = 0;
  uint32_t reload = SysTick->LOAD; //LOAD的值
  ticks = nus * fac_us;            //需要的节拍数
  told = SysTick->VAL;             //刚进入时的计数器值
  while (1)
  {
    tnow = SysTick->VAL;
    if (tnow != told)
    {
      if (tnow < told)
        tcnt += told - tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
      else
        tcnt += reload - tnow + told;
      told = tnow;
      if (tcnt >= ticks)
        break; //时间超过/等于要延迟的时间,则退出.
    }
  };
}

#include "dht11.h"
#include <stdio.h>
//GPIO组
#define DHT11_GPIO_PORT  GPIOB
//接入引脚
#define DHT11_GPIO_PIN   GPIO_PIN_8
//读取电平状态
#define DHT11_DQ_IN HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN)



/********配置引脚具有收发功能************/
//IO口的初始化为输入模式 上拉(初始为高电平)
static void DHT11_IO_IN(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Pin = DHT11_GPIO_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);

}
//初始化为输出模式
static void DHT11_IO_OUT(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Pin = DHT11_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
}
/**************起始*********************/

void DHT11_Rst(void)
{
	//单片机向DHT11发送信号
	//配置输出模式
	DHT11_IO_OUT();
	//将电平拉低
	HAL_GPIO_WritePin(DHT11_GPIO_PORT,DHT11_GPIO_PIN,GPIO_PIN_RESET);
	//延时20ms
	HAL_Delay(20);
	//将电平拉高
	HAL_GPIO_WritePin(DHT11_GPIO_PORT,DHT11_GPIO_PIN,GPIO_PIN_SET);
	//延时30us(20us-40us)
	delay_us(30);
	
	
	//单片机链接DHT11结束

}

//等待DHT11答复
//1 未检测到DHT11的存在
//0 存在

uint8_t DHT11_Check(void)
{
	uint8_t retry = 0;
	DHT11_IO_IN();//SET INPUT
	//判断电平是否拉低或者延时不超过100us
	while(DHT11_DQ_IN && retry<100)
	{
		retry++;
		delay_us(1);
	}
	//>100us:未检测到DHT11存在
	//<100us: 检测到DHT11
	if(retry >=100)
	{
		return 1;
	}else
	{
		retry = 0;
	}
	//下一步检测DHT11将电平拉高
	
	while(!DHT11_DQ_IN && retry<100)
	{
		retry ++;
		delay_us(1);
	}
	if(retry >=100)
	{
		return 1;
	}else
	{
		return 0;
	}
		
}


//传送数据
//从DHT11读取一位
//返回值:1/0

uint8_t DHT11_Read_Bit(void)
{
	uint8_t retry = 0;
	while(DHT11_DQ_IN && retry <100)
	{
		retry++;
		delay_us(1);
	}
	retry = 0;
	
	//等待电平拉高第一个数据位
	while(!DHT11_DQ_IN && retry < 100)
	{
		retry++;
		delay_us(1);
	}
	//此时在第一个数据位开始时间
	delay_us(40);
	//0 26us - 28us 
	//1 70us
	//延时40us 如果现在还是高电平代表1 反之为0;
	if(DHT11_DQ_IN)return 1;
	else
		return 0;
}

//读取一个字节

uint8_t DHT11_Read_Byte(void)
{
	uint8_t i,dat;
	dat = 0;
	for(i=0;i<8;i++)
	{
		//依次将读到的一位数据左移
		dat  <<= 1;
		//将数据读出一位
		dat |= DHT11_Read_Bit();	
	}
	return dat;

}	

//从DHT11读取一次数据
uint8_t DHT11_Rrad_Date(uint8_t *humiH,uint8_t *humiL,uint8_t *tempH,uint8_t *tempL)
{
	uint8_t buf[5];
	uint8_t i;
	DHT11_Rst();
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)
		{
			buf[i]=DHT11_Read_Byte();
		}
	}
	if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    {
       *humiH=buf[0];
       *humiL=buf[1];
       *tempH=buf[2];
       *tempL=buf[3];

   }else
	return HAL_ERROR;
   return HAL_OK;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,STM32支持单总线通信单总线通信是指在一个信号线上同时传输数据和时钟信号的通信方式,常用于连接一些简单的外设,例如温度传感器、EEPROM等。STM32中常用的单总线通信协议有1-Wire协议和I2C总线协议。其中I2C总线协议需要两根线SCL和SDA,而1-Wire协议只需要一根信号线。需要注意的是单总线通信协议相比于传统的SPI接口和UART接口,其传输速率较慢且容错能力较差,但可以大大减少通信线的数量,从而简化硬件设计。 ### 回答2: 是的,STM32微控制器系列是支持单总线通信的。单总线通信是一种串行通信协议,只使用一根信号线来传输数据和控制信息。STM32微控制器通常使用GPIO引脚来实现单总线通信,比如使用DS18B20温度传感器时可以使用STM32提供的GPIO引脚来进行通信。在使用单总线通信时,STM32需要配置相应的GPIO引脚为输入或输出,并使用相应的通信协议进行数据交换。在软件方面,可以使用STM32的相关库函数或者第三方库函数来实现单总线通信协议,简化开发过程。总而言之,STM32支持单总线通信,可以通过配置相应的GPIO引脚和使用相应的通信协议来实现单总线通信功能。 ### 回答3: 是的,STM32微控制器支持单总线通信单总线通信通常使用一根总线线路来实现通信,可以同时连接多个设备。在STM32系列微控制器中,有一个专门的接口称为单总线接口(One Wire Interface),可以用来实现单总线通信。 在STM32微控制器上,单总线通信一般通过GPIO(通用输入输出口)引脚实现。可以使用单总线协议(例如DS18B20温度传感器常用的1-Wire协议)来实现通信。只需要连接单总线设备的数据引脚到STM32的GPIO引脚上,然后使用STM32的GPIO库函数来控制数据引脚的电平变化即可进行通信。 STM32提供了丰富的软件库和例程,可以方便地编写单总线通信的代码。开发者可以根据需要使用STM32的GPIO库函数来读取和写入单总线设备的数据,实现与单总线设备之间的通信。 需要注意的是,由于单总线通信只是一种通信协议,并没有专门的硬件支持,因此在使用STM32进行单总线通信时,需要开发者自行控制GPIO引脚的电平变化,以满足单总线协议的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值