串口通信实验原理
如图所示,P3.0 与 P3.1 同 MAX232 相连,P3.0 与 P3.1 为单片机串行通信引脚,TTL 电平,需要用 MAX232 转换为 RS-232 电平,8051 单片机内部有一个可编程的全双工串行接口,它在物理上分为两个独立的发送缓冲器和接收缓冲器SBUF,这两个缓冲器占用一个特殊功能寄存器地址 99H,究竟是发送缓冲器还是接收缓器工作是靠软件指令来决定的。对外有两条独立的收、发信号线 RXD(P3.0)和 TXD(P3.1),因此可以同时接收和发送数据,实现全双工传送,使用串行口时可以用定时器T1 作为波特率发生器。
系统时钟频率为 12MHz,使用这个频率可以将波特率近似设置为各种常用的整数值。实验中,我们设定好单片机的串行通信方式,使其工作于 4800 波特率。用计算机通过串口向单片机发送数据,单片机把收到的数据再转发回计算机。
实验步骤
1. 在 KEIL C 中完成项目的建立,文件的命名,文件的编辑,芯片的选择。
2. 按照以上的实验要求使用集成开发环境 KEIL C 编写控制程序。
3. 控制程序编译调试无误后,将实验板用 USB 线连接至计算机。
4. 用 KEIL C 生成可执行文件***.HEX。
5. 使用烧录程序下载 HEX 程序至实验板上的单片机中。
代码如下:
#include<reg52.h>
//主程序
void main(void)
{
SCON=0x50; //设置为工作方式1
TMOD=0x20; //设置计数器工作方式2
PCON=0x80; //波特率加倍
TH1=0xF3; //计数器初始值,波特率为4800
TL1=0xF3;
EA=1; //打开总中断
ES=1; //打开串口中断
TR1=1; //TR1:启动Timer 1
while(1) //主循环不做任何动作
{;
}
}
void UART_SER(void)interrupt 4 //串行中断服务程序
{
unsigned char Temp; //定义临时变量
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
Temp=SBUF; //读入缓冲区的值
P1=Temp; //把值输出到P1口,用于观察
SBUF=Temp; //把接收到的值再发回电脑端
}
if(TI) //如果是发送标志位,清零
TI=0;
}
编译结果: