【51单片机】中断与定时计数

本文详细介绍了51单片机中断系统的工作原理,包括中断请求源、中断标志位、中断允许与优先级控制,以及中断响应过程。并通过实例演示了中断系统的应用,如单一外中断和两个外中断的处理。
摘要由CSDN通过智能技术生成

中断系统

一、概述

        中断技术主要用于实时监测与控制,要求单片机能及时地响应中断请求源提出的服务请求,并快速响应与及时处理。       当中断请求源发出中断请求时,如中断请求被允许,单片机暂时中止当前正在执行的主程序,转到中断服务处理程序处理中断服务请求,处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。

图1 单片机对外设中断服务请求整个中断响应和处理过程 

二、51单片机中断原理

        中断系统有5个中断请求源(简称中断源),2个中断优先级,可实现2级中断服务程序嵌套。每一中断源可用软件独立控制为允许中断或关闭中断状态;每一个中断源的优先级均可用软件设置。

图2

1、中断请求源

 由图2,中断系统共有5个中断请求源,它们是:

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

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

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

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

(5)串行口中断请求,标志为发送中断TI或接收中断RI。 

2、中断请求标志寄存器

[1]TCON寄存器

        为定时器/计数器的控制寄存器,字节地址为88H,可位寻址。既包括定时器/计数器T0、T1溢出中断请求标志位TF0和TF1,也包括两个外部中断请求的标志位IE1与IE0,还包括两个外部中断请求源的中断触发方式选择位。TCON格式见图3。

图3  特殊功能寄存器TCON的格式 

 TCON寄存器中与中断系统有关各标志位功能如下:

(1)TF1—定时器/计数器T1的溢出中断请求标志位。  当启动T1计数后,T1从初值开始加1计数,当最高位产生溢出时,硬件 置TF1为“1”,向CPU申请中断,响应TF1中断时,TF1标志硬件自动清“0”,TF1也可由软件清“0”。

(2)TF0—定时器/计数器T0溢出中断请求标志位,与TF1类似。

(3)IE1—外部中断请求1中断请求标志位。

(4)IE0—外部中断请求0中断请求标志位,与IE1类似。 

(5)IT1—选择外中断请求1为跳沿触发还是电平触发方式。 0--电平触发方式,加到INT0*脚上的外中断请求输入信号为低电平有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清“0”。 1--跳沿触发方式,加到INT1*脚上的外中断请求输入信号从高到低的负跳变有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清“0”。

(6)IT0—选择外中断请求0为跳沿触发方式还是电平触发方式,与IT1类似。  当AT89S51复位后,TCON被清“0”,5个中断源的中断请求标志均为0。 TR1(D6位)、TR0(D4位)这2位与中断系统无关,仅与定时器/计数器T1和T0有关

[2]SCON寄存器

        串行口控制寄存器,字节地址为98H,可位寻址。SCON的低二位锁存串口的发送中断和接收中断的中断请求标志TI和RI,格式见图4。

图4  SCON中的中断请求标志位 

SCON标志位功能:

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

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

3.中断允许与中断优先级

(1)中断允许寄存器IE

各中断源开放或屏蔽,是由片内中断允许寄存器IE控制。IE字节地址为A8H,可进行位寻址,格式见图6-5。

图5  中断允许寄存器IE的格式

IE对中断开放和关闭实现两级控制。两级控制就是有一个总的中断开关控制位EA(IE.7位),当EA=0,所有中断请求被屏蔽,CPU对任何中断请求都不接受;当EA=1时,CPU开中断,但5个中断源的中断请求是否允许,还要由IE中的低5位所对应的5个中断请求允许控制位的状态来决定。 

(2)中断优先级寄存器IP

中断请求源有两个中断优先级,每一个中断请求源可由软件设置为高优先级中断或低优先级中断,也可实现两级中断嵌套。      所谓两级中断嵌套,就是AT89S51正在执行低优先级中断的服务程序时,可被高优先级中断请求所中断,待高优先级中断处理完毕后,再返回低优先级中断服务程序。 

图6 两级中断嵌套过程

 各中断源的中断优先级关系,可归纳为下面两条基本规则:

(1)低优先级可被高优先级中断,高优先级不能被低优先级中断。

(2)任何一种中断(不管是高级还是低级)一旦得到响应,不会再被它的同级中断源所中断。如果某一中断源被设置为高优先级中断,在执行该中断源的中断服务程序时,则不能被任何其他的中断源的中断请求所中断。 AT89S51片内有一个中断优先级寄存器IP,字节地址为B8H,可位寻址。只要用程序改变其内容,即可进行各中断源中断优先级设置,IP寄存器格式见图7。 

图7  IP寄存器的格式 

中断优先级寄存器IP各位含义:

(1)PS—串行口中断优先级控制位,1—高级;0—低级。

(2)PT1—T1中断优先级控制位,1—高级;0—低级。

(3)PX1—外部中断1中断优先级控制位,1—高级;0—低级。

(4)PT0—T0中断优先级控制位,1—高级;0—低级。 

(5)PX0—外部中断0中断优先级控制位,1—高级;0—低级。

4、中断响应原理

一个中断源中断请求被响应,须满足以下必要条件:

(1)总中断允许开关接通,即IE寄存器中的中断总允许位EA=1。

(2)该中断源发出中断请求,即该中断源对应的中断请求标志为“1”。

(3)该中断源的中断允许位=1,即该中断被允许。

(4)无同级或更高级中断正在被服务。   中断响应就是CPU对中断源提出的中断请求的接受,当查询到有效的中断请求时,满足上述条件时,紧接着就进行中断响应。

中断响应过程:    首先由硬件自动生成一条长调用指令“LCALL addr16”。即程序存储区中相应的中断入口地址。例如,对于外部中断1的响应,硬件自动生成的长调用指令为:     LCALL 0013H   生成LCALL指令后,紧接着就由CPU执行该指令。首先将程序计数器PC内容压入堆栈以保护断点,再将中断入口地址装入PC,使程序转向响应中断请求的中断入口地址。各中断源服务程序入口地址是固定的,见表6-2。  其中两个中断入口间只相隔8字节,一般情况下难以安放一个完整的中断服务程序。

5、中断标志位复位原理 

中断标志位的复位原理取决于特定处理器架构的设计和实现。在x86架构中,中断标志位(IF)是EFLAGS寄存器的一个标志位。该寄存器是一个32位的寄存器,用于存储各种标志位信息,包括中断标志位。中断标志位的位置(位号)在不同的处理器架构中可能会有所不同。当中断标志位被设置为1时,处理器会响应外部中断。当中断标志位被清除为0时,处理器不会响应外部中断。

中断标志位的复位通常通过以下方式之一来实现:

1.使用CLI指令:CLI(Clear Interrupt Flag)是一条汇编指令,用于将中断标志位设置为0,从而禁用中断响应。具体操作是将EFLAGS寄存器中的IF位设置为0。CLI指令可以在特权级0(内核态)执行,或者在适当的权限级别下使用相关指令进行模拟。

2.使用编程语言提供的函数或指令:许多高级编程语言提供了设置中断标志位的函数或指令,可以方便地在程序中进行操作。具体的函数或指令名称可能因编程语言而异。在C语言中,可以通过操作系统或编译器提供的相关函数或宏来清除中断标志位。例如,在Linux环境下,可以使用cli()函数来清除中断标志位。

三、中断系统的应用

1.单一外中断的应用

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

C语言代码:

#include <reg51.h>
#define uchar unsigned char
	void Delay(unsigned int i)
	{
	unsigned int j;
		for(;i>0;i--)
		{
		for(j=0;j<333;j++)
			{;}
		}
	}
	void main()
	{
	EA=1;
		EX0=1;
		IT0=1;
		while(1)
		{
		P2=0;
		}
	}
	void int0() interrupt 0 using 0
	{
	uchar m;
		EX0=0;
		for(m=0;m<5;m++)
		{
		P2=0x0f;
			Delay(400);
			P2=0xf0;
			Delay(400);
			EX0=1;
		}
	}

Proteus电路仿真:

2.两个外中断的应用 

在单片机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 <reg51.h>
#define uchar unsigned char
	void Delay(unsigned int i)
	{
		uchar j;
		for(;i>0;i--){
			for(j=0;j<125;j++)
			{;}
		}
	}
	void main()
	{
	uchar display[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
	unsigned int a;
	for(;;)
	{
		EA=1;
		EX0=1;
		EX1=1;
		IT0=1;
		IT1=1;
		IP=0;
		for(a=0;a<9;a++)
		{
		Delay(500);
			P2=display[a];
		}
	}
	}
	void int0_isr(void) interrupt 0 using 1
	{
	uchar n;
		for(n=0;n<10;n++)
		{
		P2=0x0f;
			Delay(500);
			P2=0xf0;
			Delay(500);
		}
	}
	void int1_isr(void) interrupt 2 using 2
	{
	uchar m;
		for(m=0;m<10;m++)
		{
		P2=0xff;
			Delay(500);
			P2=0;
			Delay(500);
		}
	}

 

 定时器/计数器的结构

 AT89S51定时器/计数器结构见图 7-1,定时器/计数器T0由特殊功能寄存器TH0、TL0构成,T1由特殊功能寄存器TH1、TL1构成。

图1 定时器/计数器结构框图 

T0、T1都有定时器和计数器两种工作模式,两种模式实质都是对脉冲信号进行计数,只不过计数信号来源不同。计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数(见图1);定时器模式是对系统时钟信号经12分频后的内部脉冲信号(机器周期)计数。由于系统时钟频率是定值,可根据计数值计算出定时时间。两个定时器/计数器属于增1计数器,即每计一个脉冲,计数器增1。T0、T1具有4种工作方式(方式0、1、2和3)。

  • 21
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
51单片机可以通过外部中断来进行计数,具体步骤如下: 1. 配置中断引脚为外部中断模式,可以使用P3口的INT0和INT1引脚,或者P1口的T0和T1引脚。 2. 初始化中断相关的寄存器,包括IE(中断使能寄存器)、IP(中断优先级寄存器)和TCON(定时器/计数器控制寄存器)等。 3. 编写中断服务程序,当外部中断发生时,会自动跳转到中断服务程序中执行。 4. 在中断服务程序中对计数器进行操作,可以使用一个全局变量来保存计数值。 5. 在主程序中定时读取计数器的值,可以使用定时器或者延时函数来控制读取的时间间隔。 6. 在需要重置计数器时,可以在主程序中设置一个标志位,当标志位被置位时,将计数器清零。 示例代码如下: ```c #include <reg52.h> #include <intrins.h> sbit INT0 = P3^2; // 外部中断0引脚 unsigned int count = 0; // 计数器 void init_interrupt() { EA = 1; // 开启总中断 EX0 = 1; // 开启外部中断0 IT0 = 1; // 配置为下降沿触发 } void isr_int0() interrupt 0 { count++; // 计数器加1 } void main() { init_interrupt(); // 初始化中断 while(1) { // 定时读取计数器的值,可以使用定时器或者延时函数 _nop_(); // 空指令,延时一段时间 _nop_(); _nop_(); _nop_(); printf("count = %d\n", count); // 重置计数器 if(/*条件*/) { count = 0; } } } ``` 注意:在使用P3口的INT0和INT1引脚时,需要将P3口的其他引脚设置为输入模式,否则可能会影响中断的触发。同时,需要注意中断服务程序的执行时间,尽量保持短暂,不要阻塞主程序的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值