C8051F330定时器功能

摘要:

使用定时器016位定时器(方式2)模式,实现100us中断。
系统时钟使用内部高频时钟24.5M
定时器时钟采用系统时钟4分频

宏定义:

#define SYSCLK   (24500000)
#define AUX2     (0xFD91)              //100us定时所需要的计数(定时器时钟是系统时钟5分频)
#define AUX3     (AUX2&0x00FF)
#define AUX4     ((AUX2&0xFF00)>>8)

#define TIMER0_RELOAD_HIGH       (AUX4)  // Reload value for Timer0 high byte
#define TIMER0_RELOAD_LOW        (AUX3)  // Reload value for Timer0 low byte
比较难理解的就是计算这个地方,单片机计算需要有一个同65535相减的过程,这个细节需要注意:
实例计算:
假设C8051F330单片机的晶振是24500000HZ,测每秒计24500000个数
经过4分频后,每秒计24500000÷4=6125000个数,我们需要100us的时间,则需要设置的计数器值为6125000*0.0001s=612.5,取613。则我们需要装填到寄存器中的值为65535-613=649220xFD9A
配置函数:
void Timer0_Init(void)
{
	TH0 = TIMER0_RELOAD_HIGH;
	TL0 = TIMER0_RELOAD_LOW;
	
	TMOD |= TMOD_GATE0_NOINT1 | TMOD_CT0_TIME | TMOD_TIME0_BIT_16;          //无边沿出发,TIME1定时器,TIME0计数器	
	CKCON |= CKCON_T0M_SCA | CKCON_SCA_SYSCLOCK_4;                          //定时器时钟来源及分频选择
	ET0 = 1;            //定时器中断使能
	TCON |= TCON_TR0_EN;//定时器使能	
}

上面是宏定义的配置方式,如果不想用宏定义,直接配置寄存器(按照bit配置):
static void Timer0_Init(void)
{
	TH0 = TIMER0_RELOAD_HIGH;
	TL0 = TIMER0_RELOAD_LOW;
	
	TMOD &= ~((1<<3) | (1<<2) | (1<<1));//非捕捉,16位+定时器模式
	TMOD |= (1<<0);
	
	CKCON &= ~((1<<2) | (1<<1));                //时钟来源SCA,系统时钟4分频
	CKCON |= (1<<0);
	
	IE |= (1<<1);                      //定时器中断使能
	TCON |= (1<<4);                    //定时器0使能
}

上面这个配置方式对于没有宏定义的寄存器配置具有很好的参考意义,比较要的地方就是注意某一bit位置1要用“|= |”的方式,而对于置0要采用“&= ~(|)”的方式,不明白读者的可以拿实际数据验证一下。另外“&= (|)”的方式和“&=(())| (~())”不一样,需要注意一下
中断函数:

void Timer0_ISR (void) interrupt 1
{
		//动作
   LED1 = ~LED1;                        // 只是一个简单引脚的翻转,用来测试定时器翻转周期
   TH0 = TIMER0_RELOAD_HIGH;           /// Reinit Timer0 High register
   TL0 = TIMER0_RELOAD_LOW;            /// Reinit Timer0 Low register
}

测试结果:
因为内部高频时钟会有%2的精度误差,以及小数的处理,实际输出约11us

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值