最后更新:2022-07-21 21:47:40 手机定位技术交流文章
同步(synchronous)和异步(asynchronous)之间主要区别就是通信双方有没有时钟线为他们传输同步信号。
同步通信有时钟同步信号,时钟信号作为信件,两个通信各方在时钟内执行一个特定的任务。
非同步通信没有时钟同步信号,因此,通信双方都希望在没有错误的情况下传输数据,必须事先达成一系列协议.数据线的状况如何显示起始位置,什么状态代表逻辑1和逻辑0,是什么状态表示数据传输的结束,都需要提前规定,数据传输时,双方严格按照规定进行沟通.

例如, 字符串, 字符串数据是由时间决定的.
数据线拉低一个time,认为是起始位,后面的就是数据位,在后面的每个1/2Time时刻,接收方采集数据线上的电平。然后采集8个bit后,认为下一个Time的数据线状态时校验位,没有校验位则是停止位。
序列端口的逻辑水平是高电压和平低电压,但一些更复杂的通信协议不是,它们根据电压水平的时间定义逻辑1和0。
以红外遥控解码器为例.
初始信号:解码器发出9ms的低电压水平,4ms的高电压水平用于指示数据传输的启动。

逻辑1:0.56ms+1.69ms高压的低压水平
逻辑0:0.56ms低压+0.56ms高压水平

接收方和发送方应按照上述协议发送数据。
同步和非同步通信具有优点和缺点.同步传输速度快,抗干扰能力强,但需要更多的信号线,因为它们有时会发出钟声。非同步通信只能通过数据线传输数据,所以使用的信号线相对较小,但由于非同步通信的每个帧都按照特定的协议编码和解码,因此,通信的速度取决于协议,它相对缓慢,但能满足大多数场景要求,抗干预能力也与协定的复杂性有关。
如果使用两个模块之间的一个单线进行双向数据传输,那么一定会出现以下问题: 在某个点,A模块输出高压,B模块输出低压,在这个点,电压会发生冲突,电路可能会被烧毁。
因此,让两个模块不能同时驱动电路。 但是,只有一个数据线,没有控制两个模块的时钟信号,并且不能在两个模块之间指定时间,所以必须从硬件电路中解决。

在上面的图中,GPIO连接到三脚的基杆,然后驱动控制三脚的数据线。
GPIOA=1,三极导管,低压数据线
GPIOA=0,三极管关闭,高压数据线
GPIOB=1,三极导管,低压数据线
GPIOB=0,三极管封闭,数据线高压水平
真值表如下:
| GPIOA | GPIOB | DATA |
|---|---|---|
| 0 | 0 | 1(Vcc),数据线连接到拖拉阻尼器 |
| 0 | 1 | 0,数据线接地 |
| 1 | 0 | 0,数据线接地 |
| 1 | 1 | 0,数据线接地 |
根据上述四个条件,可以发现当A和B同时运行数据线时,数据线只有当双方驱动三脚时才达到高水平。 因此即使两个驱动者同时驱动数据线,电路也不会燃烧。
基于上述电路,双方可以可靠地传输数据,但仍需按照双方的协议传输数据。
例如,数据线默认为高电压水平,并维护它,突然 A 控制了数据线,拖下它,保存了一个时间,然后放弃了控制,B收到低电平信号,时间过后,控制数据线进行划线和保持时间,给A一个回应,然后放弃控制权,然后A可以将数据发送到B。

正如你所看到的,数据线可以实现半双重工作通信模式。
DHT11数字温度湿度传感器是一种具有校正数字信号输出的温度湿度复合传感器。
查询DHT11数据手册,了解DHT11连接方法和数据格式。

典型应用电路:

正如你可以看到,DHT11只使用单片机之间的一个线连接,接收和传输数据。
通信过程:
1.数据线的默认状态是高电压水平,主机被拉低,然后在拉上指示准备接收数据,然后主机等待DHT11响应。
DHT11拉下高信号线,响应DHT11准备好的主机,然后开始传输数据。
3,DHT11传输数据。
4.DHT11拉下50us信号线,指示数据传输的结束,然后主机拉到默认的数据线。

以上是初始信号和响应信号的时间,必须确保它们按照规则编写和编写,以便能够正常地识别信号。

以上是DHT11数据传输协议中的逻辑0和逻辑1的表示。
对于DHT11,他的时间序列是我们级,时间很短,所以需要高精度的计时器来检测数据。
DS18B20是一个单线数字温度传感器,其容量小,精度高,由于DDN单线总线,时间序列非常严格。
引脚配置图:

内部结构:
DS18B20主要由64位ROM和9位接收器组成。

64-bit ROM:存储DS18B20的64-bit地址序列编号,当多个DS18B20在同一总线上加载时,根据序列数目,它与DS18B20兼容。较低的8位是DS18B20单线温度传感器的家族编号;较高的8位是CRC环冗余校正代码。第一个56位数是否正确,中间48位数是唯一的序列数。

9位元存储器相当于RAM,用于存储一些数据,包括温度值、最高温度警报值、较低温度警报值、配置注册表和8位元CRC生成器。
RAM是9字节,每个字节存储不同的数据,如下图所示。
| byte0 | 温度数据低八位 |
|---|---|
| byte1 | 温度数据高八位 |
| byte2 | 用户设置最大警报值,可以与EEPROM双边 |
| byte3 | 用户设置最低警报值,可以与EEPROM双边 |
| byte4 | 配置注册表, 用于配置转换精度, 9 到 12 位精度. |
| byte5 | 预留位 |
| byte6 | 预留位 |
| byte7 | 预留位 |
| byte8 | 提高数据准确度的测试和分析 |
為了使用DS18B20,他提供了五個ROM指令和六個RAM指令。
ROM指令:
| Read ROM [33H] | 允许总线控制器读取DS18B20ROM序列 |
|---|---|
| Match ROM [55H] | 匹配ROM命令,其次是64位ROM序列,然后在设备上执行所有操作 |
| Skip ROM [CCH] | 如果忽略了ROM,则发出的命令将影响到总线上的所有设备。特别适用于总线上只有一个DS18B20 |
| Search ROM [F0H] | 搜索ROM来确定与同一总线连接的DS18B20的数目,并识别64位ROM地址 |
| Alarm ROM [ECH] | 警告搜索当执行此命令时,只有温度高于或低于设定限度的芯片才会响应 |
RAM指令:
| Convert Teamperature [44H] | 启动温度转换,导致内存RAM |
|---|---|
| Write Scratchpad [4EH] | 将数据插入内部临时。 你可以用这些三个字符来写字节2、3、4 |
| Read Scratchpad [BEH] | 阅读整个内部RAM9字节数据 |
| Copy Scratchpad [48H] | 将内存RAM中的2、3、4字节数据合并为EPROM |
| Recall EEPROM [B8H] | 写TH、TL和配置值从EPROM到内存RAM字节2、3、4 |
| Read Power Supply [B4H] | 获取DS18B20的电源模式: 1 - 电源; 0 - 数据线电源 |
如果你熟悉上面的指示,你可以访问DS18B20一次。
1.初始化:主机首先拉下总线然后释放,然后DS18B20拉下总线然后释放。

当主机检测DS18B20的低到高时序时,初始化被认为是成功的。
发送ROM命令来确定需要访问的DS18B20
3.发送RAM指令来执行特定的功能,例如启动温度转换、读取和写入RAM。
每次操作DS18B20,重复上述三个步骤。
写数据:

写0: 主机首先拉下巴士15us, 在45us后面, 继续拉下巴士.
写1:主机先拉低总线15us,在这15us内,主机需要释放总线,然后总线在上拉电阻的作用下电平被拉高。
注意,每个写操作之间必须至少有1us。
读数据:
读 0: 主机首先发射一个低电压级超过1us,低于15us,然后放弃控制总线,在这个点上总线被过载电阻提升。 在45us的后面,DS18B20拉动低总线,主机读取数据0。
读取1:控制器发出1us以上和15us以下的低压水平,其中DS18B20将数据线驱动到高压水平,其次是45us中的主机读取数据1。
注意:所有读时序列都由主机的低电压总线至少生成1us,DS18B20数据仅在主机发送15us的低电压平衡信号后才有效,因此必须在15us后进行主机采样。
红外协议有:NEC、SONY、RC5、RC6等,常用的就是NEC。下面讲解下NEC的数据协议。
首先了解以下NEC协议的逻辑1和逻辑0如何表达。

逻辑 1:0.56ms低压加上2.25ms高压,高压长于低压的三倍。
逻辑0:0.56ms低压加0.56ms高压水平,高压和平低压水平时间相同。
正如你所看到的,无论是逻辑1还是逻辑0,它们都以0开始。 56ms的低压。
NEC数据框架由一个比特和一个由导引代码、地址代码和数据代码组成的部分组成。

启动代码与启动代码相等,告诉设备准备开始传输数据。
地址是红外遥控的数目,ID的数目,不同类型的发电机的地址代码不相同。
数据是一种特定的传输数据。
为了验证数据的准确性,降低数据传输的误差率,对地址和数据进行逆操作。
引导码数据格式:

导引码为9ms的低压和平4.A的高压水平5ms。
重复码:
如果远程控件上的键仍然被按下,数据发送后将发送一个重复代码,指示当前键是否被按下或最后一个。
通常在脉冲结束后约40毫秒。 重复的代码会在108毫秒内继续发射,直到钥匙被打开。
重复代码在序列中包含下列内容:

重复代码例(绿色时低电压,白色时高电压):

你可以看到,在大约40毫秒后发送一个数据帧后,每108毫秒开始发送一个重复代码。
注:数据帧背面有一个562和一个重复代码。 5us的低电位意味着末端
因此,完整的数据框架和重复代码应该是这样:

如果它是562.5us是单位T,那么上面的所有代码和逻辑1,0是562.5us的乘数。
2.25ms=4T
4.5ms=8T
9ms=16T
在编程的时候,可以设置引脚为双边沿触发中断,每次进入中断,计算当前中断和上次中断的时间差,就得到了脉冲的宽度,在主程序中分析时间差数据,就可以解析到数据。
本文由 在线网速测试 整理编辑,转载请注明出处。