中断

三、中断

(基本)中断优先级

外部中断0 > 定时器/计数器0 > 外部中断1 > 定时器/计数器1 > 串行口

假设程序正运行到定时器/计数器0中断中,如果产生了外部中断0,则程序会运行到外部中断0中。

如果产生了外部中断1,则仍会在定时器/计数器0中断中。

原理

  • 书上解释:

    当中断请求源(简称“中断源”)发出中断请求时,如果中断服务请求被允许的话,单片机暂时中止当前正在执行的主程序,转到中断服务程序处理中断服务请求,处理完中断服务请求后,再回到被终止的程序之处(断点),继续执行被中断的主程序。

  • 我的理解:

    进入中断时,会暂停原来的程序

    在”中断总开关“打开的情况下,在需要中断的地方打开对应”中断开关“就会进入对应中断程序

    这个过程中,不同的中断受到不同的寄存器控制

    同时具有优先级的关系

中断开关

TCON寄存器

  1. TF1:片内定时器/计数器T1的溢出中断请求标志位。

    当启动T1计数后,定时器/计数器T1从初值开始加1计数,当计数溢出时,由硬件自动为TF1置“1“,向CPU申请中断。CPU响应TF1中断时,TF1标志位由硬件自动清零,TF1也可由软件清零。

  2. TF0:片内定时器/计数器T0的溢出请求标志位,功能与TF1基本相同。

  3. IE1:外部中断请求1的中断请求标志位

  4. IE0:外部中断请求0的中断请求标志位

  5. IT1:选择外部中断请求1为负跳变触发方式还是电平触发方式。

    • IT = 0,为电平触发方式,加到引脚

上的外部中断请求输入信号为低电平有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清零。

  • IT = 1,为负跳变触发方式,加到

上的外部中断请求输入信号电平为从高到低的负跳变有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清零。

  1. IT0:选择外部中断请求0为负跳变触发方式还是电平触发方式,与IT1类似。

  2. TR1位 = 1,启动定时器/计数器的必要条件

    TR1位 = 0,停止定时器/计数器计数。

  3. TR0:与TR1类似。

SCON寄存器

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

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

外部中断初始化

外部中断0

//外部中断0初始化
void exterInit()
{
    EA = 1;    //总中断允许
    EX0 = 1;    //外部中断0允许
    IT0 = 1;    //选中外部中断0为电平触发方式
}

外部中断1

//外部中断0初始化
void exterInit()
{
    EA = 1;    //总中断允许
    EX1 = 1;    //外部中断1允许
    IT1 = 1;    //选中外部中断1为电平触发方式
}

实践代码

功能:跑马灯从D0 --> D1 --> ... -->D7 -->D0 -->...,外部中断起延时函数的作用

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
 #define uint unsigned int
//变量定义
sbit K32 = P3^2;    //外部中断0控制管脚
int i = 0;    //循环变量
uchar array[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};    //跑马灯

//函数声明
void init();
void exter0();

//数码管从零亮到九,然后产生中断使跑马灯从D0亮到D7
void main()
 {
    init();
    P1 = 0xFF;//跑马灯接在P2口
    
    while(1)
    {
        for (i = 0; i < 8; i ++)
        {
            P1 = array[i];
            K32 = 0;//进入外部中断
        }        
    }        
}      

//初始化
void init()
 {
    EA = 1;
    EX0 = 1;//打开外部中断0
    IT0 = 0;//选中外部中断0为电平触发方式   
}
 

//外部中断
void exter0() interrupt 0
 {
    uint x,y;

    for (x =100;  x>0; x--)
        for (y = 170;  y>0; y--);
     K32 = 1;
}
posted @ 2021-09-04 01:33  六月琳  阅读(51)  评论(0)    收藏  举报