历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2018年07月30日 | PIC单片机之定时器(TMR1)

2018-07-30 来源:eefocus

之前我们讲解了TMR0定时器,现在我们来讲解16位定时器TMR1,TMR1和TMR0最大的差别就是TMR1是16位定时器。所以TMR1两个八位寄存器 TMRH 和TRMRL组成.许多有关定时器的基础知识我就不在赘述了可以看TMR0的文章。我单刀直入讲实例了。

实例讲解:如果我们想隔0.5S输出个高电平,0.5S输出个低电平那要怎么做呢?

首先:先选择合适的时钟频率和预分频。这个只要满足需要的延时时间就行了。这里我们选择时钟为4MHZ,预分频为1:8;

然后:设置TMR1定时器的初始值,初始值的作用即是设置TMR1的溢出时间,(设置溢出时间的原因是)

比如在初始值为0的情况下,定时器需要经过524288us的时间才溢出,

如果初始值为3036,定时器就在这个值的基础上一直加上去,需要的时间为0.5s才溢出。

这个的时间是怎么计算出来的呢,最长的定时时间-需要定时的时间=初始值的时间。524288us-500000us=24288us.

初始值的时间/预分频器溢出的周期=初始值 24288us/8us=3036.将其转换为十六进制为0x0BDC将高位存入TMR1H寄存器,将低位存入TMR1L寄存器。

程序如下: TMR1H=0x0B;

                      TMR1L=0xDC;

指令周期x预分频比=预分频器溢出的周期  1usX8=8us

时钟周期x4=指令周期  0.25usX4=1us.详见上图。


这只是我个人理解方式有兴趣的朋友可以看看:

      我们可以将分频器,寄存器,还有溢出中断标志这几个名词完全不一样的东西理解成同一个22位寄存器。

下面是一个由4分频,8分频TMR1L,TMR1H,TMR1IF组成的一个22位寄存器。定时就是该寄存器对时钟周期的计数。

该表格的值是TMR1H刚溢出TMR1IF为1时的数值。二进制数10000,0000,0000,0000,0000,0代表的十进制为2097152,2097152×0.25us=524288us 


初始化设置 T1CON:TIMER1控制寄存器

我重点要设置就是设置预分频比,和开启TMR1其他默认为0就行了。T1CKPS<1:0>设置为11,TMR1ON设置为1,。

所以设置 T1CON = 0x31; //enable TIMER1 ,1:8

实例程序:

#include

__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON

                         &FCMEN_ON&IESO_ON&CLKOUTEN_OFF);
__CONFIG(PLLEN_ON&LVP_OFF);


#define TMR1H_value  0x0B

#define TMR1L_value  0xDC

#define true 1

#define false 0

#define LED LATA5

unsigned int timer1_counter;

void init_timer1()
{
    T1CON = 0x31; //enable TIMER1 ,1:8
}

void init_time1_count() //设置以0.5S为单位的延时初始化设置

{

   TMR1H= TMR1H_value;
    TMR1L= TMR1L_value;
    TMR1IF = 0;
    timer1_counter=0;

}

/*以0.5S为单位 limit  的数代表延时几个单位。

 比如limit=3那么就是延时1.5S。时间到了函数返回 true ,时间没到返回 false

*/

unsigned char time1_count(unsigned int limit)
{
    if(PIR1bits.TMR1IF == 1 )
    {
        timer1_counter++;
        TMR1H=TMR1H_value;
        TMR1L=TMR1L_value;
        TMR1IF=0;
    }
    if(timer1_counter >= limit)
    {
      return true;
    }
    else
    {
        return false;
    }
}

 void init_fosc(void)

{

 osccon = 0x68;//4mhz

}

void init_gpio(void)

{

   PORTA =0;

  LATA =0;

 ANSELA =0;

 TRISAbits.TRISA5=0;//RA5设置成输出 用来控制LED

}

void main(void)

{

  init_fosc();

  init_gpio();

  init_timer1();

  while(1)

  {

   LED = 1;//LED灯亮

     init_time1_count()//初始化定时初始值

    while(time1_count(1)==false)//延时0.5s

     {

      /*这里面可以写一些定时期间需要执行的程序*/

     }

   LED = 0;//LED灯灭


      init_time1_count()//初始化定时初始值

    while(time1_count(1)==false)

     {

     }

  }   

}


推荐阅读

史海拾趣

Autonics公司的发展小趣事

作为一家具有社会责任感的企业,Autonics不仅注重经济效益的发展,还积极参与公益事业和环保活动。公司致力于推动绿色生产,减少对环境的影响。同时,Autonics还关注员工福利和社会贡献,为员工提供良好的工作环境和发展空间,积极回馈社会。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

以上五个故事仅是对Autonics公司发展起来的一些重要阶段的概括性描述,并未涉及具体的细节和内部信息。如需了解更多关于Autonics公司的发展历程和故事,建议查阅相关新闻报道、行业分析报告或公司官方网站。

昆泰(CHRONTEL)公司的发展小趣事

进入21世纪后,昆泰的创始人Dr. Gillings不满足于CRO企业的平稳收益和稳定现金流,他开始寻求与药企建立更加紧密的战略合作伙伴关系。为此,昆泰在2000年成立了PharmaBio部门,通过资金、技术和销售团队为客户提供全方位的支持。这一战略转型不仅使昆泰与药企建立了深厚的合作关系,还为其带来了丰厚的回报。

FDK AMERICA公司的发展小趣事

随着环保意识的日益增强,FDK AMERICA公司积极响应绿色制造理念。公司投入大量资金研发环保型电子产品,采用环保材料和绿色生产工艺,减少对环境的影响。同时,公司还积极参与各类环保活动,倡导绿色消费理念。这种环保举措不仅提升了公司的社会形象,也为公司赢得了更多消费者的青睐。

Hi-Tech Resistors Pvt Ltd公司的发展小趣事

在竞争激烈的电子市场中,FDK AMERICA公司始终坚持品质至上的原则。公司严格控制产品质量,从原材料采购到生产流程再到售后服务,每一个环节都力求做到精益求精。这种对品质的执着追求赢得了客户的信赖,也为公司树立了良好的品牌形象。

Azoteq公司的发展小趣事

2013年,Azoteq发布了第三条产品线——PowerSense™。这一产品系列主要包括一系列交流LED照明解决方案,为照明行业带来了全新的技术突破。PowerSense™的推出,不仅进一步巩固了Azoteq在半导体行业的地位,也为其在未来的市场竞争中赢得了更多机会。

American Power Management Inc公司的发展小趣事

随着电子行业的快速发展,新技术不断涌现,市场竞争也日趋激烈。面对这一变革,APMI及时调整战略,加大研发投入,紧跟技术潮流。公司不仅推出了多款具有竞争力的新产品,还积极拓展新的应用领域,如新能源汽车、物联网等。通过不断创新和拓展,APMI成功应对了行业变革带来的挑战,保持了持续稳健的发展态势。

问答坊 | AI 解惑

如何看待视频监控下的另一个潜力市场?

大众运营市场是运营商多年来极力推广的一个市场,但实际推广得还不太好。国内大部分运营商参与这块市场,目前主要针对的不是普通用户和私人企业,而是政府用户为主。他们采取先垫资,然后向政府收取运营费用的方式进行,主要集中在公共场所监控领域 ...…

查看全部问答>

程序交换机-串口通信

我在做一个程控交换机的计费软件和能控制程控交换机的软件,是用串口通信的,牌子是国威的ws82(10),,请问通信的协议的什么,,格式是什么。。。。 有没有人知道啊…

查看全部问答>

创建的纯资源DLL(电量图标)系统始终加载不上是什么原因?内付代码

首先是注册表的修改: [HKEY_LOCAL_MACHINE\\Security\\ResOver\\Bitmaps] \"BaseDll\"=string:\"batteryIcon.dll\" \"BatteryIconIdStart\"=dword:100 \"BatteryIconLevels\"=dword:1 BaseDll points to the DLL from which overridden bi ...…

查看全部问答>

压缩解压的代码

象WinRAR那样无损压缩和解压的代码或者算法哪里有啊? 那个大侠有啊?…

查看全部问答>

TASKING C166 V8.5正版软件分享

正版软件实在太贵,个人买恐怕负担不起的, KEIL C166 V6正版42000元 TASKING C166 V8.5我们公司几个人用花了10000多元 现在我把公司买的正版TASKING C166 V8.5与大家分享一下. 如果谁有KEIL C166 V6的我希望也和大家分享一下, 共同使用,共同学 ...…

查看全部问答>

打开wifi后,如何连接指定的网络

已经打开wifi,并且找到网络了,怎么才能连接到指定的网络呢,如果包含密码应该如何传递密码?还有就是怎么判断网络已经连接好了?…

查看全部问答>

[现在DM9000a的34引脚‘INT’一直为低,即是没有中断信号]

x86架构下,vxworks系统,现在DM9000a的34引脚‘INT’一直为低,即是没有中断信号。 我现在应该如何操作呢?…

查看全部问答>

求助,wince5.0 下使用FTDI2232D 网卡驱动问题!

我的环境是基于X86的winCE 5.0平台,使用的FTDI 公司的FTD2232D USB 转串口 芯片,他的网站提供CE下的驱动程序,这款芯片有两种通讯配置方式:虚拟串口和D2XX,在我的CE系统中,VCP(虚拟串口的)配置使用时没有问题的,可D2XX(直接通讯方式),每 ...…

查看全部问答>

单片机串行通信用共阴极LED怎么就不行?

现做两单片机之间的串行通信仿真实验,当我用共阴极LED时,其显示发生错误,但是当我换成共阳极LED时,其显示正确。用共阴极或共阳极时,其显示段码也换成相应的显示段码。段码应该没有错,因为我用它做LED静态或动态显示时是正确的。 代码如下: ...…

查看全部问答>

请问STR910能否用Wiggler调试?

                                 H-Jtag好像不支持…

查看全部问答>