草庐IT

原理分享 | 单片机常用通信协议汇总(上)

JaneZJW 2024-12-12 原文

 vx【嵌入式工程师成长日记】

https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484134&idx=1&sn=b779ccf07e88a56cce83a33f08bf9fd6&chksm=cf4307bef8348ea846497fe037377eb9727c7865c1582fdab51acfb6019a3bad967f6c06a2c5&token=1733680428&lang=zh_CN#rdhttps://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484134&idx=1&sn=b779ccf07e88a56cce83a33f08bf9fd6&chksm=cf4307bef8348ea846497fe037377eb9727c7865c1582fdab51acfb6019a3bad967f6c06a2c5&token=1733680428&lang=zh_CN#rd

串口通信:

51单片机内部自带UART(通用异步收发器),可实现单片机串口通信。

RS232也是常用的串行通讯接口,最高速率为20KB/s,也是专为点对点通讯设计,最大传送距离为15m,适合本地设备之间的通信。

硬件电路

单片机对PC、单片机设备之间的接线为TXD连RXD,RXD连TXD

通信形式

全双工:允许数据在两个方向上同时传输

半双工:数据可以在一个信号载体的两个方向上传输,但是不能同时传输

单工:数据传输是单向的,一方固定为接收端,一方固定为发送端

UART通信方式为异步通信(通信双方各自约定通信速率)

UART数据帧格式

起始位:发送一位逻辑电平0开始传输数据

空闲位:当为高电平时,无数据传输

数据位:先发低位再发高位,传输8位数据

校验位:奇偶校验,1的位数为偶数(偶校验),1的位数为奇数(奇校验)

停止位:发送逻辑电平1停止数据传输

各参数值计算方法

SCON计算:

通常情况下选择工作方式1(8位UART,波特率可变),并且单片机一般选择工作在12T模式。

其中SYSclk为11.0592MHz,SMOD=0

串口模式图及相关代码

void UartInit(void)   //波特率设置为9600

{

AUXR = 0x01;

SCON = 0x50; //配置串口工作方式1,REN使能接收

TMOD = 0x01;//16为定时器/计数器

TH1 = 0xFD;

TL1 = 0xFD;//9600波特率的初值

TR1 = 1;//启动定时器

EA = 1;//开启总中断

ES = 1;//开启串口中断

}

I2C通信:

II2C通信是同步通信方式,采用一个同步时钟线,所有的I2C设备的SCL连在一起,SDL连在一起,均要配置成开漏 输出模式,各添加一个上拉电阻4.7k。

两根通信线:SCL(Serial Clock)、SDA(Serial Data)

同步、半双工,带数据应答

开漏输出和上拉电阻的共同作用实现了“线与”的功能,为了解决多机通信互相干扰。

I2C时序结构

起始条件:SCL高电平期间,SDA从高电平切换为低电平

终止条件:SCL高电平期间,SDA从低电平切换为高电平

发送字节:SCL低电平时,主机将数据放到SDA上,数据高位在前、低位在后,从机在SCL高电平时读取数据位

接收字节:SCL低电平时,从机将数据放到SDA上,主机在SCL高电平时读取数据位(在接受前,需要释放SDA)

发送应答(写时序):在接受完一个字节时,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

接收应答(读时序):在发送完一个字节后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接受之前,需要释放SDA)

写时序:

读时序:

I2C代码

#include <REGX52.H>

sbit I2C_SCL = P2^1;

sbit I2C_SDA = P2^0;

void I2C_Start(void)

{

I2C_SDA=1;

I2C_SCL=1;

I2C_SDA=0;

I2C_SCL=0;

}

void I2C_Stop(void)

{

I2C_SDA=0;

I2C_SCL=1;

I2C_SDA=1;

}

void I2C_SendByte(unsigned char Byte)

{

unsigned char i;

for(i=0;i<8;i++)

{

I2C_SDA=Byte&(0x80>>i);

I2C_SCL=1;

I2C_SCL=0;

}

}

unsigned char I2C_ReceiveByte(void)

{

unsigned char Byte=0x00,i;

I2C_SDA=1;

for(i=0;i<8;i++)

{

I2C_SCL=1;

if(I2C_SDA){Byte|=(0x80>>i);}

I2C_SCL=0;

}

return Byte;

}

void I2C_SendAck(unsigned char AckBit)

{

I2C_SDA=AckBit;

I2C_SCL=1;

I2C_SCL=0;

}

unsigned char  I2C_ReceiveAck()

{

unsigned char AckBit;

I2C_SDA=1;

I2C_SCL=1;

AckBit = I2C_SDA;

I2C_SCL=0;

return AckBit;

}

AT24C02时序代码

#define AT24C02_ADDRESS  0xA0

void AT24C02_WriteByte(unsigned char WordAddress,Data)

{

I2C_Start();

I2C_SendByte(AT24C02_ADDRESS);

I2C_ReceiveAck();

I2C_SendByte(WordAddress);

I2C_ReceiveAck();

I2C_SendByte(Data);

I2C_ReceiveAck();

I2C_Stop();

}

unsigned char AT24C02_ReadByte(unsigned char WordAddress)

{

unsigned char Data;

I2C_Start();

I2C_SendByte(AT24C02_ADDRESS);

I2C_ReceiveAck();

I2C_SendByte(WordAddress);

I2C_ReceiveAck();

I2C_Start();

I2C_SendByte(AT24C02_ADDRESS);

I2C_ReceiveAck();

Data = I2C_ReceiveByte();

I2C_ReceiveAck(1);

I2C_Stop();

return Data;

}

问题解答

Q:为什么AT24C02的地址是0xA0?

A:从时序图分析:若对AT24C02执行写操作,则读写位位0,所以8位地址为 1010 0000,为0xA0;反之读写位为1,则地址为0xA1

单总线(1-Wire)

1-Wire由Dallas公司推出

采用单根信号线,既传输时钟又传输数据,而且数据传输是双向的

单总线的数据传输速率一般为16.3kbit/s,最大可达142kbit/s,通常情况下采用100kbps/s以下的速率传输数据

一般需要加上拉电阻,通常选用5k~10k

传输数据的次序是低位到高位,与I2C不同

单总线时序图

初始化:

主机拉低总线480-960us产生复位脉冲,然后释放总线,进入接受模式。

单片机器件检测到上升沿,延时15-60us,拉低总线60-240us产生应答脉冲

写操作:

主机产生一个写0的时序,拉低数据线并保持60us

主机产生一个写1的时序,必须拉低数据线,在开始后的15us内拉高数据线

读操作:

主机拉低总线1us,随后释放总线,若发送1,则保持高电平;若发送0,则拉低总线并在周期结束后释放总线

所有读操作都是在主机拉低总线并保持1us后,再释放总线开始

时序代码

sbit onewire_dq = P3^7;

unsigned char onewire_init(void)

{

unsigned char i;

unsigned char ackbit;

onewire_dq=1;

onewire_dq=0;

i = 247;while (--i);  //delay 500us

onewire_dq=1;

i = 32;while (--i);   //delay 70us

ackbit = onewire_dq;

i = 247;while (--i);  //delay 500us

return ackbit;

}

unsigned char onewire_sendbit(unsigned char Bit)

{

unsigned char i;

onewire_dq=0;

i = 4;while (--i); //delay 14us

onewire_dq  =Bit;

i = 22;while (--i); //delay 50us

onewire_dq=1;

}

unsigned char onewire_receivebit(void)

{

unsigned char i;

unsigned char Bit;

onewire_dq=0;

i = 2;while (--i); //delay 9us

onewire_dq=1;

i = 2;while (--i); //delay 9us

Bit = onewire_dq;

i = 22;while (--i); //delay 50us

return Bit;

}

void onewire_sendbyte(unsigned char byte)

{

unsigned char i;

for(i=0;i<8;i++)

{

onewire_sendbit(byte&(0x01<<i));

}

}

unsigned char onewire_receivebyte(void)

{

unsigned char i;

unsigned char byte=0x00;

for(i=0;i<8;i++)

{

if(onewire_receivebit())

{

byte|=(0x01<<i);

}

}

return byte;

}

功能命令

以DS18B20为例(常用)

跳过ROM——0xcc

启动转换——0x44

读取暂存器——0xbe

有关原理分享 | 单片机常用通信协议汇总(上)的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  7. 电脑怎么截图?进来看(8种常用截图方法) - 2

    电脑上可以截取图片吗?如果可以,该如何操作呢?相信很多小伙伴都只知道一两种截图的方式,知道的并不全面。其实,电脑上有多种方式截图的,而且非常方便。电脑怎么截图?今天我们就来教大家如何使用电脑截取图片的8种常用方式!操作环境:演示机型:Delloptiplex7050系统版本:Windows10方法一:系统自带截图具体操作:同时按下电脑的自带截图键【Windows+shift+S】,可以选择其中一种方式来截取图片:截屏有矩形截屏、任意形状截屏、窗口截屏和全屏截图。 方法二:QQ截图具体操作:在电脑登录QQ,然后同时按下【Ctrl+Alt+A】,可以任意截图你需要的界面,可以把截图的页面直接下载,

  8. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  9. 常见网络安全产品汇总(私信发送思维导图) - 2

    安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un

  10. 网络实验之RIPV2协议(一) - 2

    一、RIPV2协议简介  RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对

随机推荐