您的位置:首页 > 其它

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

2015-11-26 21:37 471 查看
这篇文章讲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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: