单片机串口通信

合集下载

单片机串口通信奇偶校验

单片机串口通信奇偶校验

单片机串口通信奇偶校验串口通信是单片机与外部设备进行数据交互的一种常见方式。

在串口通信中,为了保证数据的可靠传输,常常会使用奇偶校验来检测和纠正数据传输中的错误。

本文将介绍串口通信的基本原理、奇偶校验的作用和实现方法。

一、串口通信的基本原理串口通信是通过串行传输方式实现数据的发送和接收。

在单片机中,串口通信常用的接口有UART(通用异步收发传输器)和USART (通用同步异步收发传输器)。

这两种接口在硬件上的实现方式不同,但在数据通信的原理上是相似的。

串口通信中的数据是按照位的顺序逐个传输的。

发送端将数据从高位到低位依次发送出去,接收端则按照相同的顺序接收数据。

为了确保数据的可靠传输,通常会在数据的最后添加一个校验位,用来检测数据传输过程中是否出现错误。

二、奇偶校验的作用奇偶校验是一种简单有效的错误检测方法。

在奇偶校验中,发送端会根据数据的位数和奇偶性,在数据的最后添加一个校验位。

接收端在接收到数据后,会重新计算校验位,并与接收到的校验位进行比较,从而判断数据是否传输正确。

奇偶校验的原理是:发送端根据数据的位数和奇偶性计算出校验位,使得数据和校验位中1的个数为奇数或偶数。

接收端在接收到数据后,重新计算校验位,如果计算结果与接收到的校验位一致,则认为数据传输正确;如果计算结果与接收到的校验位不一致,则认为数据传输错误。

三、奇偶校验的实现方法奇偶校验的实现方法主要有两种:奇校验和偶校验。

1. 奇校验:发送端根据数据的位数和奇偶性计算出校验位,使得数据和校验位中1的个数为奇数。

接收端在接收到数据后,重新计算校验位,如果计算结果与接收到的校验位一致,则认为数据传输正确;如果计算结果与接收到的校验位不一致,则认为数据传输错误。

2. 偶校验:发送端根据数据的位数和奇偶性计算出校验位,使得数据和校验位中1的个数为偶数。

接收端在接收到数据后,重新计算校验位,如果计算结果与接收到的校验位一致,则认为数据传输正确;如果计算结果与接收到的校验位不一致,则认为数据传输错误。

基于单片机的数据串口通信

基于单片机的数据串口通信

基于单片机的数据串口通信随着科技的不断进步,我们生活中越来越多的设备需要进行数据传输和通信。

而技术成为了我们日常生活中无法忽视的一部分。

本文将从单片机的基本原理、串口通信的工作原理以及应用案例三个方面来详细介绍。

一、单片机的基本原理单片机,是一种集成电路芯片,具有微处理器、内存、输入输出设备以及其他辅助功能电路等一系列电子元件。

单片机通常包含中央处理器(CPU)、存储器、定时器/计数器、输入/输出接口等功能单元。

它的特点是集成度高、体积小、功耗低,适合嵌入式应用。

二、串口通信的工作原理串口通信是指通过串行接口进行的数据传输方式。

串口通信中使用的串行通信接口有RS-232、RS-485等。

在单片机中实现串口通信,需要通过串口通信芯片与外部设备进行交互。

在串口通信中,数据通过逐位传输的方式进行传输。

发送端通过发送器将数据位、起始位、停止位以及校验位等信息编码成串行数据,通过串口发送出去。

接收端通过接收器解码接收到的串行数据,将其还原成数据位、起始位、停止位以及校验位等信息,供单片机进行处理。

三、应用案例技术在现实生活中有着广泛的应用。

下面将介绍几个常见的应用案例。

1. 远程监控系统技术可以用于远程监控系统,如智能家居、安防系统等。

通过单片机和传感器建立连接并实现数据采集,再通过串口与中央服务器进行通信,实现信息传输和远程控制。

2. 工业自动化在工业自动化领域中,技术被广泛应用于控制系统。

通过串口连接各种传感器和执行器,收集和传输数据,实现自动控制。

例如,监测温度、湿度、气压等信息,并根据预设条件自动控制设备的开关。

3. 移动设备数据传输技术也可以用于移动设备的数据传输。

例如,通过串口与智能手机进行连接,将单片机中收集到的数据传输到智能手机上,便于用户实时获取数据并进行分析。

总结:技术在现代生活中扮演着重要的角色。

通过串口通信,单片机可以与其他设备进行数据传输和通信,实现各种应用需求。

从远程监控到工业自动化,再到移动设备数据传输,技术正越来越广泛地应用于各个领域,为我们的生活带来了更多便利与可能性技术在现实生活中的广泛应用为我们的生活带来了许多便利和可能性。

单片机串口通信原理

单片机串口通信原理

单片机串口通信原理
单片机串口通信原理是指通过串口进行数据的发送和接收。

串口通信是一种异步通信方式,它使用两根信号线(TXD和RXD)进行数据的传输。

在发送数据时,单片机将待发送的数据通过串口发送数据线(TXD)发送出去。

发送的数据会经过一个串口发送缓冲区,然后按照一定的通信协议进行处理,并通过串口传输线将数据发送给外部设备。

在接收数据时,外部设备将待发送的数据通过串口传输线发送给单片机。

单片机接收数据线(RXD)会将接收到的数据传
输到一个串口接收缓冲区中。

然后,单片机会根据通信协议进行数据的解析和处理,最后将数据保存在内部的寄存器中供程序使用。

串口通信协议通常包括数据位、停止位、校验位等信息。

数据位指的是每个数据字节占据的位数,常见的有8位和9位两种。

停止位用于表示数据的结束,常用的有1位和2位两种。

校验位用于检测数据在传输过程中是否发生错误,常见的校验方式有奇偶校验和无校验。

总的来说,单片机串口通信原理是通过串口发送数据线和接收数据线进行数据的传输和接收,并通过一定的通信协议进行数据的解析和处理。

这种通信方式可以实现单片机与外部设备的数据交换,广泛应用于各种嵌入式系统和物联网设备中。

单片机串口通信协议

单片机串口通信协议

单片机串口通信协议1. 引言单片机串口通信是一种常见的数据通信方式,它允许单片机与其他外部设备进行通信。

串口通信协议定义了数据传输的格式、波特率等参数,确保通信的稳定和可靠性。

本文将介绍单片机串口通信协议的基本原理和常用协议。

2. 串口通信基础串口通信是通过串行数据传输来实现的。

其中,UART(通用异步收发传输器)是实现串口通信的重要组件。

UART将并行数据转换为串行数据,并通过串口进行传输。

在单片机中,常用的串口通信引脚是TX(发送)和RX(接收)。

3. 串口通信协议串口通信协议定义了数据传输时各个数据包的格式和规则。

常见的串口通信协议有以下几种:3.1. RS-232RS-232是最早出现的串口通信协议之一。

它定义了数据传输的电气特性和信号级别。

RS-232使用9个引脚进行数据传输,包括发送和接收数据线、数据控制线等。

该协议具有较长的最大传输距离和可靠性,但通信速率相对较慢。

3.2. RS-485RS-485是一种多点通信的串口协议。

相比于RS-232,RS-485支持多个设备之间的通信。

它使用不同的信号级别和电气特性,可实现更远的传输距离和更高的通信速率。

RS-485通信中设备分为主设备和从设备,主设备负责控制通信流程。

3.3. SPISPI(Serial Peripheral Interface)是一种同步串口通信协议,常用于单片机与外部设备之间的通信。

SPI使用四条引脚进行通信,包括时钟线、数据线、主设备输出从设备输入线和主设备输入从设备输出线。

SPI通信速率较快,适用于高速数据传输。

3.4. I2CI2C(Inter-Integrated Circuit)是一种多主从通信的串口协议。

I2C使用两条引脚进行通信,包括时钟线和数据线。

在I2C总线上,可以连接多个设备,实现多个设备之间的通信和数据交换。

I2C通信速率较慢,但具有较简单的硬件设计和较低的功耗。

4. 协议选择和配置选择合适的串口通信协议需要考虑通信距离、通信速率、设备数量等因素。

单片机串口通信实现

单片机串口通信实现

单片机串口通信实现单片机串口通信是指通过串口来进行数据传输和通信的一种方式。

通过串口通信,可以实现单片机与其他外设设备的数据传输和控制,以达到实现各种功能的目的。

下面将介绍如何在单片机中实现串口通信。

一、串口的硬件设置串口通信需要硬件上的支持,主要包括波特率、数据位、停止位和校验位等设置。

以常见的UART串口为例,波特率值可设置为常见的9600、115200等,数据位通常为8位,停止位为1位,校验位可选择无校验、奇校验、偶校验等。

在单片机中,可以通过寄存器对这些参数进行设置,以满足具体的需求。

二、初始化串口在单片机中实现串口通信之前,需要对串口进行初始化设置。

具体步骤如下:1. 设置串口引脚将单片机的串口引脚与外部设备连接,可以通过查阅单片机的数据手册或引脚图来确定具体的引脚连接方式。

2. 设置波特率、数据位、停止位和校验位通过寄存器设置,将波特率、数据位、停止位和校验位等参数设置为所需的数值。

3. 使能串口使能串口功能,以便能够正常进行数据传输和通信。

三、发送数据发送数据是串口通信的核心部分。

在单片机中,通过向串口发送指令或数据来实现数据的发送。

具体步骤如下:1. 准备待发送的数据将需要发送的数据存储在单片机的某个特定的寄存器中。

2. 检查发送缓冲区状态检查发送缓冲区的状态,判断是否可继续发送数据。

如果发送缓冲区为空,则可以继续发送数据;如果发送缓冲区已满,则需要等待发送缓冲区空闲。

3. 发送数据将待发送的数据写入发送缓冲区,启动发送操作。

四、接收数据接收数据是串口通信的另一个重要部分。

在单片机中,通过接收串口传来的数据,可以实现对外部设备的控制和数据读取。

具体步骤如下:1. 检查接收缓冲区状态检查接收缓冲区的状态,判断是否有数据可读取。

如果接收缓冲区为空,则需要等待数据的到达;如果接收缓冲区有数据,则可以进行后续的读取操作。

2. 读取数据从接收缓冲区中读取数据,并存储在单片机指定的地址空间中。

单片机中的串口通信技术

单片机中的串口通信技术

单片机中的串口通信技术串口通信技术是指通过串行接口将数据传输和接收的技术。

在单片机领域,串口通信是一种常见的数据交互方式。

本文将介绍单片机中的串口通信技术,并探讨其在实际应用中的重要性。

一、串口通信的原理串口通信是指通过串行接口传输数据的方式,其中包括一个数据引脚和一个时钟引脚。

数据引脚用于传输二进制数据,在每个时钟周期内,数据引脚上的数据会被读取或写入。

时钟引脚则用于控制数据的传输速度。

单片机中的串口通信主要包含两个部分:发送和接收。

发送时,单片机将数据转换为二进制形式,并通过串口发送出去。

接收时,单片机会从串口接收到二进制数据,并将其转换为可识别的格式。

通过发送和接收两个过程,单片机可以与外部设备进行数据交互。

二、串口通信的类型在单片机中,串口通信主要包含两种类型:同步串口和异步串口。

同步串口是指发送和接收两个设备之间使用相同的时钟信号,以保持数据同步。

同步串口通信速度快,但需要额外的时钟信号输入。

异步串口则是通过发送数据前提供起始位和终止位来区分不同数据帧的方式进行通信。

异步串口通信的优势是不需要额外的时钟信号,但速度相对较慢。

在实际应用中,通常使用异步串口通信。

异步串口通信相对简单易用,适合多种应用场景。

三、单片机串口通信的实现单片机中实现串口通信通常需要以下几个方面的内容:1. 串口通信引脚配置:单片机需要连接到一个串口芯片或者其他外部设备,因此需要配置相应的引脚作为串口通信的数据引脚和时钟引脚。

2. 波特率设置:波特率是指单位时间内传输的数据位数。

在进行串口通信时,发送端和接收端的波特率需要相同。

单片机中通常通过寄存器设置波特率,以确保数据传输的稳定性。

3. 数据发送和接收:在单片机中,通过将数据写入发送缓冲器并启动发送操作来发送数据。

接收数据时,单片机会接收到串口中的数据,并将其保存在接收缓冲器中。

4. 中断机制:在进行串口通信时,单片机通常会使用中断机制来处理数据接收和发送。

中断机制可以减轻单片机的负担,提高系统效率。

单片机指令的串口通信实现方法

单片机指令的串口通信实现方法串口通信是指通过串行通信接口实现的数据传输方式。

在单片机系统中,串口通信是一种重要的通信方式,可以实现与外部设备(如PC 机、传感器等)的数据交互。

本文将介绍单片机指令的串口通信实现方法,包括硬件连接和软件编程两方面。

一、硬件连接串口通信需要通过发送器和接收器两个设备来完成数据的发送和接收。

在单片机系统中,可使用通用异步收发器(UART)作为串行通信接口。

下面是串口通信的硬件连接步骤:1. 将单片机与UART连接:首先,确保单片机具有UART接口,并根据其引脚定义将UART的发送线(TXD)连接到单片机的接收引脚,接收线(RXD)连接到单片机的发送引脚。

2. 选择波特率:波特率指每秒钟传送的位数,通常使用的波特率有9600、115200等。

在发送和接收数据时,单片机和外部设备需要使用相同的波特率,以保证数据的正确传输。

3. 连接外部设备:根据实际需求,将UART的发送线和接收线分别连接到外部设备的接收引脚和发送引脚。

二、软件编程实现单片机指令的串口通信需要编写相应的软件程序。

下面是基于C语言的软件编程实现方法:1. 初始化串口:在程序开始时,需要对串口进行初始化设置。

通过设置寄存器来配置波特率、数据位、停止位等参数。

2. 发送数据:使用发送指令将待发送的数据写入UART的数据寄存器,等待数据传输完成。

3. 接收数据:通过接收指令读取UART接收到的数据,并进行相应的处理。

可以使用中断或轮询方式进行数据接收。

4. 错误处理:在数据传输过程中,可能会出现错误,例如帧错误、奇偶校验错误等。

需要进行相应的错误处理操作,例如重新发送数据或发出错误提示。

5. 通信协议:根据通信需求,可以制定相应的通信协议。

通信协议包括数据帧结构、数据格式、数据校验等内容,用于确保数据的可靠传输。

三、实例演示下面通过一个简单的示例来演示单片机指令的串口通信实现方法。

假设我们需要实现从单片机向PC机发送一条消息,并接收PC机返回的确认信息。

单片机教程 第9章-串口通信


9.2
MCS-51单片机串行接口
方式1所传送的波特率取决于定时器T1的溢出 率和特殊功能寄存器PCON中SMOD的值,即方式1的
波特率=(2SMOD/32)×定时器T1的溢出率。
②方式1接收:当串行口置为方式1,且REN=1 时,串行口处于方式1输入状态。它以所选波特率 的16倍的速率采样RXD引脚状态。
示字符的结束。异步传送的字符格式如图所示。 ①字符帧:也叫数据帧,由起始位、数据位、奇 偶校验位和停止位4个部分组成。
9.1
串行通信基础
9.1
串行通信基础
②波特率:就是数据的传送速率,即每秒钟传送的 二进制位数,单位:位/秒。 说明:要求发送端与接收端的波特率必须一 致。波特率越高,传送速度越快。
9.1
串行通信基础
下图为以上两种通信方式的示意图。由图可知, 假设并行传送N位数据所需时间为T,那么串行传送 的时间至少为NT,实际上总是大于NT的。
9.1
串行通信基础
9.1.1
串行通信的分类
1、异步通信
异步传送的特点是数据在线路上的传送不连
续。在传送时,数据是以一个字符为单位进行传送
的。它用一个起始位表示字符的开始,用停止位表
;清0接收中断标志 ;接收数据 ;取奇偶校验位 ;偶校验时转L1 ;奇校验时RB8为0转出错处理
;偶校验时RB8为1转出错处理 ;奇偶校验对时存入数据 ;修改指针 ;恢复现场 ;中断返回 ;出错处理 ;中断返回
L1: L2:
ERR:
9.2
MCS-51单片机串行接口
4、方式3 方式3为波特率可变的9位异步通信方式,除了
fOSC 2 SMOD 64
T 1溢出率2 SMOD 32

单片机串口传负值

单片机串口传负值(实用版)目录1.单片机串口通信简介2.串口传输负值的原因3.解决串口传输负值的方法4.应用实例正文【1.单片机串口通信简介】单片机串口通信(Serial Communication)是一种在单片机之间进行数据传输的通信方式。

它是通过一根数据线(TXD)和一根地线(GND)完成数据传输的。

在串口通信中,数据是逐个比特按顺序进行传输的,发送方将数据字符从并行转换为串行,按位发送给接收方。

接收方收到串行数据后,再将其转换为并行数据。

这种通信方式在仅用一根数据线的情况下完成数据传输,具有线路简单、成本低的优点。

【2.串口传输负值的原因】在单片机串口通信中,有时会出现传输负值的情况。

这主要是因为在串口通信过程中,数据传输可能会受到干扰或者数据表示方式的问题。

例如,在负极性电压下,数据“0”表示为负电压,数据“1”表示为正电压;而在正极性电压下,数据“0”表示为正电压,数据“1”表示为负电压。

当发送方和接收方电压极性不一致时,就会出现传输负值的情况。

【3.解决串口传输负值的方法】为了解决串口传输负值的问题,可以采取以下几种方法:(1)保持发送方和接收方电压极性一致。

在通信开始之前,需要确保双方的电压极性一致,避免因极性不一致导致的负值传输。

(2)采用差分传输。

差分传输是一种抗干扰能力较强的传输方式,它通过两条数据线(TXD 和 RXD)同时传输数据,并利用接收方将两条数据线之间的差值作为接收信号。

这样,即使在受到干扰的情况下,也能保证接收方正确接收数据。

(3)对数据进行编码处理。

在发送数据之前,可以对数据进行编码处理,如采用曼彻斯特编码(Manchester Encoding)或者其他编码方式。

这样可以有效避免因电压极性不一致导致的负值传输。

【4.应用实例】在实际应用中,例如通过单片机控制机器人的运动,需要对机器人的运动速度和方向进行控制。

这时候,可以通过串口通信传输数据,对机器人的电机进行精确控制。

单片机串口通讯及通信分类、特点、基本原理、参数与设计计算方法(图文并茂解析)

单片机串口通讯及通信分类、特点、基本原理、参数与设计计算方法一、按照数据传送方向分类1、单片机的通讯功能就是由串口实现的,在串口的基础上可以扩展出RS232、RS485、LIN等。

2、单工:数据传输只支持数据在一个方向上传输。

3、半双工:允许数据在两个方向上传输。

但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。

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

因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端分别如下图中的a、b、c所示。

二、按照通信方式分类1、同步通信:带时钟同步信号传输。

比如:SPI,IIC通信接口。

2、异步通信:不带时钟同步信号。

比如:UART(通用异步收发器),单总线在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。

例如:通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。

在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些用于同步的信号位,或者将主题数据进行打包,以数据帧的格式传输数据。

通讯中还需要双方规约好数据的传输速率(也就是波特率)等,以便更好地同步。

常用的波特率有4800bps、9600bps、115200bps等。

在同步通讯中,数据信号所传输的内容绝大部分是有效数据,而异步通讯中会则会包含数据帧的各种标识符,所以同步通讯效率高,但是同步通讯双方的时钟允许误差小,稍稍时钟出错就可能导致数据错乱,异步通讯双方的时钟允许误差较大。

三、STM32串口通信基础1、STM32的串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器)。

而对于大容量STM32F10x系列芯片,分别有3个USART和2个UART。

2、UART引脚连接方法:①、RXD:数据输入引脚,数据接收;②、TXD:数据发送引脚,数据发送;对于两个芯片之间的连接,两个芯片GND共地,同时TXD和RXD交叉连接。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机串口通信关键词:单片机,串口通信单片机应用中,串口通信是不可缺少的部分。

如何编写有效的串口通信程序对程序的结构、可靠性都有很大的影响。

串口控制程序一般分为查询和中断两者方式。

查询方式适用于简单的应用,简单可靠,但是缺点是需要占用处理器资源,在发送或者接收数据的时候不能做其它的事情,处理器利用率低。

中断方式下,在发送或者接受数据的时候处理器还可以做其它的工作,效率较高。

对于稍微复杂的系统来说,中断方式管理串口程序将会更加有效。

中断处理方式也可分为几种,其中采用循环缓冲区的方式比较高效。

循环缓冲区为定义的一定长度的RAM区间,对于接受数据来说,中断中收到的数据将存入RAM中,然后等待主程序来读取。

其中会涉及到数据见的协调问题,写数据的时候不能把还没有读取的数据覆盖掉,读数据的时候应该读取的是缓冲区中最老的数据。

当缓冲区已满的时候,写入的新数据应该覆盖掉最老的数据。

这些问题的处理可以使用两个指针来实现。

初始化时两个指针均指向RAM区间的底部,如图1所示。

当中断中接收到一个数据的时候,将这个数据写入写指针WPTR指向的存储单元,然后调整写指针指向下一个空余的RAM区间,程序上处理就是把写指针加一,如图2所示。

同理,写入N个数据后写指针同步更新,如图3所示。

当读数据的时候,首先判断缓冲区中是否有数据,方法是判断读指针和写指针是否相等,如果相等表明没有数据,如图5所示。

如果读指针和写指针不等,那么读取缓冲区中的数据,然后调整读指针,当写指针和读指针相等的时候,表明缓冲区中的有效数据已经读取完,此时读指针和写指针相等。

当有数据再次写入的时候,继续紧接着上次写入的地址后写入新的数据,如果数据长度超过缓冲区的长度,写指针重新返回缓冲区的底部重新开始(这是循环缓冲的由来),如图6所示。

此时如果有数据读出,读指针做同样的更新。

如果没有数据读出,一直有数据写入,可能会出现缓冲区写满的情况,如图7所示。

此时如果仍然没有数据读取,继续有数据写入的时候,为了保留新的数据,必须丢弃老的数据,即写指针可能超过读指针,此时,读指针必须和谐指针同步更新,这样才能保证读取的是没有被覆盖的最老的数据,如图8所示。

需要注意的是,读指针在中断过程中也可能被更改,因此,读数据的子程序需要对读指针的更改进行保护,方法是在读数据的时候关闭串行口中断。

下面是循环缓冲区接收数据的程序实例。

FT, 尽然连文本都不能上传,代码只好贴出来吧。

/** FileName: uart.h* Description: header file for SerialPort* Author: SangWei, HUST-CEEE-2004* Contact: swkyer@, swkyer@* Date: 2005-09-22** Platform: P89C6102(Philips), KeilC51(ver: 7.20)** (C)All Rights Reserved.*/#ifndef __UART_H__#define __UART_H__#define UARTBUFFLEN 64 /* 串口缓冲区64个字节*/void UartInit(void);void SendChar(unsigned char ch);unsigned char IsUartReceived(void);unsigned char ReadChar(unsigned char idata *buf);#endif /* __UART_H__ *//** FileName: uart.c* Description: Implementation of SerialPort* Author: SangWei, HUST-CEEE-2004* Contact: swkyer@, swkyer@ * Date: 2005-09-22** Platform: P89C6102(Philips), KeilC51(ver: 7.20) ** (C)All Rights Reserved.*/#include#include "hardware.h"#include "uart.h"unsigned char data ramuse;static unsigned char idata uartbuf;static unsigned char idata bufwptr, bufrptr;extern unsigned char xdata uartbuff[UARTBUFFLEN];/** 初始化串口, 波特率9600*/void UartInit(void){CLR_DOG;status = 0;bufwptr = 0; // 写指针bufrptr = 0; // 读指针MAX485CTL = 0; // 接收数据PCON = 0x00; // 设置串口波特率, 时钟频率30MHZT2CON = 0x30; // 定时器2作为波特率发生器SCON = 0x50; // 模式1// n = 65536 - [fosc/baud*32]// n = 65536 - 30000000/(19200*32) = 65536 - 49 = 654 90 = 0xffd2// n = 65536 - 22118400/(19200*32) = 65536 - 36 = 655 00 = 0xffdc#ifdef _DEBUG_AT_HOMERCAP2H = 0xff;RCAP2L = 0xb8; // baud rate 9600TH2 = 0xff;TL2 = 0xb8;#elseRCAP2H = 0xff;RCAP2L = 0x9e; // baud rate 9600TH2 = 0xff;TL2 = 0x9e;#endifIP = 0x10; // 串口中断优先级高 REN = 1;TI = 0;RI = 0;TR2 = 1; // 启动定时器2ES0 = 1; // 使能串口中断CLR_DOG;}/** 发送一个字节数据*/void SendChar(unsigned char ch) {SBUF = ch;while(TI == 0);TI = 0;}/** 判断是否接收到数据,如果没有返回0,如果有,返回数据长度 */unsigned char IsUartReceived(void){unsigned char num;CLR_DOG;EA = 0; // 关中断if(bufwptr == bufrptr)num = 0;else if(bufwptr > bufrptr)num = (bufwptr-bufrptr);else // if(bufwptr < bufrptr)num = (UARTBUFFLEN-bufwptr+bufrptr);EA = 1;return num;}/** 从缓冲区中读一个字节数据* 返回剩下的字节数*/unsigned char ReadChar(unsigned char idata *buf) {unsigned char ch, num;CLR_DOG;USE_ERAM;EA = 0;if(bufwptr == bufrptr){*buf = 0;num = 0;}else if(bufwptr > bufrptr){ch = uartbuff[bufrptr];*buf = ch;bufrptr++;num = (bufwptr-bufrptr);}else // if(bufwptr < bufrptr){ch = uartbuff[bufrptr];*buf = ch;bufrptr++;if(bufrptr == UARTBUFFLEN)bufrptr = 0;num = (UARTBUFFLEN-bufrptr+bufwptr);}EA = 1;return num;}/** 串口中断接受*/void UartInt(void) interrupt 4 using 1{ // use eramif(RI){ES0 = 0;ramuse = AUXR; // 保存进入中断时的ram区间状态 ramuse &= 0x03;AUXR = 0x00;uartbuf = SBUF;RI = 0; // 清中断标志CLR_DOG;uartbuff[bufwptr] = uartbuf; // 数据写入缓冲区if(bufwptr >= UARTBUFFLEN-1) // 循环缓冲指针bufwptr = 0;elsebufwptr++;if(bufwptr == bufrptr) // 未读数据被覆盖,读指针更新到写指针的上一个单元bufrptr = bufwptr + 1;AUXR = ramuse;ES0 = 1;}}注:转载请说明出处。

相关文档
最新文档