51单片机串口通信原理、使用方法及附带收发数据例程代码

温馨提示:本篇文章详细介绍了串口的原理及使用方法,涉及的内容较多,但也较为全面,学者若想充分掌握串口通信的原理和具体使用方法(部分限于51单片机),请静下心来将其读完,相信一定会受益匪浅!而且对32单片机的串口学习也有非常好的辅助!

一.串行通信的原理

1.随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重 要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。

2.通信有并行通信和串行通信两种方式。在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。

3.计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。可以分为两大类:并行通信与串行通信。

4.并行通信
通常是将数据字节的各位用多条数据线同时进行传送

 并行通信控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。 

5.串行通信是指 使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。

6.串行通信的特点:传输线少,长距离传送时成本低,但数据的传送控制比并行通信复杂。 

串行通信又可分为异步通信同步通信

(1).异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。

(2).

 异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍。

异步通信是一种很常用的通信方式(效率较低)异步通信在发送字符时,发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。所传送的数据以字节为单位。每个字节前加上一位起始位,每个字节的后面加上停止位。好处:异步通信的好处是通信设备简单、便宜,但传输效率较低。

(3).同步通信

同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现。  

 二.串行通信的传输方向

单工:单向的(或者是收或者是发)

半双工:收/发不可同时进行

全双工:收/发可同时进行

 三 .串行通信常见的错误校验

1、奇偶校验

      在发送数据时,数据位尾随的1位为奇偶校验位(10)。奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。

2、代码和校验

      代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。

3、循环冗余校验

      这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。这种校验方法纠错能力强,广泛应用于同步通信中。

四.传输速率

      比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送2个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:

           10位×240个/秒 = 2400 bps

五.串行通信接口标准

(一)、RS-232C接口

RS-232CEIA(美国电子工业协会)1969年修订RS-232C标准。RS-232C定义了       数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。

1、机械特性

 RS-232C接口规定使用25针连接器,连接器的尺寸及每个插针的排列位置都有明确的           定义。(阳头)

 

 六.传输距离与传输速率的关系

串行接口或终端直接传送串行信息位流的最大距离与传输速率及传输线的电气特性有关。当传输线使用每0.3m(约1英尺)有50PF电容的非平衡屏蔽双绞线时,传输距离随传输速率的增加而减小。当比特率超过1000 bps 时,最大传输距离迅速下降,如9600 bps 时最大距离下降到只有76m(约250英尺)。

七.采用RS-232C接口存在的问题

1、传输距离短,传输速率低

     RS-232C总线标准受电容允许值的约束,使用时传输距离一般不要超过15米(线路条件好时也不超过几十米)。最高传送速率为20Kbps。

2、有电平偏移

     RS-232C总线标准要求收发双方共地。通信距离较大时,收发双方的地电位差别较大,在信号地上将有比较大的地电流并产生压降。

3、抗干扰能力差

      RS-232C在电平转换时采用单端输入输出,在传输过程中当干扰和噪声混在正常的信号中。为了提高信噪比,RS-232C总线标准不得不采用比较大的电压摆幅。

八.串行接口的结构

 有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H

在逻辑上,SBUF只有一个,它既表示发送寄存器,又表示接收寄存器,具有同一个单元地址99H。但在物理结构上,则有两个完全独立的SBUF,一个是发送缓冲寄存器SBUF,另一个是接收缓冲寄存器SBUF。如果CPU写SBUF,数据就会被送入发送寄存器准备发送;如果CPU读SBUF,则读入的数据一定来自接收缓冲器。即CPU对SBUF的读写,实际上是分别访问上述两个不同的寄存器。 a = SBUF; SBUF = a;


九.串口使用的方法

需对相关寄存器进行配置,设定其工作模式

1.设置T1的工作方式(编程TMOD寄存器);

2.计算T1的初值,装载TH1、TL1;

3.启动T1(编程TCON中的TR1位);

4.确定串行口控制(编程SCON寄存器);

5.如需串行口在中断方式工作时,要进行中断设置编程IE寄存器。

与串行通信相关的寄存器:

 串行口控制寄存器SCON(可位寻址)

T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCONTR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。

         T1 溢出率 = fosc /{12×[256 -(TH1]}

常用串口波特率:

   300600120024004800960019200   ……115200

 

 

 定时计数器中断相关寄存器

 

 单片机同优先级中内部查询顺序

内部查询顺序: 在同时收到几个同一优先级的中断请求时,哪一个中断请求能优先得到响应,取决于内部的查询顺序。这相当于在同一优先级内,还同时存在另一辅助优先级结构,其查询顺序如下:

void UART() interrupt 4  //串口中断处理函数,加关键字interrupt和入口号

{

中断处理语句

}

/*
串口收发程序,把发送的数据接收后用P1口的LED灯以二进制的形式显示
并且蜂鸣器发出提示音,再把接收的数据加1并发出。
使用STC ISP软件界面上的串口助手,选择对应的串口号,
设置波特率为9600,选择HEX模式发送和接收
*/
#include <reg52.h>

#define uchar unsigned char
#define uint  unsigned int

sbit beep = P2^3;//蜂鸣器接口
uchar num;//发送暂存变量

void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--);
}	
void UART_init()
{
	TMOD = 0x20;  	//T1工作模式2  8位自动重装
	TH1 = 0xfd;
	TL1 = 0xfd; 	//比特率9600
	TR1 = 1;		//启动T1定时器
	SM0 = 0;
	SM1 = 1; 		//串口工作方式1 10位异步
	REN = 1;		//串口允许接收
	EA  = 1;		//开总中断
	ES  = 1;		//串口中断打开
}
void main()
{
	UART_init(); //串口初始化
	while(1);	
}


void UART() interrupt 4
{
	if(RI)	//检测是否接收完成
	{
		num = SBUF;	  //num 取出接收缓存器的值
		P1 = SBUF;
		beep = 0;
		delay(100);
		beep = 1;//蜂鸣器发出滴提示音
		num++;//把接收的数据加1并发送
		RI = 0;
		SBUF = num;	
		while(!TI);
		TI = 0;
	}
}
#include <reg52.h>
#include <stdio.h>

#define uint unsigned int
#define uchar unsigned char

//毫秒级延时函数定义
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 		
} 

//串口初始化
void UARTInit()
{
	SM0 = 0;	SM1 = 1;//串口工作方式1,8位UART波特率可变
	TR1 = 1;//启动定时器1
	TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
	TH1 = 0xfd;
	TL1 = 0xfd;//设置比特率9600
}

void main()
{
	UARTInit(); //串口初始化
	while(1)
	{
		TI = 1;
		puts("大家好!欢迎学习单片机");
		while(!TI);
		TI = 0;
		delay(1000);
	}	
}

使用printf()puts()前都应软件置位TI = 1;
printf()puts()  使用putchar函数发送字节

void putchar(uchar sbyte )
{
    while(!TI);   //等待发送完

    SBUF=sbyte;

}

所以第一次调用putchar前没TI=1 永远等待

本次分享到此结束了,其中读者应该能够感受到芯片手册、中文手册的重要性,因为很多知识都是摘抄于这些资料的,所以建议学者在学习过程中不要忽视对相关手册的学习和记录!

物联沃分享整理
物联沃-IOTWORD物联网 » 51单片机串口通信原理、使用方法及附带收发数据例程代码

发表评论