whgarm 发表于 2012-3-29 07:13:47

初始化定时器疑问

本帖最后由 whgarm 于 2012-3-29 18:05 编辑

/****************************************************************************
* 文 件 名:main.c
* 功    能:使用0实现1秒定时,控制蜂鸣器蜂鸣。(查询方式)
* 说    明:****************************************************************************/
#include"config.h"
#define          BEEPCON1<<7                                                      // P0.7引脚控制B1,低电平蜂鸣

/****************************************************************************
* 名    称:Time0Init()
* 功    能:初始化定时器0,定时时间为1S。
* 入口参数:无
* 出口参数:无
****************************************************************************/
voidTime0Init(void)
{   /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
         Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
      */
    T0PR = 99;                                                                  // 设置定时器0分频为100分频,得110592Hz
      T0MCR = 0x03;                                                                   // 匹配通道0匹配中断并复位T0TC
      T0MR0 = 110592;                                                            // 比较值(1S定时值)
      T0TCR = 0x03;                                                                   // 启动并复位T0TC
      T0TCR = 0x01;
}

/****************************************************************************
* 名    称:main()
* 功    能:初始化I/O及定时器,然后不断的查询定时器中断标志。当定时时间到达时,取反BEEPCON
*         控制口。
****************************************************************************/
intmain(void)
{
    PINSEL0 = 0x00000000;                                                // 设置管脚连接GPIO   
    IO0DIR = BEEPCON;                                                         // 设置I/O为输出
    Time0Init();                                                                // 初始化定时器0      
                  
    while(1)      
    {
      while( (T0IR&0x01) == 0 );                            // 等待定时时间到
      T0IR = 0x01;                                                      // 清除中断标志
      if( (IO0SET&BEEPCON) == 0 )
      {
            IO0SET = BEEPCON;      
      }
      else
      {
            IO0CLR = BEEPCON;      
      }                              
   }
   return(0);
}


这里的T0MR0 = 110592    // 比较值(1S定时值)
是咋算出来的,110592Hz也不等于1s 啊,不明白,请大侠指教?

shell.albert 发表于 2012-3-29 07:22:20

T0PR = 99;   // 设置定时器0分频为100分频,得110592Hz
上面这句话不就确定定时器频率了嘛
即1秒钟发生110592次翻转,这不就是1秒嘛

whgarm 发表于 2012-3-29 07:27:57

1秒钟是咋定义出来的啊

whgarm 发表于 2012-3-29 07:35:16

我是初学者,你能说的详细一点吗?1秒钟发生110592次翻转,1秒钟是咋定义出来的啊 ,咋算的?

anvy178 发表于 2012-3-29 09:07:58

本帖最后由 anvy178 于 2012-3-29 09:08 编辑

你定时器的时钟分频后的频率是110592,是不?(举个简单例子,假如有一个频率是10Hz的,这就相当于这个频率1S钟变化10次,没错吧?),所以设置了你的定时器的视频率110592也就是1秒钟就变化110592次咯,然后你把你定时器的初值设置为110592,定时器的值110592是频率变化一次就就减1,等到110592减到0了,就是变化了110592次,变化了110592次 不刚好就是1S钟频率变化的次数吗?
表达不是很好 ,不知道你明白否,呵呵。。。

whgarm 发表于 2012-3-29 17:40:20

本帖最后由 whgarm 于 2012-3-29 17:43 编辑

你解释的很清楚我理解,不过有一点不明白,就是1秒钟就变化110592次,可否是2秒变化110592次呢,为啥是1秒?
定时器的时钟分频后的频率是110592,怎么是1秒?

armok 发表于 2012-3-29 17:55:56

页: [1]
查看完整版本: 初始化定时器疑问