一、串行通信的基础知识
CPU与其他外部设备要进行信息交换,一台计算机与其他计算机之间有时也要交换信息,这些信息交换就称为通信。通信有并行通信和串行通信两种。
1、并行通信
并行通信是将数据字节的各位用多条数据线同时进行传送。
并行通信控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接受存在困难。
2、串行通信
串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。
串行通信传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制要比并行通信复杂。
串行通信又可以分为异步通信与同步通信。
1)异步通信
异步通信是指通信的发送设备与接受设备使用各自的时钟控制数据的发送和接受过程。为使双方的收发协调,要求发送和接受设备的时钟尽可能一致。
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,字符之间是异步的,而同一字符内的各位是同步的。
异步通信的数据格式 :
异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。
2)同步通信
同步通信是要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间间不留间隙,及位同步且字符同步。发送方对接收方的同步可以通过两种方法实现。
外同步:是指对同步字符的检测在串行I/O接口芯片外部进行,当外部硬件电路检测到同步信号时,就给串行接口发送一个同步信号SYNC。当串行I/O接口芯片收到同步信号后,立即进行数据传送。
自(内)同步:是指同步字符的检测和同步控制是在串行I/O接口芯片内部进行的。自(内)同步又可分为单同步(只有一个字节的同步字符)和双同步(有两个字节的同步字符)。
二、8051的串行口
1、8051串行口的结构
有两个物理上独立的接受、发送缓冲器SBUF,它们占用同一个地址99H;接收器是双缓冲结构;因为发送时CPU是主动的,因而不会产生重叠错误。
2、8051串行口的控制寄存器
SCON是个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:
SM0和SM1为工作方式选择位,可选择四种工作方式:
SM2 多机通信控制位
REN 允许串行接受位 由软件设置REN=1,允许接受;REN=0,禁止接受。
TB8 在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。
RB8 在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则为接受到的停止位。
TI 发送中断标志位
RI 接受中断标志位
寄存器PCON中只有一位SMOD与串行口工作有关:
SMOD 波特率倍增位
三、串行口的工作方式
1、方式0
工作在方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。
1)方式0输出
2)方式0的输入
方式0发送和接收电路
2、方式1
方式1是10位数据的异步通信接口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图所示。其中1位起始位,8位数据位,1位停止位。
3、方式2和方式3
方式2或方式3为11位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚。
方式2和方式3一帧包括1位起始位,9位数据位,1位停止位。方式2的波特率固定为晶振频率的1/64或1/32,方式3波特率由定时器T1的溢出率决定。
四、波特率的计算
在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,方式1和方式3的波特率是可变的,由定时器T1的溢出率决定。
方式0的波特率=fosc/12
方式2的波特率=(2SMOD/64)·fosc
方式1的波特率=(2SMOD/32)·(T1溢出率)
方式3的波特率=(2SMOD/32)·(T1溢出率)
当T1作为波特率发生器时,常用是使T1工作在自动再装入的8位定时方式(方式2)
T1溢出率=fosc/(12*(256-TH1))
常用波特率表
五、原理图
其中U2为发送设备,U1为接受设备
六、程序设计
本程序的功能是实现U2每隔50MS向U1发送数据,U1一直处于接受状态,当U2有数据接受时,则接数据传到P2口,形成流水灯。
发送设备程序:
#include void Delay(int n) //延时1ms子程序 { int x,y; for(x=0;x<110;x++) for(y=0;y } void main () { int i; TMOD=0x20; //设置定时器1工作在方式2 TH1=250; //设置波特率为9600kps=(2*/32)*12M/(12(256-250)) TL1=250; TR1=1; //启动定时器1 SCON=0x50; //串行口工作在方式1 PCON=0x80; //SMOD=1 while(1) for(i=0;i<8;i++) { SBUF=~(1< Delay(50); } } 接收设备程序: #include void main () { TMOD=0x20; //设置定时器1工作在方式2 TH1=250; //设置波特率为9600kps=(2*/32)*12M/(12(256-250)) TL1=250; TR1=1; //启动定时器1 SCON=0x50; //串行口工作在方式1 PCON=0x80; //SMOD=1 REN=1; //允许接受 EA=1; //开总中断 ES=1; //开串行接收中断 while(1); } void Serial() interrupt 4 //溢出中断服务子程序 { //软件清零 RI=0; P2=SBUF; }
上一篇:8051 串口程序
下一篇:浅谈8051的学习方法
推荐阅读最新更新时间:2024-11-01 18:18