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);			//发送中断
}
相关推荐
sinat_360704825 小时前
STM32 看门狗
stm32·单片机·嵌入式硬件
亿道电子Emdoor5 小时前
【ARM】MDK如何生成指定大小的bin文件,并指定空区域的填充数据
arm开发·stm32·单片机
mftang5 小时前
STM32 CAN过滤器配置和应用方法介绍
stm32·单片机·嵌入式硬件
楼台的春风6 小时前
【详细讲解在STM32的UART通信中使用DMA机制】
stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式·信息与通信
Chambor_mak7 小时前
stm32单片机个人学习笔记16(SPI通信协议)
stm32·单片机·学习
电子科技圈7 小时前
在低功耗MCU上实现人工智能和机器学习
人工智能·经验分享·科技·嵌入式硬件·mcu·物联网·机器学习
小白今天也很酷8 小时前
Python与MCU通信:串口数据采集及CSV/Excel存储方法
python·单片机·excel
海的预约8 小时前
51单片机-按键
单片机·嵌入式硬件·51单片机
【云轩】12 小时前
基于STM32与IFX007T的电机驱动全解析(无人机/机器人实战)
stm32·机器人·无人机
qq_75568224020 小时前
STM32使用NRF2401进行数据传送
stm32·单片机·嵌入式硬件