【单片机与嵌入式】中断与定时计数

本文详细介绍了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构成。

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

(二)定时器与计数器寄存器

1、工作方式控制寄存器TMOD

TMOD寄存器是一个8位寄存器,用于配置定时/计数器的工作模式。它允许开发人员选择定时器0和定时器1的工作模式,包括定时器模式、定时器/计数器模式、以及自动重装载模式。TMOD格式如下图所示:

定时器1/2的前两位符号及其功能介绍:

符号功能
TMOD.7/GATETMOD. 7控制定时器1,置1时只有在INT1*脚为高及TR1控制位置1时才可打开定时器/计数器1。
TMOD.3/GATETMOD.3控制定时器0,置1时只有在INTO*脚为高及TRO控制位置1时才可打开定时器/计数器0。
TMOD.6/C/TTMOD.6控制定时器1用作定时器或计数器,清零则用作定时器(从内部系统时钟输入),置1用作计数器(从T1/P3. 5脚输入)
TMOD.2/C/TTMOD.2控制定时器0用作定时器或计数器,清零则用作定时器(从内部系统时钟输入),置1用作计数器(从T0/P3.4脚输入)

2、定时器/计数器控制寄存器TCON
TCON寄存器是一个8位寄存器,用于控制定时器0和定时器1的运行和状态。它包含了定时器/计数器的控制位,以及用于中断请求的外部中断标志位。TCON格式如下图所示:


TF1:T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢时由硬件置“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清 “0”TF1 (TF1 也可由程序查询清“0”)。
TR1:定时器T1的运行控制位。该位由软件置位和清零。当GATE (TMOD.7) =0,TR1=1时就 允许T1开始计数,TR1=0时禁止T1计数。当GATE (TMOD.7) =1, TR1=1且INTI*输入高电平时,才允许T1计数。
TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当最高位产生溢出时,由硬件置“1”TF0,向CPU请求中断,一直保持CPU响应 该中断时,才由硬 件清“0”TF0 ( TF0也可 由程序查询清“0”)。
TR0:同上方的TR1类似是定时器T0的运行控制位。该位由软件置位和清零。当GATE (TMOD.3) =0,TR0= 1时就 允许T0开始计数,TR0=0时禁止T0计数。当GATE (TMOD.3) =1, TR1=0且INTO*输入高电平时,才允许T0计数。
IE1: 外部中断1请求源(INT1*/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该中断时由硬件清“0” IE1。
IE0:外部中断0请求源(INT0/P3.2)标志。IE0=1外 部中断0向CPU请求中断,当CPU响应外中断时由硬件清“0”IE0 。
IT1:外部中断1中断源类型选择位。IT1=0,INT1*/P3.3引脚上的低电平信号可触发外部中断1。IT1=1, 外部中断1为下降沿触发方式。
IT0:外部中断0中断源类型选择位。IT0=0,INT0*/P3.2引脚上的低电平信号可触发外部中断0。IT0=1, 外部中断0为下降沿触发方式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值