PIC16F877A定时器1实验

2019-04-15 13:07发布

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 如果你觉得我说的很啰嗦那就直接看公式吧: