找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5870|回复: 5
收起左侧

STC12C5A60S2 定时器可调频率

[复制链接]
ID:51533 发表于 2017-2-8 13:07 | 显示全部楼层 |阅读模式
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单片机!

回复

使用道具 举报

ID:153041 发表于 2017-2-8 16:29 | 显示全部楼层
计数器工作在16位计数模式,计数初始值=65535-Fx/(f*2)。 Fx为计时器频率(51是晶振频率除以12),f是你要的频率范围(1-100),f频率越高精度越低,非线性的。每次进中断,只要把IO口反置一下即可在这个IO口上得到f频率的方波。
回复

使用道具 举报

ID:153041 发表于 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之间的频率是调不出来的。   归根到底,就是精度不够。
回复

使用道具 举报

ID:51533 发表于 2017-2-8 18:07 | 显示全部楼层
能说一说具体的公式吗?

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

使用道具 举报

ID:51533 发表于 2017-2-9 15:07 | 显示全部楼层
求助!那个大侠给个方法???
回复

使用道具 举报

ID:153041 发表于 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频率的方波。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表