串口通讯进阶应用(还是很初级其实)

本文介绍了如何在51单片机中使用串口通讯,包括发送字符串、处理不同输入值的逻辑操作,如使用指针、switch语句、取反和逻辑门。详细展示了关闭蜂鸣器和继电器的初始化代码以及处理接收到的数据以控制LED灯的示例。
摘要由CSDN通过智能技术生成

在使用串口通讯,为了更好的用好串口,我们往往会遇到更加复杂的代码,这一节就是比较正常的利用串口通讯来传输一些信息。

我们先看这道题目,这道题目由三个部分组成,需要发送三类信息,用到的知识点也是之前就学到的,但这次,我们将更加综合的利用他们。

首先,我们根据题目要求先将蜂鸣器与继电器等工具关闭,一些最最基础的代码函数请在最后面查看,相关解析在前面的文章里。

void InitSystem()//关闭蜂鸣器和继电器
{
	Select573(5);
	P0 = 0x00;
	Select573(4);	
	P0 = 0xff;
}

在这次的题目中,我们需要发送字符串,在这里老师使用到了指针而我还没学到,所以就大概了解一下就好,等我学到,我再回来补上。(感觉*str是一种遍历?在字符串里面从第一个字符遍历到最后一个,也就是\0)

void SendDat(unsigned char n)
{
		SBUF = n;
		while(TI == 0);
		TI = 0;
}
	
void SendString(unsigned char *str)
{
	while(*str != '\0')
	{
		SendDat(*str++);
	}
}

接着就是本讲的绝对重点,首先,我们先确定一下上位机(普遍意义上可以直接指的就是PC)发送的值不是0x00,然后我们将输入的值与上0xf0,保留了前四位,接着用switch语句选择。

在选择以后,我们可以有两种选择去点亮灯,第一种是利用if语句,这样代码比较直观但是也比较长。第二种是重点学习内容,简洁但是不宜读懂,但是必须得读懂。

由于51单片机是低电平也就是0启动,所以我们输入的数据和我们实际要展现的小灯是相反的,所以,我们可以先对数据进行取反,然后我们在利用或与门的知识,就可以直接让小灯按要求亮,这里需要一定的计算量,但是核心永远是下面的那俩句。

由于高四位为b时是要让L5到L8亮,所以,我应该让取反以后的dammand左移4位,那么低四位就会变成高四位了。再根据方法也能让对应的小灯亮

而第三部分,c0部分,在显示字符串以后,我们需要将dammand清零,否则,他会不断重复的发出这段字符串

0与任何数与都是0,f与任何数与都是任何数,0和任何数或都是任何数,f和任何数与都是0

unsigned char dammand = 0x00;
void Working()
{
	if(dammand != 0x00)
	{
		switch(dammand & 0xf0)
		{
			case 0xa0:
				P0 = (P0 | 0x0f) & (~dammand | 0xf0);
				break;
			case 0xb0:
				P0 = (P0 | 0xf0) & (~dammand <<	4 | 0x0f);
				break;
			case 0xc0:
				SendString("The system will run!\r\n");
				dammand = 0x00;
				break;
		}
	}

于是总结写下来,全部代码就是这些啦!

#include "reg52.h"

sfr AUXR = 0x8e;

void Select573(unsigned char channel)
{
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f)	| 0x80;
			break;
		case 5:
			P2 = (P2 & 0x1f)	| 0xa0;
			break;
		case 6:
			P2 = (P2 & 0x1f)	| 0xc0;
			break;
		case 7:
			P2 = (P2 & 0x1f)	| 0xe0;
			break;		
	}
}

void InitSystem()//关闭蜂鸣器和继电器
{
	Select573(5);
	P0 = 0x00;
	Select573(4);	
	P0 = 0xff;
}

void InitUART()
{
	TMOD = 0x20;
	TH1 = 0xfd;
	TL1 = 0xfd;
	
	SCON = 0x50;
	AUXR = 0x00;
	
	TR1 = 1;
	EA = 1;
	ES = 1;
}


void SendDat(unsigned char n)
{
		SBUF = n;
		while(TI == 0);
		TI = 0;
}
	
void SendString(unsigned char *str)
{
	while(*str != '\0')
	{
		SendDat(*str++);
	}
}

unsigned char dammand = 0x00;

void ServeUART() interrupt 4
{
	if(RI == 1)
	{
		RI = 0;
		dammand = SBUF;
	}
}
unsigned char dammand = 0x00;
void Working()
{
	if(dammand != 0x00)
	{
		switch(dammand & 0xf0)
		{
			case 0xa0:
				P0 = (P0 | 0x0f) & (~dammand | 0xf0);
				break;
			case 0xb0:
				P0 = (P0 | 0xf0) & (~dammand <<	4 | 0x0f);
				break;
			case 0xc0:
				SendString("The system will run!\r\n");
				dammand = 0x00;
				break;
		}
	}
}

void main()
{
		InitSystem();
		InitUART();
	SendString("Welcome to XMF system!\r\n");

	while(1)
	{
		Working();
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值