求单片机高手帮忙详细解释下程序 特别是中断那

Tick equ 5000 ; 10000 x 100us = 1s
T100us equ 20 ; 100us时间常数(6M)
C100us equ 5h ; 100us记数单元
LEDBuf BIT 00H
LED BIT P1.1

org 0000H
ljmp Start
org 0030H
org 000bh
LJMP T0Int
ORG 0100H
T0Int:
push PSW
mov a, C100us+1
jnz Goon
dec C100us
Goon:
dec C100us+1
mov a, C100us
orl a, C100us+1
jnz Exit ; 100us 记数器不为0, 返回
mov C100us, #HIGH(TICK);#high(Tick)
mov C100us+1, #LOW(TICK);#low(Tick)
cpl LEDBuf ; 100us 记数器为0, 重置记数器
; 取反LED
Exit:
pop PSW
reti
Start:
mov TMOD, #02h ; 方式2, 定时器
mov TH0, #t100us
mov TL0, #t100us
mov IE, #10000010b ; EA=1, IT0 = 1
setb TR0 ; 开始定时
clr LEDBuf
clr P1.1
mov C100us, #high(Tick)
mov C100us+1, #low(Tick)
Loop:
mov c, LEDBuf
mov P1.1, c
ljmp Loop
end
解释下怎样定时一秒的,先谢谢了

这应该是一个闪烁灯的程序,定时器以方式2自动重装的方式工作,定时器到时产生一次中断就将记数字段减一,等到计数字段减到0就改变一次LED灯的状态,这基实就是一个延时的过程。
总的来讲就是定时器每100us就产生一次中断,而每次中断就将计数字段减一,因此计数字段应该设为10000,这样就是产生10000次中断(就是10000*100us =1s)时改变一次LED灯的状态,便实现了1s的计时。
Start:
mov TMOD, #02h ; 方式2, 定时器
mov TH0, #t100us
mov TL0, #t100us
mov IE, #10000010b ; EA=1, IT0 = 1
这几句是选择定时器并设置定时器工作方式,此处选择了定时器0并以工作方式2工作,方式2是自动重装,TH0减至0时,定时器到时产生中断并自动将TL0的值赋给TH0,之后重新工作。TH0和TL0决定了定时器工作起点,其中TH0是设置高八位字节,TL0是设置低八位字节(定时器总共是2个字节16位,最大值的十进制为65535)。EA=1是开总中断,IT0=1是开定时器0的中断。

mov C100us, #high(Tick)
mov C100us+1, #low(Tick)
两句是设置计数器计数起点,C100us是高位字段,C100us+1是低位字段。

T0Int:
push PSW
mov a, C100us+1
jnz Goon
dec C100us
这是定时器到时产生中断后的处理过程。先看C100us+1(即低位字段)是否为0,不为0即jnz(jump not zero)就跳转至Goon处,否则就将C100us(即高位字段)减一,然后执行Goon。

Goon:
dec C100us+1
mov a, C100us
orl a, C100us+1
jnz Exit ; 100us 记数器不为0, 返回
mov C100us, #HIGH(TICK);#high(Tick)
mov C100us+1, #LOW(TICK);#low(Tick)
cpl LEDBuf ; 100us 记数器为0, 重置记数器
; 取反LED
这几句就是判断计数器是否为0。其中 orl a, C100us+1是将高位字段与低位字断“按位与”。结果若不为0(只有在高位字断与低位字断同时为0时,结果才为0)便执行EXIT,即退出;若为0
则重置计数器,并将LED取反。

OK就是这样了,今天下午没课,一高兴就写了这么多,不要烦啊,呵呵。
温馨提示:答案为网友推荐,仅供参考