单片机/MCUwilliam hill官网
直播中

蔡文科

10年用户 18经验值
擅长:测量仪表 嵌入式技术 控制/MCU
私信 关注
[问答]

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

频率转换公式为什么是这样的啊: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++;
}

/*********************************************************/


回帖(2)

陈锐文

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

z00

2014-4-2 09:59:34
frq_num = ((Count *65535+Hdata * 256+Ldata) *108 / 100)   和时钟周期有关系 确实是如楼上所推算的结果
举报

更多回帖

发帖
×
20
完善资料,
赚取积分