大家好(我一點也不好):
我用了一顆PIC12F629做計時器, 使用內部OSC 4MHz, GPIO2接LED, 程式如下:
參考
http://www.microchip.com.tw/modules/n ... e=flat&order=ASC&start=10
#include <pic.h>
// 每50ms(0.05s)計數一次
// (4Mhz/4) [1*(50000)] = 50mS (內部振盪器:4MHz, Prescale:1)
#define TMR1H_VALUE 256-(unsigned char)((4000000/4 * 0.05)/256)-1
#define TMR1L_VALUE 256-(unsigned char)(4000000/4 * 0.05) % 256
#define WARNNING_LED GPIO2
//**********************************
//* Function Prototype Declaration
//**********************************
void interrupt isr_Sevr ( void );
void Initial_Timer1Int(void);
// ================================================================
// **** Establish PIC12F629 Configuration Word
// **** == Internal Oscillator No Clock Mode
// **** == Watch-Dog Timer Off
// **** == Power Up Timer Off
// **** == MCLR Enable External
// **** == Brown-Out Detect Enabled
// **** == Code Protect Off
// **** == Data EE Read Protect Off
//__CONFIG (INTRC_OSC_NOCLKOUT & WDT_OFF & PWRTE_OFF & MCLRE_EXT & BODEN_ON & CP_OFF & CPD_OFF);
unsigned long _50ms = 0;
unsigned long _1s = 0;
unsigned long _1m = 0;
//---------------------------------------------------------------------------
//*********************************
//* program main()
//*********************************
void main(void)
{
// 校正內部Oscillator 4Mhz
OSCCAL = _READ_OSCCAL_DATA();
// Initial GPIO
GPIO = 0; // Init GPIO
CMCON = 0x07; // Set GP<2:0>(CM<2:0>) to digital IO
TRISIO = 0b00000011; // Set GP<1:0> as input and GP<2> as output
Initial_Timer1Int();
while (1)
{
if (_50ms >= 20) // 1秒
{
_50ms = 0;
_1s++;
}
if (_1s>=60) // 1分鐘
{
_1s = 0;
_1m++;
WARNNING_LED = !WARNNING_LED;
}
}
}
//---------------------------------------------------------------------------
//***********************************************
//* Interrupt Service Routine *
//***********************************************
void interrupt isr_Sevr ( void )
{
//GIE = 0; // INTCON<7> Disables all interrupts
if (TMR1IF) // PIR1<0>
{
TMR1H = TMR1H_VALUE;
TMR1L = TMR1L + TMR1L_VALUE;
TMR1IF = 0;
_50ms++;
}
//GIE = 1; // INTCON<7> Enables all unmasked interrupts
}
//---------------------------------------------------------------------------
//***********************************************
//* Initial Timer1 Interrupt
//***********************************************
void Initial_Timer1Int(void)
{
TMR1H = TMR1H_VALUE;
TMR1L = TMR1L_VALUE;
// Enable Timer1
T1CON = 0b00000001; // Enable Timer1, Internal Clock(Fosc/4), LP Oscillator is Off,
// 1:1 Prescale Value, Timer1 is On ignore !T1G
TMR1IE = 1; // PIE1<0> Enable Timer1 Interrupt
PEIE = 1; // INTCON<6> Enables all unmasked peripheral interrupts
GIE = 1; // INTCON<7> Enables all unmasked interrupts
TMR1IF = 0; // PIR1<0> TMR1 register overflowed (must be cleared in software)
}
為何1分鐘就會快個0.5秒, 真傷腦筋