标题: STC12C5A60S2 定时器可调频率 [打印本页]

作者: qiang275129042    时间: 2017-2-8 13:07
标题: STC12C5A60S2 定时器可调频率
void timer0_int()interrupt 1 using 0
{
TH0 = (65536-1000)/256;//1ms产生一次中断
TL0 = (65536-1000)%256;
counter++;
if(tm==counter)
{
  P1=0xff;
  for(p=0;p<150;p++);
  TF0=0;
  P1=0x00;  
  counter=0;
            }

这个是定时器0的中断程序!现在要求频率可调变化为1.00HZ到100.00HZ

现在初始值为1MS产生一次中断!

如果:TM等于1对应频率为1000,
         TM等于1000对应频率等于1
如何将tm变量经过换算成频率?
求换算公式! 这个是51单片机!


作者: utzuzu    时间: 2017-2-8 16:29
计数器工作在16位计数模式,计数初始值=65535-Fx/(f*2)。 Fx为计时器频率(51是晶振频率除以12),f是你要的频率范围(1-100),f频率越高精度越低,非线性的。每次进中断,只要把IO口反置一下即可在这个IO口上得到f频率的方波。
作者: utzuzu    时间: 2017-2-8 16:46
你这个1ms的刻度太粗了,在单片机上不能这样做,举一个最简单的例子:如果想要是100Hz,那么TM=1000/100=10;这个没问题;如果频率是99hz呢?TM=1000/99=10.1  这个10.1次在单片机里是很难算出来的,最后约等于10,输出还是100Hz,99是出不来的。。     反过来算,TM=10时输出100Hz,当TM=11时(最小刻度),输出频率是1000/11=90.9Hz。也就是说100Hz的下一个跨度是90.9Hz,90.9到100之间的频率是调不出来的。   归根到底,就是精度不够。
作者: qiang275129042    时间: 2017-2-8 18:07
能说一说具体的公式吗?

感谢上面的回复!具体怎么搞?

作者: qiang275129042    时间: 2017-2-9 15:07
求助!那个大侠给个方法???
作者: utzuzu    时间: 2017-2-10 08:24
建议直接计数器计时输出方波: 就是在定时器中断里面,计数值=65535-Fx/(f*2), IO口输出非一下(反一下)。在主程序里面设置你的f就可以啦。不需要很复杂的,几行代码就够了。
 
计数器工作在16位计数模式,计数初始值=65535-Fx/(f*2)。 Fx为计时器频率(51是晶振频率除以12),f是你要的频率范围(1-100),f频率越高精度越低,非线性的。每次进中断,只要把IO口反置一下即可在这个IO口上得到f频率的方波。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1