精华内容
下载资源
问答
  • 写了一个 51单片机外部中断程序

    千次阅读 2016-07-11 18:12:15
    /*以下是能在keilC 中变异的源码,直接粘贴过去就行,外部中断0(INT0)和外部中断1都有(INT1)*/ /*程序很简单,但是对新手来说还是很实用的*/ /****************************************************************...

    /*以下是能在keilC 中变异的源码,直接粘贴过去就行,外部中断0(INT0)和外部中断1都有(INT1)*/

    /*程序很简单,但是对新手来说还是很实用的*/

    /*******************************************************************/
    /*                                                                 */
    /* 单片机开发系统演示程序 - INT0 INT1 中断计数                     */
    /*                                                                 */
    /* 6位数码管显示                                                   */
    /*                                                                 */
    /* 作者:曾露337  店铺:http://shop58430712.taobao.com             */
    /*                                                                 */
    /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       */
    /*                                                                 */
    /*******************************************************************/
     
    #include < reg51.h >
    #include <intrins.h>

    #define uchar unsigned char
    #define uint  unsigned int

    unsigned char code  LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,
                                      0x82,0xF8,0x80,0x90,0xff};
                                        
    unsigned char data  display[8] = {0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00};

    unsigned char code  scan_bit[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

    unsigned char count0,count1,temp=0 ;

    /********************************************************
    *                                                       *
    * 延时函数                                              *
    *                                                       *
    ********************************************************/
    void delay(uint ms) 
    // 延时子程序
    {
     uchar k;
     while(ms--)
     {
      for(k = 0; k < 100; k++);
     }
    }

    /********************************************************
    *                                                       *
    *  数据处理与显示函数                                   *
    *                                                       *
    ********************************************************/
    void  disp_count()
    {
        char n; 

        temp=count0;

        display[2]=temp/100;    //数据处理
        temp=temp%100;
        display[1]=temp/10;
        display[0]=temp%10;

     if(display[2]==0)        //高位为0,不显示 
     { 
       display[2]=0x0a;
       if(display[1]==0)
       display[1]=0x0a;  
        }

        temp=count1;

        display[7]=temp/100;    //数据处理
        temp=temp%100;
        display[6]=temp/10;
        display[5]=temp%10;

     if(display[7]==0)        //高位为0,不显示 
     { 
       display[7]=0x0a;
       if(display[6]==0)
       display[6]=0x0a;  
        } 
         
        for(n=0;n<8;n++)
        {  
          P0 =LEDData[display[n]] ;  //显示段码
          P2 =scan_bit[n];           //输出位码
          delay(1);
       P2 = 0xff;                 //关闭显示
        } 
    }

    /********************************************************
    *                                                       *
    * 主程序                                               *
    *                                                       *
    ********************************************************/
    void main(void)
    {  
       P0=0xff;
       P1=0xff;
       P2=0xff;   
       
       IT0=0;          //低电平触发
    //   IT0=1;        //下降沿触发
       IT1=0;          //低电平触发
    //   IT1=1;        //下降沿触发
       PX0=1;
       EA=1;
       EX1=1;
       EX0=1;

       while(1)
       {
          disp_count();
       }
    }

    /********************************************************
    *                                                       *
    * INT0中断函数                                          *
    *                                                       *
    ********************************************************/
    void  counter0(void) interrupt 0
    {
       uchar  x;
       EX0=0;
       count0++;
        
       for(x=0;x<10;x++)
       {
         disp_count();
       }
       EX0=1;
    }

    /********************************************************
    *                                                       *
    * INT1中断函数                                          *
    *                                                       *
    ********************************************************/
    void  counter1(void) interrupt 2 
    {
       uchar  x;
       EX1=0;
       count1++;
        
       for(x=0;x<10;x++)
       {
         disp_count();
       }
       EX1=1;
    }

    /********************************************************/

    展开全文
  • 51单片机外部中断实验程序的设计与分析.pdf
  • 51单片机外部中断例程 51单片机外部中断例程 51单片机外部中断例程 51单片机外部中断51单片机外部中断例程程
  • 本文介绍了51单片机外部中断触发方式。
  • 51单片机外部中断例子程序

    热门讨论 2009-02-16 18:10:27
    很好的单片机外部中断例程,看了就知道了,中断里计数,并显示到数码管上
  • 外部中断原理与程序
  • 简单的软硬兼施51单片机外部中断扩展 简单的软硬兼施51单片机外部中断扩展 简单的软硬兼施51单片机外部中断扩展 简单的软硬兼施51单片机外部中断扩展
  • 51单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;下面一起来学习一下
  • 外部中断模块-汇编: 中断地址定义:  ;-----------------------------------------------  ORG 0000H ;伪指令 告诉编译器从0000H开始  LJMP MAIN ;64KB无条件跳转 跳转到main处执行  ORG 0003H ;中断

    这篇文章讲51芯片内部各个模块的汇编程序,这里不做实验,只贴代码:

    外部中断模块-汇编:


    中断地址定义:

      ;-----------------------------------------------
      ORG 0000H  ;伪指令 告诉编译器从0000H开始
      LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
      ORG 0003H     ;中断入口
      LJMP exter0  ;中断函数名
      ORG 0013H     ;中断入口
      LJMP exter1  ;中断函数名
      ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用
      ;-----------------------------------------------


    主函数  main:

    MAIN:
      MOV SP,#3FH   ;设置栈低为5FH
      LCALL DELAY40ms          ;延时40.301ms 64KB长调用子函数
      MOV num,#00H
      MOV wei,#07H
      SETB EX0        ;开启外部中断 0,即P32引脚
      SETB IT0      ;将外部中断0设为边沿触发方式
      CLR PX0        ;优先级为0    
      SETB EX1    
      SETB IT1   
      SETB PX1  ;1的中断优先级比0的高   外部中短1的优先级比0的高
      SETB EA        ;首先开启总中断
      ;********************死循环**********************

    while1:
      LCALL led_Static_display
      INC num
      MOV A,num
      CJNE A,#011H,rigthnum
      MOV num,#00H
      rigthnum:
      LCALL DELAY500ms
      LCALL DELAY500ms
      LJMP while1
      ;================================================
      ;外部中断0函数
      ;================================================




    中断函数:

    exter0:    
      ;CLR EA
      PUSH 31H
      PUSH DPH
      PUSH DPL
      PUSH PSW
      PUSH ACC
      PUSH 05H    
      PUSH 06H
      PUSH 07H
      ;SETB p3.2   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
      ;LCALL DELAY40ms
      ;JB p3.2,OVER
      MOV numtemp,#03H
      while1exter0:
      MOV num,numtemp
      LCALL led_Static_display
      LCALL DELAY500ms
      MOV num,#10H  ;闪烁
      LCALL led_Static_display
      LCALL DELAY500ms
      DEC numtemp     
      MOV A,numtemp    
      CJNE A,#0FFH,while1exter0
      OVER:
      POP 07H    
      POP 06H
      POP 05H    
      POP ACC
      POP PSW
      POP DPL
      POP DPH
      POP 31H
      CLR IE0   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
      SETB EA
      RETI        ;中断结束返回
      ;================================================
      ;外部中断1函数
      ;================================================
    exter1:    
      ;CLR EA
      PUSH 32H
      PUSH 31H
      PUSH DPH
      PUSH DPL
      PUSH PSW
      PUSH ACC
      PUSH 05H    
      PUSH 06H
      PUSH 07H
      SETB p3.3   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
      LCALL DELAY40ms
      JB p3.3,OVERexter1
      MOV numtemp,#04H
      while1exter1:
      MOV num,numtemp
      LCALL led_Static_display
      LCALL DELAY500ms
      MOV num,#10H  ;闪烁
      LCALL led_Static_display
      LCALL DELAY500ms
      INC numtemp     
      MOV A,numtemp    
      CJNE A,#08H,while1exter1
      OVERexter1:
      POP 07H    
      POP 06H
      POP 05H    
      POP ACC
      POP PSW
      POP DPL
      POP DPH
      POP 31H
      POP 32H
      CLR IE1   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
      ;SETB EA
      RETI        ;中断结束返回
      ;================================================
      ;数码管静态显示函数
      ;================================================


    整个程序源代码:

      ;-----------------------数码管脚功能定义---------------------------   
      LED_wei EQU P2
      LED138_0 EQU P2.0
      LED138_1 EQU P2.1
      LED138_2 EQU P2.2
      LED_duan EQU P0
      ;-------------------- 数码要显示的位、数据---------------------------
      wei EQU 30H    ;数码管位选
      num EQU 31H    ;数码管段选
      numtemp EQU 32H    ;数码管段选暂存
      ;-----------------------------------------------
      ORG 0000H  ;伪指令 告诉编译器从0000H开始
      LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
      ORG 0003H     ;中断入口
      LJMP exter0  ;中断函数名
      ORG 0013H     ;中断入口
      LJMP exter1  ;中断函数名
      ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用
      ;-----------------------------------------------
    MAIN:
      MOV SP,#3FH   ;设置栈低为5FH
      LCALL DELAY40ms          ;延时40.301ms 64KB长调用子函数
      MOV num,#00H
      MOV wei,#07H
      SETB EX0        ;开启外部中断 0,即P32引脚
      SETB IT0      ;将外部中断0设为边沿触发方式
      CLR PX0        ;优先级为0    
      SETB EX1    
      SETB IT1   
      SETB PX1  ;1的中断优先级比0的高   外部中短1的优先级比0的高
      SETB EA        ;首先开启总中断
      ;********************死循环**********************
    while1:
      LCALL led_Static_display
      INC num
      MOV A,num
      CJNE A,#011H,rigthnum
      MOV num,#00H
      rigthnum:
      LCALL DELAY500ms
      LCALL DELAY500ms
      LJMP while1
      ;================================================
      ;外部中断0函数
      ;================================================
    exter0:    
      ;CLR EA
      PUSH 31H
      PUSH DPH
      PUSH DPL
      PUSH PSW
      PUSH ACC
      PUSH 05H    
      PUSH 06H
      PUSH 07H
      ;SETB p3.2   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
      ;LCALL DELAY40ms
      ;JB p3.2,OVER
      MOV numtemp,#03H
      while1exter0:
      MOV num,numtemp
      LCALL led_Static_display
      LCALL DELAY500ms
      MOV num,#10H  ;闪烁
      LCALL led_Static_display
      LCALL DELAY500ms
      DEC numtemp     
      MOV A,numtemp    
      CJNE A,#0FFH,while1exter0
      OVER:
      POP 07H    
      POP 06H
      POP 05H    
      POP ACC
      POP PSW
      POP DPL
      POP DPH
      POP 31H
      CLR IE0   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
      SETB EA
      RETI        ;中断结束返回
      ;================================================
      ;外部中断1函数
      ;================================================
    exter1:    
      ;CLR EA
      PUSH 32H
      PUSH 31H
      PUSH DPH
      PUSH DPL
      PUSH PSW
      PUSH ACC
      PUSH 05H    
      PUSH 06H
      PUSH 07H
      SETB p3.3   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
      LCALL DELAY40ms
      JB p3.3,OVERexter1
      MOV numtemp,#04H
      while1exter1:
      MOV num,numtemp
      LCALL led_Static_display
      LCALL DELAY500ms
      MOV num,#10H  ;闪烁
      LCALL led_Static_display
      LCALL DELAY500ms
      INC numtemp     
      MOV A,numtemp    
      CJNE A,#08H,while1exter1
      OVERexter1:
      POP 07H    
      POP 06H
      POP 05H    
      POP ACC
      POP PSW
      POP DPL
      POP DPH
      POP 31H
      POP 32H
      CLR IE1   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
      ;SETB EA
      RETI        ;中断结束返回
      ;================================================
      ;数码管静态显示函数
      ;================================================
    led_Static_display:
      ANL wei, #07H
      ANL LED_wei,#0F8H
      MOV A,wei
      ORL LED_wei,A
      MOV A,num  
      MOV DPTR,#numtab
      MOVC A,@A+DPTR  ;查表取数据
      MOV LED_duan,A
      RET
      ;================================================
      ;各种参数的延时子函数
      ;================================================
    DELAY100us:     ;100us  
      MOV R6,#06H
      DEL11: MOV R7,#08H
      DEL12: DJNZ R7,DEL12
      DJNZ R6,DEL11
      RET

    DELAY500us:    ;500us
      MOV R6,#0CH   ;288
      DEL21: MOV R7,#18H
      DEL22: DJNZ R7,DEL22
      DJNZ R6,DEL21
      RET
     
    DELAY1ms:    ;1ms
      MOV R6,#18H   
      DEL61: MOV R7,#18H
      DEL62: DJNZ R7,DEL62
      DJNZ R6,DEL61
      RET

    DELAY40ms:    ;延时40ms  500得1ms
      MOV R6,#100
      DEL41: MOV R7,#200
      DEL42: DJNZ R7,DEL42
      DJNZ R6,DEL41
      RET

    DELAY256ms:        ;延时256ms
      MOV R5,#05H
      DEL51: MOV R6,#100
      DEL52: MOV R7,#0FFH
      DEL53: DJNZ R7,DEL53
      DJNZ R6,DEL52
      DJNZ R5,DEL51
      RET
     
    DELAY500ms:        ;延时256ms
      MOV R5,#0AH
      DEL81: MOV R6,#100
      DEL82: MOV R7,#0FFH
      DEL83: DJNZ R7,DEL83
      DJNZ R6,DEL82
      DJNZ R5,DEL81
      RET
     
    DELAY1s:    ;1秒
      MOV R5,#16H
      DEL31: MOV R6,#100
      DEL32: MOV R7,#0FFH
      DEL33: DJNZ R7,DEL33
      DJNZ R6,DEL32
      DJNZ R5,DEL31
      RET
     
    DELAY10s:    ;10秒
      MOV R5,#0DCH
      DEL71: MOV R6,#100
      DEL72: MOV R7,#0FFH
      DEL73: DJNZ R7,DEL73
      DJNZ R6,DEL72
      DJNZ R5,DEL71
      RET
    numtab: DB  03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H,000H
    end


    keil工程整体源码:

    51汇编之外部中断带优先级-汇编.zip

    http://download.csdn.net/detail/chengdong1314/9303641

    展开全文
  • 51单片机外部中断

    2017-11-10 12:33:41
    51单片机中断实验,HL-1学习板专用。删除按键部分所有单片机通用。
  • 51单片机外部中断实验报告51单片机外部中断实验实验报告要求:整理本实验涉及的程序,将它们按正确的格式详细书写在实验报告纸上。无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000...

    51单片机外部中断实验报告

    51单片机外部中断实验

    实验报告要求:

    整理本实验涉及的程序,将它们按正确的格式详细书写在实验报告纸上。

    无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000开始加1显示(加到9999后复位为0000),同时蜂鸣器报警。

    #include

    #include

    int n1,n2;

    sbit beep=P3^5;

    char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

    void delay(int x)

    {

    int i,j;

    for(i=0;i

    for(j=0;j<200;j++);

    }

    void main()

    {

    EA=1;

    EX0=1;

    IT0=0;

    EX1=1;

    IT1=1;

    PX1=1;

    while(1);

    }

    void int0() interrupt 0

    {

    beep=0;

    P2=0xfe;

    delay(200);

    for(n1=8;n1>0;n1--)

    {

    P2=_crol_(P2,1);

    delay(200);

    }

    }

    void int1() interrupt 2

    {

    P0=0x00;

    for(n2=0;n2<16;n2++)

    {

    P1=table[n2];

    delay(200);

    }

    }

    设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序)。

    C语言程序

    #include

    #include

    int n1,n2;

    chartable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

    0x88,0x83,0xc6,0xa1,0x86,0x8e};

    void delay(int x)

    {

    int i,j;

    for(i=0;i

    for(j=0;j<200;j++);

    }

    void main()

    {

    EA=1;

    EX0=1;

    IT0=1;

    P2=0xfe;

    delay(200);

    for(n1=8;n1>0;n1--)

    {

    P2=_crol_(P2,1);

    delay(200);

    }

    }

    void int0() interrupt 0

    {

    EX0=1;

    P0=0x00;

    for(n2=0;n2<16;n2++)

    {

    P1=table[n2];

    delay(200);

    }

    EX0=0;

    }

    汇编程序:

    ORG 0000H

    AJMP MAIN

    ORG 0003H

    LJMP EXT0_INT

    ORG 0013H

    LJMP EXT1_INT

    ORG 0100H

    MAIN:SETB EA

    SETB EX0

    SETB EX1

    SETB PX1

    CLR IT0

    CLR IT1

    AJMP $

    EXT0_INT: MOV P2,#0FEH

    MOV R4,#08H

    L1:ACALL DELAY

    MOV A,P2

    RL A

    MOV P2,A

    DJNZ R4,L1

    RETI

    EXT1_INT: MOV P1,#0F0H

    MOV R5,#00H

    MOV DPTR ,#TAB

    L4:MOV A,R5

    MOVC A,@A+DPTR

    MOV P0,A

    ACALL DELAY

    INC R5

    CJNE R5,#0AH,L4

    RETI

    TAB: DB 0C0H ,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

    DELAY:MOV R6,#0FFH

    L5:MOV R7,#0FFH

    L6:NOP

    NOP

    DJNZ R7,L6

    DJNZ R6,L5

    RET

    END

    写出实验结果、实验收获与对本实验改进的意见。

    1)无中断时发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000开始加1显示(加到9999后复位为0000),同时蜂鸣器报警。

    2)当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序被中断去执行外部中断1的中断程序(数码管

    展开全文
  • 本文主要讲了51单片机外部中断触发方式的经验总结,希望对你的学习有所帮助。
  • 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序)。 #include<...

    设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序)。

    #include<reg51.h>
    #define uchar unsigned char;
    sbit key1=P3^2;
    sbit key2=P3^3;
    unsigned int i;
    uchar led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
    uchar tube[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

    void delay1s(unsigned char time)
    {
    unsigned int i,j,k;
    for(i=0;i<time;i++)
    for(j=0;j<1000;j++)
    for(k=0;k<144;k++);
    }

    int main(void)
    {
    IT0=1;
    IT1=1;
    EA=1;
    EX0=1;
    EX1=1;
    PX0=1;
    PX1=0;
    while(1);
    }
    void int1(void) interrupt 0
    {
    while(!key1);
    for(i=0;i<10;i++)
    {
    P1=0x00;
    P2=tube[i];
    delay1s(1);
    }
    }
    void int2(void) interrupt 2
    {
    while(!key2);
    for(i=0;i<8;i++)
    {

    	P0=led[i];
    	delay1s(1);
    }
    

    }
    视频:
    https://www.bilibili.com/video/BV1jK411u7JH/

    展开全文
  • AT89C51单片机外部中断

    千次阅读 2020-11-27 22:12:30
    C51单片机外部中断调用P3_2 ,P3_3口。 中断方式有两种,分别为电平方式和脉冲方式。 中断请求有0和1。中断总允许为EA=1, IE0:外部中断请求0标志位; IT0:外部中断0触发方式设置位,IT0=1下降沿触发,IT0=0低电平...
  • //流水数码,当外部中断产生,流水数码闪烁
  • 单片机外部中断程序系统,关于51单片机外部中断的程序
  • 51单片机外部中断0实例详解

    千次阅读 2020-02-14 11:47:49
    今天就以51单片机外部中断0为例,来简单讲解一下单片机中断的用法。 1 51单片机的中断源 51单片机共有5个中断源,分别为: 外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断都对应一个中断向量,...
  • 51/52单片机外部中断实验程序 伟福试验箱专用
  • 单片机程序控制P0口数码管循环显示0~LENGTH-1 外中断0、外中断1发生时分别在P2口、P1口依次显示0~LENGTH-1
  • 51单片机 外部中断

    2021-04-09 21:13:42
    为了降低CPU的占有率,同时实现单片机对复杂情景的处理,引入了中断。 CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,为该外设服务(或者处理紧急事件),...
  • 而很多现实场景需要有多个外部中断同时进行,这时候单片机自带的外部中断端口可能就不够用了,那么,怎么解决这个问题呢,本文将会用最典型的51单片机为例,介绍两种较简单的拓展外部中断的方法。
  • 分析了80C51单片机的2个对外中断入口INT0和INT1的结构、功能,讨论了通过控制机构的合理设置、编程,实现单片机对外中断功能的控制问题。
  • 51单片机外部中断程序,可移植性强,功能强大
  • 内含51单片机中断使用方法和优先级设置方法的测试仿真以及程序,适合初学protues,单片机,嵌入式的人。
  • 已知单片机的 P0 口接了一位七段数码管,当无外部中断外部中断 0)时,数码 管按 a~g 段依次点亮,不断循环显示;当有外部中断(按钮被按下,P3.2 有下降沿电 压)时,数码管显示状态改为“8”亮灭闪烁显示,亮灭...
  • 51单片机外部中断实现LED灯的亮灭

    万次阅读 多人点赞 2020-08-06 15:59:57
    #include"reg52.h"typedef unsigned char u8;typedef unsigned int u16;sbit led=P2^0;sbit k4=P3^3;//外部中断1void delay(u16 i){ while(i--);}void zhongduan(){ EA=1;...//外部中断1...
  • 该资源详细说明了单片机中断的应用,可以好好学习一下
  • 本文首先介绍了中断技术的概念,接着论述了MCS-51中断系统结构、相关寄存器及中断处理过程,依据MCS-51中断功能要求编制了Proteus仿真电路并设计了驱动程序,最后对本文的实验仿真效果进行了总结。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,200
精华内容 3,680
关键字:

51单片机外部中断程序