精华内容
下载资源
问答
  • 51单片机中断响应

    2020-11-26 17:17:44
    51单片机中断响应 每条指令结束后,都自动检测是否有中断请求,如果有,且允许中断,则响应中断。 硬件把优先级状态标志置1 硬件把PC入栈 硬件清楚中断请求标志 如果需要,软件保护现场(寄存器内容入栈) 硬件调用...

    51单片机中断响应

    中断概念

    在这里插入图片描述# 响应过程

    1. 每条指令结束后,都自动检测是否有中断请求,如果有,且允许中断,则响应中断。
    2. 硬件把优先级状态标志置1
    3. 硬件把PC入栈
    4. 硬件清楚中断请求标志
    5. 如果需要,软件保护现场(寄存器内容入栈)
    6. 硬件调用中断向量,进入中断服务
    7. 软件恢复现场(栈内容弹出到寄存器)
    8. 中断返回(端点地址弹回到PC中)
    展开全文
  • MCS-51单片机中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期[1]。无论是哪一种原因引起的误差,在定时的应用场合,必须...
  • 请问当两个同级别的中断向CPU提出申请的时候,CPU如何决断处理的先后?
  • 51单片机中断响应原理

    千次阅读 2019-11-12 11:26:35
    CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。。 2.中断系统结构 3.中断允许控制 ...

    1.中断概念

    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);
    CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
    待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。

    2.中断系统结构

    引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统。

    89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。

    • (P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
    • (P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
    •  TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
    •  TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
    •  RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。

    3.中断允许控制寄存器---IE

    CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的

    • EX0(IE.0),外部中断0允许位;
    • ET0(IE.1),定时/计数器T0中断允许位;
    • EX1(IE.2),外部中断0允许位;
    • ET1(IE.3),定时/计数器T1中断允许位;
    • ES(IE.4),串行口中断允许位;
    • EA (IE.7), CPU中断允许(总允许)位。

    4.定时器控制寄存器---TCON

    TCON的中断标志:中断标志位就是提供给用户查询的事件及区分中断事件

    • 51串口中断接受与发送时同一个中断入口,需要串口中断标记位RI与TI区分时发送中断还是接收中断。
    • 当中断不开启,而使用查询方式,这就可以使用中断标记位进行判断是否有相关事件发生。
    • 当开启中断时,每执行一条汇编指令系统会根据这个标志位进行是否进入中断处理。

    通俗的讲:中断标志置1的话,cpu会记录这个中断标志位,然后进入中断处理

    • TR0(TR1)——定时器运行控制位

                       当TR0(TR1)=0  停止定时器/计数器工作

                       当TR0(TR1)=1  启动定时器/计数器工作

    • IE0(IE1)——外中断请求标志位

                      当CPU采样到P3.2(P3.3)出现有效中断请求时,此位由硬件置1。在中断响应完成后转向中断服务时,再由硬件自动清0。

    • IT0(IT1)——外中断请求信号方式控制位

                       当IT0(IT1)=1 脉冲方式(后沿负跳有效)

                       当IT0(IT1)=0 电平方式(低电平有效)此位由软件置1或清0。

    • TF0(TF1)——计数溢出标志位

                      当计数器产生计数溢出时,此位由硬件置1。当转向中断服务时,再有硬件自动清0。计数溢出的标志位的使用有两种情况:采用中断方式时,作中断请求标志位  来使用;采用查询方式时,作查询状态位来使用。

    5.中断优先级寄存器--IP

    IP 这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复位值都是 0,当把某一位设置为 1 的时候,这一位的优先级就比其它位的优先级高了。

    • 抢占优先级

    比如设置了 PT0位为 1 后,当单片机在主循环或者任何其它中断程序中执行时,一旦定时器 T0 发生中断,作为更高的优先级,程序马上就会跑到 T0 的中断程序中来执行。

    反过来,当单片机正在 T0中断程序中执行时,如果有其它中断发生了,还是会继续执行 T0 中断程序,直到把 T0 中的中断程序执行完毕以后,才会去执行其它中断程序。

    当进入低优先级中断中执行时,如又发生了高优先级的中断,则立刻进入高优先级中断执行,处理完高优先级级中断后,再返回处理低优先级中断,这个过程就叫做中断嵌套,也称为抢占

    所以抢占优先级的概念就是,优先级高的中断可以打断优先级低的中断的执行,从而形成嵌套。当然反过来,优先级低的中断是不能打断优先级高的中断的。

    • 固有优先级

    那么既然有抢占优先级,自然就也有非抢占优先级了,也称为固有优先级。在下图的最后一列给出的就是固有优先级,请注意,在中断优先级的编号中,一般都是数字越小优先级越高。

    从表中可以看到一共有 1~6 共 6 级的优先级,这里的优先级与抢占优先级的一个不同点就是,它不具有抢占的特性,也就是说即使在低优先级中断执行过程中又发生了高优先级的中断,那么这个高优先级的中断也只能等到低优先级中断执行完后才能得到响应。既然不能抢占,那么这个优先级有什么用呢?

    答案是多个中断同时存在时的仲裁。比如说有多个中断同时发生了,当然实际上发生这种情况的概率很低,但另外一种情况就常见的多了,那就是出于某种原因我们暂时关闭了总中断,即 EA=0。执行完一段代码后又重新使能了总中断,即 EA=1。那么在这段时间里就很可能有多个中断都发生了,但因为总中断是关闭的,所以它们当时都得不到响应,而当总中断再次使能后,它们就会在同时请求响应了,很明显,这时也必需有个先后顺序才行,这就是非抢占优先级的作用了——如表中,谁优先级最高先响应谁,然后按编号排队,依次得到响应。

    6.定时器模式寄存器---TMOD

    工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。

    • GATE是门控位

               GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;

               GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。

    • C/T :定时/计数模式选择位

              C/T =0为定时模式;

              C/T =1为计数模式。

    •  M1M0:工作方式设置位

             定时/计数器有四种工作方式

    7.中断源

    记住区分中断号

    7.中断响应条件

    • 中断源有中断请求;
    •  此中断源的中断允许位为1;
    •  CPU开中断(即EA=1)。

    8.举例说明(外部中断0):

    #include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器

    typedef unsigned int u16;      //对数据类型进行声明定义
    typedef unsigned char u8;

    sbit k3=P3^2;  //定义按键K3
    sbit led=P2^0;     //定义P20口是led

    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能           : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
        while(i--);    
    }

    /*******************************************************************************
    * 函 数 名         : Int1Init()
    * 函数功能           : 设置外部中断1
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void Int0Init()
    {
        //设置INT0
        IT0=1;//跳变沿出发方式(下降沿)---中断请求
        EX0=1;//打开INT0的中断允许。     ---外部中断允许
        EA=1;//打开总中断                         ----总中断
    }
    void main()
    {    
        Int0Init();  //    设置外部中断0
        while(1);        
    }

    /*******************************************************************************
    * 函 数 名         : Int0()    interrupt 0
    * 函数功能           : 外部中断0的中断函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/

    void Int0()    interrupt 0        //外部中断0的中断函数 ;0为外部中断0的中断号
    {
        delay(1000);     //延时消抖
        if(k3==0)
        {
            led=~led;
        }
    }

    9.举例说明(定时器1实验 )

    **************************************************************************************
    *                      定时器1实验                                                  *
    实现现象:下载程序后数码管最后一位间隔一秒循环显示0-F。使用单片机内部定时器可以实现准确延时。
    注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                  
    ***************************************************************************************/

    #include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器

    typedef unsigned int u16;      //对数据类型进行声明定义
    typedef unsigned char u8;

    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;

    u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
    u8 n=0;
    /*******************************************************************************
    * 函 数 名         : Timer1Init
    * 函数功能           : 定时器1初始化
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void Timer1Init()
    {
        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

    //0x10=0001 0000,所以是T1模式,工作方式1

        TH1=0XFC;    //给定时器赋初值,定时1ms  (65536-1000=64536)
        TL1=0X18;    
        ET1=1;//打开定时器1中断允许
        EA=1;//打开总中断
        TR1=1;//打开定时器            
    }

    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能         : 主函数
    * 输    入       : 无
    * 输    出         : 无
    *******************************************************************************/
    void main()
    {    
        LSA=0;
        LSB=0;
        LSC=0;
        Timer1Init();  //定时器1初始化
        while(1);        
    }

    /*******************************************************************************
    * 函 数 名         : void Timer1() interrupt 3
    * 函数功能           : 定时器0中断函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void Timer1() interrupt 3
    {
        static u16 i;
        TH1=0XFC;    //给定时器赋初值,定时1ms
        TL1=0X18;
        i++;
        if(i==1000)
        {
            i=0;
            P0=smgduan[n++];
            if(n==16)n=0;    
        }    
    }

     

     

    展开全文
  • MCS51单片机系列属于8位单片机,它是Intel公司继MCS48系列的成功设计之后,于1980年推出的产品。由于MCS51系列具有很强的片内功能和指令系统,因而使单片机的应用发生了一个飞跃,这个系列的产品也很快成为世界上第...
  • 51单片机中断

    2021-10-02 18:09:52
    51单片机中断机制 单片机的中断简介 52单片机一个有6个中断源,它们的符合,名称以及触发方式如下:

    51单片机中断

    单片机的中断简介
    52单片机一个有6个中断源,它们的符号,名称以及触发方式如下:

    中断源默认中断优先级序号(C语言)入口地址(汇编)
    外部中断0(INT0)最高00003H
    定时器/计数器T0中断第21000BH
    外部中断1(INT1)第320013H
    定时器/计数器T1中断第43001BH
    串口中断第540023H
    定时器/计数器T1中断最低5002BH

    中断相关寄存器

    IE寄存器

    bitB7B6B5B4B3B2B1B0
    nameEA-ET2ESET1EX1ET0EX0

    EA:CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
    (EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制)
    ET2:定时/计数器T2的溢出中断允许位。ET2=1,允许T2中断:ET2=0,禁止T2中断。
    ES ∶串行口1中断允许位。ES=1,允许串行口1中断;ES=0,禁止串行口1中断。
    ET1∶定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。
    EX1:外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。
    ET0 :T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0禁止T0中断。
    EX0:外部中断0中断允许位。EX0=1,允许中断:EX0=0禁止中断。

    IP寄存器

    bitB7B6B5B4B3B2B1B0
    name--PT2PSPT1PX1PT0PX0

    PX0:外部中断0优先级设定位。PX0=1设置外部中断0为高优先级;PX0=0设置外部中断0为低优先级。

    PT0:定时/计数器T0优先级设定位。PT0=1设置定时/计数器T0为高优先级;PT0=0设置定时/计数器T0为低优先级。

    PX1:外部中断1优先级设定位。PX1=1设置外部中断1为高优先级;PX1=0设置外部中断1为低优先级。

    PT1:定时/计数器T1优先级设定位。PT1=1设置定时/计数器T0为高优先级;PT1=0设置定时/计数器T1为低优先级。

    PS :串行口优先级设定位。PS=1设置串行口为高优先级;PS=0设置串行口为低优先级。

    PT2:定时/计数器T2优先级设定位。PT2=1设置定时/计数器T2为高优先级;PT2=0设置定时/计数器T2为低优先级。

    TCON寄存器

    bitB7B6B5B4B3B2B1B0
    nameTF1TR1TF0TR0IE1IT1IE0IT0

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

    定时器中断

    51单片机内部有两个16位可编程的定时计数器,而52单片机有三个定时计数器相比于51单片机内部多了一个T2定时计数器。
    单片机里面的定时器和计数器其实是同一个元器件,只是他们的脉冲来源不同,计数器记录的是单片机外部发生的事件(指外部事件触发时引起的外部脉冲),而定时器则时由单片机自身提供或外部焊接的晶振电路提供的一个频率非常稳定的脉冲;如:51单片机的晶振经过12分频之后共给单片机的只有1MHZ稳定脉冲;12MHZ/12=1MHZ=1000000次/秒=1000000条指令/秒=1000000次/1000000微秒=1次/微秒=1条指令/微秒;也就是说,晶振振荡一次,就会给单片机提供一个时钟脉冲,花费的时间是1微秒,此时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微秒=1条指令。
    在这里插入图片描述

    TMOD:定时计数器工作方式设置寄存器

    [外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imblog.csdnimg.czS5Q62bb34163723444dba1eba77987dc3.png0)(https://img-blog.csdnimg1.cn/62bb3416372344479a8dba1eba797dc3.png)]

    由上图可知,TMOD的高四位是设置定时计数1的,低四位是设置定时计数0的。
    GATE————门控制位。
    GATE=0,定时器/计数器启动与停止仅受TCON寄存器中TRX (X=0,1)来控制。
    GATE=1,定时器/计数器启动与停止由TCON寄存器中TRX (X=0,1)和外部中断引脚( INTO或INT1)上的电平状态来共同控制。
    C/T————定时器模式和计数器模式选择位。
    C/T=1,为计数器模式;
    C/T=0,为定时器模式。
    M1M2————工作方式选择位
    在这里插入图片描述

    计算定时器初值

    晶振 :12MHZ
    时钟周期 :1/12MHZ(单位秒)
    机器周期 : 51单片机经过12分频,12/12MHZ=1us
    因为定时器是每个机器周期加1所以定时器加N次之后产生溢出中断的时间就是N微妙。
    我们现在选择定时器的工作模式为方式1,16位定时计数器能设定的最大值位65536
    初值 = 65536 - N (N为你想要定时的时间)
    例如 :
    需要定时的时间为50ms = 0.05s =50000us N的值就等于50000
    65536-50000=15536=0x3CB0

    				    TL0 = 0xB0;		//设置定时初值 
    				 	TH0 = 0x3C;		//设置定时初值
    

    除了手算我们还有更简单的方法比如用 stc-isp-15xx-v6.87F.exe软件里面可以自动生产定时器代码(提取码:zxcv)
    链接:https://pan.baidu.com/s/1TrgDcdIowktFhDYOEhwEMw
    提取码:zxcv
    在这里插入图片描述
    :系统频率选择 12MHZ
    :时间长度 50ms
    :选择定时器0
    :定时器模式选择16位(16位没有自动重载,因为不会自动重载所以在每次发生溢出中断后我们都要给TL0,TH0重新赋值)
    :定时器时钟选择12T
    :AUXR寄存器我们在51单片机中用不到直接注释就可以

    中断服务程序写法

    C51中断函数格式:

    void 函数名()interrupt 中断号 using 工作组
    		{
    			中断服务程序内容
    		}
    
    #include<reg51.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    
    sbit led = P0^0;
    uchar num = 0;
    void Timer0Init(void)		//50毫秒@12.000MHz
    {
    //	AUXR &= 0x7F;		//定时器时钟12T模式
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x01;		//设置定时器模式
    	TL0 = 0xB0;		//设置定时初值
    	TH0 = 0x3C;		//设置定时初值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    	EA = 1;         // 开总中断
        ET0 = 1;        // 开定时器0中断
    }
    
    //主程序
    void main()
    {
    	Timer0Init();  //定时器0初始化
        while(1)
        {
            if (num >= 20)//定时1s    50ms * 20 = 1000ms = 1s
            {
                num = 0;
                led = ~led;//led等一秒翻转一次
            }
        }
    }
    
    
    void T0_time() interrupt 1
    {
    	TL0 = 0xB0;		//设置定时初值
    	TH0 = 0x3C;		//设置定时初值
        num++;
    }
    
    展开全文
  • 51单片机中断

    千次阅读 多人点赞 2021-01-27 23:59:10
    51单片机中断51单片机中断原理中断的概念:中断作用中断源及相关寄存器中断源及优先级定时器/计数器控制寄存器 TCON中断允许寄存器 IE中断优先寄存器 IP工作方式寄存器TMOD定时器初值寄存器THx 和 TLx计数器初值的...

    51单片机中断原理

    中断的概念:

    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。(中断的返回)。
    在这里插入图片描述

    中断作用

    随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与I/O设备的数据传送问题,而且还有具有如下的优点:

    1. 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。
    2. 实时操作:CPU能够及时处理应用系统的随机事件,系统的实时性大大增强。
    3. 可靠性高:CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性更高。

    中断源及相关寄存器

    中断源及优先级
    中断源符号名称中断标志中断引起原因中断号优先级
    /INT0外部中断0IE0低电平或下降沿信号0最高
    T0定时器中断0TF0定时/计数器0 计数回0溢出1
    /INT1外部中断1IE1定电平或下降沿信号2
    T1定时器中断1TF1定时/计数器1 计数回0溢出3
    TX/RX串行口中断TI/RI串行通信完成一帧数据发送或接收4最低
    定时器/计数器控制寄存器 TCON
    D7D6D5D4D3D2D1D0
    功能TF1TR1TF0TR0IE1IT1IE0IT0

    TF0、 TF1: 是定时器中断标志(定时器0溢出标志位、定时器1溢出标志位)
    TR0 、TR1: 打开相应的定时器(定时器0运行控制位,=1时启动定时器0、定时器1运行控制位,=1时启动定时器1)
    由软件清0关闭定时器0/1。当GATE=1,且INIT为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器0/1。
    IT0、IT1: 是外部中断的触发方式。 =0时 低电平触发,=1时负跳变触发。
    IE0、IE1: 是外部中断的标志位

    中断允许寄存器 IE
    D7D6D5D4D3D2D1D0
    功能EA————ESET1EX1ET0EX0

    EA: 总中断允许。 EA=0;CPU屏蔽所有中断的请求 EA=1;开放所有中断。
    ES:串行口中断允许位。ES=0; 禁止串行中断。ES=1; 允许串口中断。
    ET0、ET1: 定时器/计数器0 和 定时器/计数器 1 中断允许位 =0时 禁止相应的定时器中断。 =1 允许相应的定时器中断
    EX0、EX1: 外部中断0 和 外部中断 1 中断允许位。=0时 禁止相应的外部中断。 =1时 允许相应的外部中断。
    ——:无效位

    中断优先寄存器 IP
    D7D6D5D4D3D2D1D0
    功能——————PSPT1PX1PT0PX0

    PS: 串行口中断优先级 PS = 1;(高) 。PS = 0; (低)。
    PT0:定时器0中断优先级 PT0 = 1;(高) PT0 = 0;(低)。
    PT1:定时器1中断优先级 PT1 = 1;(高) PT1 = 0;(低)。
    PX0:外部中断0中断优先级 PX0 = 1;(高) PX0 = 0;(低)。
    PX1:外部中断1中断优先级 PX1 = 1;(高) PX1 = 0;(低)。
    ——:无效位

    IP寄存器不做设置,上电复位后为00H,默认是为低优先级
    不设置默认优先级是(由高到低):
    外部中断0→定时器0→外部中断1→定时器1→串口

    如果我们把IP寄存器设置为:(IP = 0X10)
    PS = 1;
    PT1 = 0;
    PX1 = 0;
    PT0 = 0;
    PX0 = 0;
    如下表:

    D7D6D5D4D3D2D1D0
    功能——————10000

    那么优先级从高到低是:
    串口→外部中断0→定时器0→外部中断1→定时器1

    工作方式寄存器TMOD
    D7D6D5D4D3D2D1D0
    功能GATEC/TM1M0GATEC/TM1M0

    在这里插入图片描述
    GATE:门控制
    =0:仅有运行控制位TRx来控制定时/计数器的开启。
    =1:由TRx和外部中断脉冲计数。(用于计算外部中断 负跳变 的次数)
    C/T:计数器模式和定时器模式选择
    =0:选择定时器模式
    =1:选择计数器模式
    M1、M0:选择定时/计数器的工作方式

    M1M0工作方式
    00方式0:为13位定时/计数器
    01方式1:为16位定时/计数器
    10方式2:为8位初值自动重装定时/计数器
    11方式3:仅适用于T0,分成两个8位计数器,T1停止计数。

    方式0
    方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
    在这里插入图片描述
    方式1
    方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。
    在这里插入图片描述
    方式2
    方式2为自动重装初值的8位计数方式。
    在这里插入图片描述
    方式3
    方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
    在这里插入图片描述

    定时器初值寄存器THx 和 TLx

    首先先了解一下CPU时序有关知识:
    振荡周期: 为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)
    状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。
    机器周期:1个机器周期含6个状态周期,12个振荡周期。
    指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。

    例如:外接晶振为12MHz时,51单片机相关周期的具体值为:
    振荡周期=1/12us;
    状态周期=1/6us;
    机器周期=1us;
    指令周期=1~4us;

    计数器初值的计算:

    机器周期就是CPU完成一个基本操作所需要得时间。
    机器周期 = 1 /单片机的时钟频率
    51单片机内部时钟频率是外部时钟的12分频,也就是当外部晶振的频率输入到单片机里面
    的时候要进行12分频。

    比如:你用的是12MHZ的晶振,当你使用12MHZ的外部晶振的时候,
    机器周期 = 1 / 1M = 1us。
    (选择定时器工作方式1 16位)
    我们2的16次方等于65536,也就是最大值为65536(溢出)
    如果定时1ms
    初值就为:1ms / 1us = 1000。也就是要计数1000个数, 初值 = 65535-1000+1 = 64536,65536才会溢出。 所以初值即FC18H(十进制为64536)

    如果定时50ms
    50ms/1us=50000;
    初值 = 65535-50000+1=15536;
    定时为50ms 初值为15536 即3CB0(十六进制)

    对于每个不同的方式计算初值数有公式去计算的,但是我不会哈哈,我是用一个软件来计算的,软件名字 mcuelf这样也比较快
    在这里插入图片描述

    外部中断

    操作步骤(INT0 INT1)

    1 设置 外部中断中断源号及触发方式。设置IT0或IT1(TCON寄存器)
    2 打开相应的外部中断允许。设置EX0或EX1(IE寄存器)
    3 打开总中断。设置EA(IE寄存器)

    如何配置外部中断

    这里就用外部中断0开示例吧

    //配置外部中断0
    void initInterrupt0()
    {
    	IT0 = 1; //触发方式为负跳变触发
    	EX0 = 1; //打开外部中断0允许
    	EA  = 1; //总中断打开
    }
    

    中断服务函数(发生中断你想做什么?)

    无返回值 函数名(随意起) interrupt 中断号
    void interrupt0ServiceFun() interrupt 0
    {
    	//编写你要做的事情
    }
    

    外部中断1也是差不多的,这里就不写了。

    程序示例

    实现按键按下开灯/关灯

    #include "reg52.h"
    
    typedef unsigned char u8;
    typedef unsigned int u16; 
    typedef unsigned long int u32;
    						   
    
    sbit KEY = P3^2; //定义中断按键引脚  
    sbit LED = P2^0; //定义LED1引脚
    
    //配置中断0
    void initInterrupt0()
    {
    	EX0 = 1;
    	IT0 = 1;
    	EA  = 1;
    }
    //延时函数
    void delay(u8 i)
    {
    	while(i--);
    }
    void main()
    {
    
    	initInterrupt0();	//调用中断
    	while(1);
    
    }
    
    //发生中断执行函数
    void interruptHandler() interrupt 0
    {
    	delay(12000);  //延迟 因为当进入外部中断函数的时候按键时已经按下了这里是消抖作用
    	if(KEY == 0)	//再次确认是否真的按键被按下
    	{
    		LED = ~LED;	   //开灯/关灯
    	}
    }
    

    定时器/计数器中断

    需要了解的知识

    51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。

    定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。

    51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。

    有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。

    工作原理

    实质上是加1计数器,随着输入脉冲,计数器自动加1,
    溢出的时候会回0.,且计数器的溢出使相应的中断标志位 置1.
    向CPU发出中断请求。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
    可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

    定时器结构

    定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
    在这里插入图片描述

    操作步骤(T0 T1)

    1.选择工作方式。设置M1、M0 (TMOD寄存器)
    2.选择控制方式。设置GATE(TMOD寄存器)
    3.选择定时器还是计数器模式。设置C/T(TMOD寄存器)
    4.给定时/计数器赋初值。设置THx 和 TLx(定时器初值寄存器)
    5.开启总中断。设置EA(IE寄存器)
    6.打开相应定时器中断允许。 设置ET0或ET1(IE寄存器)
    7.启动定时器。设置TR1或TR0(TCON寄存器)

    如何配置定时器

    这里就选择定时器0吧 选择方式1(16位)进行定时示例吧
    1.选择工作方式1(16位)M1=0;M0=1;
    2.控制方式 :仅有运行控制位TRx来控制定时/计数器的开启。GATE=0;
    3.选择定时器模式 C/T=0;

    TMOD=0x01;
    

    4.赋初值 这里选择定时为50ms 我的板子晶振是11.0592 具体怎么算我不会,推荐跟我一样不会的用软件mcuelf计算出以下结果
    在这里插入图片描述

        TH0 = 0x4C;
        TL0 = 0x00;
    

    5.打开总中断(总开关)

    EA=1;
    

    6.打开T0中断开关

    ET0=1;
    

    7.启动定时器0

    TR0=1;
    
    //配置定时器函数
    void time0Config()
    {
    	TMOD=0x01; //设定T0定时器,选择工作方式1(16位),定时器模式 仅有运行控制位TRx来控制定时/计数器的开启。
    	TH0 = 0x4C;  //初值设定
    	TL0 = 0x00;	 //初值设定
    	EA=1;        //打开总中断开关
    	ET0=1;		 //打开T0中断开关
    	TR0=1;		 //启动定时器0
    }
    
    
    //发生中断执行函数(这样就是50ms)
    void time0() interrupt 1   //T0中断号为1
    {
    	/*要注意这里不会自动重装,所以要再次设置回初值(除工作方式2)*/
    	TH0 = 0x4C;  //初值重新设定
    	TL0 = 0x00;	 //初值重新设定
    	
    	//编写你要做的事
    }
    

    程序示例

    这里就写一个用定时器来做一个简单的时钟显示在LCD1602上
    LCD1602我昨天发布了一个LCD1602的使用和显示hello word。这里就是详细讲LCD1602具体的操作了。

    引脚定义

    //引脚定义
    #define LCD P0
    sbit E = P2^7;   //使能
    sbit RS = P2^6;  //数据/命令(H/L)
    sbit RW = P2^5; //读写(H/L)
    
    

    lcd1602.h

    void write_com(unsigned char command);	//写命令函数
    void write_data(unsigned char dat);		//写数据函数
    void init_lcd();  //初始化LCD1602函数
    void delay5ms();  //延时5ms函数	
    

    lcd1602.c

    #include <reg52.h>
    #include "lcd1602.h"
    
    #define LCD P0
    sbit E = P2^7; 
    sbit RS = P2^6;
    sbit RW = P2^5;
    
    /******延迟5毫秒函数********/
    void delay5ms()   //误差 -0.000000000001us
    {
        unsigned char a,b;
        for(b=15;b>0;b--)
            for(a=152;a>0;a--);
    }
    
    
    /******LCD1602写命令函数********/
    void write_com(unsigned char command)
    {
    	RS = 0; 
    	RW = 0; 	//高读低写
    	LCD = command;
    	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
    	E = 1;		//使能拉高 
    	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
    	E = 0;
    }
    
    /******LCD1602写数据函数********/
    void write_data(unsigned char dat)
    {
    	RS = 1;
    	RW = 0;
    	LCD = dat;
    	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
    	E = 1;		//使能拉高 
    	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
    	E = 0;
    }
    /******初始化LCD1602********/
    void init_lcd()
    {	
    	write_com(0x06); //写入数据后光标自动右移 整屏不移动。
    	write_com(0x0c); //开显示功能 无光标 不闪烁
    	write_com(0x38); //数据总线8位 16X2显示 5*7点阵
    	write_com(0x01); //清屏 0000 0001
    }
    

    main.c

    #include <reg52.h>
    #include "lcd1602.h"
    
    unsigned char t = 0; //用来计数时间
    unsigned char i=0;
    unsigned char hours = 23;  //小时
    unsigned char minutes = 59; //分钟
    unsigned char seconds = 0; //秒
    
    unsigned char date[16] = {"2021-01-27   WED"};
    unsigned char time[5] = {"time:"};
    
    //配置定时器函数
    void time0Config()
    {
    	TMOD=0x01; //设定T0定时器,选择工作方式1(16位),定时器模式 仅有运行控制位TRx来控制定时/计数器的开启。
    	TH0 = 0x4C;  //初值设定
    	TL0 = 0x00;	 //初值设定
    	EA=1;        //打开总中断开关
    	ET0=1;		 //打开T0中断开关
    	TR0=1;		 //启动定时器0
    }
    
    void main()
    {	
    	init_lcd();	 //1.初始化lcd1602
    	
    	write_com(0x80); //设置显示日期位置 (第一行第一个开始)
    	for(i=0;i<16;i++)
    	{
    		write_data(date[i]);	
    	}
    	
    	write_com(0xc0); //设置显示time:位置(第二行第一个开始)
    	for(i=0;i<5;i++)  
    	{
    		write_data(time[i]);		
    	}
    	
    	time0Config();//调用定时器中断
    
    	while(1)
    	{
    		write_com(0xc6); 	//设置显示小时的十位 位置
    		write_data(hours/10+'0');	//小时十位
    		write_com(0xc7); 	//设置显示小时的个位 位置
    		write_data(hours%10+'0');	//小时个位
    	
    		write_com(0xc8); //设置显示: 位置
    		write_data(':');			//显示 :
    	
    		write_com(0xc9); 	//设置显示分钟的十位 位置
    		write_data(minutes/10+'0');	//分钟十位
    		write_com(0xca); 	//设置显示分钟的个位 位置
    		write_data(minutes%10+'0');	//分值个位
    	
    		write_com(0xcb); 	//设置显示: 位置
    		write_data(':');			//显示 :
    	
    		write_com(0xcc); 	//设置显示秒的十位 位置
    		write_data(seconds/10+'0');	//秒十位
    		write_com(0xcd); 	//设置显示秒的 个位 位置
    		write_data(seconds%10+'0');	//秒个位
    						
    	}
    }
    
    //发生中断执行函数(一次就是50ms)
    void time0() interrupt 1   //T0中断号为1
    {
    	/*要注意这里不会自动重装,所以要再次设置回初值(除工作方式2)*/
    	
    	TH0 = 0x4C;  //初值重新设定
    	TL0 = 0x00;	 //初值重新设定	
    	t++;
    	if(t == 20) //证明够1秒了 20 X 50ms = 1000ms = 1s
    	{
    		seconds++;	//秒+1
    		t=0;   //够了1秒设置为0 重新计数
    	}
    	if(seconds == 60) //如果秒到60
    	{
    		minutes++;   //分钟+1
    		seconds = 0; //秒回0
    	}
    	if(minutes == 60) //如果分钟到60
    	{
    		hours++;     //小时+1
    		minutes = 0; //分钟回0
    	}
    	if(hours == 24 ) //如果小时到24
    	{
    		hours = 0;   //小时回0
    	}
    	
    }
    

    最终项目展示

    在这里插入图片描述

    展开全文
  • 51单片机中断设置

    2021-01-19 18:28:36
    外部中断系统框图:  这些中断请求源的中断请求标志位...  1——表示有中断请求,CPU要响应中断请求,跳向中断服务程序,按优先级处理中断程序,跳入中断服务程序时,由硬件清0;  0——表示没有中断
  • 51单片机中断系统

    万次阅读 多人点赞 2018-12-11 20:04:08
    CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。    引起CPU中断的根源,称为中断源。...
  • MCS51单片机系列属于8位单片机,它是Intel公司继MCS48系列的成功设计之后,于1980年推出的产品。由于MCS51系列具有很强的片内功能和指令系统,因而使单片机的应用发生了一个飞跃,这个系列的产品也很快成为世界上第...
  • 中断响应过程 要求  掌握: 中断控制的专用寄存器 中断响应过程  了解: 中断的概念 单片机的单步执行方式 5.1 中断的基本概念 5.2 MCS-51 单片机的中断系统 5.3 中断系统的应用举例
  • 51单片机中断学习

    2020-01-21 10:28:24
    CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 二、中断源 在51单片机中有5个中断源 中断号 ...
  • 51单片机中断详解

    千次阅读 多人点赞 2019-06-03 14:37:17
    51单片机中断级别 中断源 默认中断级别 序号(C语言用) INT0---外部中断0 最高 0 T0---定时器/计数器0中断 第2 1 INT1---外部中断1 第3 2 ...
  • 微机原理与接口技术 第6章 MCS-51中断系统 第一节 中断系统概述 二中断源 三中断的分类 四中断嵌套 五中断系统功能 软件排队流程图示例 中断系统功能... 对中断优先级的控制 三MCS-51对中断的响应 二中断响应过程 四MC
  • Q1:请教高人C51单片机C语言中的中断优先级怎么设置?C51中设置中断优先级,需要对中断寄存器IP进行配置。具体值需要根据用户需要的优先级顺序进行确定,具体的设置方法就是直接写如下C语言语句:IP = 06H;// 如果5...
  • 51单片机 中断

    2013-10-30 16:11:20
     CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);  待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断   二、中断源  在51单片机中有...
  • 估计也困扰了许多小伙伴很久,今天以我的角度重新给大家说一下关于51单片机中断。 定义 中断的意思很简单,以一个生活中的例子来说: 我在洗衣服,洗衣服可以认为是一个程序在运行中,这时候突然有人打来电话,...
  • 51单片机中断基本概念

    千次阅读 多人点赞 2020-07-31 10:11:47
    中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。 中断系统特点: ①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,977
精华内容 1,590
关键字:

51单片机中断响应过程