打印
[学习资料]

PIC16F877A定时器1实验(转)

[复制链接]
906|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

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


使用特权

评论回复
5
天灵灵地灵灵| | 2019-6-20 23:29 | 只看该作者
例子很通俗易懂。

使用特权

评论回复
6
qcliu|  楼主 | 2019-7-25 14:30 | 只看该作者
非常感谢楼上支持

使用特权

评论回复
7
598330983| | 2019-7-31 23:52 | 只看该作者
这个芯片比较古老了。

使用特权

评论回复
8
xixi2017| | 2019-8-5 23:07 | 只看该作者
为何PIC不做一些库函数呢

使用特权

评论回复
9
xixi2017| | 2019-8-5 23:08 | 只看该作者
寄存器名字跟别人的也不同,要好一段适应。

使用特权

评论回复
10
functions| | 2019-8-6 13:29 | 只看该作者
感谢楼主分享!学习一下

使用特权

评论回复
11
qcliu|  楼主 | 2019-9-9 15:43 | 只看该作者
感谢各位支持

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

3315

帖子

4

粉丝