单片机外部中断程序代码_52单片机外部中断代码 - CSDN
  • 寄存器是干什么的?怎么配置它?配置完寄存器后,有什么作用呢? 寄存器是中央处理器内的组成部分。它是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。寄存器可以用来暂存指令、暂存数据、暂存地址...

    寄存器是干什么的?怎么配置它?配置完寄存器后,有什么作用呢?
    寄存器是中央处理器内的组成部分。它是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。寄存器可以用来暂存指令、暂存数据、暂存地址。换而言之,我们配置寄存器,便是给寄存器中赋予一定的值,而这些值又要与我们的目的想对应,这样它便会有相应的作用。
    例如,芯片的资料规定,当给芯片的 A 寄存器赋“0x11”时,它会出现 B 现象;赋“0x77”时,它会出现 C 现象。那么当我们目的是完成 B 现象时,我们就只需要配置 A 寄存器为“0x11”即可。
    虽说看起来很简单,并且去完成目的时的流程并非这么容易。但是,实实在在而言,这些就是控制寄存器的根本!
    这里以外部中断0(INT0)为例,使得外部中断0每发生一次,最后一位数码管的数值加1。
    前一篇博文已经提到,要实现外部中断0,就必须要配置好两个寄存器IP、IE。而对于中断优先级寄存器IP,当我们使用默认优先级时(上篇博文的优先级表格所述),就不必要去配置IP。
    接下来附上IE寄存器的每一位的作用:
    这里写图片描述
    首先,中断允许位寄存器 IE 是可位寻址的,意思是说,我们可以单独的对D0~D7每一位进行操作,而不需要对 IE 整个赋值(为什么可以这样,因为keil的头文件“reg52.h”已经对 IE 的地址进行了定义)。
    在这里说明一点,对于51单片机的 I/O 口而言,上电时,默认输出为高电平。对于其寄存器而言,上电是,默认为0。可见,当要完成外部中断0的配置时,我们只需要配置中的EX0、EA,当然还有外部中断0的触发方式(产生方式),这里就要看到中断及控制寄存器TCON,其成员及意义如下:
    这里写图片描述
    这里写图片描述
    可见外部中断0和外部中断1的设置方式雷同,跟据上表所述,我们通过设置IT0来设置外部中断0的触发方式(分别为:低电平触发、下降沿触发),其中 IE 位由硬件自身控制,不需要软件操作。

    实例的核心代码如下:

    /*数码管配置完成*/
    void main()
    {
        IT0 = 1//设置为下降沿触发
        EX0 = 1//外部中断0中断允许位                    
        EA = 1while(1);                           //等待外部中断0发生 
        {
            display();
        }                           
    }
    
    void INT0() interrupt 0                //中断服务函数的书写格式
    {
        if( IE == 1//产生了外部中断,IE 自动置为1
        {
            dspbuf[0]++;    
        }
    }

    在上面可以看到配置外部中断0相关的寄存器时,我们先打开EX0=1,允许外部中断产生,再EA = 1,打开总中断,这样就配置好了能产生外部中断0的先决条件,通过IT0 来配置中断的触发方式。在中断服务函数中,函数名“INT0”可自由编写,并且中单服务函数不需要声明,后面所加的“interrupt X”X为该中断对应的C语言序号。
    值得注意的是,对于51单片机而言,上电之后,所有寄存器的值默认为“0”,所有 I/O 口的值默认为“1”。
    通过外部中断的理解,很方便的能引出下一节的定时器/计数器中断。

    未完待续……

    展开全文
  •  80C51单片机提供两个外部中断口: INT0(P3.2)和INT1(P3.3)引脚输入。这两个引脚是功能复用引脚,既可以作为普通V0口,也可作为外部中断输入引脚。下面以部中断0来讲述。80C51单片机在每个机器周期的S5P2期间扫描...

    前言:单片机的中断系统(一)


            80C51单片机提供两个外部中断口:  INT0(P3.2)和INT1(P3.3)引脚输入。这两个引脚是功能复用引脚,既可以作为普通V0口,也可作为外部中断输入引脚。下面以部中断0来讲述。80C51单片机在每个机器周期的S5P2期间扫描外部中断输入引脚的电平状态。当外部中断设置为下降沿触发时,若处理器在连续两个机器周期扫描到INT0引脚的电平先后为高电平和低电平时,就会设置中断标志位IE0为1,表示外部有中断申请,该中断申请信号会一直保持,直到该中断被响应,该标志由内部硬件自动清除当外部中断设置为电平触发方式时,在外部中断引脚INTo变为低电平时,IE0变为1,并一直保持为1,直到引脚INTo的输入变为高电平时,IE0位才清0。因此,选择低电平触发方式时,对INT0的电平持续时间有严格要求,必须保持INTo引脚为低电平,直到中断被响应才 能变高,而且在中断返回前必须变成高电平,以撤销中断请求。若低电平时问太短,则可能导致中断不会被响应;若太长,在中断子程序执行完后仍为低电平,则IE0会一直保持为1,这时会导致一次中断请求,得到多次响应 ——————http://www.51dzw.com/embed/embed_110007.html

     

    外部中断0实验 

    按键作为外部中断的产生源,按下按键,led状态反转。

    图一:单片机引脚图
    图二:独立按键接线图
    图三:LED引脚图

    程序:

    #include<reg52.h>
    
    sbit key3=P3^2;//外部中断0的引脚接口
    sbit led=P2^0;
    
    void delay(int dat)
    {
    	while(dat--);
    }
    
    void Int0Init()
    {
    	IT0=1;//下降沿触发
    	//IE0=0;请求标志位,无触发,或响应中断后,硬件自动置0
    	EX0=1;//外部中断0允许标志
    	EA=1;//打开总终端
    }
    
    void main(void)
    {
    	Int0Init();
    	while(1);//如果不写while(1),单片机在主程序中会不断循环执行,导致不断初始化		
    }
    
    void LedRever() interrupt 0	//0是外部中断的中断号
    {
    	 delay(1000);
    	 if(key3==0)
    	 {
    	 	led=~led;
    	 }
    }
    
    

     比较有意思的是,中断函数中增加了消抖部分。

    如果不加消抖,可能想程序可能想多次执行这个中断。如果消抖在外面,可能已经进入中断了,还没进行消抖。

     

    外部中断1实验:

    接线引脚图如图一、二、三。

    普中教程代码:

    /**************************************************************************************
    *		              外部中断1实验												  *
    实现现象:下载程序后按下K4按键可以对D1小灯状态取反。
    注意事项:无。																				  
    ***************************************************************************************/
    
    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    sbit k4=P3^3;  //定义按键K4
    sbit led=P2^0;	 //定义P20口是led
    
    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能		   : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    /*******************************************************************************
    * 函 数 名         : Int1Init()
    * 函数功能		   : 设置外部中断1
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void Int1Init()
    {
    	//设置INT1
    	IT1=1;//跳变沿出发方式(下降沿)
    	EX1=1;//打开INT1的中断允许。	
    	EA=1;//打开总中断	
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	Int1Init();  //	设置外部中断1
    	while(1);		
    }
    
    /*******************************************************************************
    * 函 数 名         : Int1()	interrupt 2
    * 函数功能		   : 外部中断0的中断函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    
    void Int1()	interrupt 2		//外部中断1的中断函数
    {
    	delay(1000);	 //延时消抖
    	if(k4==0)
    	{
    		led=~led;
    	}
    }

     

    参考文章:

    外部中断0中断请求标志位。

     

     

     

     

     

     

     

     

    展开全文
  • 程序为例: #include&lt;reg52.h&gt; sbit led=P3^0; void main() { IT0=1; //设置外部中断0的触发方式为下降沿 EX0=1; //开启外部中断0 //中断的设置,首先设置中断的触发方式,再...

    以程序为例:

    #include<reg52.h>
    
    sbit led=P3^0;
    
    void main()
    {
    	 IT0=1;	//设置外部中断0的触发方式为下降沿
    	 EX0=1;	//开启外部中断0
    													  //中断的设置,首先设置中断的触发方式,再设置开启终端,最后开启总中断。
    	 IT1=1; //设置外部中断1的触发方式为下降沿			 //顺序保证:最后开启总中断
    	 EX1=1;	//开启外部中断1
    
    	 EA =1;	//总中断开关
    	while(1)
    	{
    		P0=0xaa;
    		P0=0xff;
    	}
    }
    
    void EX0_ISR(void) interrupt 0
    {
    	led=~led;
    }
    
    void EX1_ISR(void) interrupt 2     //外部中断1的中断在此为2!!!! 
    {
    	led=~led;
    }

    对于中断的理解:单片机中断和Java、Android中的线程有些像。中断的使用:首先要声明、设置中断服务,在此以外部中断0和1作解。首先要设置中断的触发方式,再设置中断的开启,最后再设置中断的总开关。IT0=1和IT1=1分别设置外部中断0的触发方式低电平触发也就是下降沿触发,同理IT1的触发方式也是如此。EX0=1和EX1=1是设置外部中断0和外部中断1都开启。EA=1是设置开启中断的所有开关。

    以上是对中断的声明与设置。完成以上步骤要写中断响应服务。即代码中:

    void EX0_ISR(void) interrupt 0
    {
    	led=~led;
    }
    
    void EX1_ISR(void) interrupt 2     //外部中断1的中断在此为2!!!! 
    {
    	led=~led;
    }

    所谓的低电平触发是说的单片机上INT0与INT1变为低电平时侯。

    也就是当开关按下的时候。

    我在这一部分中容易犯得错误就是中断初始化那三行代码记的不熟悉。

    IT0=1;
    EX0=1;
    EA=1;

     

    展开全文
  • 练习一下对外部中断有关的寄存器的控制,代码如下:;==================================================================== ; Main.asm file generated by New Project wizard ; ; Created: 周日 4月 29 2018 ; ...

    练习一下对外部中断有关的寄存器的控制,代码如下:

    ;====================================================================
    ; Main.asm file generated by New Project wizard
    ;
    ; Created:   周日 4月 29 2018
    ; Processor: AT89C51
    ; Compiler:  ASEM-51 (Proteus)
    ;====================================================================
    
    $NOMOD51
    $INCLUDE (8051.MCU)
    
    ;====================================================================
    ; DEFINITIONS
    ;====================================================================
    
    ;====================================================================
    ; VARIABLES
    ;====================================================================
    
    ;====================================================================
    ; RESET and INTERRUPT VECTORS
    ;====================================================================
    
          ; Reset Vector
          org   0000h
          jmp   Start
    	  org   0003h
    	  ljmp   INT0_
    ;====================================================================
    ; CODE SEGMENT
    ;====================================================================
    
          org   0100h
    Start:	
          ; Write your code here
    		MOV A,#00H
    		MOV SP,#50H
    LOOP1:	
    		MOV TCON,#01H
    		MOV IE,#81H
    		MOV P1,A
    		INC A
    		LCALL DELAY
    		SJMP LOOP1
    INT0_:
    		PUSH ACC
    		MOV B,#3
    LOOP2:
    		MOV P1,#0FFH
    		LCALL DELAY
    		MOV P1,#00H
    		LCALL DELAY
    		DJNZ B,LOOP2
    		POP ACC
    		RETI
    		
    DELAY:
    		MOV R4,#0ffH
    DELAY2:	MOV R3,#0ffH
    DELAY1:
    		NOP
    		NOP
    		DJNZ R3,DELAY1
    		DJNZ R4,DELAY2
    		RET
    Loop:	
          jmp Loop
    
    ;====================================================================
          END

    下面给出仿真设计的电路图。



    编程中注意循环的操作以及现场保护和现场还原,否则在中断服务子程序执行完后,回不到当初的状态。


    展开全文
  • 新搭了一个系统,用线激光进行实时三维重建,从而测量物体最小包围盒,本科...今天先把keil端的程序弄上来,有时间再把串口通信的程序写一写。程序已经通过运行,如图所示:利用串口调试工具试了一下完全可以,程序...
  • 51单片机入门教程(6)——外部中断
  • 51单片机一共有两个外部中断源。 IE0的置位与否与IT0有关,当IT0=1时,下降沿触发也就是说当INT0由高到低时IE0将被硬件置1, 执行完中断,遇到RETI自动清0,但不影响INT0的状态。当IT0=0时,当CPU检测到连续两...
  • AT89X51单片机中断嵌套程序,定时器1与外部中断0相互嵌套
  • INT0输入单脉冲,申请中断,设置中断触发为边沿触发 ORG 0000H LJMP MAIN ORG 0003H LJMP INT_0 org 0100h MAIN: SETB EA SETB EX0 SETB IT0 MOV A,#55H ...
  • 设计一个外部中断触发流水灯系统:当外部中断来临时,启动流水灯,即从P2口的LED循环点亮。可以从protues中看到结果
  • 硬件:STC89C52RC 开发工具:Keil uVision4 前言:8051是一款很经典的、历史悠久的单片机,作为一款入门级的单片机8051受到很多初学者的欢迎。...外部中断单片机提供的系统紧急事件的输入控制。事件触发的方式...
  • 51单片机外部中断实现流水灯 作业要求: 按照给定的实验板电路图编程实现外部中断控制流水灯,初始上电时,实验板右下侧的流水灯区域只有最右侧LED灯亮,其他灯全都熄灭,每按下一次按键,流水灯从右向左流动一个...
  • 单片机外部中断实验

    2020-05-31 00:28:22
    设定外部信号发生器每2s钟,产生一个下降沿,作为外部中断源,中断处理完成led灯的闪烁一次,以及控制步进电机旋转一圈。
  • 比如小七我现在正在电脑前写帖子,突然老妈叫我帮她下楼拿点东西,于是我就收到了老妈给我的一个中断(可以叫做外部中断),当我去拿东西时,突然尿急(内部中断,尿袋快要撑爆了),这又是一个中断,!我们把引起中断...
  • 中断系统原理 何为中断,何为中断系统 举个例子: 生活中常见的例子,一个正在写寒假作业的孩子突然听到一阵敲门声,原来是父母下班回来了,孩子说:“等会,我来了”。于是,他记住当下页码放下作业去开门,然后...
  • 了解单片机外部中断脉冲触发和电平触发的不同应用 掌握外部中断处理程序的编程方法 二、实验内容 打开ISIS 7Professional,参照图5.1设计仿真电路原理图 2.编写程序实现: (1)主流程为P1口接8个LED,实现每...
  • 这篇文章讲51芯片内部各个模块的汇编程序,这里不做实验,只贴代码外部中断模块-汇编: 中断地址定义:  ;-----------------------------------------------  ORG 0000H ;伪指令 告诉编译器从0000H开始  ...
  • STC15单片机外部中断上升沿触发的解决办法
  • 单片机中断是指CPU在正常执行程序的过程中,由于计算机内部或外部发生了另一...今天要做的一个实验叫做外部中断,按下按键,停止主程序中的内容,立即转去执行中断服务函数。 我们主要看到原理图与代码,了解中断是什...
  • 中断: 什么是中断,就是打断,你一开始在做一件事,突然意外发生(中断源),你不得...五个中断源(外部中断0(/INT0),定时器0中断(T0),外部中断1(/INT1),定时器1中断(T1),串行口中断(TI/RI)) 中断三...
1 2 3 4 5 ... 20
收藏数 7,414
精华内容 2,965
关键字:

单片机外部中断程序代码