精华内容
下载资源
问答
  •  51单片机中断优先级的设置方法解析  PX0(IP.0),外部中断0优先级设定位;  PT0(IP.1),定时/计数器T0优先级设定位;  PX1(IP.2),外部中断0优先级设定位;  PT1(IP.3),定时/计数器T1优先级设定位...
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
  • MCS—51系列单片机内部只有两个外部中断源输入端,当外部中断源多于两个时,就必须进行扩展,下面介绍几种简单的扩展方法
  • 实现51单片机的外部中断,下降沿触发中断,实现中断功能。
  • 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单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;下面一起来学习一下
  • MCS—51系列单片机内部只有两个外部中断源输入端,当外部中断源多于两个时,就必须进行扩展,下面介绍几种简单的扩展方法。
  • c51中断的应用,利用外部中断0,实现单片机上灯的闪烁。
  • MCS-51单片机中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期[1]。无论是哪一种原因引起的误差,在定时的应用场合,必须...
  • 本文为大家介绍了51单片机中断函数注意事项。
  • 51单片机中断地址表

    2021-03-19 10:50:25
    51中断地址表
    展开全文
  • 51单片机中断基本概念

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

    在了解基本概念之前,先看三个问题:
    1.你想使用的中断是哪个?
    2.你所希望的触发条件是什么?
    3.你希望在中断之后做什么?
    可以边看边思考,文章最后给出答案

    中断概念
    • 为什么引入中断?

    • 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。
      中断系统特点:
      ①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率;
      ②实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增强;
      ③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高

    • 中断过程
      对于单片机来讲,中断是指CPU在处理某一时间A时,发生了另一事件B请求CPU立刻去处理(中断发生或中断请求);CPU暂时停止当前的工作(中断响应),转而去处理事件B(中断服务),待CPU处理事件B完成后,再回到原来事件A被中断的地方继续处理事件A(中断返回)。这一过程称为中断,注意是整个过程,而不是单一的停止一件事的意思。

    • 举例:你打开火,烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完开水后,你又回去继续洗衣服。这个过程中实际上就发生了一次中断。
      对照图:
      在这里插入图片描述

    • 程序流程图
      在这里插入图片描述

    单片机在执行程序时,中断也随时有可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。

    • 中断系统:实现中断过程
    • 中断源:请示CPU中断的请求源。微型机的中断系统一般允许多个中断源,当几个中断源同时向 CPU 请求中断,要求为它服务的时候,这就存在CPU 优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU 总是先响应优先级别最高的中断请求。
    • 中断嵌套:当单片机正在执行中断请求时,又出现了一个比正在执行的优先级更高的中断请求,则先停止正在执行的中断请求,执行优先级高的中断请求,等执行完后再执行原来优先级较低的中断请求。
      拥有中断嵌套的中断系统称为多级中断系统,没有嵌套功能的为单级中断系统。
    中断结构
    • 大多数单片机共提供8个中断请求源,但是一定有最基本的5个中断。
    • 中断:
      外部中断0(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。
    • 基本中断:
      INT0、INT1、定时器 0,定时器1,串口中断。
    • 中断请求标志位TCON
      在这里插入图片描述

    IT0(TCON.0),外部中断 0 触发方式控制位。
    当 IT0=0 时,为电平触发方式。
    当 IT0=1 时,为边沿触发方式(下降沿有效)。
    IE0(TCON.1),外部中断 0 中断请求标志位。
    IT1(TCON.2),外部中断 1 触发方式控制位。
    IE1(TCON.3),外部中断 1 中断请求标志位。
    TF0(TCON.5),定时/计数器 T0 溢出中断请求标志位。
    TF1(TCON.7),定时/计数器 T1 溢出中断请求标志位。
    注:外部中断0和1(IT0和IT1)为0或1时是两种触发方式,低电平触发和边沿触发,是控制位不是标志位。

    • 中断允许控制
      CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE 控制的。
      各中断的中断允许位:
      在这里插入图片描述
      EX0(IE.0),外部中断 0 允许位;
      ET0(IE.1),定时/计数器 T0 中断允许位;
      EX1(IE.2),外部中断 1允许位;
      ET1(IE.3),定时/计数器 T1 中断允许位;
      ES(IE.4),串行口中断允许位;
      EA (IE.7), CPU 中断允许(总允许)位。
      注意:总中断允许位就是是总开关一样,只有总允许位有效的前提下,其它中断置允许位才能使中断有效。
    • 中断优先级
      同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:
      在这里插入图片描述

    中断优先级三条原则:

    1. 首先响应高优先级的中断请求。
      2.高优先级的中断请求可以打断低优先级的中断。
      3.低优先级的中断请求不可以打断高优
      先级及同优先级的中断。
    • 中断号
      中断号在编程时非常重要,当中断来临时,只有中断号正确才能进入中断。
      在这里插入图片描述

    • 中断响应条件
      ①中断源有中断请求;
      ②此中断源的中断允许位为 1;
      ③CPU 开中断(总允许位)(即 EA=1)。
      以上三条同时满足时,CPU 才有可能响应中断
      如图,为中断内部结构框图:
      在这里插入图片描述
      TCON为中断请求标志,其中外部中断0和外部中断1可选择控制方式低电平有效还是下降沿有效。
      ,IE为中断允许位,可以看到,只有EA等于1时,其他中断允许才可能有效。
      从图中可以看出,一个中断过程:中断位(确定哪一个中断)->中断标志位->中断允许位->中断总允许位->中断执行功能。

    • 问题引入及解答(中断应用举例)
      回到上面的三个问题
      1.你想使用的中断是哪个?
      每一个中断都对应一个中断号,要想使用某一中断就选择对应的中断号。
      2.你所希望的触发条件是什么?
      外部中断的触发调件触发条件可分为低电平触发和下降沿触发,要明确触发条件。
      3.你希望在中断之后做什么?
      即中断服务函数,函数里要做什么,执行什么样的功能。
      以外部中断0为例:

    EA=1;//打开总中断开关
    EX0=1;//开外部中断 0
    IT0=0/1;//设置外部中断的触发方式
    
    /*中断服务函数*/
    void int0() interrupt 0 using 1//intterrupt表示中断,0表示中断号,using1可省略
    {
    //编写用户所需的功能代码
    }
    
    
    展开全文
  • 51单片机中断计数PROTEUS仿真+源程序
  • 51单片机中断设置

    2021-01-19 18:28:36
    外部中断系统框图:  这些中断请求源的中断请求标志位分别有特殊功能寄存器TCON和SCON的响应位锁存  1、TCON寄存器  与中断有关的是低四位。  1)IT0和 IT1——外中断请求触发标志位: ...
  • 51单片机中断配置

    千次阅读 2019-11-07 17:52:06
    51单片机中断配置 1.interrupt标号: interrupt0:外部中断0 interrupt1:定时器0 interrupt2:外部中断1 interrupt3:定时器1 interrupt4:串口 interrupt5:定时器2 2.寄存器配置 参考郭天祥P65页 2.1...

    51单片机中断配置




    1.interrupt标号:

    interrupt0外部中断0
    interrupt1定时器0
    interrupt2外部中断1
    interrupt3定时器1
    interrupt4串口
    interrupt5定时器2





    2.寄存器配置

    参考郭天祥P65页

    2.1中断允许寄存器IE

    位序号D7D6D5D4D3D2D1D0
    位符号EAET2ESET1EX1ET0EX0
    /*  IE  */
    sbit EA    = IE^7;
    sbit ET2   = IE^5; //8052 only
    sbit ES    = IE^4;
    sbit ET1   = IE^3;
    sbit EX1   = IE^2;
    sbit ET0   = IE^1;
    sbit EX0   = IE^0;
    

    2.2中断优先级寄存器IP

    位序号D7D6D5D4D3D2D1D0
    位符号PSPT1PX1PT0PX0
    /*  IP  */
    sbit PT2   = IP^5;
    sbit PS    = IP^4;
    sbit PT1   = IP^3;
    sbit PX1   = IP^2;
    sbit PT0   = IP^1;
    sbit PX0   = IP^0;
    

    2.3定时器&计数器——的工作方式寄存器TMOD

    位序号D7D6D5D4D3D2D1D0
    位符号GATEG/TM1M0GATEG/TM1M0
    外部控制计数/定时模式定时器1外部控制计数/定时模式定时器0
    //不能位寻址
    

    2.4定时器&计数器——控制寄存器TCON

    位序号D7D6D5D4D3D2D1D0
    位符号TF1TR1TF0TR0IE1IT1IE0IT0
    定时器1溢出定时器1运行定时器0溢出定时器0运行外部中断1标志外部中断1触发方式外部中断0标志外部中断0触发方式
    /*  TCON  */
    sbit TF1   = TCON^7;
    sbit TR1   = TCON^6;
    sbit TF0   = TCON^5;
    sbit TR0   = TCON^4;
    sbit IE1   = TCON^3;
    sbit IT1   = TCON^2;
    sbit IE0   = TCON^1;
    sbit IT0   = TCON^0;
    
    

    2.5TH0TL0

    参考宋雪松P57页
    参考郭天祥P72页

    模式1:
    16位定时器最大定时71ms左右

    定时50ms:
    (  (1/11059200)*12*(65536-X)  )  =  0.05s  
                               X = 19456 = 0x4C00  
                               
    定时50ms:
    (  (1/11.0592)*12*(65536-X)  )  =  50000us;
                              X = 19456 =  0x4C00;  
    





    3.中断程序



    3.1外部中断0

    外部中断0初始化

    
    //外部中断0初始化  
    void exter0_init(void)  
    {  
    	EA = 1;	//开总中断  
    	EX0 = 1; //开外部中断0  
    	IT0 = 0;//低电平触发  
    }  
    
    

    外部中断0触发

    
    //外部中断0  
    void exter0_code(void) interrupt 0  
    {  
    	led1 = 0;  
    }  
    
    




    3.2外部中断1

    外部中断1初始化

    
    //外部中断1初始化  
    void exter1_init(void)  
    {  
    	EA = 1;	//开总中断  
    	EX1 = 1; //开外部中断1  
    	IT1 = 0;//低电平触发  
    }  
    
    

    外部中断1触发

    
    //外部中断1  
    void exter1_code(void) interrupt 2  
    {  
    	led1 = 0;  
    }  
    
    




    3.3定时器0

    3.3.1TF0软件清零方式

    定时器0软件清零初始化

    
    //定时器0s初始化  
    void timer0s_init(void)  
    {  
    	//模式1:16位定时器最大定时71ms左右  
    	//定时50ms:((1/11059200)*12*(65536-X))=0.05s;X=19456=0x4C00;  
    	//定时50ms:((1/11.0592)*12*(65536-X))=50000us;X=19456=0x4C00;  
    	TH0 = 0x4C;  
    	TL0 = 0x00;  
    	//SFR配置算法  
    	TMOD &= ~(0xF<<0);  
    	TMOD |= 0x1<<0;  
    	//启动定时器0  
    	TR0 = 1;  
    }  
    
    

    定时器0软件清零触发

    
    while(1)  
    {
    	if(TF0==1)  
    	{  
    		TF0 = 0;  
    		TH0 = 0x4C;  
    		TL0 = 0x00;  
    		cnt++;  
    		if(cnt==50)  
    		{  
    			cnt = 0;  
    			led1 = 0;  
    		}  
    	}  
    }  
    
    
    
    3.3.2TF0硬件清零方式

    定时器0硬件清零初始化

    
    //定时器0h初始化  
    void timer0h_init(void)  
    {  
    	//开中断  
    	EA = 1;  
    	ET0 = 1;  
    	//模式1:16位定时器最大定时71ms左右  
    	//定时50ms:((1/11059200)*12*(65536-X))=0.05s;X=19456=0x4C00;  
    	//定时50ms:((1/11.0592)*12*(65536-X))=50000us;X=19456=0x4C00;  
    	TH0 = 0x4C;  
    	TL0 = 0x00;  
    	//SFR配置算法  
    	TMOD &= ~(0xF<<0);  
    	TMOD |= 0x1<<0;  
    	//启动定时器0  
    	TR0 = 1;  
    }  
    
    

    定时器0硬件清零触发

    
    //定时器0h中断  
    void timer0h_code(void) interrupt 1  
    {  
    	TH0 = 0xFC;  
    	TL0 = 0x00;  
    	led1 = 0;  
    }  
      
    





    3.4定时器1

    定时器1硬件清零初始化

    //定时器1h初始化  
    void timer1h_init(void)  
    {  
    	//开中断  
    	EA = 1;  
    	ET1 = 1;  
    	//模式1:16位定时器最大定时71ms左右  
    	//定时50ms:((1/11059200)*12*(65536-X))=0.05s;X=19456=0x4C00;  
    	//定时50ms:((1/11.0592)*12*(65536-X))=50000us;X=19456=0x4C00;  
    	TH1 = 0xFF;  
    	TL1 = 0x00;  
    	//SFR配置算法  
    	TMOD &= ~(0xF<<4);  
    	TMOD |= 0x1<<4;  
    	//启动定时器0  
    	TR1 = 1;  
    }  
    

    定时器1硬件清零触发

    
    //定时器1h中断  
    void timer1h_code(void) interrupt 3  
    {  
    	TH0 = 0xFC;  
    	TL0 = 0x00;  
    	led1 = 0;  
    }  
    
    
    展开全文
  • 51单片机中断详解

    千次阅读 多人点赞 2019-06-03 14:37:17
    51单片机中断级别 中断源 默认中断级别 序号(C语言用) INT0---外部中断0 最高 0 T0---定时器/计数器0中断 第2 1 INT1---外部中断1 第3 2 ...
  • 大家都知道51单片机有的寄存器R0-R7共有四组。很多朋友对寄存器组的使用时经常出现问题。虽然这并不是多难的问题,但如果出现错误,也会造成很严重的后果。
  • 51单片机中断系统

    万次阅读 多人点赞 2018-12-11 20:04:08
    中断定义  CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续...
  • 51单片机中断嵌套,定时器延时前言一、如何做到定时器延时?二、如何做到外部中断?三、如何合并1.引入库2.读入数据总结 前言 这里讲的是中断嵌套,具体的话是用定时器延时,外部中断触发,不断切换 提示:以下是...
  • AT89X51单片机中断嵌套程序,定时器1与外部中断0相互嵌套
  • 51单片机中断系统实验

    千次阅读 2020-11-20 15:28:51
    51单片机中断系统实验 一、实验内容 INT0端接单次脉冲发生器。按一次脉冲产生一次中断,CPU使P1.0状态发生一次反转,P1.0接LED灯,以查看信号反转。 根据实验内容编写一个程序,并在实验系统上调试和验证。 二、仿真...
  • 51单片机汇编课程PPTMCS-51单片机中断系统.ppt
  • 本文主要介绍了关于MCS-51单片机中断函数的几点注意事项,希望对你的学习有所帮助。
  • 51单片机 中断与定时器

    千次阅读 2020-06-23 11:45:27
    51单片机,拥有两个定时器,用来中断计数,分别是T0和T1。而52单片机和51单片机的定时器是一样的,只是52比51多了一个定时器/计数器T2,它们的设置都大同小异 定时器T0与T1不同之处在于它们的工作方式3不同,方式0...
  • 51单片机中断相关寄存器

    千次阅读 多人点赞 2018-12-31 15:52:58
    52单片机中断级别 中断允许寄存器IE EA——全局中断 ES——串口中断 ET2——定时器2中断 EX1——外部中断1 ET1——定时器1 中断 EX0——外部中断0 中断优先级寄存器IP PS——串口 PT——计时器 PX...
  • 51单片机中断系统的原理和运用

    千次阅读 2020-05-02 23:31:00
    QX-MCS51开发板上使用的是DIP封装(双列直插式)有40只引脚! 40只引脚按其功能来分,有三类 一、电源和时钟引脚:Vcc、Vss;XTAL1、XTAL2 **电源引脚接入单片机工作电源** Vcc(40脚):接+5V电源; Vss ( 20脚 ) ...
  • 51单片机按键中断

    2018-04-28 01:39:32
    51单片机按键中断代码,初始化:边沿触发方式下降沿,打开总的中断
  • 基于51单片机用汇编语言写的定时器中断功能,编译通过,可以参考下
  • 已知单片机的 P0 口接了一位七段数码管,当无外部中断(外部中断 0)时,数码 管按 a~g 段依次点亮,不断循环显示;当有外部中断(按钮被按下,P3.2 有下降沿电 压)时,数码管显示状态改为“8”亮灭闪烁显示,亮灭...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,904
精华内容 7,961
关键字:

51单片机中断