这是编译器造成的,你最好用Debug模式看看生成的汇编代码是什么摸样,比较一下你那三种方 式给TH0和TL0赋的是什么样的值。
这是我试验的结果:
4: TH0=-780/256;
C:0x0003 758CFD MOV TH0(0x8C),#0xFD
5: TL0=-780%256;
C:0x0006 758AF4 MOV TL0(0x8A),#0xF4
6: TH0=-516/256;
C:0x0009 758CFE MOV TH0(0x8C),#0xFE
7: TL0=-516%256;
C:0x000C 758AFC MOV TL0(0x8A),#0xFC
8: TH0=(65536-516)/256;
C:0x000F 758CFD MOV TH0(0x8C),#0xFD
9: TL0=(65536-516)%256;
C:0x0012 758AFC MOV TL0(0x8A),#0xFC
看出差别了吧?使用-780时给T0赋值0xFDF4,使用第三种方式赋值为0xFDFC,这两个数字相近,所以结果基本正确。但是使用-516时赋值的0xFEFC,这差别就大了,结果就是不正确。
一般建议用TH0=(65536-516)/256 ;TL0=(65536-516)%256;这种方式,保证不出问题。
定时器是从小到大计数的,前2个设置是错误的。
另外,定时器中断处理时有时间开销,如寄存器入栈。尤其是用c编译器,额外开销是不可见的。
学习单片机、CPLD,请到“电子设计网dzsj”
用中断来做,指令也要占用时间。轮询会随机不确定的。
每条指令也需要时间呀,当然不是516,而是780很正常,你可以减掉这个误差值呀,