;看了论坛里很多关于定时器精度的帖子,很是迷惑,一个定时器有那么难伺候吗,特地写一段,12MHZ,定时器0无累计误差和相对误差,绝对误差可以通过T0H、T0L的初始值一次性修正。有比这精度更高的欢迎贴出来探讨 TL EQU 030H ;保存定时器响应时间用 T0H DATA 0F8H ;修改T0HT0L可以得到想要的定时中断 T0L DATA 036H
ORG 0000H LJMP MAIN ORG 000BH MOV TL,TL0 ;中断响应时的定时器值保存用于后面修正用 LJMP CTC0 ORG 001BH LJMP CTC1 ORG 30H MAIN: MOV SP,#080H MOV TMOD,#011H SETB PT0 ;此级别必须最高 SETB ET0 SETB TR0 SETB ET1 SETB TR1 SETB EA LOOP: NOP ;主循环的任何指令都不会影响执行时间,虽然影响中断响应速度 NOP LJMP LOOP ;=== CTC0: PUSH PSW PUSH DPH PUSH DPL PUSH ACC MOV A,TL ;不同的TL会跳得不同的距离 MOV DPTR,#TAB JMP @A+DPTR TAB: NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ;NOP指令不能太少,否则不够跳而出现错误 NOP NOP MOV TH0,T0H MOV TL0,T0L CPL P1.0 ;此处开始软件方面无误差(可以根据实际情况修改输出以便用示波器观察) NOP POP ACC POP DPL POP DPH POP PSW RETI CTC1: PUSH PSW POP PSW RETI END (为方便去掉了无关的其它中断细节) |