PIC16F877A 定時器實驗1
***************************
TMR0用作定時器時,定時器時鐘=系統(tǒng)時鐘/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實現(xiàn)精確的定時,一旦用了預分頻器后就不要對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;
}
}