蓝桥杯之单片机学习(十一)——串口通信的基本原理与应用

一、串行通信概述

微控制器与外部设备的数据通信,根据连线结构传送方式的不同,可以分为两种:并行通信串行通信
并行通信:指数据的各位同时发送或接收,每个数据位使用一条导线。
串行通行:指数据一位接一位地顺序发送或接收

串行通信有SPI、IIC、UART等多种,最常见最通用的是指UART,大多数情况下,串口通信指的就是UART
串行通信的制式有:单工(只能发不能收)、半双工(能发能收,不能同时进行)、全双工(能发能收,能同时进行)三种
RS485总线是半双工的通信制式
串行通信的主要方式有两种:异步同步
同步串行通信:需要使用同一个时钟,以数据块为单位传送数据
异步串行通信:每个设备都有自己的时钟信号,通信中双方的波特率要保持一致,以i字符为单位进行数据帧传送,一次传送一个帧。

1.1 关于波特率的计算

波特率:串口每秒钟传输的位数
在51单片机的串口通信中,模式1模式3的波特率是可变的,取决于定时1的溢出率,也就是说定时器1每溢出1次,串口就发送一次数据
通常使用定时器1工作模式28位自动重装)来产生波特率,TL1作为脉冲计数寄存器,TH1作为自动冲转寄存器,当计数到最大值溢出时,TH1的值会自动装到TL1

1.2 波特率计算公式

在这里插入图片描述

1.3 UART口的数据发送与接收

串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H
这个重叠的地址靠读/写指令区分:
串行发送时,CPU向SBUF写入数据,此时99H表示发送缓存SBUF
串行接收时,CPU从SBUF读出数据,此时99H表示接收缓存SBUF
数据发送,把数据扔进SBUF后,内核会自动将数据发送出去,内容发送完成后,会将TI标志位置1
发送数据程序:SBUF = 数据/变量,如:SBUF = 0x58;
数据接收,内核从串口接收到一个完整的数据后,会将RI标志位置1,用户用SBUF直接读取即可
接收数据程序:变量 = SBUF, 如:dat = SBUF

1.4 串口控制寄存器SCON

在这里插入图片描述

二、训练内容

在CT107D单片机综合训练平台上,利用51单片机的串行接口与上位机建立传输信道进行数据的收发。采用8位的UART模式,即模式1,波特率为9600BPS。数据发送采用查询方式,数据接收采用中断方式。系统上电初始化之后,单片机向上位机发送两个字节: 0x5a和0xa5,然后等待接收上位机的数据,每接收到一个字节后,在该字节的基础.上加1 然后返回给上位机

2.1 训练重点

  1. 串口通信的初始化设置,特别是工作模式和波特率的理解
  2. 串口通信单字节发送程序的设计
  3. 串口通信结束中断服务函数的设计
    在这里插入图片描述

三、代码展示

#include <reg52.h>

sfr AUXR = 0x8e;

typedef unsigned int uint;
typedef unsigned char uchar;

uchar urdat;

void SelectHC138(uchar channel)
{
	switch(channel)
	{
		case 4:    //LED
			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 InitUart()
{
	TMOD = 0X20;
	TH1 = 0XFD;
	TL1 = 0XFD;
	TR1 = 1;
	
	SCON = 0X50;
	AUXR = 0X00;
	
	ES = 1;
	EA = 1;
}



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

void ServiceUart() interrupt 4
{
	if(RI == 1)
	{
		RI = 0;
		urdat = SBUF;
		SendByte(urdat + 1);
	}
}

//初始化系统
void Initsys()
{
	SelectHC138(5);
	P0 = 0X00;//关闭蜂鸣器和继电器
	SelectHC138(4);
	P0 = 0XFF;//关闭LED
}

void main()
{
	InitUart();
	Initsys();
	SendByte(0xa5);      
	SendByte(0x5a);
	while(1);
}

四、一些参考

在这里插入图片描述
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周末不下雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值