【蓝桥杯】CT107D单片机之串口通信

1、概述


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

串行通信有SPI、IIC、 UART等多种,最常见最通用的是指UART,大多数情况下,串口通信指的就是UART。

串行通信的制式有:单工、半双工、全双工三种。RS485总线是半双工的通信制式。

串行通信的主要方式有两种:同步和异步。
同步串行通信:需要使用同一个时钟,以数据块为单位传送数据。
异步串行通信:每个设备都有自己的时钟信号,通信中双方的波特率要保持一致,以字符为单位进行数据帧传送,一次传送一个帧。

2、关于波特率的计算

波特率:串口每秒钟传输的位数。

在51单片机的串口通信中,模式1和模式3的波特率是可变的,取决于定时器1的溢出率,也就是说定时器1每溢出1次,串口就发送一次数据。

通常使用定时器1的工作模式2 (8位自动重装)来产生波特率,TL1作为脉冲计数寄存器,TH1作为自动重装寄存器,当计数到最大值溢出时,TH1 的值会自动装到TL1中。
在这里插入图片描述
12M晶振或11.0592M晶振的情况下,要产生9600BPS的波特率,SMOD=0时,参数为0xfd; SMOD=1 时,参数为0xfa。

3、UART口的数据发送与接收

串行口中有两个缓冲寄存器SBUF, -一个是发送寄存器,一个是接收寄存器,在物理结构.上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。

这个重叠的地址靠读/写指令区分:
串行发送时,CPU向SBUF写入数据,此时99H表示发送缓存SBUF。.
串行接收时,CPU从SBUF读出数据,此时99H表示接收缓存SBUF。

数据发送,把数据扔进SBUF后,内核会自动将数据发送出去,内容发生完成后,会将Tl标志位置1。发送数据程序: SBUF =数据/变量;如: SBUF = 0x58。
数据接收,内核从串口接收到一个完整的数据后,会将RI标志位置1,用户用SBUF直接读取即可。接收数据程序:变量= SBUF;如: dat= SBUF。

4、串行口控制寄存器SCON

  SCON(Serial Control Register)串行口控制寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态。SCON既可以字节寻址,也可以位寻址,其字节地址为98H,地址位为98H~9FH。
  串行口控制寄存器SCON各位定义

D7D6D5D4D3D2D1D0
SM0SM1SM2RENTB8RB8TIRI
9FH9EH9DH9CH9BH9AH99H98H

控制寄存器SM0、SM1——串行口工作方式控制位

  (1)方式0( SM0 SM1 :0 0):串行口的工作方式0为移位寄存器I/O方式,可外接移位寄存器,一扩展I/O口,也可外接同步I/O设备。 发送操作:当执行一条“MOVSBUF,A”指令时,启动发送操作,由TXD输出移位脉冲,由RXD串行SBUF中的数据。发送完8位数据后自动置TI=1.请求中断。要继续发送时,TI必须有指令清零。 接收操作:REN是串行口接收允许控制位。REN=0时禁止接收;REN=1时允许接收。当软件将REN置“1”时,即开始从RXD端口以fosc/12波特率输入数据,当接收到8位数据时,将中断标志RI置“1”。再次接收数据之前,必须用软件将RI清0。
  (2)方式1 ( SM0 SM1 :0 1) :串行口为10位通用异步接口。发送或接收一帧数据信息为10位,包括1位起始位“0”、8位数据位、1位停止位“1”。发送数据:数据从TXD端口输出,当数据写入发送缓冲器SBUF时,就启动发送器发送。发送完一帧数据后,置中断标志TI=1,申请中断,通知CPU可以发送下一个数据了。接收数据:首先使REN=1(允许接收数据),串行口从RXD接收数据,当采样到1至0跳变时,确认是起始位“0”,就开始接收一帧数据,当接收完一帧数据时,置中断标志RI=1,申请中断,通知CPU从SBUF取走接收到的数据 。
  (3)方式2 ( SM0 SM1 :1 0) :串行口为11位异步通信接口。发送或接收一帧信息包括1位起始位“0”、8位数据位、1位可编程位、1位停止位“1”。发送数据:发送前,先根据通信协议由软件设置TB8为“奇偶校验位”或“数据标识位”,然后将要发送的数据写入SBUF,即能启动发送器。发送过程是由执行任何一条以SBUF为目的寄存器的指令而启动的,把8位数据装入SBUF,同时还把TB8装到发送移位寄存器的第9位上,然后从TXD(P3.1)端口输出一帧数据。接收数据:先置REN=1,使串行口为允许接收状态,同时还要将RI清“0”。然后再根据SM2的状态和所接收到的RB8的状态决定此串行口在信息到来后是否置RI=1,并申请中断,通知CPU接收数据。当SM2=0时,不管RB8为“0”还是为“1”,都置RI=1,此串行口将接收发送来的信息。当SM2=1时,且RB8=1,表示在多机通信情况下,接收的信息为“地址帧”, 此时置RI=1,串行口将接收发来的地址。当SM2=1时,且RB8=0,表示在多机通信情况下,接收的信息为“数据帧”, 但不是发给本从机的,此时RI不置为“1”,因而SBUF中接收的数据帧将丢失。
  (4)方式3 ( SM0 SM1 :1 1) :为波特率可变的11位异步通信方式,除了波特率有所区别之外,其余方式都与方式2相同。

SM0SM1工作方式功能波特率
00方式08位同步移位寄存器晶振频率/12
01方式110位UART可变
10方式211位UART晶振频率/64或晶振频率/32
11方式311位UART可变

控制寄存器SM2——多机通信控制位

  多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接收到的数据放弃。当SM2=0时,就不管第9位数据是0还是1,都会将数据送入SBUF,并发出中断申请。工作于方式0时,SM2必须为0。

控制寄存器REN——允许接收位

   REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。

控制寄存器TB8——发送数据位8

   在方式2和方式3中,TB8是要发送的——即第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。

控制寄存器RB8——接收数据位8

   接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。

控制寄存器TI——发送中断标志位

   方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。

控制寄存器RI——接收中断标志位

   接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。在串口中断处理时,TI,RI都需要软件清"0",硬件置位后不可能自动清0,此外,在进行缓冲区操作时,需要ES=0,以防止中断出现。

5、串口通信实验

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

注意: 对于IAP15F2K61S2单片机,需要对新增的AUXR寄存器(0x8e)配置。

程序代码:

#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8e;

unsigned char urdat;

void SendByte(unsigned char dat);

void InitUart()
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0xE0;		//设定定时初值
	TH1 = 0xFE;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

void ServiceUart() interrupt 4 /*串口中断服务函数*/
{
	if(RI == 1)  /*串口通信数据的接收*/
	{
		RI = 0;
		urdat = SBUF; 
		SendByte(urdat + 1);
	}
}

void SendByte(unsigned char dat) /*串口通信数据的发送*/
{
	SBUF = dat;
	while(TI == 0);
	TI = 0;
}

void main()
{
	InitUart();
	SendByte(0x5a);
	SendByte(0xa5);
	while(1);
	
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值