51单片机与汇编之定时器中断闪烁LED

2023-01-11  

话不多说,先上程序

ORG 0000h

AJMP START

ORG 000BH

AJMP TIME0

START:

MOV 66H,#0

MOV TMOD,#00000001B

MOV TH0,#0BBH

MOV TL0,#0CCH

SETB EA

SETB ET0

SETB TR0

AJMP $

TIME0: PUSH ACC

PUSH PSW

MOV TH0,#0BBH

MOV TL0,#0CCH

INC 66H

MOV A,66H

CJNE A,#30,TIME00

CPL P1.0

MOV 66H,#0

TIME00: POP PSW

POP ACC

RETI

END

这段程序的达成的目标是:用定时器产生一个中断,中断内容是让LED灯闪烁。现在来分析程序的每一个步骤。

ORG 0000h ;。。。

AJMP START ;跳到start处去运行程序

ORG 000BH ;定时器0的中断在中断向量表中的地址

AJMP TIME0 ;跳到中断内容处运行

START:

MOV 66H,#0 ;给60h这个单元赋0

MOV TMOD,#00000001B ;以下6行都是定时器的基本设置,我就不说这个了,用c写过的哥们应该都懂,后面三行是开启中断的。

MOV TH0,#0BBH

MOV TL0,#0CCH

SETB EA

SETB ET0

SETB TR0

AJMP $ ;进入死循环中,等待中断的产生

TIME0: PUSH ACC ;把ACC和PSW中的东西压入栈中,把进入中断前的现场进行保护,就是中断不改变原来的累加器和状态寄存器的内容。

PUSH PSW

MOV TH0,#0BBH ;重新赋初值让它进行下一次中断

MOV TL0,#0CCH

INC 66H ;这个单元内的数值自己加一,相当于i++

MOV A,66H ;传到A中与30进行比较

CJNE A,#30,TIME00 ;如果不相等则跳去让PSW和ACC出栈,然后返回主函数中的死循环。如果相等则继续执行下面的程序,就是把LED灯进行反转,就是让定时器计时到时30次才进行一次灯的状态的改变。

CPL P1.0 ;灯的状态的反转

MOV 66H,#0 ;地址内的数归零,进行下一次的定时器计数

TIME00: POP PSW

POP ACC

RETI ;中断返回的指令,注意不是主程序的返回ret

END


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。