一、简介
本小节主要实现的是使用串口让单片机和PC进行通信。51单片机发送数据,计算机通过串口接收数据,或者PC发送数据,单片机接收数据。
二、串口通信
1、发送数据时:先要把数据写入到发送缓冲区SBUF,通过TXD口,发送出去。接收数据时:数据通过RXD口,写入接收缓冲区SBUF。
2、需要对串口进行初始化,初始化包括串口控制寄存器SCON,电源及波特率选择寄存器PCON,波特率的确定,中断是否开放。AUXR寄存器是用来调分频的。
3、串口初始化
串口控制寄存器SCON:用于设定串行口的工作方式,
SM0、SM1:串口工作方式选择位
SM2:多机通信控制位,主要用于方式2和方式3
REN:允许串行接收位
TI:发送中断标志位
RI:接收中断标志位
电源控制寄存器PCON设置:
SMOD:波特率倍增。SMOD=1时,波特率提高一倍,复位时,SMOD=0;
TMOD设置;用于设置定时器/计数器的工作方式。
GATE:0表示不需要外部中断,用软件设置TR0,TR1设置定时器启动,1表示需要外部中断,并且设置TR0或者TR1为1时,才会启动定时器。
C/~T:定时器/计数器模式选择位。C/T = 0为定时模式,C/T = 1为计数模式。
M1:M0:工作方式设置位。
三、串口通信初始化
1、串口初始化步骤
1)确定T1的工作方式(TMOD寄存器);
2)确定串口工作方式(SCON寄存器);
3)计算T1的初值(设定波特率),装载TH1,TL1。
4)启动T1(TCON中TR1位)。
5)如何使用中断,需开启串口中断控制位(IE寄存器)。
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit KEY3 = P3^2;
sbit LED = P2^0;
void delay_10us(unsigned int us)
{
while(us--);
}
void Uart_Init(u8 baud)
{
TMOD |= 0x20;//设置计数器工作方式2
SCON = 0x50;//设置工作方式1
PCON = 0x80;//波特率加倍
TH1 = baud;
TL1 = baud;
ES = 1;//打开串口中断
EA = 1;//打开总中断
TR1 = 1;//打开定时器
}
void main()
{
Uart_Init(0xFA);
while(1);
}
void uart() interrupt 4
{
u8 rec_data;
RI = 0;//清除接收中断标志位
rec_data = SBUF;//存储接收到的数据
SBUF = rec_data;//将接收到的数据放入到发送寄存器
while(!TI);//等待发送数据完成
TI = 0;//清除发送完成标志位
}