;定时器实验
T100us equ 256-50 ;100us时间常数(6M)
C100us equ 30h ;100us计数单元
LEDBuf equ 0
LED equ P1.0
ljmp Start
org 000bh
T0Int: ;中断子函数
push PSW
mov a,C100us+1
jnz Goon
dec C100us
Goon:
dec C100us+1
mov a,C100us
orl a,C100us+1
jnz Exit
mov C100us,#27h ;要定时10000次才能达到一秒,10000的十六进制位2710h,存储时先放高字节。
mov C100us+1,#10h
cpl LEDBuf
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 LED
mov C100us,#27h ;要定时10000次才能达到一秒,10000的十六进制位2710h,存储时先放高字节。
mov C100us+1,#10h
Loop:
mov c,LEDBuf
mov LED,c
ljmp Loop
end
1,reti
概念
RETI是中断返回指令
这条指令的功能和RET指令相似,2条指令的不同之处,是本指令除了中断响应时,被置1的MCS-51内部中断优先级寄存器的优先级状态。
中断程序完成后,一定要执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。中断指令“RETI”作为中断跳出指令,除了将堆栈中保存着的地址取出,送回PC,使程序从主程序的中断处继续往下执行的作用外,还有将“优先级生效”触发器清零的功能。
2,注意点
mov C100us,#27h ;要定时10000次才能达到一秒,10000的十六进制位2710h,存储时先放高字节。
mov C100us+1,#10h
笔者开始没有写#号,导致了奇怪错误
3,orl a,C100us
把a累加器和C100us中得值进行或运算。
4,一段经典写法:
mov a,C100us+1
jnz Goon
dec C100us
Goon:
dec C100us+1
经典的用两个变量做减法,控制每次减一的算法!好!
<!--EndFragment-->