[学习资料] PIC16F877A定时器1实验(转)

[复制链接]
1341|10
 楼主| qcliu 发表于 2019-6-19 11:54 | 显示全部楼层 |阅读模式
PIC16F877A单片机的Timer1是16位的,我们利用此定时器实现一个10ms的定时,在定时中断里我们再判断1s是否到了,到了之后将LED灯状态取反。
#include <htc.h>

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



 楼主| qcliu 发表于 2019-6-19 11:54 | 显示全部楼层
void main(void)
{
        TRISD=0x00;
        LED=0xff;
        timer1_init();
        while(1);
}




 楼主| qcliu 发表于 2019-6-19 11:55 | 显示全部楼层
void interrupt ISR(void)
{
        if(TMR1IF)
        {
                TMR1IF=0;
                TMR1H=0xfb;
                TMR1L=0x1e;
                if(++Counter>100-1)
                {
                        LED=~LED;
                        Counter=0;
                }
        }
}



 楼主| qcliu 发表于 2019-6-19 11:55 | 显示全部楼层

程序还是比较简单的,这里有个需要特别说明就是定时器的初始值是怎么计算的问题:

系统时钟是经过4分配后才给外设的,所以Timer1的时钟就是1Mhz(单片机外接4Mhz晶振),

假设程序里配置为8分频,那么此时Timer1的时钟

是 : 1000000/8=125000Hz

所以要想实现10ms定时,可以这样计算, 10ms就是1s的百分之一,定时器1的百分之一时间内计数值就是1250,

由于定时器是从65535变成0的时候才会产生中断,所以我们要让初始值变成65536-1250=64286=0xFB1E

如果你觉得我说的很啰嗦那就直接看公式吧:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
天灵灵地灵灵 发表于 2019-6-20 23:29 | 显示全部楼层
例子很通俗易懂。
 楼主| qcliu 发表于 2019-7-25 14:30 | 显示全部楼层
非常感谢楼上支持
598330983 发表于 2019-7-31 23:52 | 显示全部楼层
这个芯片比较古老了。
xixi2017 发表于 2019-8-5 23:07 | 显示全部楼层
为何PIC不做一些库函数呢
xixi2017 发表于 2019-8-5 23:08 | 显示全部楼层
寄存器名字跟别人的也不同,要好一段适应。
functions 发表于 2019-8-6 13:29 | 显示全部楼层
感谢楼主分享!学习一下
 楼主| qcliu 发表于 2019-9-9 15:43 | 显示全部楼层
感谢各位支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

3317

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部