求助-定时器

[复制链接]
 楼主| wytianyi 发表于 2007-5-23 10:38 | 显示全部楼层 |阅读模式
SYSCLK为定时器的时钟源,
TH1=(-SYSCLK/1000)>>8;
TL1=-SYSCLK/1000;
这样设置定时器就是1ms,为什么TH1,TL1是这么设置的啊??
古道热肠 发表于 2007-5-23 10:55 | 显示全部楼层

定时器的初始值是算出来的

   你那种写法不对吧!至少得给出工作模式
  我有个试过的,给你看看
#define   FOSC                    11059200L
//#define   FOSC                    18432000L

#define   MACHINE_NUM             12          /*根据需要调整,如:W777E58=4*/
#define   TICKS_PER_SEC           20            /* # of clock ticks to obtain 1 second               */

void Init_sys_timer(void)
{
  BYTE_WORD Init_value; 

  
  Sys_clk_init();  
    
  T2CON=0x00;
//定时器2使用机器周期作为计数脉冲(Fosc/12)
  Init_value.word=FOSC/((ulong)TICKS_PER_SEC*MACHINE_NUM); 
//  Init_value.word=38400; 
  TH2=RCAP2H=-Init_value.bytes.high;
  TL2=RCAP2L=-Init_value.bytes.low;

//    ComSendTxt ("TH2Value", &Init_value, 2);

//启动定时器2工作
      ET2=1;
    TR2=1; 
//开中断总开关    
    ENTER_CRITICAL();   
  //TMOD&=0xF0;                  //使用定时器0,但在中断中需要重新赋初值,因而我更倾向用Timer2
  //TMOD|=0x01;
  
 // Init_value.word=FOSC/(TICKS_PER_SEC*MACHINE_NUM); 
  //TH0=-Init_value.bytes.high;
  //TL0=-Init_value.bytes.low;

  //ET0=1;
  //TR0=1;
}
 楼主| wytianyi 发表于 2007-5-23 11:05 | 显示全部楼层

不理解我这个怎么算的

我也是看的,F020单片机的

void SYSCLK_Init (void)
{
   int i;                                          // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                                    // 22.1184MHz crystal

   for (i=0; i < 256; i++) ;               // XTLVLD blanking interval (>1ms)

   while (!(OSCXCN & 0x80)) ;      // Wait for crystal osc. to settle

   OSCICN = 0x88;                       // select external oscillator as SYSCLK
                                                   // source and enable missing clock
                                                   // detector
}

void Timer0_Init (void)
{
   CKCON|=0x8;   //T0M=1(CKCON.3),T0用系统时钟作为时钟基准正确。
   TMOD|=0x1;                                                //16Bit
   TR0 = 0;                                                      // STOP Timer0
   TH0 = (-SYSCLK/1000) >> 8;                      // set Timer0 to overflow in 1ms
   TL0 = -SYSCLK/1000;
   TR0 = 1;                                                      // START Timer0
   IE|= 0x2; 
}
不明白这里的TH0和TL0是怎么算的
zxq1234508 发表于 2007-5-23 11:23 | 显示全部楼层

遇到过

曾经遇到过这样得问题,也不是很明白,这种计算方法是有得,但是不是很精确,甚至会产生很大得误差。那位大虾说说看,LZ说得是怎么个计算得。定时值该是多少啊?
 楼主| wytianyi 发表于 2007-5-23 14:04 | 显示全部楼层

ding

ding
infree 发表于 2007-5-23 15:00 | 显示全部楼层

这个应是正确的

SYSCLK/1000计算出1ms定时需要计数的次数,而加上负号就是计数的初值。即若计数次数应为1000次,则-1000对应的16位整数为FC18(补码),FFFF-FC18整好是1000次。
ww4u 发表于 2007-5-23 20:00 | 显示全部楼层

正解,顶!

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

本版积分规则

1

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部