转载自本人博客:http://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汇编之外部中断带优先级-汇编.ziphttp://download.csdn.net/detail/chengdong1314/9303641
转载自本人博客:http://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汇编之外部中断带优先级-汇编.ziphttp://download.csdn.net/detail/chengdong1314/9303641
举报