51单片机通信协议
51单片机通信协议
单片机通信协议现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。
其中就涉及到通信的过程。
在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。
1.自定义数据通信协议这里所说的数据协议是建立在物理层之上的通信数据包格式。
所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。
在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。
所有的数据协议全部建立在这两个操作方法之上。
通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。
类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。
帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。
减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。
通常有两种做法,一、减小特征字节的匹配几率。
二、增加特征字节的长度。
通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。
使用第二种方法的情况更加通用,适合于数据随即的场合。
通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。
地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。
在一对多的通信系统中,可以只包含目的地址信息。
同时包含源地址和目的地址则适用于多对多的通信系统。
数据类型、数据长度和数据块是主要的数据部分。
数据类型可以标识后面紧接着的是命令还是数据。
数据长度用于指示有效数据的个数。
51单片机通讯协议书
51单片机通讯协议书甲方(以下简称甲方):地址:联系电话:乙方(以下简称乙方):地址:联系电话:鉴于甲方需开发一款基于51单片机的通讯设备,乙方具备相应的技术能力和经验,双方经友好协商,就51单片机通讯协议的制定与实施达成如下协议:第一条协议目的本协议旨在明确甲方与乙方在51单片机通讯协议开发过程中的权利、义务和责任,确保通讯协议的顺利制定和实施。
第二条协议范围1. 本协议涵盖51单片机通讯协议的制定、测试、优化及最终交付。
2. 乙方应根据甲方的技术要求和标准,开发符合甲方需求的通讯协议。
第三条技术要求1. 乙方应保证所开发的通讯协议满足甲方提出的技术参数和性能指标。
2. 通讯协议应支持至少两种以上的通讯方式,包括但不限于串行通讯、并行通讯等。
3. 乙方应确保通讯协议具有良好的稳定性和兼容性。
第四条交付成果1. 乙方应向甲方提供完整的通讯协议文档,包括但不限于协议说明、接口定义、数据格式等。
2. 乙方应提供通讯协议的源代码,并确保代码的可读性和可维护性。
3. 乙方应提供通讯协议的测试报告,包括测试环境、测试方法和测试结果。
第五条知识产权1. 乙方开发的通讯协议及其源代码的知识产权归甲方所有。
2. 乙方应保证所开发的通讯协议不侵犯任何第三方的知识产权。
第六条保密条款1. 乙方应对在协议开发过程中知悉的甲方商业秘密和技术秘密负有保密义务。
2. 未经甲方书面同意,乙方不得向任何第三方披露、提供或允许第三方使用甲方的商业秘密和技术秘密。
第七条违约责任1. 如乙方未能按照本协议约定的时间和要求完成通讯协议的开发,甲方有权要求乙方承担违约责任。
2. 如乙方开发的通讯协议侵犯了第三方的知识产权,乙方应负责解决相关纠纷,并赔偿甲方因此遭受的一切损失。
第八条协议变更和终止1. 本协议的任何变更或补充均需双方协商一致,并以书面形式确认。
2. 如一方严重违反本协议,另一方有权书面通知对方终止本协议。
第九条争议解决本协议在履行过程中如发生争议,双方应首先通过友好协商解决;协商不成时,任何一方均可向甲方所在地人民法院提起诉讼。
485通信程序(51单片机)
485通信程序(51单片机)什么是485通信?RS-485是一种串行通信协议,它使用差分信号传输数据。
485通信支持了在两个或以上设备之间传输数据的需求,比如用于电子计算机、通信设备、工业自动化等等。
RS-485已广泛应用于数控机床、自动化设备控制等领域中。
单纯的485通信包含四种通信模式:点对点、总线形、多主机和简介式通信。
其中,点对点通信指的是一对一的通信方式;总线形通信指的是一对多的群通信方式,所有设备都在同一条总线上发送和接收数据;多主机通信指的是多台主机的通信方式,多个设备都可以同时发送数据;简介式通信是一种用于仅需要发送少量数据的情况的通信方式。
下面介绍一下485通信的部分基本知识1.485通信的传输距离远,一般可以达到1200米。
2.485通信具有较强的抗干扰能力。
3.485通信使用差分信号进行传输,信号稳定,传输速率也比较快。
4.485通信可以支持多个设备同时进行通信,但是在同一时间内只有一个设备可发送数据。
5.在采用485通信时,一定要注意通讯端口的设置,如波特率、数据位、停止位等。
程序实现原理该程序使用了51单片机作为主控制器实现了基本的485通信,具体实现如下:1.通信模式的设置在程序开始时,需要设置通信模式。
如果通信模式为点对点通信,则可以直接使用UART通信模块进行通信;如果是多点通信,则需要使用485通信芯片。
2.通讯端口的配置在进行485通讯时,需要进行通讯端口的配置,包括波特率、数据位、停止位等参数的设定。
在485通信模式下,只有一个设备可为主设备,其他设备均为被设备。
在发送数据时,主设备的TXD口要与外部总线的D+口相连,而D-口不连接,从设备的TXD口要与D-口相连,而D+口不连接。
在接收数据时,主设备的RXD口要与D+口相连,而D-口不连接,从设备的RXD口要与D-口相连,而D+口不连接。
3.数据的发送和接收在发送和接收数据时,需要采用特定的方式进行报文的封装和解析。
51单片机串口通信原理
51单片机串口通信原理详解1. 引言串口(Serial Port)是一种常用于计算机与外部设备之间进行数据传输的接口,它是一种逐位传输的方式。
51单片机是一种非常常用的单片机,串口通信是其重要的通信方式之一。
本文将详细解释51单片机串口通信的基本原理,包括串口通信的定义、硬件连接示意图、通信协议、数据传输过程以及数据接收处理等方面的内容。
2. 串口通信定义串口通信是一种通过串行通路进行数据传输的通信方式。
它是一种点对点的通信协议,即通信的两端通过共享数据线进行数据交换。
3. 硬件连接示意图完成串口通信,需要将单片机与外部设备进行连接。
下图是一个常见的串口通信连接示意图:___| |TXD <-|---|---> RXD| |RXD <-|---|---> TXD|___|单片机外部设备通常,单片机的TXD引脚连接到外部设备的RXD引脚,而单片机的RXD引脚连接到外部设备的TXD引脚。
4. 串口通信协议串口通信需要明确一种通信协议,以规定数据的传输格式和相关参数。
在51单片机中,常用的串口通信协议有UART(Universal Asynchronous ReceiverTransmitter)和USART(Universal Synchronous Asynchronous Receiver Transmitter)。
UART是指不使用时钟信号而直接利用起始位、数据位和停止位来传输数据的协议,属于异步通信。
USART是指同步和异步传输都能实现的通信协议。
5. 数据传输过程串口通信的数据传输过程可以分为发送和接收两个部分。
5.1 发送数据发送数据的步骤如下:1.配置串口通信参数,包括波特率、数据位、停止位和校验位等。
2.将要发送的数据存放在发送缓冲区中。
3.设置发送开始标志位。
4.如果发送缓冲区为空,则等待直到缓冲区不为空。
5.将发送缓冲区中的数据通过串口发送出去。
6.等待发送完成。
c51单片机实用通信协议
c51单片机实用通信协议一、基本格式:通信头->巴克码->地址字->长度字->命令字->信息位->校准字1. 通信头:占1~8个字节,表通信开始(0x00、0xff不能用作通信头);2.巴克码:占1字节,一般为0x72,表通信头结束;3.地址字:表终端的地址,占1字节(0x00作为广播地址);4.长度字:占1字节,表示从地址字到信息位之间的字节数;5.命令字:占1字节,指示终端的不同操作;6.信息位:不定长,从0~252字节;7.校验位:两个字节,采用和校验及CRC校验。
二、应答1.如果终端接收正确,则应答ACK;如果终端接收错误,则应答NAK;2.发送方收到ACK,此次通信结束;3.发送方收到NAK,重发刚才的命令字(最多7次);4.如果发送方发完数据后无应答,隔0.5~1S后重发(最多7次)。
三、ACK/NAK的格式通信头->巴克码->地址字->长度字->命令字->0x06、0x06、、0x06(1~8个)(若信息位长时,分包传输,信息位的第一位是包号0x01,最后1包为0xff)============================================================= =============================================================单片机多机并行通讯的一种方法1 简介本文介绍的单片机多机并行通讯系统,使用89C51作为主机,多片89C2051作为从机。
(89C2051为20脚300MIL封装,带有2K FLASH E2PROM的单片机,除了少了两个并口外,具备MCS-51系列单片机所有功能。
因为其体积小,功能强,必将在单片机应用领域内广泛使用)。
这种并行通讯方法适用于在多站点,多层次的检测和控制系统中充当通信控制器的角色;也适合于用作单片机串行口扩充电路。
51单片机双机通信原理(一)
51单片机双机通信原理(一)51单片机双机通信简介•什么是51单片机双机通信•双机通信的作用和应用场景基本原理•单片机串口通信原理–串口通讯协议–数据帧的构成•串口通信的硬件连接–引脚连接方式–串口信号格式设置单向通信实现•主从模式–主机发送数据–从机接收数据•编程实现–主机端程序设计–从机端程序设计双向通信实现•主从模式–主机发送数据–从机接收数据–主机接收数据–从机发送数据•编程实现–主机端程序设计–从机端程序设计通信协议的设计•自定义通信协议–协议的格式–数据的解析与封装高级功能扩展•多机通信实现•数据加密与解密•异常处理与误码纠错总结•51单片机双机通信的基本原理和实现方式•可能遇到的问题及解决方案•双机通信的进一步应用展望简介51单片机双机通信是指使用51系列单片机实现两台或多台单片机之间的数据传输和通信。
双机通信可以实现在多个单片机之间传递数据、完成控制指令的下发、数据的采集和处理等功能。
在各种电子设备和嵌入式系统中,双机通信被广泛应用,可以实现设备之间的互联和协同工作,提高系统的灵活性和智能化水平。
基本原理单片机串口通信原理串口通信是一种将数据通过串行线路进行传输的通信方式。
在51单片机的串口通信中,常用的是UART(通用异步收发传输器)通信协议。
UART通信采用的是异步传输方式,数据按照固定的数据帧格式进行传输。
串口通信的硬件连接在51单片机的串口通信中,需要将主机和从机的UART引脚连接起来。
常用的连接方式是通过一对直线的串行数据线(TXD和RXD)连接主从机,其中TXD是发送数据的引脚,RXD是接收数据的引脚。
为了确保数据的正确传输,还需要进行串口信号格式的设置,包括波特率、数据位数、停止位数和校验位等。
单向通信实现主从模式在单向通信中,主机负责发送数据,从机负责接收数据。
主机通过串口发送数据帧,从机通过串口接收数据帧,并进行相应的处理。
编程实现在主机端程序设计中,需要配置串口通信的参数,并使用串口发送数据的相关函数来发送数据。
485通讯协议程序怎么写(51单片机的485通信程序案例)
485通讯协议程序怎么写(51单片机的485通信程序案例)
RS-485总线接口是一种常用的串口,具有网络连接方便、抗干扰性能好、传输距离远等优点。
RS-485收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力,加上收发器具有高的灵敏度,能检测到低达200mv的电压,可靠通信的传输距离可达数千米。
使用RS-485总线组网,只需一对双绞线就可实现多系统联网构成分布式系统、设备简单、价格低廉、通信距离长。
51单片机的485通信程序
#ifndef __485_C__ #define __485_C__
#include 《reg51.h》
#include 《string.h》
#define unsigned char uchar
#define unsigned int uint
/* 通信命令*/
#define __ACTIVE_ 0x01 // 主机询问从机是否存在
#define __GETDATA_ 0x02 // 主机发送读设备请求
#define __OK_ 0x03 // 从机应答
#define __STATUS_ 0x04 // 从机发送设备状态信息
#define __MAXSIZE 0x08 // 缓冲区长度
#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错
uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息
uchar dev; // 该字节用于保存本机设备号
sbit M_DE = P1。
51单片机模拟can协议
51单片机模拟can协议51单片机是一种常见的嵌入式微控制器,具有广泛的应用。
CAN (Controller Area Network)协议是一种用于控制器之间通信的串行总线通信协议。
本文将介绍如何使用51单片机模拟CAN协议。
我们需要了解CAN协议的基本原理。
CAN协议是一种多主控制器、多节点的通信协议,用于在汽车、工业自动化等领域中实现控制器之间的高速、可靠通信。
CAN协议采用差分传输方式,通过两根线(CAN_H和CAN_L)进行数据传输。
CAN协议具有高抗干扰性、可靠性强等特点,因此在工业控制领域得到广泛应用。
要使用51单片机模拟CAN协议,我们首先需要了解CAN协议的基本通信过程。
CAN协议的通信过程包括以下几个步骤:帧的发送、帧的接收和错误处理。
在帧的发送过程中,发送节点将数据封装成CAN帧,并通过CAN总线发送给接收节点。
在帧的接收过程中,接收节点接收到CAN帧,并解析出其中的数据。
如果在通信过程中发生错误,CAN协议还提供了错误处理机制,可以及时检测和纠正错误。
在51单片机中模拟CAN协议的过程可以分为以下几个步骤:1. 配置51单片机的串口功能,使其能够模拟CAN总线的发送和接收功能。
可以通过设置串口的波特率、数据位、停止位等参数来实现。
2. 编写发送函数。
在发送函数中,我们需要将数据封装成CAN帧,并通过串口发送给接收节点。
可以使用51单片机的串口发送功能实现这一步骤。
3. 编写接收函数。
在接收函数中,我们需要通过串口接收CAN帧,并解析出其中的数据。
可以使用51单片机的串口接收功能实现。
4. 实现错误处理功能。
在通信过程中,可能会发生错误,如数据传输错误、帧格式错误等。
我们需要在程序中加入错误处理的代码,及时检测和纠正错误。
通过以上步骤,我们就可以在51单片机中模拟CAN协议的基本功能。
当然,要实现更复杂的功能,如多节点通信、数据校验等,还需要进一步深入学习CAN协议的相关知识和相关编程技巧。
51单片机的串口通信协议的6个特征
51单片机的串口通信协议的6个特征现实生活中,我们总是要与人打交道,互通有无。
单片机也一样,需要跟各种设备交互。
例如汽车的显示仪表需要知道汽车的转速及电动机的运行参数,那么显示仪表就需要从汽车的底层控制器取得数据。
而这个数据的获得过程就是一个通信过程。
类似的例子还有控制器通常是单片机或者PLC与变频器的通信。
通信的双方需要遵守一套既定的规则也称为协议,这就好比我们人之间的对话,需要在双方都遵守一套语言语法规则才有可能达成对话。
通信协议又分为硬件层协议和软件层协议。
硬件层协议主要规范了物理上的连线,传输电平信号及传输的秩序等硬件性质的内容。
常用的硬件协议有串口,IIC,SPI,RS485,CAN和USB。
软件层协议则更侧重上层应用的规范,比如modbus协议。
好了,那这里我们就着重介绍51单片机的串口通信协议,以下简称串口。
串口的6个特征如下。
(1)、物理上的连线至少3根,分别是Tx数据发送线,Rx数据接收线,GND共用地线。
(2)、0与1的约定。
RS232电平,约定﹣5V至﹣25V之间的电压信号为1,﹢5V至﹢25V之间的电压信号为0 。
TTL电平,约定5V的电压信号为1,0V电压信号为0 。
CMOS 电平,约定3.3V的电压信号为1,0V电压信号为0 。
其中,CMOS电平一般用于ARM 芯片中。
(3)、发送秩序。
低位先发。
(4)、波特率。
收发双方共同约定的一个数据位(0或1)在数据传输线上维持的时间。
也可理解为每秒可以传输的位数。
常用的波特率有300bit/s, 600bit/s, 2400bit/s, 4800bit/s, 9600bit/s。
(5)、通信的起始信号。
发送方在没有发送数据时,应该将Tx置1 。
当需发送时,先将Tx置0,并且保持1位的时间。
接受方不断地侦测Rx,如果发现Rx常时间变高后,突然被拉低(置为0),则视为发送方将要发送数据,迅速启动自己的定时器,从而保证了收发双方定时器同步定时。
手把手教你学51单片机之十八 RS485通信与Modbus协议
在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换。
最初采用的方式是RS232接口,由于工业现场比较复杂,各种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。
除此之外,RS232接口只能实现点对点通信,不具备联网功能,最大传输距离也只能达到几十米,不能满足远距离通信要求。
而RS485则解决了这些问题,数据信号采用差分传输方式,可以有效的解决共模干扰问题,最大距离可以到1200米,并且允许多个收发设备接到同一条总线上。
随着工业应用通信越来越多,1979年施耐德电气制定了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采用Modbus协议,本节课我们要讲解一下RS485通信和Modbus协议。
单单使用一块KST-51开发板是不能够进行RS485实验的,应很多同学的要求,把这节课作为扩展课程讲一下,如果要做本课相关实验,需要自行购买USB转485通信模块。
18.1 RS485通信实际上在RS485之前RS232就已经诞生,但是RS232有几处不足的地方:1、接口的信号电平值较高,达到十几V,容易损坏接口电路的芯片,而且和TTL电平不兼容,因此和单片机电路接起来的话必须加转换电路。
2、传输速率有局限,不可以过高,一般到几十Kb/s就到极限了。
3、接口使用信号线和GND与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。
4、传输距离有限,最多只能通信几十米。
5、通信的时候只能两点之间进行通信,不能够实现多机联网通信。
针对RS232接口的不足,就不断出现了一些新的接口标准,RS485就是其中之一,他具备以下的特点:1、我们在讲A/D的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。
尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。
51单片机串口原理
51单片机串口原理
51单片机串口原理是指通过串行通信协议实现数据的发送与
接收的一种通信方式。
串口通信可以用于串联外部设备与单片机进行数据传输,如与计算机、传感器、模块等进行数据交互。
串口通信由发送端与接收端组成。
发送端将要发送的数据转换成串行数据流,通过串行引脚将数据发送到接收端。
接收端接收到串行数据流后,将其转换为并行数据并进行相应的处理。
51单片机的串口通信主要依靠两个寄存器:TBUF(发送缓冲器)和RBUF(接收缓冲器)。
发送端通过向TBUF写入数据
实现数据发送,接收端通过读取RBUF来获取接收到的数据。
串口通信的波特率是指每秒钟传送的位数,它是串口通信中十分重要的参数。
串口通信的波特率由波特发明,并以其名字命名。
常见的波特率有9600、38400、115200等。
串口通信使用的是异步串行通信,即数据以比特为单位依次传送。
在每个数据字节的前后,都有一个起始位和一个或多个停止位。
起始位用于通知接收端数据的到来,停止位用于标记数据的结束。
在51单片机中,通过设置相应的寄存器来配置串口的波特率、数据位数、停止位数和校验位。
通过配置串口通信的参数,可以实现不同设备之间的数据传输。
以上就是51单片机串口通信的基本原理,通过串口通信可以
实现单片机与外部设备之间的数据交互,为嵌入式系统的开发提供了方便和灵活性。
51单片机实现通讯协议的串口通讯编程
51 单片机实现通讯协议的串口通讯编程摘要: 我们以51 单片机为例。
51 中一般针对串口通讯编程,通常采取中断接受查询发送的方式。
中断函数在接受数据到达时被重复调用,其实是个重复入栈的过程,所以不宜将函数写的太长,函数太长一般会导致栈太深占用系统资源,...我们以51 单片机为例。
51 中一般针对串口通讯编程,通常采取中断接受查询发送的方式。
中断函数在接受数据到达时被重复调用,其实是个重复入栈的过程,所以不宜将函数写的太长,函数太长一般会导致栈太深占用系统资源,二是处理时间过长,可能导致通讯出错。
为了防止在处理数据过程中不受干扰,通常在处理接受数据前关闭中断,处理完后再开。
通常的的编程方式如下:STatic void UartInterruptService(void)interrupt 4{ES = 0;RI = 0;uart_process(SBUF);ES=1;}下面重点介绍数据处理函数uart_process(SBUF);其实很多时候,对于通讯传输的数据处理才是关键,尤其对于设计通讯协议而言。
笔者在刚刚做的一个系统上就碰到这样的问题,当系统庞大了,资源十分有限的情况下,数据处理一旦占用资源太多,效率太低将导致系统崩溃而无法运行。
到了这里,很多工程师可能会考虑开个大的缓冲区FIFO 将接收到的数据保存在缓冲区,然后对其进行解析、判断进行下一步程序编写,当然这在系统资源比较丰富的情况下是没有问题的,ARM 上采取的就是这样的方式。
但如何系统庞大呢,留给的资源缺乏则不行。
这样做的一个很大缺点必须是将数据帧接收完了才能够判断,降低了效率和运行速度。
其实还有另外的方式,可以采取在每接收一个字节就对其解析,解析完判断转到下一个状态,并将其中的有用数据存储在相应的数据结构中去,可以采取状态机实现。
将状态机设计为两个控制状态,一是串口状态——uart_state ,一是命令类型状态——CMD_state 。
51单片机串行通信原理
51单片机串行通信原理串行通信是指在信息传输时,数据位逐个进行传输的方式。
51单片机串行通信是指在51单片机中,使用串行通信协议进行数据传输。
1.串行传输方式:串行通信中,数据位按照顺序逐个传输。
每个数据位传输结束后,发送端或接收端会发送一个时钟信号来同步数据的传输。
2.通信协议:串行通信需要定义一种通信协议,用于规定数据传输的格式和规则。
常用的串行通信协议包括UART(通用异步收发传输)协议、SPI(串行外设接口)协议和I2C(串行双线制)协议等。
3.UART串行通信协议:UART协议是一种异步串行通信协议,常用于单片机与外部设备(如计算机、模块等)之间的通信。
UART使用一对传输线(分别为传输线和接收线)进行数据的传输,通过起始位、数据位、校验位和停止位等进行数据的解析和传输。
4.SPI串行通信协议:SPI协议是一种同步串行通信协议,常用于单片机与外部设备之间的通信。
SPI使用四根传输线(分别为传输线、接收线、时钟线和片选线)进行数据的传输,通过时钟信号同步数据的传输。
SPI协议具有母-从的结构,单片机可以作为主设备控制从设备的操作。
5.I2C串行通信协议:I2C协议是一种双线制串行通信协议,常用于单片机与外部设备之间的通信。
I2C使用两条传输线(分别为传输线和接收线)进行数据的传输,通过时钟信号同步数据的传输。
I2C协议具有多主-多从的结构,多个设备可以共享同一条数据线。
6.数据传输流程:在串行通信过程中,发送端会将数据位逐个传输到接收端。
接收端接收到数据位后,对数据进行解析和处理。
在UART协议中,通信开始时发送端会发送起始位,然后发送数据位,接收端解析数据位后,可以进行校验,最后发送停止位。
在SPI和I2C协议中,发送端通过时钟信号同步数据的传输,并通过片选线或地址来选择接收端。
以上就是51单片机串行通信的原理,通过串行通信可以有效地进行数据传输和设备间的通信。
51入门系列教程 协议协议(IIC篇)
51入门系列教程协议协议(IIC篇)从这一贴开始,和大家一起聊聊有关通讯协议,通讯协议是指单片机和外部设备进行数据交互的基本准则.先说说物理连接吧!地球上的通讯端口,从根本上来讲只有两种:一种是串行接口,即指数据按照高地位的一定顺序,一位一位分时进行传输;一种是并行接口,即指所有数据,一次性同时进行传输;由此可以看来,并行接口理论上的速度会比串行接口快.为了简化单片机(主)和外部设备(从)的物理连接复杂度,一般情况下会使用串行接口.而单片机内部的总线,一般就是并行的结构.俺们这里主要聊聊串行通信,再说协议,这个是非常重要的通信手段.举个栗子,咱(主机)和女神(从机)聊天,首先得确认两个原则性的东西:第一,相同的语言.咱说国语,女神说那美克星语,直接后果就是双方完全不能沟通.类比下来,就是通讯中的信号协议,必须遵循一定的信号发送接收的格式.还记得韩梅梅和李雷吗?韩:hi,lilei,how are you李:fine,thank you,and you?韩:I’m fine too,goodbye李:goodbye韩用英语先喊名字打招呼,李听到喊自己名字且听懂后,才会有下面的交流.这就是一次完整的通信过程,以hi开始,以goodbye结束.第二,相同的语速.虽然咱和女神都说国语.但是咱每秒说10个字,女神每秒只能听见并理解5个字,这样下来,明显也无法正常沟通.不信你试试飞快地读“西安”一词,会不会有人理解成“先”一字呢?呵呵,速度快了,意思完全就不通了抛开上面两点,接下来就是一些细节内容了,譬如,咱向女神阐述长达1分钟的故事.女神在这1分钟内,会隔一段时间回复一个“嗯”,来表示正在聆听,并且做好准备继续聆听.咱才能继续讲下去哈反过来女神讲事情给咱也是一样,咱也得时不时回复一个“嗯”.好让女神继续讲下去,如果换个场景,咱一个人(主机)给多个人(多从机)吹水.也基本上就是上面的过程,个人认为一个串行通信比较重要的方面也就这么些了,下面来看看今天咱聊的具体对象IIC.IIC,有些写成I2C,简单读成i方c,全称Inter-Integrated Circuit,是由飞利浦在上世纪80年代设计推广的一种通信总线协议,呃,现在应该叫恩智浦(NXP)了.它只需要两个IO口即可构成,一根是SCL时钟线,有些也标为SCK之类,说法不一;另外一根是SDA数据线,SCL是一个单向的IO,由主机向从机发送.SDA则是条双向IO,主机需要对其进行读写操作,每次8位数据.读的时候接收数据,写的时候发送数据.IIC的速度分为三个等级:标准模式100kbit/s,快速模式400kbit/s,高速模式3.4Mbit/s.由SCL的频率来决定.一般情况下,需要参照外围器件的要求来决定SCL频率.在硬件上,SDA和SCL 是需要有上拉电阻,从机设备需要是OC/OD状态,集电极开路或者漏极开路,且这个上拉电阻的取值,会对速度产生比较大的影响.10kohm以下比较常见,个人喜欢4.7k,IIC要求的细则很多,有兴趣可以下载英文原版的手册研读.这里聊聊一些基本要求:1、基本原则SCL为高时,SDA不能乱动.SCL 为低时,SDA随便玩.SCL必须由主机控制.在寻址过程中,一次发送数据8位,其中高7位为从机地址,最后一位为读写标志位.So,每个从机一个地址,一条IIC总线理论上最多挂载127个从设备.主机呼叫,从机听到叫自己才作出回应2、起始信号类似于打招呼hi,告诉别人,咱要发话了时序图SCL在高电平器件,SDA出现一次下降沿,也就是SDA从高电平跳变到低电平,看代码:void start(){SDA=1; //SDA拉高delay();SCL=1; //SCL拉高delay();SDA=0; //SDA拉低,出现一次下降沿,形成起始信号delay();SCL=0; //SCL拉低delay();}3、停止信号时序图类似于再见goodbye,告诉别人交流结束,SCL高电平期间,SDA由低电平跳变到高电平,也就是出现一次上升沿,看代码:void stop(){SDA=0; //SDA拉低delay();SCL=1; //SCL拉高delay();SDA=1; //SDA拉高,出现一次上升沿delay();}4、应答信号应答信号有两类:一类是主机发送给从机的,另一类是从机发送给主机的,出现在8位数据传输结束后,第九个时钟到来之时,应答信号一般称为ACK信号.至于NACK(非应答信号),其实就是ACK的另一种说法,时序图:表示从机已经收到之前传输的8位数据,简单点理解,就是女神的“嗯”(邪恶了!!!!!!!) .这个需要由主机读取SDA的值,来判断是否有ACK信号.看代码:bit respons(){bittemp=0;SDA=1; //主机将SDA拉高,释放SDA控制权(SDA 是上拉到电源的哟)delay();SCL=1; //SCL拉高delay();temp = SDA; //读取SDA的值,赋给tempSCL=0; //SCL拉低delay();return temp; //返回temp值}So,temp=1的话,是个NACK信号,从机无响应,temp=0的话,则是个ACK信号咯,那就可以认为,从机已经接收到主机发送过来的数据了.5、数据发送过程每次传递8位的数据,这些数据啥时候发送呢?看时序图:So easy ,SCL高电平期间,保持SDA数据稳定,就是1位数据传过去了 .SCL低电平期间,SDA可以进行数据变化...瞧代码:void wr_byte(uchar date){uchari;for(i=0;i{date=dateSDA=CY; //将左移进位信号1或0赋给SDA,详见REG51.h中SY寄存器delay();SCL=1; //SDA稳定后,SCL拉高delay();SCL=0; //SCL拉低delay();}}上面2-4肢解了IIC一次数据通信过程,就这么些.但是不同的IIC设备,读写时序略有不同,咱来看些具体的例子吧!正好手头上有块24C08看看这货的地址情况8位寻址数据,最后一位为读写标志位,0写1读,D7-D1为地址位,其中高四位固定为1010,B2、B1、B0可操作.但是注意一下,对于24C08而言,B2位是由外部管脚确定的,写无效.也就是说,一条IIC总线上可以挂2个24C08,B2为0或者1.而其他,特别是24C02,B0、B1、B2都是由外部管脚确定,可挂8片.不过24c08可以软件操作B1和B0.B1B0=00时,指向block0的256个字节空间.后面依次类推.总共有4x256=1024k字节=8kbit.所以叫做24c08,呵呵。
51单片机的串口通信分析
51单片机的串口通信分析1. 简介串口通信是51单片机中常用的通信方式之一,它能够实现通过串行端口将数据传输到其他设备或与其他设备进行通信。
本文将对51单片机的串口通信进行分析与讨论。
2. 串口通信原理串口通信主要包括数据传输、数据格式和通信协议三个方面。
在51单片机中,串口通信使用了UART(通用异步收发传输)协议。
UART协议通过选择适当的波特率、数据位、校验位和停止位等参数,实现串口数据的稳定传输。
3. 串口通信硬件连接在51单片机中,串口通信需要将单片机的串行端口与外部设备连接起来。
一般情况下,串口通信需要使用串口线连接单片机的TXD引脚和RXD引脚与外部设备的对应引脚。
4. 串口通信程序设计51单片机的串口通信程序设计主要包括串口初始化和数据发送与接收两个步骤。
在程序设计中,需要设置适当的波特率、数据位、校验位和停止位等参数,并编写相应的发送和接收函数来实现数据的发送和接收功能。
5. 串口通信应用实例串口通信在51单片机的应用非常广泛,可以用于与PC机的通信、与传感器的通信、与其他单片机的通信等等。
在实际应用中,可以通过串口通信实现数据的传输、控制信号的发送与接收等功能。
6. 总结51单片机的串口通信是一种常用且有效的通信方式,通过合理设置通信参数和编写相应的程序,可以实现稳定的数据传输和通信功能。
在应用中,可以根据具体需求选择适当的串口方式和协议来实现串口通信功能。
以上为本文对51单片机的串口通信进行的简要分析与讨论,希望对读者有所帮助。
参考文献:1. 参考书籍12. 参考书籍2。
51单片机多机通信协议
51单片机多机通信协议做自己以前没做过的东西,总会有各种踌躇,害怕做不出来,其实要是真的开始去做了,问题就解决大半了。
在家没网,就开始写了,熬了两夜,加一个半天,总算是完成了通信协议,经调试,可以正常工作。
如果有孩子也要做这个,可以参考一下哈!别的不多说,贴代码。
//-------------------------------------------------//主机程序,主机座控制,用中断法//-----------------------------------------------#include "basic.h"//---------------------------------------------------//宏定义#define EN_ADDSEND TB8=1;//发送寻址,搜寻从机#define EN_DATASEND TB8=0;//发送数据#define M_S 0Xf0//握手后的命令字,主机到从机#define S_M 0Xf1//握手后的命令字,从机到主机#define M_SOK 0Xf2//主到从准备完成,从机发送的反馈信息#define S_MOK 0xf3//从到主准备完成,主机发送的反馈信息#define STOP 0xf4//主机到从机发送结束#define ERROR 0xf5//错误#define Response 0xf6//应答信号#define CONTINUE 0xf7//接受数据之后给对方发送的反馈,请求继续#define OK 0xf8//--------------------------------------------------//数据定义uchar DATA[20]={0};//从机返回的状态值uchar CMD[20]={0x44,0x44,0x44,0x55,0x55,0x55,0x47,0x45,0x65,0x35,0x55,0x55,0x55,0x55,0x55,0x 55,0x55,0x55,0x55,0x55,};// 主机给从机发送的命令uchar state=0;//状态值,进行中断判断uchar Address;//呼叫从机地址uchar temp=0;//SBUF缓存uchar *Position=0;//数据指针,指定数据更新的位置//---------------------------------------------//串口1初始化,用于和从机通讯void Uart1_Init(void) //9600bps@11.0592MHz{PCON &= 0x7F; //波特率不倍速SCON = 0xD0; //9位数据,可变波特率AUXR |= 0x40; //定时器1时钟为Fosc,即1TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xDC; //设定定时初值TH1 = 0xDC; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1EA=1; //总中断启动SM2=0;ES=1;}//------------------------------------------//查询法发送一个数据,TB8=0;void SendByte (uchar date){//EN_DATASEND;//TB8=0;TB8=1;SBUF=date;while(!TI);TI=0;}//-----------------------------------//寻址从机void Search(uchar ADD){//EN_ADDSEND;TB8=1;SBUF=ADD;while(!TI);TI=0;}//主机向从机发送命令//因为主机为控制端,为便于控制从机,所以选择用查询法而不选用中断void M_S_Protocol(uchar add,uchar *m)//三个参量分别为从机地址,命令的字节数,命令的位置{state=1;ES=1;Position=m;Search(add);}//主机接收从机状态,同样也为查询法不用中断void S_M_Protocol(uchar add,uchar *m)//三个参量分别为从机地址,命令的字节数,命令的位置{state=4;ES=1;Position=m;Search(add);}void M_S_Send(uchar add,uchar *m)//主机到从机整个过程{M_S_Protocol(add,m);while(state);ES=0;}void S_M_Send(uchar add,uchar *m)//从机到主机的整个过程{S_M_Protocol(add,m);while(state);ES=0;}//-----------------------------//主函数,主机主函数主要用于与GPRS和从机之间做桥接void main(){Uart1_Init();while(1){S_M_Send(0x01,CMD);}}void UART1() interrupt 4{RI=0;//清除中断标志temp=SBUF;if(state)//处于传输状态{switch(state){//----------------------------------------------------------------- //---------------------M_S部分--------------------------------case 1:{if(temp==Response)//寻址成功{SendByte(M_S); //发送M_S命令state=2; //转换状态break;}/*else//寻址不成功,通信结束,转换为非通信状态 {state=0;SendByte(STOP);//发送通信停止命令break;}*/break;}case 2:{if(temp==M_SOK)//M_S得到回应{state=3;SendByte(*Position);//发送第一字节break;}break;}case 3:{if(temp==CONTINUE) //从机继续要求数据if(Position-CMD{Position++;SendByte(*Position);//发送数据break;}else//数组溢出,停止通信{state=0;SendByte(STOP);break;}}break;}//----------------------------------------------------------------------- //----------------接收部分--------------------------------------------- case 4:{if(temp==Response)//呼叫从机得到回应{state=5;//转换状态SendByte(S_M);//发送从机到主机命令break;/*else//无回应,停止此次传输{state=0;SendByte(STOP);break;} */elsebreak;}case 5:{if(temp==OK)//发送S_M得到回应{state=6;//转换状态SendByte(S_MOK);//准备完成break;}/*else //无回应,停止通信{state=0;SendByte(STOP); //发送停止命令 break;}*/elsebreak;}case 6:{if(Position-CMD{*Position=temp;//接收数据Position++;SendByte(CONTINUE); //要求从机继续发送数据break;}else//超出数组,停止通信{state=0;SendByte(STOP);break;}}default:break;}}}//-----------------------------------------------//从机程序,从机接收信息,所以用中断法会更便于反馈和执行命令//-------------------------------#include "basic.h"//---------------------------------------------------//宏定义#define EN_ADDSEND TB8=1;//发送寻址,搜寻从机#define EN_DATASEND TB8=0;//发送数据#define M_S 0Xf0//握手后的命令字,主机到从机#define S_M 0Xf1//握手后的命令字,从机到主机#define M_SOK 0Xf2//主到从准备完成,从机发送的反馈信息#define S_MOK 0xf3//从到主准备完成,主机发送的反馈信息#define STOP 0xf4//主机到从机发送结束#define ERROR 0xf5//错误#define Response 0xf6//应答信号#define CONTINUE 0xf7//接受数据之后给对方发送的反馈,请求继续#define OK 0xf8sbit key=P3^7;//--------------------------------------------------//数据定义ucharDATA[20]={0x12,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,0x55,0x55,0x5 5,0x55,0x55,0x55,0x55,0x55,0x55,};//从机返回的状态值uchar CMD[20]={0};//主机给从机发送的命令uchar state=0;//状态值,进行中断判断uchar ADDR;//呼叫从机地址uchar temp=0;//SBUF缓存uchar *Position=0;//数据指针,指定数据更新的位置//------------------------------------------//STC12具有7字节全球唯一ID,将7位的ID加和作为从机地址.(有可能从机地址会重复)uchar Set_Add(){uchar *p;uchar i;uchar addr=0;p=0xf1;//上电后唯一ID起始地址for(i=0;i{addr+=*p;}return (addr);}//---------------------------------------------//串口1初始化,用于和从机通讯void Uart1_Init(void) //9600bps@11.0592MHz{PCON &= 0x7F; //波特率不倍速SCON = 0xD0; //9位数据,可变波特率AUXR |= 0x40; //定时器1时钟为Fosc,即1TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xDC; //设定定时初值TH1 = 0xDC; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1}void All_Init(){Uart1_Init();ADDR=Set_Add();EA=1;//打开总中断ES=1;//打开串口中断}//------------------------------------------//查询法发送一个字void SendByte (uchar date){ES=0;//关断串口中断EN_DATASEND;SBUF=date;while(!TI);TI=0;ES=1; //打开串口中断}//主函数,可以用大循环只执行全局数组命令,而中断接收并修改全局命令命令void main(){All_Init();Position=DATA;//SendCmd(DATA);while(1);{}}//串口1中断服务程序,用state进行状态判断处理void UART1() interrupt 4{RI=0;temp=SBUF;//读取数据if (state){switch (state){case 1:if(temp==M_S)//主机发送到从机,从机准备好接收数据 {SendByte(M_SOK);//发送应答state=2;//更换状态break;}else if(temp==S_M)//主机要求从机发数据 {SendByte(OK);//回应主机state=3;//转换状态Position=DATA;break;}else if(temp==STOP){SM2=1;state=0;break;}break;case 2:{if(temp==STOP)//停止符判定,回到待机状态 {state=0;SM2=1;break;}DATA[1]=temp;//接收数据SendByte(CONTINUE);//接收数据后回应//SendByte(DATA[1]);//串口测试用的break;}case 3:{switch(temp){case S_MOK://主机准备完成{SendByte(*Position);//发送数据break;}case CONTINUE:{Position++;SendByte(*Position);//发送数据break;}case STOP:// 停止命令,返回待机状态 {state=0;SM2=1;break;}}}}}if(RB8==1)//判断寻址{if(temp==ADDR)//进行地址判断{SM2=0;//从机响应,清除SM2SendByte(Response);//发送应答state=1;//更换状态}else//用于主机呼叫从机之后,错误的呼叫其他从机,则使该机处于待机状态 {SM2=1;state=0;}}}。
51单片机与PC机通信
51单片机与PC机通信随着嵌入式系统和物联网技术的发展,51单片机在许多应用中扮演着重要的角色。
这些单片机具有低功耗、高性能和易于编程等优点,使其在各种嵌入式设备中得到广泛应用。
在这些应用中,与PC机的通信是一个关键的需求。
本文将探讨51单片机与PC机通信的方法和协议。
串口通信是51单片机与PC机进行通信的最常用方式之一。
串口通信使用一个或多个串行数据线来传输数据,通常使用RS232或TTL电平标准。
在硬件连接方面,需要将51单片机的串口与PC机的串口进行连接。
通常使用DB9或USB转TTL电路来实现这一连接。
在软件编程方面,需要使用51单片机的UART控制器来进行数据的发送和接收。
具体实现可以使用Keil C51或IAR Embedded Workbench 等集成开发环境进行编程。
USB通信是一种比较新的通信方式,它具有传输速度快、支持热插拔等优点。
在51单片机中,可以使用USB接口芯片来实现与PC机的通信。
在硬件连接方面,需要将51单片机的USB接口芯片与PC机的USB接口进行连接。
通常使用CH340G或FT232等USB转串口芯片来实现这一连接。
在软件编程方面,需要使用51单片机的USB接口芯片来进行数据的发送和接收。
具体实现可以使用相应的USB库来进行编程。
网络通信是一种更加灵活和高效的通信方式。
在51单片机中,可以使用以太网控制器来实现与PC机的网络通信。
在硬件连接方面,需要将51单片机的以太网控制器与PC机的网络接口进行连接。
通常使用ENC28J60等以太网控制器来实现这一连接。
在软件编程方面,需要使用51单片机的以太网控制器来进行数据的发送和接收。
具体实现可以使用相应的网络库来进行编程。
需要注意的是,网络编程涉及到更多的协议和数据格式,需要有一定的网络基础知识。
本文介绍了51单片机与PC机通信的三种常用方式:串口通信、USB 通信和网络通信。
每种方式都有其各自的优缺点和适用场景。
51单片机can通信原理
51单片机can通信原理
51单片机CAN通信原理主要涉及到CAN总线的工作原理、硬件
连接和通信协议等方面。
首先,CAN(Controller Area Network)总线是一种串行通信
协议,用于在汽车、工业控制等领域中的实时控制系统中进行通信。
CAN总线采用差分信号进行通信,具有抗干扰能力强、传输距离远、传输速率高等特点。
在51单片机中,实现CAN通信需要通过CAN控制器和CAN总线
收发器来实现。
CAN控制器负责控制CAN总线的发送和接收,而CAN
总线收发器则负责将单片机的数字信号转换成CAN总线上的差分信号,并接收CAN总线上的差分信号并转换成数字信号供单片机处理。
在CAN通信中,数据通过CAN消息的形式进行传输。
CAN消息
由标识符(ID)和数据组成。
发送端通过CAN控制器将消息发送到CAN总线上,接收端通过CAN控制器接收并解析消息。
CAN总线采用CSMA/CR(Carrier Sense Multiple Access with Collision Resolution)协议,能够实现多个节点之间的协同工作,避免数据
冲突。
在硬件连接方面,需要将51单片机的CAN控制器和CAN总线收发器连接到CAN总线上,并通过电阻终端电阻来终止总线。
在软件开发方面,需要编写相应的CAN通信协议的驱动程序,实现CAN消息的发送和接收,并进行数据的解析和处理。
总的来说,51单片机CAN通信的原理涉及硬件连接、CAN消息的发送和接收、通信协议的实现等方面,需要综合考虑硬件和软件的设计。
希望这个回答能够全面地解答你的问题。
51单片机双机通信原理
51单片机双机通信原理引言:随着科技的不断发展,人们对通信技术的需求也越来越高。
单片机作为一种小型、低功耗、功能丰富的微处理器,被广泛应用于各个领域。
而双机通信则是单片机应用中的一个重要方面。
本文将以51单片机双机通信原理为主题,探讨其工作原理及应用。
一、概述单片机双机通信是指两个或多个单片机之间通过某种通信方式进行数据传输和交互的过程。
通过双机通信可以实现数据的共享、协作和控制,从而提高系统的可靠性和性能。
二、通信方式1. 串行通信串行通信是指单片机之间通过串行接口进行数据传输的方式。
其中,常用的串行通信协议有RS232、I2C和SPI等。
RS232是一种基于串行通信的标准协议,常用于计算机与外设的数据传输;I2C是一种双线制的串行通信协议,常用于短距离的设备间通信;SPI是一种高速的串行通信协议,常用于单片机与外围设备的通信。
2. 并行通信并行通信是指单片机之间通过并行接口进行数据传输的方式。
在并行通信中,数据同时通过多条线路传输,速度较快。
然而,并行通信所需的引脚较多,布线复杂,限制了其在实际应用中的使用。
三、通信过程单片机之间的通信过程可以分为初始化、数据传输和结束三个步骤。
1. 初始化在进行通信之前,需要对通信接口进行初始化设置。
包括设置通信协议、波特率、数据位数、停止位数等参数。
通过正确的初始化设置,可以保证通信的稳定性和可靠性。
2. 数据传输数据传输是单片机通信的核心过程。
在通信过程中,发送端将要发送的数据通过通信接口发送给接收端,接收端接收到数据后进行处理。
数据传输可以是单向的,也可以是双向的。
在双向通信中,发送端和接收端可以同时发送和接收数据。
3. 结束通信结束后,需要对通信接口进行相应的清理工作,包括关闭通信接口、释放资源等。
通过正确的结束操作,可以保证通信的完整性和稳定性。
四、应用实例单片机双机通信广泛应用于各个领域,如智能家居、工业自动化、车载系统等。
以下是一个智能家居系统的应用实例:智能家居系统中,通过单片机双机通信可以实现各种设备之间的数据共享和控制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
///////////////////////////////////////////////////////////////////// //函 数 名:HexToChar() //功能描述:把 16 进制转换为 ASCII 字符 //函数说明: //调用函数: //全局变量: //输 入:16 进制 //返 回:ASCII 字符 //设 计 者:牛毅 //修 改 者: //版 本: ///////////////////////////////////////////////////////////////////// unsigned char HexToChar(unsigned char bHex) { if((bHex>=0)&&(bHex<=9))
//public 变量 unsigned char databuf[FIELD_MAXBUF],errframe_cnt; //函数
///////////////////////////////////////////////////////////////////// //函 数 名:send() //功能描述:向串口发送一个字符 //函数说明: //调用函数: //全局变量: //输 入:ch-要发送的 ASCII 字符 //返 回:无 //设 计 者:牛毅 //修 改 者: //版 本: ///////////////////////////////////////////////////////////////////// void send(unsigned char ch) { SBUF=ch; while(TI==0); TI=0; }
//常数 #define S_MAXBUF 16 #define FIELD_MAXBUF 48
//接收/发送数据的最大缓存量 //最小场缓存,可以大于 48 字节,因为协议是以 20 字节为
单位传输的 #define communicationing P1_7 //正在通讯(1)标志 #define ERRFRAME_MAX 5 //连续 NOFRAME_CNT 次帧不正确 #define ERR_NOCNTMAX_RESEND if(++errframe_cnt<=ERRFRAME_MAX)resend_frame(); else errframe_cnt=communicationing=0; //若超过 ERRFRAME_MAX 次则令通讯停止 ERR_NOCNTMAX_RESEND
bHex += 0x30; else if((bHex>=10)&&(bHex<=15))//大写字母 bHex += 0x37; else bHex = 0xff; return bHex; }
///////////////////////////////////////////////////////////////////// //函 数 名:com_int() //功能描述:初始化串口 //函数说明:默认其他参数为[baud_rate],n,8,1 //调用函数: //全局变量: //输 入:baud_rate 波特率 //返 回:无 //设 计 者:牛毅 //修 改 者: //版 本: ///////////////////////////////////////////////////////////////////// void com_init(unsigned int baud_rate) { EA=1;ES=1;//ET1=1; SCON = 0x50; /* 0x52;//SCON */ TMOD = 0x20; /*0x20;// TMOD */ TCON = 0x60; /*0x60;// TCON */ PCON=PCON&0x7f; switch(baud_rate) { //波特率设置 case 1200: TL1=0xe8;TH1=0Xe8;break; //1200 case 2400: TL1=0xf4;TH1=0Xf4;break; //2400 case 4800: TL1=0xfa;TH1=0Xfa;break; //4800 case 9600: TL1=0xfd;TH1=0Xfd;break; //9600 case 19200: PCON=PCON|0x80;TL1=0xfd;TH1=0Xfd;break; //19200 case 38400: PCON=PCON|0x80;TL1=0xfe;TH1=0Xfe;break; //38400 default: TL1=0xfd;TH1=0Xfd;break;//9600 } }
///////////////////////////////////////////////////////////////////// //函 数 名:resend_frame() //功能描述:发送重发帧 //函数说明:通知 PC 重发 //调用函数: //全局变量: //输 入:无 //返 回:无 //设 计 者:牛毅 //修 改 者: //版 本: ///////////////////////////////////////////////////////////////////// void resend_frame(void) { send(F_ST1); send(F_ST2); send(F_C); send(F_SPACE); send(F_SPACE);//发送效验和 send(F_END); }
#include <reg51.h>
#include <config.h> //预定义 //帧 #define F_ST1 0x6e //帧头标志 n #define F_ST2 0x79 //帧头标志 y #define F_R 0x72 //帧类型 读 r #define F_W 0x77 //帧类型 写 w #define F_D 0x64 //帧类型 数据帧 d #define F_B 0x62 //帧类型 写回应帧 b #define F_C 0x63 //帧类型 重发命令帧 c #define F_Q 0x71 //帧类型 放弃帧 q #define F_ADDR 0x31 //器件地址 0-9 #define F_END 0x7a //帧尾标志 z #define F_SPACE 0x30 //空标志 0 #define F_ERR1 0x31 //错误标志 1,flagerr 1 #define F_ERR2 0x32 //错误标志 2 2
51 串口通信协议(新型篇)
C51 编程:这是网友牛毅编的一个 C51 串口通讯程序!
//PC 读 MCU 指令结构:(中断方式,ASCII 码表示) //帧: 帧头标志|帧类型|器件地址|启始地址|长度 n|效验和|帧尾标志 //值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10 //字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2 //求和:
while(RI==0); RI=0; return SBUF; }
///////////////////////////////////////////////////////////////////// //函 数 名:CharToHex() //功能描述:把 ASCII 字符转换为 16 进制 //函数说明: //调用函数: //全局变量: //输 入:ASCII 字符 //返 回:16 进制 //设 计 者:牛毅 //修 改 者: //版 本: ///////////////////////////////////////////////////////////////////// unsignr bChar) { if((bChar>=0x30)&&(bChar<=0x39)) bChar -= 0x30; else if((bChar>=0x41)&&(bChar<=0x46))//大写字母 bChar -= 0x37; else if((bChar>=0x61)&&(bChar<=0x66))//小写字母 bChar -= 0x57; else bChar = 0xff; return bChar; }
///////////////////////////////////////////////////////////////////// //函 数 名:com_int() //功能描述:串口中断 //函数说明: //调用函数: //全局变量: //输 入:无 //返 回:无 //设 计 者:牛毅 //修 改 者: //版 本: ///////////////////////////////////////////////////////////////////// void com_int()interrupt 4 { unsigned char i,csaddr,clen,csum,tempbuf[S_MAXBUF]; csum=0; if(receive()==F_ST1) {//是侦 if(receive()==F_ST2) {//头判断完 communicationing=1;//设置通讯状态为正常 即启动通讯 switch(receive()) { case F_R://是读指令帧 r if(receive()==F_ADDR) { P1_2=!P1_2;//地址正确 csaddr=CharToHex(receive())<<4; csaddr+=CharToHex(receive()); clen=CharToHex(receive())<<4;clen+=CharToHex(receive()); csum=csaddr+clen; i=CharToHex(receive())<<4;i+=CharToHex(receive()); if(i==csum) {//效验和正确 if(receive()==F_END) {//结束标志正确 //开始发送数据帧 csum=0; send(F_ST1); send(F_ST2); send(F_D); send(HexToChar((clen&0xf0)>>4)); send(HexToChar(clen&0x0f)); csum+=clen; for(i=0;i<clen;i++)