中断与定时计数(51单片机)

经过我们之前的学习,我们已经能够掌握关于单片机周期性、延时函数,包括nop指令等内容,下面我们开始接触新的内容:中断和定时计数的相关知识。

一、中断系统

1、中断系统结构

在上图的AT89C51的中断系统结构中,存在着5个中断请求源(包括:外部中断0请求、定时器/计数器0中断请求、外部中断1请求、定时器/计数器1中断请求、串行口中断请求)。此外,系统支持2个不同的中断优先级,并且可以实现嵌套的2级中断服务程序。每个中断源的中断状态可以由软件单独控制,可以选择允许或关闭中断。另外,每个中断源的优先级可以通过软件进行设置。 

五个中断请求源具体如下:

⑴  INT0:外部中断请求0,外部中断请求信号(低电平或负跳变有效)由INT0引脚输入,中断请求标志为IE0。

⑵  INT1:外部中断请求1,外部中断请求信号(低电平或负跳变有效)由INT1引脚输入,中断请求标志为IE1。

⑶ T0:定时器/计数器T0计数溢出的中断请求,标志为TF0。

⑷ T1:定时器/计数器T1计数溢出的中断请求,标志为TF1。

⑸ TX、RX:串行口中断请求,标志为发送中断TI或接收中断RI。

 2、中断寄存器

TCON寄存器

SCON寄存器

功能:

RI:串行口接收中断请求标志位。在串口接收完一个串行数据帧,硬件自动使RI中断请求标志置“1”。CPU在响应串口接收中断时,RI标志并不清“0”,须在中断服务程序中用指令对RI清“0”。

TI:串口发送中断请求标志位。CPU将1字节的数据写入串口的发送缓冲器SBUF时,就启动一帧串行数据的发送,每发送完一帧串行数据后,硬件使TI自动置“1”。CPU响应串口发送中断时,并不清除TI中断请求标志,TI标志必须在中断服务程序中用指令对其清“0”。

中断允许寄存器IE

IE是一个位结构寄存器,用于控制和配置8051系列单片机中断的功能。其对中断开放和关闭实现两级控制。两级控制就是有一个总的中断开关控制位EA(IE.7位),当EA=0,所有中断请求被屏蔽,CPU对任何中断请求都不接受;当EA=1时,CPU开中断,但5个中断源的中断请求是否允许,还要由IE中的低5位所对应的5个中断请求允许控制位的状态来决定。

功能:

EA—中断允许总开关控制位。     

         EA=0,所有的中断请求被屏蔽。

         EA=1,所有的中断请求被开放。

ES—串行口中断允许位。

         ES=0,禁止串行口中断。

         ES=1,允许串行口中断。

ET1/ET0—定时器/计数器T1/T0溢出中断允许位。

         ET1/ET0=0,禁止T1/T0溢出中断。

         ET1/ET0=1,允许T1/T0溢出中断。

EX1/EX0—外部中断1/0中断允许位。  

         EX1/EX0=0,禁止外部中断1/0中断。   

         EX1/EX0=1,允许外部中断1/0中断。

中断优先级寄存器IP

IP寄存器是一个8位寄存器,用于配置和控制中断的优先级。每个位对应于一个特定的中断,通过设置或清除这些位,可以指定每个中断的优先级。优先级高的中断将优先被处理。

PS—串行口中断优先级控制位

PT1—T1中断优先级控制位

PX1—外部中断1中断优先级控制位

PT0—T0中断优先级控制位

PX0—外部中断0中断优先级控制位

1——高级;0——低级

二、定时器和计数器

定时器/计数器概述

  • AT89S51具有两个独立的定时器/计数器:Timer 0和Timer 1。
  • 这些定时器/计数器可以用来生成精确的时间延迟、进行时间测量、计数输入脉冲等任务。

Timer 0

  • Timer 0是一个8位定时器,可以作为定时器或计数器使用。
  • 它可以由软件或外部脉冲触发,用于生成周期性的定时中断或计数外部事件的脉冲数量。

Timer 1

  • Timer 1是一个16位定时器,也可以作为定时器或计数器使用。
  • 它可以通过软件或外部脉冲触发,并且可以处理更长的时间间隔或更大的计数范围。

工作模式

  • 定时器可以在不同的工作模式下运行,例如定时器模式(用于生成定时延迟)、计数器模式(用于计数外部事件)、定时/计数器模式等。

配置和编程

  • 使用AT89S51的定时器/计数器需要适当的配置和编程。通过设定定时器的工作模式、预分频器(若有)、计数初始值和中断使能来实现所需的定时或计数功能。

工作方式控制寄存器TMOD

 TMOD寄存器是一个8位寄存器,其每个位都对应于定时器0和定时器1的不同工作模式或计数模式。

  • Bit 7: GATE1 - Timer 1 的门控控制位
  • Bit 6: C/T1 - Timer 1 的工作模式选择位
  • Bit 5: M1_1 - Timer 1 的模式选择位1
  • Bit 4: M1_0 - Timer 1 的模式选择位0
  • Bit 3: GATE0 - Timer 0 的门控控制位
  • Bit 2: C/T0 - Timer 0 的工作模式选择位
  • Bit 1: M0_1 - Timer 0 的模式选择位1
  • Bit 0: M0_0 - Timer 0 的模式选择位0

定时器/计数器控制寄存器TCON

 TCON寄存器是一个8位寄存器。

  • Bit 7: TF1- 定时器1溢出标志位。当Timer 1计数溢出时,该位被置1,需要软件清零。
  • Bit 6: TR1  - 定时器1运行控制位。置1启动定时器1,置0停止定时器1。
  • Bit 5: TF0  - 定时器0溢出标志位。当Timer 0计数溢出时,该位被置1,需要软件清零。
  • Bit 4: TR0 - 定时器0运行控制位。置1启动定时器0,置0停止定时器0。
  • Bit 3: IE1 - 外部中断1边沿标志位。当外部中断1触发时,该位被置1。
  • Bit 2: IT1  - 外部中断1类型控制位。控制外部中断1的触发方式(低电平触发或下降沿触发)。
  • Bit 1: IE0 - 外部中断0边沿标志位。当外部中断0触发时,该位被置1。
  • Bit 0: IT0 - 外部中断0类型控制位。控制外部中断0的触发方式(低电平触发或下降沿触发)。

三、实践应用

1、中断嵌套

题目要求:设计一中断嵌套程序:要求K1和K2都未按下时,P1口8只LED呈流水灯显示,当按一下K1时,产生一个低优先级外中断0请求(跳沿触发),进入外中断0中断服务程序,上下4只LED交替闪烁。此时按一下K2时,产生一个高优先级的外中断1请求(跳沿触发),进入外中断1中断服务程序,使8只LED全部闪烁。当显示5次后,再从外中断1返回继续执行外中断0中断服务程序,即P1口控制8只LED,上、下4只LED交替闪烁。设置外中断0为低优先级,外中断1为高优先级。

 代码示例

#include <REGX52.H>
 
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
 
void main()
{
	EA=1;		//总中断打开
	EX0=1;
	EX1=1;	//	允许中断0、1中断
	IT0=1;
	IT1=1;	//中断0、1设置下降沿中断
	//只设置IP优先级只有两级,设置IPH可将优先级设为四级
	PX0=0;	//IP可位寻址
	PX1=1;	//中断1优先于中断0
	while(1)
	{
		P2=0xFE;//1111 1110
		Delay1ms(500);
		P2=0xFD;//1111 1101
		Delay1ms(500);
		P2=0xFB;//1111 1011
		Delay1ms(500);
		P2=0xF7;//1111 0111
		Delay1ms(500);
		P2=0xEF;//1110 1111
		Delay1ms(500);
		P2=0xDF;//1101 1111
		Delay1ms(500);
		P2=0xBF;//1011 1111
		Delay1ms(500);
		P2=0x7F;//0111 1111
		Delay1ms(500);		
	}
}
 
	
void Int0_Routine() interrupt 0//外部中断0
{
	unsigned char i;
	for(i=0;i<10;i++)
	{
		P2=0xF0;
		Delay1ms(300);
		P2=0x0F;
		Delay1ms(300);
	}
}
 
void Int1_Routine() interrupt 2//外部中断1
{	
			unsigned char i;
			for(i=0;i<10;i++)
			{
				P2=0xFF;
				Delay1ms(300);
				P2=0;
				Delay1ms(300);
			}
}

Proteus仿真电路图

2、外部中断的运用

题目要求:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接一只按钮开关K1。要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。

代码示例

#include <REGX51.H>
 
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
 
 
void main()
{
	EA = 1;
	EX0 = 1;
	IT0 = 1;
	while(1)
	{
		P1 = 0  ;
	}
}
void Int0_Routine() interrupt 0 using 0
{
	unsigned char n;
	EX0 = 0;
	for(n=0;n<5;n++)
	{
		P1 = 0x0F;
		Delay1ms(500);
		P1 = 0xF0;
		Delay1ms(500);
		EX0 = 1;
	}
}

Proteus仿真电路图

3、两个外中断

题目要求:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接有一只按钮开关K1。在外部中断1输入引脚(P3.3)接有一只按钮开关K2。要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下再松开时,上下各4只LED交替闪烁10次,然后再回到流水灯显示。如果按下再松开K2(P3.3)时,P1口的8只LED全部闪烁10次,然后再回到流水灯显示。设置两个外中断的优先级相同。

代码示例

#include <REGX52.H>
 
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
 
void main()
{
	EA=1;		//总中断打开
	EX0=1;
	EX1=1;	//	允许中断0、1中断
	IT0=1;
	IT1=1;	//中断0、1设置下降沿中断
	IP=0;		//中断优先级控制寄存器低(可位寻址)
	
	while(1)
	{
		P2=0xFE;//1111 1110
		Delay1ms(500);
		P2=0xFD;//1111 1101
		Delay1ms(500);
		P2=0xFB;//1111 1011
		Delay1ms(500);
		P2=0xF7;//1111 0111
		Delay1ms(500);
		P2=0xEF;//1110 1111
		Delay1ms(500);
		P2=0xDF;//1101 1111
		Delay1ms(500);
		P2=0xBF;//1011 1111
		Delay1ms(500);
		P2=0x7F;//0111 1111
		Delay1ms(500);		
	}
}
 
	
void Int0_Routine() interrupt 0//外部中断0
{
	unsigned char i;
	for(i=0;i<10;i++)
	{
		P2=0xf0;
		Delay1ms(300);
		P2=0x0f;
		Delay1ms(300);
	}
}
 
void Int1_Routine() interrupt 2//外部中断1
{	
			unsigned char i;
			for(i=0;i<10;i++)
			{
				P2=0xff;
				Delay1ms(300);
				P2=0x00;
				Delay1ms(300);
			}
}

Proteus仿真电路图

总结

学习51单片机中断与定时计数的应用,我深入理解了中断机制的原理与实现方法,以及定时器在实时控制中的关键作用。通过课堂理论学习和实验操作。在实践过程中,遇到了各种问题,比如中断处理和定时器溢出等问题,但通过上网查询,我逐步解决了这些问题。这些经历不仅丰富了我的知识,也增强了我的技术能力和解决问题的能力。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值