测透51汇编 51单片机外部中断模块程序

版权声明:本人乐于交流,欢迎转载,如果转载的时候能和我说一声那就更加的好! https://blog.csdn.net/chengdong1314/article/details/50061541

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

没有更多推荐了,返回首页