基于proteus软件仿真AT89C52的双机串口通信 附工程包

计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。 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建立工程如下:
基于proteus软件仿真AT89C52的双机串口通信 附工程包_第1张图片
运行时的截图如下:
基于proteus软件仿真AT89C52的双机串口通信 附工程包_第2张图片
基于proteus软件仿真AT89C52的双机串口通信 附工程包_第3张图片
左边为主机,主机代码为:

#include 

//初始化串行口
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 

//初始化串行口
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;
	}

你可能感兴趣的:(proteus,单片机,嵌入式,串口通信,AT89C51)