版权声明:本文为博主原创文章,未经博主允许不得转载。 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时:禁止串行接收
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位数据) |
可变 |
位 |
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; //清除发送完成标志位
}