计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。 51 单片机用 4 个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。
51 单片机的串行接口是一个全双工的接口,它可以作为 UART (通用异步接受和发送器)用,也可以作为同步移位寄存器用。 51 单片机串行接口的结构如下:
( 1 )数据缓冲器( SBUF )
接受或发送的数据都要先送到 SBUF 缓存。有两个,一个缓存,另一个接受,用同一直接地址 99H, 发送时用指令将数据送到 SBUF 即可启动发送;接收时用指令将 SBUF 中接收到的数据取出。
( 2 )串行控制寄存器( PCON )
SCON 用于串行通信方式的选择,收发控制及状态指示,各位含义如下:
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0,SM1: 串行接口工作方式选择位,这两位组合成 00 , 01 , 10 , 11 对应于工作方式 0 、 1 、 2 、 3 。
串行接口工作方式特点见下表
SM0 SM1 工作方式 功能 波特率
0 0 0 8 位同步移位寄存器(用于 I/O 扩展)f ORC /12
0 1 1 10 位异步串行通信( UART ) 可变( T1 溢出率 *2 SMOD /32 )
1 0 2 11 位异步串行通信( UART ) f ORC /64 或 f ORC /32
1 1 3 11 位异步串行通信( UART ) 可变( T1 溢出率 *2 SMOD /32 )
SM2 :多机通信控制位。
REN :接收允许控制位。软件置 1 允许接收;软件置 0 禁止接收。
TB8 :方式 2 或 3 时, TB8 为要发送的第 9 位数据,根据需要由软件置 1 或清 0 。
RB9 :在方式 2 或 3 时, RB8 位接收到的第 9 位数据,实际为主机发送的第 9 位数据 TB8 ,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。
TI :发送中断标志。发送完一帧数据后由硬件自动置位,并申请中断。必须要软件清零后才能继续发送。
RI :接收中断标志。接收完一帧数据后由硬件自动置位,并申请中断。必须要软件清零后才能继续接收。
( 3 )输入移位寄存器
接收的数据先串行进入输入移位寄存器, 8 位数据全移入后,再并行送入接收 SBUF 中。
( 4 )波特率发生器
波特率发生器用来控制串行通信的数据传输速率的, 51 系列单片机用定时器 T1 作为波特率发生器, T1 设置在定时方式。波特率时用来表示串行通信数据传输快慢程度的物理量,定义为每秒钟传送的数据位数。
( 5 )电源控制寄存器 PCON
其最高位为 SMOD 。
( 6 )波特率计算
当定时器 T1 工作在定时方式的时候,定时器 T1 溢出率 = ( T1 计数率) / (产生溢出所需机器周期)。由于是定时方式, T1 计数率 = f ORC /12 。产生溢出所需机器周期数 = 模 M- 计数初值 X 。
proteus建立工程如下:
运行时的截图如下:
左边为主机,主机代码为:
#include <reg51.h>
//初始化串行口
void csh()
{
SM0=0;
SM1=1;
REN=1;
TI=0;
RI=0;
PCON=0;
TH1=0xF3;
TL1=0XF3;
TMOD=0X20;
EA=1;
ET1=0;
ES=1;
TR1=1;
}
void main()
{
int i,j;
char c=0;
csh();
while(1)
{
ES=0;
TI=0;
P0=c;
SBUF=c;
while(!TI)
;
TI=0;
ES=1;
for(j=0;j<50;j++)
for(i=0;i<5000;i++)
;
c++;
if (c>9)
c=0;
}
}
void intrr() interrupt 4
{
char temp;
temp=SBUF;
P2=temp;
RI=0;
}
右边为从机,代码为:
#include <reg51.h>
//初始化串行口
void csh()
{
SM0=0;
SM1=1;
REN=1;
TI=0;
RI=0;
PCON=0;
TH1=0xF3;
TL1=0XF3;
TMOD=0X20;
EA=1;
ET1=0;
ES=1;
TR1=1;
}
void main()
{
csh();
while(1)
{
;
}
}
void intrr() interrupt 4
{
char temp;
temp=SBUF;
P2=temp;
RI=0;
temp++;
if (temp>9)
temp=0;
ES=0;
TI=0;
P0=temp;
SBUF=temp;
while(!TI)
;
TI=0;
ES=1;
}
下载链接:https://download.csdn.net/download/qq_40608730/16434518