天天看點

PIC16F877A 定時器實驗1

/*********************

Forum:http://bbs.cepark.com

Author:hnrain

Date:2010-12-28

Email:[email protected]

***************************

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 <pic.h>

#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;

    }

}

/*********************
Forum:http://bbs.cepark.com
Author:hnrain
Date:2010-12-28
Email:[email protected]
***************************
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 <pic.h>
#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;
	}
}