并行通信和串行通信的区别:
并行通信通常是将数据字节的各位用多条数据线同时进行传送 。
串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。
异步
不要求收发双方时钟的严格一致,实现容易,设备开销较小,
但每个字符要附加2~3位用于起止位,所以导致了会有间隔,
各帧之间还有间隔,因此传输效率不高
以字符(构成的帧)为单位
字符间是异步的
字符内各位是同步的
同步通信
发送方时钟与接收方时钟同步。既保持位同步,也保持字符同步。
传输速率
比特率:每秒钟传输二进制代码的位数
波特率:每秒钟调制信号变化的次数,即每秒钟发送的位数,单位是:波特(Baud)。
时钟同步。既保持位同步,也保持字符同步。
P3.0接收角RXD
P3.1发送角TXD
工作寄存器SCON
RI:接收中断标志位
接收结束时,会由硬件置1,向CPU发出中断请求。(要由软件复位)
TI:发送中断标志位
发送结束时,会由硬件置1,向CPU发出中断请求。要由软件复位)
TB8:用来存放发送的第9位。
RB8:用来存放接收的第9位。
REN:是串行接收允许位
0时:允许串行接收
1时:禁止串行接收
SM2:多机通信控制位。(不常用)
因为多级通信是在工作方式2和工作方式3下进行的,因此
SM2主要用在工作方式2和工作方式3。
当SM2=0时:不论接收的第9位是0还是1,都接收数据,产
生中断。
当SM2=1时:只有在接收到的第9位为1时,才接收
数据,并产生中断;而如果接收到的第9位为0时,则将接收
到的数据丢弃,不产生中断。
工作方式寄存器PCON
PCON是没有位寻址的,也就是说不能直接操作SMOD要直接操作PCON寄存器。
没有位寻址的意思是你不能以SMOD=0;的方式给SMOD赋值,而需要以PCON=0x00给SMOD赋值
SMOD:是波特率是否加倍的选择位。
0时:波特率不加倍。
1时:波特率加倍。
串行口的波特率是用定时器T1作为波特率发生器的,这是定时器自动设置在工作方式2(可自动重装初值)。
串口的操作步骤:
先设置波特率:
设置定时器T1为工作方式2(设置TMOD寄存器)
给计数器赋初值(工作方式2会自动重装)
设置串口工作方式:
设置SCON(如果允许)
如果使用中断方式,那么打开相应的中断和总中断。
打开定时器T1,开始产生波特率。
设置TRx
串口通信实战环节
/*********************************************************************************
*实验名 :串口通讯实验
*实验效果 :配合串口助手使用
将收到的数据发送回给计算机,可在串口助手上显示
*波特率 :9600
*
*********************************************************************************/
#include<reg52.h>
#include"bstv51.h"
void UartConfiguration();
void main()
{
bstv51_init();
UartConfiguration();
while(1)
{
}
}
void UartConfiguration()
{
TMOD=0x20; //设置计数器1的工作方式2
TH1=0xfd; //设置计数器1的初值,决定波特率
TL1=0xfd; //设置计数器1的初值,决定波特率
PCON=0x00; // 波特率倍增0x00不加倍 0x80加倍
SCON=0x50; //设置工作方式1 开启接受允许
EA=1; //开启总中断
ES=1; //开启串口接受中断
TR1=1; //计数器1开始运行
}
void Uart() interrupt 4
{
uchar date;
date=SBUF; //取出接受到的数据
RI=0; //清除接受中断标志位
SBUF=date; //接收到的数据放入发送缓存器发送
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}