特别注意事项:
1,在进行写定时器时会停止计数,填充的时候需要补偿1。
2,进入定时器中断时需要时间,填充前必须读出再减去进入中断需要的时间。
3,计算填充值时需要时间,填充计算过程中需要考虑。
例子:
活动填充值:
- #include<at89x51.h>
- #define uint8_t unsigned char
- #define uint16_t unsigned int
- #define K1 P1_0
- #define K2 P1_1
- #define L0 P2_0
- uint16_t T_D,T_X;
- void delay_ms(uint8_t xms) // 晶体为12M时循环一次为1mS
- {
- uint16_t xus;
- for(;xms;--xms)
- {
- for(xus=124;xus;--xus);
- }
- }
- void int_t0(void) interrupt 1
- {
- T_X = T_D+TL0+14; // T_X为临时变量,T_D为定时器填充值,14为补偿值,TL0当前值为进入中断所需时间
- TH0 = T_X>>8;
- TL0 = T_X;
- P2_0 = !P2_0;
- }
- void main(void)
- {
- TMOD = 0x01; // T0设置为16位定时器
- TH0 = 0xFC;
- TL0 = 0x22;
- ET0 = 1; // 开T0中断
- EA = 1; // 开总中断
- TR0 = 1; // 打开T0定时器
- T_D = 65536-1000;
- T_X = 0;
- while(1)
- {
- if(!(K1&&K2))
- {
- delay_ms(100);
- if((!K1)&&(T_D<5000))
- {
- T_D = T_D+100;
- }
- else if((!K2)&&(T_D>100))
- {
- T_D = T_D-100;
- }
- while(!(K1&&K2));
- }
- }
- }
复制代码固定填充值50mS(12M):
- #include<at89x51.h>
- #define uint8_t unsigned char
- #define uint16_t unsigned int
- #define K1 P1_0
- #define K2 P1_1
- #define L0 P2_0
- void int_t0(void) interrupt 1
- {
- TH0 = (65536-50000)/256; // 定时50mS进入中断
- TL0 = (65536-50000)%256+2+TL0; // 加上补偿时间
- P2_0 = !P2_0;
- }
- void main(void)
- {
- TMOD = 0x01; // T0设置为16位定时器
- TH0 = (65536-50000)/256; // 定时50mS进入中断
- TL0 = (65536-50000)&256;
- ET0 = 1; // 开T0中断
- EA = 1; // 开总中断
- TR0 = 1; // 打开T0定时器
- while(1);
- }
复制代码
{
TH0 = (65536-50000)/256; // 定时50mS进入中断
TL0 = (65536-50000)%256+2+TL0; // 加上补偿时间
P2_0 = !P2_0;
}
楼主能不能讲讲上面对TL0赋初值时的补偿时间啊,什么是补偿时间?为什么加上补偿时间?为什么补偿时间是加上2+TL0?
谢谢了!!
定时器溢出后会重新计数,并且触发中断,
从主函数进入中断需要时间,
在中断读出TL0 也就是进入中断的时间,
+2的计算和写入消耗的时间补偿,
如果TL0需要填充的是0,
那么在中断里面就不需要加了,
要写--TL0;因为写TH0时会导致TL0加2,所以需要减去一个!
那按照您的意思,是指每次进入中断里面都要在写入TH0和TL0耗费时间,所以对TL0要加上补偿时间,这个我理解了,但是为什么加的是2呢?还有为什么在中断中对TL0重新写入初值时还要加上TL0呢??
建议你用个仿真器测试下,在中断后的第一句做断点!
主函数就用死循环什么也不干,
中断后看到TL0就是4或者5,这个就是中断进入所需的时间,如果主函数更复杂的话需要时间更长!
加上2的原因是在计算加的时候就消耗了两个指令时间!
一周热门 更多>