B4中的:REN允许 / 禁止串行接收控制位
REN = 1为允许串行接收状态。
接收数据必须开启。所以SCON:0101 0000 ;即0x50
如何知道数据已经接收
RI位:当收到数据后 RI = 1(由硬件置一)
硬件置一后必须用软件复位: RI = 0
PC通过串口点亮LED
例:
通过发送缓冲区发送 ' c ' 或者 ' o ' 熄灭或者打开D5
c
#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8E;
sbit D5 = P3^7;
//串口初始化
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void sendByte(char data_msg)
{
//往发送缓冲区中写入数据,就完成了数据的发送
SBUF = data_msg;
while(!TI); //超声波中,用while等待,发送成功后T1 == 1
TI = 0;
}
void sendString(char* str)
{
while(*str != '\0'){
sendByte(*str);
str++;
}
}
void main()
{
char cmd;
D5 = 1; //D5通电以后为灭的状态
//配置c51串口的通信方式
UartInit();
while(1){
Delay1000ms();
sendString("laowang lihai!\r\n");
//如何知道数据已经接收,通过查询RI的值,如果RI = 1(收到数据后由硬件置一)
if(RI == 1){
RI = 0; //软件复位
cmd = SBUF; //读数据
if(cmd == 'o'){
D5 = 0; //D5点亮
}
if(cmd == 'c'){
D5 = 1; //D5熄灭
}
}
}
}
不使用中断时,亮灯会有延时。
PC通过串口中断控制LED
串口中断:UART
使用的中断号:void UART_Rountine(void) interrupt 4
发送和接收用的同一个中断处理函数。
ES: 串行口1中断允许位。ES = 1,允许串行口1中断;ES = 0,禁止串行口1中断。
EA: CPU的总中断控制位。EA = 1,CPU开放中断;EA = 0,CPU屏蔽所有中断请求。
c
#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8E;
sbit D5 = P3^7;
char cmd;
//串口初始化
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //开启总中断
ES = 1; //开启串口中断
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void sendByte(char data_msg)
{
//往发送缓冲区中写入数据,就完成了数据的发送
SBUF = data_msg;
while(!TI); //超声波中,用while等待,发送成功后T1 == 1
TI = 0;
}
void sendString(char* str)
{
while(*str != '\0'){
sendByte(*str);
str++;
}
}
void main()
{
D5 = 1; //D5通电以后为灭的状态
//配置c51串口的通信方式
UartInit();
while(1){
Delay1000ms();
sendString("laowang lihai!\r\n");
}
}
//中断函数
void UART_Rountine(void) interrupt 4
{
if(RI){ //接收中断
RI = 0; //软件复位
cmd = SBUF; //读数据
if(cmd == 'o'){
D5 = 0; //D5点亮
}
if(cmd == 'c'){
D5 = 1; //D5熄灭
}
}
if(TI); //发送中断
}