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);			//发送中断
}
相关推荐
糖糖单片机设计6 小时前
基于 STM32 与中移 OneNet 的智慧电梯监控平台系统
stm32·单片机·嵌入式硬件·51单片机·语音识别
创界工坊工作室9 小时前
55-基于STC89C52宠物智能饲喂控制系统设计
stm32·单片机·嵌入式硬件·51单片机·proteus·宠物
极客 - L U12 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
AMASENSYS艾马斯13 小时前
变频器滤波器选型与EMC合规建议
驱动开发·单片机·其他·硬件工程·精益工程
码小文14 小时前
CAM350使用笔记(6)---Gerber文件铺铜间距检查
嵌入式硬件·cam350软件·cam350使用笔记
Zw-awa15 小时前
编译器工具链:GCC、Clang、MSVC、ICC、armclang
stm32
Yiran_G16 小时前
双频 Wi-Fi 6 + 蓝牙 5.4:无声讯通 WS8712 模组的开发与集成要点
网络·嵌入式硬件·物联网·智能家居
凯基迪科技16 小时前
STM32G系列(G0/G4)芯片解密程序提取RDP读保护解析
网络·stm32·安全
光子物联单片机16 小时前
ESP32传感器模块编程实践(一)DIY智能WIFI视频控制小车
嵌入式硬件·esp32·智能硬件·硬件
2501_9226395817 小时前
率能半导体 SS6628E直流双向马达驱动芯片:20V/7A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
单片机·嵌入式硬件·硬件工程