小蜜蜂-串行接口进阶训练的详细解释

写在前面: 我是按照老师视频一步步来写的,但是到了输出字符串那一步就怎么也实现不了,无奈只能用之前串行基础的代码复制过来,终于成功发送了字符串。有同样情况的也建议用以前代码

0 基础知识

微控制器和外部设备的数据通信可分两种

串行通信 一位一位的顺序发送

并行通信 同时接发

串行通信有IIC SPI UART多种,通常是指UART

串行通信制式有 单工 半双工(可以接收或者发送,但同一时间只能是接受或发送中的一种) 全双工(可以同时进行接受发送)

串行通信的主要方式有 同步 和 异步

同步串行通信:需要使用一个时钟,以数据块为单位传送数据

异步串行通信 :每个设备都有自己的时钟信号,通信双方 波特率要保持一致 ,进行数据帧传送,一次传送一个帧

1 题目 

 2 完整代码

此代码以完全实现题目要求
板子为蓝桥杯指定板子
#include"reg52.h"

sfr AUXR = 0x8e;
void selectHC573()
{
	P2 = (P2 | 0X1F) & 0x80;//打开LED所用的锁存器
}

unsigned char urdat;
void SendByte(unsigned char dat);
void SendString(unsigned char *str);
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)
	{
		RI = 0;
		command = SBUF;
	}
}

void working()
{
	if(command != 0x00)
	{
		  switch(command & 0xf0)
	  {
		  case 0xa0:
				P0 = (P0 | 0x0f) & (~command | 0xf0);//P0 ¸ßËÄλ²»±ä£¬µÍËÄλ±ä³ÉÒªµãÁÁµÄÖµ
			command = 0x00;
			break;
			
			case 0xb0:
				P0 = (P0 | 0xf0) & ((~command <<4 )| 0x0f);//µÍËÄλ»¹ÊÇP0µÍËÄλ²»±ä£¬¸ßËÄλ±ä³ÉÒªµãÁÁµÄ´úÂë
			command = 0x00;
			break;
			
			case 0xc0:
				SendString("The System is Running..\r\n");
			command = 0x00;
			break;
	  }
		
	}
	
	
	
}

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

void main()
{
	InitUart();
	selectHC573();
	while(1)
{
	working();
}
}

 3 代码拆分讲解

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

3.1这是串口中断的初始化代码, 串口通信,我们先来看看怎么控制串口 

 模式选择 01 8位UART,波特率可调,REN位置1 ,允许接收,其他位置0不管

SCON = 0x50;

定时器用8位重装模式

TMOD = 0x20;

设置波特率位9600

TH1 = 0xfd;
    TL1 = 0xfd;

3.2

void working()
{
	if(command != 0x00)
	{
		  switch(command & 0xf0)
	  {
		  case 0xa0:
				P0 = (P0 | 0x0f) & (~command | 0xf0);//高四位不变,低四位变成能直接控制LED的代码
			command = 0x00;
			break;
			
			case 0xb0:
				P0 = (P0 | 0xf0) & ((~command <<4 )| 0x0f);//低四位不变,高四位变成能直接控制LED的代码
			command = 0x00;
			break;
			
			case 0xc0:
				SendString("The System is Running..\r\n");
			command = 0x00;
			break;
	  }
		
	}
	
	
	
}

代码用到了简单数电知识,

P0 = (P0 | 0x0f) & (~command | 0xf0)

P0 | 0x0f   0与任意相或任意不变 这样就高四位还是P0的原来值,

(~command | 0xf0) f 与任意相或都是1 ,这样,后面的高四位就都是1,

最后整体 相与 ,前面的高四位是P0原来值,后面高四位是1 1 与任意相与 任意不变

低四位同样分析

case b0 同样分析

这个代码很巧妙的地方是 控制低四位时,高四位是不变的,即不影响L5-L8工作状态,控制高四位同理

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值