PIC16F877A单片机的Timer1是16位的,我们利用此定时器实现一个10ms的定时,在定时中断里我们再判断1s是否到了,到了之后将LED灯状态取反。
#include
#define u8 unsigned char
#define u16 unsigned int
__CONFIG(0xFF32);
#define LED PORTD
char Counter=0;
void timer1_init()
{
T1CKPS0=1; //1:8
T1CKPS1=1;
TMR1CS=0; //定时器模式
TMR1IE=1;
TMR1H=0xfb; //10ms@4MHz
TMR1L=0x1e;
TMR1ON=1;
PEIE=1;
GIE=1;
}
void main(void)
{
TRISD=0x00;
LED=0xff;
timer1_init();
while(1);
}
void interrupt ISR(void)
{
if(TMR1IF)
{
TMR1IF=0;
TMR1H=0xfb;
TMR1L=0x1e;
if(++Counter>100-1)
{
LED=~LED;
Counter=0;
}
}
}
程序还是比较简单的,这里有个需要特别说明就是定时器的初始值是怎么计算的问题:
系统时钟是经过4分配后才给外设的,所以Timer1的时钟就是1Mhz(单片机外接4Mhz晶振),
假设程序里配置为8分频,那么此时Timer1的时钟
是 : 1000000/8=125000Hz
所以要想实现10ms定时,可以这样计算, 10ms就是1s的百分之一,定时器1的百分之一时间内计数值就是1250,
由于定时器是从65535变成0的时候才会产生中断,所以我们要让初始值变成65536-1250=64286=0xFB1E
如果你觉得我说的很啰嗦那就直接看公式吧: