【MCS-51单片机汇编语言】期末复习总结⑥——串口通信(题型六)

在这里插入图片描述

知识准备

发送/接收缓冲器 SBUF

  • 单片机在发送或接收数据的前先将数据存储在SBUF中;
  • 接收:MOV A, SUBF
  • 发送:MOV SUBF, A

串口通信控制寄存器SCON

D7 D6 D5 D4 D3 D2 D1 D0
SM0 SM1 SM2 REN TB8 RB8 TI RI
  • SM0、SM1决定串行口的工作方式共四种组合,如下表所示:
M1 M0 方式 帧格式 波特率
0 0 方式0 8位移位寄存器 晶振 / 12
0 1 方式1 10位UART 可变,由定时器控制
1 0 方式2 10位UART 晶振 / 64或∫晶振 / 32
1 1 方式3 10位UART 可变,由定时器控制
  • SM2:多机控制位;
  • REN:允许串行口接收控制位:
    • 0:禁止;
    • 1:允许;
  • TB8:发送第9位数据;
  • RB8:接收第9位数据;
  • TI:发送中断标志;
  • RI:接收中断标志;

电源控制寄存器 PCON

D7 D6 D5 D4 D3 D2 D1 D0
SMOD GF1 GF0 PD IDL
  • SMOD:串行口波特率系数控制位;

各个工作方式波特率的设定

  • 在串行通信中,收发双方的波特率必须一致。
  • 方式0的波特率:∫OSC / 12(∫OSC 是晶振频率);
  • 方式2的波特率:(2SMOD / 64) • ∫OSC
  • 方式1方式3的波特率:(2SMOD / 32) • T1的溢出率 = (2SMOD / 32) • ( ∫OSC / 12(256 - X);(注意一般使用T1的方式2作为波特率发生器);

常考题型

例题1

题目描述

  • MCS51单片机的时钟频率为u=11.0592MHZ,选用定时器T1工作在方式2作为波特率发生器,要求产生4800bit/s的波特率,求T1的计数初值。若串行口工作在方式1,允许接收,允许串行口中断,试写出该单片机串行口的初始化程序。

题目解析

本题可分为两个小问题看待。首先是求T1的初值:可根据方式1的波特率公式(2SMOD / 32) • ( ∫OSC / 12(256 - X)解出初值X的值。

  • 假设SMOD = 0(因为题目并未给出),则方式1的波特率 = (2SMOD / 32) • ( ∫OSC / 12(256 - X),代入数值得:
  • 4800 = (20 /32) • (11.0953 * 106 ) / 12(256 - X),解得 X = FAH;
  • 所以TH1 = TL1 = 0FAH

其次是写出初始化程序:

  • 根据题目要求串行口工作在方式1,允许接收,可以得出SCON = 0101 0000 = 50H
  • 由允许串行口中断可以得出 IE寄存器中的EA、ES必须置为1;
  • 由选用定时器1工作在方式2可得出 TCON = 0010 0000 = 20H

题解

MOV		TMOD,	#20H
MOV		TH1,	#0FAH
MOV		TL1,	#0FAH
SETB	TR1		;启用定时器1
MOV		PCON,	#00H
MOV		SCON,	#50H
SETB	EA
SETB	ES

例题2

题目描述

  • MCS51单片机进行通信。要求甲机将内部RAM地址30H开始存储的20个数据送入乙机器中内部RAM地址40H开始的存储空间中。要求双方的串口均采用方式1、中断方式进行数据传输。波特率为4800bit/s,晶振频率为11.0592MHZ。试分别写出甲乙机器的发送与接收程序。

题解

  • 方式1的波特率 = (2SMOD / 32) • ( ∫OSC / 12(256 - X),代入数值得:
  • 4800 = (20 /32) • (11.0953 * 106 ) / 12(256 - X),解得 X = FAH;
  • 所以TH1 = TL1 = 0FAH

甲机(发送数据)

	ORG		0000H
	AJMP	MAIN
	ORG		0023H		;串行口中断入口
	AJMP	SOUT		;跳转到中断服务程序
	ORG		0030H
MAIN:
	MOV		SCON,	#40H;采用方式1,且禁止接收
	MOV		TMOD,	#20H;定时器采用方式2
	MOV		TH1,	#0FAH;定时器初值
	MOV		TL1,	#0FAH
	SETB	TR1			;启用定时器1
	SETB	EA			;打开中断允许总开关
	SETB	ES			;允许串行口中断
	MOV		R0,		#30H;存储数据的地址
	MOV		R7,		#20H;控制循环次数
	MOV		A,		@R0
	MOV		SBUF,	A	;先将数据存储至SBUF
	DEC		R7			;R7-1
	SJMP	$			;死循环,等待中断
SOUT:
	CLR		TI			;发送中断标志位清零
	INC		R0		;R0+1
	MOV		A,		@R0
	MOV		SBUF,	A
	DJNZ	R7,		ENDSI;判断循环是否结束
	CLR		ES			;关闭串行口中断
ENDSI:
	RETI
	END

乙机(接收数据)

	ORG		0000H
	AJMP	MAIN
	ORG		0023H		;串行口中断入口
	AJMP	SOUT		;跳转到中断服务程序
	ORG		0030H
MAIN:
	MOV		SCON,	#50H;采用方式1,且允许接收
	MOV		TMOD,	#20H;定时器采用方式2
	MOV		TH1,	#0FAH;定时器初值
	MOV		TL1,	#0FAH
	SETB	TR1			;启用定时器1
	SETB	EA			;打开中断允许总开关
	SETB	ES			;允许串行口中断
	MOV		R0,		#40H;存储数据的地址
	MOV		A,		@R0
	SJMP	$			;死循环,等待中断
SIN:
	CLR		RI			;接收中断标志位清零
	MOV		A,		SBUF
	MOV 	@R0,	A
	INC		R0
ENDSI:
	RETI
	END

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gllll_yu/article/details/131046072