基本知识:
( 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 。
仿真图:
完整代码:
单片机1的代码:
#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;
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;
}
}
单片机2的代码:
#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;
switch(temp){
case 0: P1=0x00;break;
case 1: P1=0xfe;break;
case 2: P1=0xfd;break;
case 3: P1=0xfb;break;
case 4: P1=0xf7;break;
case 5: P1=0xef;break;
case 6: P1=0xdf;break;
case 7: P1=0xbf;break;
case 8: P1=0x7f;break;
}
RI=0;
}
仿真效果: