PIC16F877A 定时器实验1

it2022-05-08  6

/********************* Forum:http://bbs.cepark.com Author:hnrain Date:2010-12-28 Email:hnrain1004@gmail.com *************************** 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:hnrain1004@gmail.com *************************** 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; } }

转载于:https://www.cnblogs.com/hnrainll/archive/2010/12/28/1918449.html

相关资源:STM32自学笔记

最新回复(0)