话不多说,先上程序
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
相关文章