当前位置:首页 > 单片机 > 单片机
[导读]***************************TMR0用作定时器时,定时器时钟=系统时钟/4;写TMR0时,会产生2个周期的的延时,如果不使用前置分频器,可通过设置初值进行补偿。例如 需要定时200个时钟周期时,TMR0 = 256 -200 + 2= 5

***************************
TMR0用作定时器时,定时器时钟=系统时钟/4;
写TMR0时,会产生2个周期的的延时,如果不使用前置分频器,可通过设置
初值进行补偿。
例如 需要定时200个时钟周期时,TMR0 = 256 -200 + 2= 58

OPTION_REG:

bit5 T0CS:TMR0 Clock Source Select bit

1 = Transition on T0CKI pin

0 = Internal instruction cycle clock(CLKO)

bit 4 T0SE:TMR0 Source Edge Select bit

1 = Increment on high-to-low transition on T0CKI pin

0 = Increment on low-to-high transition on T0CKI pin

bit 3 PSA:Prescaler Assignment bit

1 = Prescaler is assigned to the WDT

0 = Prescaler is assigned to the Timer0 module

bit2-0 PS2:PS0:Prescaler Rate Select bits

给大家一个意见:如果想用TMR0实现精确的定时,一旦用了预分频器后就不要对TMR0做任何写操作。

注意:在中断服务程序中查询TMR0中断时,既要查询T0IE位,还要查询T0IF位。
***********************/
#include
#include "../head/config.h"

__CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);
//HS振荡,禁止看门狗,低压编程关闭,启动延时定时器

uint16 count = 0;
void main(void)
{
PSA = 1;//prescaler is assigned to the WDT
T0CS = 0;//Internal instruction cycle clock

TMR0 = 58;//timer 200 cycle clock

GIE = 1;//global interrupt enable
T0IE = 1;//TMR0 interrupt enable

PORTD = 0x00;
TRISD = 0x00;

while(1)
{}
}

void interrupt ISR(void)
{
if(T0IE && T0IF)
{
T0IF = 0;
count++;
if(count == 1000)
{
count = 0;
PORTD = ~PORTD;
}
TMR0 = TMR0 + 58;
}
}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭