C51--PC通过串口(中断)点亮LED

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);			//发送中断
}
相关推荐
Zw-awa35 分钟前
传感器是什么:让 STM32 知道车外发生了什么
stm32
SuperByteMaster3 小时前
allegro 布线规则管理器
嵌入式硬件
女神下凡4 小时前
芯参谋(41):DDR2_电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
Zhao136824553916 小时前
国产替代DPE5500百兆以太网控制芯片兼容W5500
嵌入式硬件·物联网
yuehuaxin016 小时前
LP20R100FN 同步整流|3C 认证适配器 CCM 工况倒灌、温升超标样机避坑解析
嵌入式硬件·智能家居·适配器模式·智能硬件
国科安芯7 小时前
商业立方星平台中高集成度抗辐射MCU的功耗优化与批量化应用可行性探讨
单片机·嵌入式硬件·架构·risc-v·抗辐射·as32x601
女神下凡7 小时前
芯参谋(40):UFS 电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
iCxhust8 小时前
CAN信号电平与485信号电平实测
单片机·can·通讯·rs485
深圳市恒锐丰科技杨生8 小时前
EG1125 准谐振原边反馈 CC‑CV 功率开关|屹晶 EGmicro
嵌入式硬件·硬件工程
iCxhust9 小时前
51单片机电力载波应用开发(七)广播通讯
c语言·开发语言·单片机·嵌入式硬件·51单片机