单片机C51 - 串行通信原理及串口编程实验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012313335/article/details/52457050

一、两种通信方式概念

1.并行通信

  • 传输原理:并行通信时数据的各个位同时传送,以字节为单位并行传输
  • 优点:并行通信速度快,传输的数据宽度可以是1~128位,甚至更宽
  • 缺点:并口上导线之间数据同步难处理,占用引脚资源多
2.串行通信
  • 传输原理:串行通信的数据是一位一位地址进行传输的,在传输中每一位数据都占据一个固定的时间长度。
  • 优点:串行通信传输线少,占用引脚资源少,成本低,适合远距离传送
  • 缺点:速度相对较慢
二、串行通信方式
1.串行数据通信模式
  • 单工通信:数据仅能从一台设备到另一台设备进行单一方向的传输。
  • 半双工通信:数据可以从一台设备到另一台设备进行传输,也可以相反方向传输,但不能在同一时刻双向传输数据。
  • 全双工通信:数据可以在同一时刻从一台设备到另一台设备进行传输,也可以进行相反方向的传输,即可以同时双向传输数据。
2.异步串行通信方式

       异步通信是指数据是以字符为单位i进行传送的,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。异步通信时,数据是一帧一帧传送的,每帧数据包含有起始位(“0”)、数据位、奇偶校验位和停止位(“1”),每帧数据的传送靠起始位来同步。

3.同步串行通信方式

       同步通信是指同步传输采用字符块的方式,字符与字符之间、字符内部的位之间都同步,减少了每个字符的控制和错误检测数据位,因而可以具有较高的传输速率。

三、串口编程实验

1、SCON寄存器工作方式

D7

D6

D5

D4

D3

D2

D1

D0

功能

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

  • RI:接收中断标志位——接收结束时,会由硬件置1,向CPU发出中断请求。(要由软件复位)
  • TI:发送中断标志位——发送结束时,会由硬件置1,向CPU发出中断请求。要由软件复位)
  • TB8:用来存放发送的第9位。
  • RB8:用来存放接收的第9位。
  • REN:是串行接收允许位——0时:允许串行接收;1时:禁止串行接收

2、串行口的工作方式

SM0

SM1

方式

说明

波特率

0

0

0

移位寄存器

fosc/12

0

1

1

10位异步收发(8位数据)

可变

1

0

2

11位异步收发(9位数据)

fosc/64或fosc/32

1

1

3

11位异步收发(9位数据)

可变

3、PCON寄存器工作方式

D7

D6

D5

D4

D3

D2

D1

D0

功能

SMOD

-

-

-

-

-

-

-

  • PCON是没有位寻址的,也就是说不能直接操作SMOD要直接操作PCON寄存器。
  • SMOD:是波特率是否加倍的选择位。——0时:波特率不加倍;1时:波特率加倍。
4、代码实现
#include <reg51.h>  
#include <intrins.h>  
#include "array.h"  
#define uint unsigned int  
#define uchar unsigned char  
#define ulong unsigned long 

/*******************************************************************************
* 函数名         :UsartConfiguration()
* 函数功能		   :设置串口
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void UsartConfiguration()
{
	SCON=0X50;			//设置为工作方式1
	TMOD=0X20;			//设置计数器工作方式2
	PCON=0X80;			//波特率加倍
	TH1=0XF3;			//计数器初始值设置,注意波特率是4800的
	TL1=0XF3;
	ES=1;				//打开接收中断
	EA=1;				//打开总中断
	TR1=1;				//打开计数器
}

void main()
{
	UsartConfiguration();
	while(1)
	{
	}
}


/*******************************************************************************
* 函数名         :Delay(unsigned int i)
* 函数功能		   : 延时函数
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void Usart() interrupt 4
{
	unsigned char receiveData;

	receiveData=SBUF;	//出去接收到的数据
	RI = 0;				//清除接收中断标志位
	SBUF=receiveData;	//将接收到的数据放入到发送寄存器
	while(!TI);			//等待发送数据完成
	TI=0;				//清除发送完成标志位
}




猜你喜欢

转载自blog.csdn.net/u012313335/article/details/52457050