单片机中断实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
ORG 0000H
LJMP START
ORG 0003H;如果没有指明外部中断地址,外部中断不会发生
LJMP X0_INT
ORG 0013H
START:
CLR IT0;设置外部中断0为电平触发
;SETB IT0;设置外部中断0位下降沿触发
;CLR IT1;设置外部中断1为电平触发
;SETB IT1;设置外部中断1为下降沿触发
SETB EX0;EX0这一位置1,就是拉成高电平
SETB EX1;EX1这个位也置1,具体意思自己查
SETB EA;打开总中断
MOV SP,#60H;堆栈,必须大于50H,就是栈的空间
MOV A,#0FEH;流水灯的第一个灯亮
;到此完成外部中断初始化设置
LOOP:
MOV P0,A
CALL DELAY
RL A;把A向左循环
SJMP LOOP
X0_INT:
CLR EA;清除总中断
PUSH PSW;把PSW寄存器状态压入堆栈
PUSH ACC;把累加器寄存器状态压入堆栈来保护现场
SETB RS1;快速返回主程序
SETB EA
;以上是写外部中断的固定写法

MOV A,#0F0H;这是灯的初始状态
MOV R2,#6;向R2移入立即数6

;接下来就需要中断返回

X0_1:MOV P0,A;这里开始是中断后运行的主程序
CALL DELAY
CPL A;按位取反
DJNZ R2,X0_1

;接下来的也是中断函数的固定写法,和开始的差不多,直接复制过来,但是出栈顺序要放一下,因为栈是先进后出
CLR EA
POP ACC;出栈
POP PSW;出栈
SETB EA
RETI;这是特殊的伪指令,一定要有,代表中断函数的返回
DELAY:MOV R5,#50
D1:MOV R6,#100
D2:MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END

中断实验,实验指导书实验一代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
ORG 0000H
LJMP START
ORG 0003H
LJMP X0_INT
START:
CLR IT0
SETB EX0
SETB EA
MOV SP,#60H
LOOP:
MOV P0,#00H
CALL DELAY
MOV P0,#0FFH
CALL DELAY
SJMP LOOP
X0_INT:
CLR EA
PUSH PSW
PUSH ACC
SETB RS1
SETB EA
;接下来就需要中断返回
MOV P0,#0AAH
CALL DELAY
MOV P0,#55H

CLR EA
POP ACC;出栈
POP PSW;出栈
SETB EA
RETI
DELAY:MOV R5,#5
D1:MOV R6,#200
D2:MOV R7,#250
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!