【MCS-51单片机汇编语言】期末复习总结⑤——定时器中断方式与查询方式程序设计(题型五)

在这里插入图片描述

知识准备

工作方式寄存器TMOD

D7 D6 D5 D4 D3 D2 D1 D0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
  • [注]:TMOD高4位T1相关,低4位T0相关。

  • GATE

    • 0:定时器/计数器的运行由TRX决定;
    • 1: 定时器/计数器的运行由TRX外中断引脚共同决定;
  • C/T

    • 0:定时器模式;
    • 1:计数器模式;
  • M1/M0

M1 M0 方式 n
0 0 方式0 13位 (重要)
0 1 方式1 16位 (重要)
1 0 方式2 8位
1 1 方式3 2个8位 (仅适用于T0)

TCON寄存器

D7 D6 D5 D4 D3 D2 D1 D0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
  • IT0/IT1:外部中断0/1的中断触发方式选择

    • 1:沿边触发,由10的下降沿有效;
    • 0:电平触发,低电平有效;
  • IE0/IE1:外部中断0/1的中断标志位

    • 1:发生中断;
    • 0:未发生中断;
  • TR0/TR1:T0/T1运行控制位

    • 1:运行;
    • 0:不运行;
  • TF0/TF1:T0/T1的溢出标志位

    • 0:定时器未溢出;
    • 1:定时器溢出;

IE寄存器

D7 D6 D5 D4 D3 D2 D1 D0
EA ES ET1 EX1 ET0 EX0
  • EX0/EX1外部中断0/1的中断允许设置位:

    • 1:允许中断;
    • 0:禁止中断;
  • ET0/ET1定时器中断T0/T1的中断允许设置位:

    • 1:允许中断;
    • 0:禁止中断;
  • ES串行口的中断允许设置位:

    • 1:允许中断;
    • 0:禁止中断;
  • EA中断允许总开关设置位:

    • 1:允许总中断;
    • 0:禁止总中断;

定时/计数器的使用

初始化

  1. 设置TMOD:设置定时器的工作方式(四种工作方式,一般选择方式0或方式1);
  2. 计算初值(上一章中已详细介绍):
  3. 将初值写入TH0、TL0TH1、TL1
  4. 开放定时器中断和ETXEA(若选择中断的方式则需要开启,查询方式不需要);
  5. 启动定时器/计数器:TR0TR1

常考题型

例题1

题目描述

  • 系统时钟晶振频率为12MHZ,利用T0定时器选择方式0在P1.0引脚上输出周期为2ms的方波,允许中断

题目解析

  • 方波周期为2ms,则波峰、波谷各持续1ms,所以解决本题的主要思路为:利用定时器实现定时1ms,当定时器溢出(即计时1ms后),立即对P1.0进行取反,实现方波一低一高。

题解

准备工作

  1. 设置TMODGATE = 0C/T = 0M1、M0 = 00(因为选择方式0),所以 TMOD = 00H
  2. 计算初值(步骤参考上一篇文章),定时时间为1ms,代入公式得 初值X = 7192 = 1C18H= 1 1100 0001 1000
  3. 写入TH0,TL0:因为选择方式0,所以TH0取X的高8位TL0取X的后5位,即TH0 = 1 1100 000 = 0E0HTL0 = (前面补0)0001 1000 = 18H

中断方式程序设计

	ORG		0000H
	AJMP	MAIN
	ORG		000BH		;T0中断入口地址
	AJMP	TIME		;跳转到定时中断服务程序
	ORG		0030H
MAIN:
	MOV		TMOD,	#00H;设置TMOD
	MOV		TL0,	#18H;填充定时器初值
	MOV		TH0,	#0E0H
	SETB	ET0			;允许定时器0中断
	SETB	EA			;中断允许总开关
	SETB	TR0			;启用定时器T0
LOOP:
	SJMP	LOOP		;死循环
TIME:
	MOV		TL0,	#18H;重装初值
	MOV		TH0,	#0E0H
	CPL		P1.0		;P1.0取反,实现方波一低一高
	RETI
	END	

在这里插入图片描述

查询方式程序设计

	ORG		0000H
	AJMP	MAIN
	ORG		0030H
MAIN:
	MOV		TMOD,	#00H;设置TMOD
	MOV		TL0,	#18H;填充定时器初值
	MOV		TH0,	#0E0H
	SETB	TR0			;启用定时器T0
HERE:
	JBC		TF0,	LOOP;当(TF0) = 1时,跳转到LOOP并且(TF0) -> 0
	AJMP	HERE
LOOP:
	MOV		TL0,	#18H;重装初值
	MOV		TH0,	#0E0H
	CPL		P1.0		;P1.0取反,实现方波一低一高
	RETI
	END
  • 注意查询方式与中断方式最明显的不同是省略了设置中断各种开关的步骤。查询方式把定时器溢出就中断的效果代替为HERE所在的指令,即一直监视TF0(定时器溢出标志位),若定时器溢出则跳转到LOOP,否则继续原地死循环。

例题2

题目描述

  • 系统时钟晶振频率为12MHZ,利用T1方式2定时模式,在P1.0引脚上输出周期为500微秒的方波。

题目解析

  • 本题与上一题思路完全相同,不同的是定时时间为250微秒,晶振频率为12MHZ,并且选择T1方式2。

题解

  1. 设置TMODGATE = 0C/T = 0M1、M0 = 10(因为选择方式2),所以TMOD = 20H
  2. 计算初值:由公式 T定时 = (2n - X) · 12/ ∫晶振 = (28 - X) · 12/12MHZ = 250,解得初值X = 06H
  3. 写入TH0,TL0:TH1 = 06HTL1 = 06H

中断方式程序设计

	ORG		0000H
	AJMP	MAIN
	ORG		001BH		;T1的中断入口地址
	AJMP	TIME		;跳转到定时中断服务程序
	ORG		0030H
MAIN:
	MOV		TMOD,	#20H;设置TMOD
	MOV		TL0,	#06H;填充定时器初值
	MOV		TH0,	#06H
	SETB	ET1			;允许定时器1中断
	SETB	EA			;中断允许总开关
	SETB	TR1			;启用定时器T1
LOOP:
	SJMP	LOOP		;死循环
TIME:
	CPL		P1.0		;P1.0取反,实现方波一低一高
	RETI
	END	

查询方式程序设计

	ORG		0000H
	AJMP	MAIN
	ORG		0030H
MAIN:
	MOV		TMOD,	#20H;设置TMOD
	MOV		TL0,	#06H;填充定时器初值
	MOV		TH0,	#06H
	SETB	TR1			;启用定时器T1
HERE:
	JBC		TF1,	LOOP;当(TF1) = 1时,跳转到LOOP并且(TF1) -> 0
	AJMP	HERE
LOOP:
	CPL		P1.0		;P1.0取反,实现方波一低一高
	RETI
	END	

可将题解当作解题模板背下……

在这里插入图片描述

猜你喜欢

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