微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 555频率转换公式!新手求助。

555频率转换公式!新手求助。

时间:10-02 整理:3721RD 点击:
频率转换公式为什么是这样的啊:frq_num = ((Count *65535+Hdata * 256+Ldata) *108 / 100)   关键是*108/100这部分

源代码:
/*********************************************************
*                                                        *
* 主函数                                                 *
*                                                        *
*********************************************************/
void main()
{
  unsigned char m;
  unsigned long frq_num;
  P3 = 0xff;
  lcd_init();
  lcd_pos(0x00); //设置显示位置为第一行
  for (m = 0; m < 16; m++)
    lcd_wdat(cdis1[m]);
  //显示字符
  lcd_pos(0x40); //设置显示位置为第二行
  for (m = 0; m < 16; m++)
    lcd_wdat(cdis2[m]);
  //显示字符
  TMOD = 0x51; //定时器0工作在定时方式
  //定时器1工作在计数方式
  TH0 = 0x4c; //50ms定时
  TL0 = 0x00;
  TH1 = 0x00; //计数初值
  TL1 = 0x00;
  ET0 = 1; //使能TIMER0中断
  ET1 = 1; //使能TIMER1中断
  EA = 1; //允许中断
  PT1 = 1; //定义TIMER1中断优先
  TR0 = 1;
  TR1 = 1;
  while (1)
  {
    if (sec)
    {
      Hdata = TH1; //取计数值
      Ldata = TL1;
      frq_num = ((Count *65535+Hdata * 256+Ldata) *108 / 100);
      TH1 = 0;
      TL1 = 0;
      sec = 0;
      Count = 0;
      TR1 = 1;
      TR0 = 1;
    }
    temp = frq_num;
    play();
  }
}
/**********************************************************
*                                                         *
* Time0中断函数                                           *
*                                                         *
**********************************************************/
void Time0()interrupt 1
{
  TH0 = 0x4c; //50ms定时
  TL0 = 0x00;
  msec++;
  if (msec == 20)
  //50*20=1S
  {
    TR0 = 0; //关闭TIMER0
    TR1 = 0; //关闭TIMER1
    msec = 0;
    sec = 1; //置秒标记位
  }
}
/**********************************************************
*                                                         *
* Time1中断函数                                           *
*                                                         *
**********************************************************/
void Time1()interrupt 3
{
  Count++;
}
/*********************************************************/

经过本人亲身的实践,发现的确不明白小编的问题所在,Count *65535+Hdata * 256+Ldata,这个就是计得的次数。后来我想想,发现:如果系统是晶振不是12M,也就是说机器周期不是1us。如果晶振是11.0592M,那机器周期就是1.08507us。那定时器0,算出来的时间不是1s,那么他的频率大概应该是:frq_num = ((Count *65535+Hdata * 256+Ldata) *108 / 100);个人见解,不知道是否正确,还请各位大神提出更高的见解。

frq_num = ((Count *65535+Hdata * 256+Ldata) *108 / 100)   和时钟周期有关系 确实是如楼上所推算的结果

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top