蓝桥杯基础模块8_2:串口进阶

一、模块题目

蓝桥杯基础模块8_2:串口进阶_第1张图片

二、原理简述

串行接口作为51单片机的重要外设,编程操作并不复杂,但在实际的项目应用中,由于数据结构和通信规约的不同,其程序逻辑也有各种变化。
一般情况下,上位机的命令可能不是一个字节,而是多个字节组成的命令帧,有的长度固定,有的长度变化;而且要求返回的数据可能也不是一个字节,可能是一个数组,也有可能是一个字符串等。在蓝桥杯的比赛中,也不可能让你只是收发一个字节而已,因此,在串口这一个单元中,必须多加一个强化环境,掌握多字节的数据帧收发应用。
很多代码块是可以重用的。
<1> 字符串发送函数
蓝桥杯基础模块8_2:串口进阶_第2张图片

<2> 串口数据接收函数
蓝桥杯基础模块8_2:串口进阶_第3张图片

<3> 命令帧解析执行函数蓝桥杯基础模块8_2:串口进阶_第4张图片

三、源码

//头文件
#include "reg52.h"

sfr AUXR = 0x8e;
//573初始状态
void SelectHC573(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;
		case 0:
			P2 = (P2 & 0x1f) | 0x00;
		break;
	}
}
//
void InitSystem()
{
	SelectHC573(5);
	P0 = 0x00;
	SelectHC573(4);
	P0 = 0xff;
}

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

unsigned char command = 0x00;
void ServiceUart() interrupt 4
{
	if(RI == 1)
	{
		command = SBUF;
		RI = 0;
	}
}

void SendByte(unsigned char dat)
{
	SBUF = dat;
	while(TI == 0);
	TI = 0;
}

void SendString(unsigned char *str)
{
	while(*str != '\0')
	{
		SendByte(*str++);
	}
}
//=======================================
void Working()
{
	if(command != 0x00)
	{
		switch(command & 0xf0)
		{
			case 0xa0:
				P0 = (P0 | 0x0f) & (~command | 0xf0);
				command = 0x00;
			break;
			
			case 0xb0:
				P0 = (P0 | 0xf0) & ((~command << 4)| 0x0f);
				command = 0x00;
			break;
			
			case 0xc0:
				SendString("The System is Running...\r\n");
				command = 0x00;
			break;
		}
	}
}

void main()
{
	InitSystem();
	InitUart();
	SendString("Welcome to XMF system!\r\n");
	while(1)
	{
		Working();
	}
}

四、开发板烧录结果

你可能感兴趣的:(单片机)