51单片机定时器,晶振是12MHZ、12分频,理论上最短定时时间1微秒,
但是,CPU 运行指令 需要时间,只要中断服务程序 的运行时间 不超过定时器 定时时间,
并且 有些余量,则就不成问题,如果没有余量,则中断结束 又进入 中断,
如果 超过定时器 定时时间,则来不及 处理 定时也就不准确了。
用 C 语言编程,有可能 定时时间 过短 会有问题,有不好 计算中断用去多少时间。
如果用 汇编语言 编程,晶振是12MHZ、12分频,只是产生一个方波信号,30KHz 频率没有问题。
当然你要检测 准确性 加入计数程序后 会占用时间,
一般编程时, 在中断 服务程序中 尽量少占用时间,能不在中断服务程序中处理的 事尽量 不在
中断服务程序中 处理。
1微秒是每条汇编指令需要的时间,定时器中断涉及到了压栈寻址出栈等操作,天知道用了多少条汇编指令,你定个20微妙当然有问题,程序还有别的事情干,比如数码管显示(这玩意儿也很耗时),不能光响应你的中断去了。。。
如果用中断还想有一定的精度的话一般单片机的话10~20k就到顶了。
不过如果你只是想输出高频方波信号的话,我建议你不要用定时器,直接在主程序里面加循环,除去必须的代码后,根据需要的频率增加不同数量的_nop_指令,这个应该能达到更高的频率。
应该是你的中断服务程序有问题,占用时间可能太多,超过定时时间了,因此可能造成不准的情况,贴上你的定时中断程序看看,还有最好在定时程序里赋值时先作如下处理:
TR2=0;
赋值
TR2=1;
如果你要提高定时精度,你可以增加晶振频率如:24MHZ,是不是能够解决你的问题
这个单片机不是传统的51单片机,时钟比传统51的时钟要快12倍,仔细看芯片资料...