2015-11-26 21:37:25 chengdong1314 阅读数 1141

这篇文章讲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

2018-04-29 14:15:18 zy010101 阅读数 1057

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

;====================================================================
; 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

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



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


2014-08-28 14:41:11 zhanghong056 阅读数 320
#include "STC/STC15F2K60S2.H"
#define uchar unsigned char
sbit K=P3^2;
sbit BELL=P4^5;
sbit Relay=P5^5;
    
    //延迟
    void delay02s(void)
    {
       uchar i,t=200;    
    while(t--)
        for(i = 150;i > 0;i--);
    }  
 
    void main (void)
     {
        EA=1;
        EX0=1;
        IT0=1;
        while(1)
        {
        P0=0xfe;
        delay02s();
        P0=0xff;
        delay02s();
        }
    }
    //中断
void int0() interrupt 0
{
    while(!K)
    {    
    P0= 0xfd;
    BELL = 0;    
    Relay = 0;
    }
    P0= 0xff;
    BELL = 1;
    Relay = 1;

}

2019-11-18 15:07:30 Supremelv 阅读数 148

51单片机中断使用注意事项

1.例如:
同时使用外部中断0和串口中断的时候,如果没有用到串口中断,一定要将串口中断ES置0,不然当你执行一次外部中断,然后再用串口发送数据(并没有用到串口中断服务程序),就会一直发送数据,这是最为致命的,这个时候外部中断0完全失效。正确代码如下:
`void UartInit(void) //9600bps@11.0592MHz
{
SCON=0x50;
// AUXR1=0x40;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
// AUXR=0x14;
// AUXR|=0x01;
AUXR=0x15;
IT0=0;
EX0=1;
// ES=1;
EA=1;
}
void Int0() interrupt 0
{
delay6(1000);
if(K1==0)
{
Hn++;
Si++;
if(Hn>2)
{
Hn=0;
}
if(Si>2)
{
Si=0;
}
}
}
第一次发帖,表述的不是多清楚,总之,就是没用到中断服务程序,就不要把相应的中断打开。(第一次发帖,有点LOW,还请看到此贴的大佬多多指教)

2019-06-27 21:34:06 qq_34190043 阅读数 248

1、中断的认识

什么是中断?
当计算机在执行main函数中的代码时,如果中断条件满足,则保存当前的代码运行地址,跳转到另一个中断服务地址中,去执行相应的程序。
中断包括:内部中断和外部中断。其中内部中断是通过数时钟脉冲,外部中断是通过判断引脚电平边沿变化。上面对中断的认识是在51单片机上学习到的,因为51单片机中的中断只有相对重要且基础的几个,比如,定时器中断,计数器中断,还有串口中断(当发送寄存器中的数据被全部发送出去后,产生一个中断。当接受寄存器中的收满数据时,产生一个中断。在这里中断的意义可以类比两个人搬运货物,当一个人把货物送给另一个人后,才能进行接下来的搬运。那如何判断货物是否被送出去了,就需要中断是否被执行来判断)。后来学习dsp28335,发现基本上每个外设都有中断服务函数。

2、中断的配置

中断的满足条件
中断的使能
3.在main中添加中断服务对象

/**
  * @brief EXTI line detection callbacks
  * @param GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_13)
  {
    /* Toggle LED0 */
    HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);
  }
}
没有更多推荐了,返回首页