单片机定时器模式的使用_单片机定时器代码_单片机定时器程序

陈翠 发表于 12-08 收藏 已收藏
赞(0) •  评论(0

评论

当前没有评论,快来抢沙发
打开电子发烧友,查看全部评论
赞(0) •  评论(0

单片机定时器模式的使用_单片机定时器代码_单片机定时器程序

陈翠 发表于 12-08 收藏 已收藏
陈翠 电子工程师 + 关注

  定时器和计数器是单片机内部的同一个模块,这篇文章我们主要讲解定时器。顾名思义,定时器就是用来进行定时的。定时器内部有一个寄存器,我们让它开始计数后,这个寄存器的值每经过一个机器周期就会自动加 1,因此,我们可以把机器周期理解为定时器的计数周期。

  就像我们的钟表,每经过一秒,数字自动加 1,而这个定时器就是每过一个机器周期的时间,也就是 12/11059200 秒,数字自动加 1。还有一个特别注意的地方,就是钟表是加到 60 后,秒就自动变成 0 了,这种情况在单片机或计算机里我们称之为溢出。

  单片机定时器模式的使用

  定时器模式0的使用 TMOD&=0xf0/TMOD&=0x0f

  单片机定时器模式的使用_单片机定时器代码_单片机定时器程序

  TL0高3位不用,低5位溢出时,直接向TH0进位。

  通过设置TH0和TL0初值(0~8191),使计数器从初值开始加1,溢出后申请中断,溢出后需重新设置初值,否则将从0开始加1计数。

  T=(模值-初值)*机器周期,初值为8191位技术最小值1,初值为0为计数最大值8191。

  定时器模式1(TMOD=0xf1/TMOD=0x1f)

  模式1和模式0功能相同,但模式1位16位。

  定时器模式2(TMOD=0x2f/0xf2)

  模式2构成自动重装的8位定时器,计数器的范围为0~256

  单片机定时器模式的使用_单片机定时器代码_单片机定时器程序

  TH作为初值寄存器,TL作为计数寄存器。TL溢出时,置位中断标志位,并且把TH中的值自动装入TL。

  定时器模式3,模式3只适用于定时器0

  模式3时定时器构成2个独立的8位计数器。

  单片机定时器模式的使用_单片机定时器代码_单片机定时器程序

  此模式下,TL0和模式0,1状态一样可以做计数和定时。TH0只能用于定时不能用于计数,并占用T1的资源TF1和TR1。

  单片机定时器代码_单片机定时器程序

  程序先使用定时器0,在使用定时器的时候,需要以下几个步骤:

  第一步:设置特殊功能寄存器TMOD,配置好工作模式;

  第二步:设置计数寄存器TH0和TL0的初值;

  第三步:设置TCON,通过打开TR0位来让定时器开始计数。

  第四步:判断TCON寄存器的TF0位,监测定时器溢出情况。

  写程序之前,我们要先来学会计算如何用定时器定时时间。我们以晶振是11.0592M为例讲解,时钟周期就是1/11059200,机器周期就是12/11059200,我们假如要定时20ms,就是0.02秒,要经过x个机器周期得到0.02秒,我们来算一下x*12/11059200=0.02,得到x= 18432。

  那么我们现在16位的定时器溢出值是65536,我们可以这样,先给TH0和TL0一个初值,让他们经过18432个机器周期后刚好溢出,溢出后我们可以通过检测TF0位得知,就刚好是0.02秒。这个初值y = 65536 - 18432 = 47104,转成16进制就是0xB800,那么就是TH0 = 0xB8,TL0 = 0x00。

  那0.02秒我们已经定时出来了,细心的同学会发现,我们如果初值直接给一个0x0000,一直到65536溢出,定时器定时值最大也就是71ms左右,那么我们想定时更长时间怎么办呢?用你小学学过的逻辑,倍数关系就可以解决此问题。

  那好了,我们下面就用程序来实现以下这个功能。

  #include //包含寄存器的库文件

  sbit LED = P0^0;

  sbit ADDR0 = P1^0;

  sbit ADDR1 = P1^1;

  sbit ADDR2 = P1^2;

  sbit ADDR3 = P1^3;

  sbit ENLED = P1^4;

  void main()

  {

  unsigned char counter = 0;

  ENLED = 0; ADDR0 = 0; ADDR1 = 1;

  ADDR2 = 1; ADDR3 = 1; LED = 1; //74HC138和LED灯初始化部分

  TMOD = 0x01; //设置定时器0为模式1

  TH0 = 0xB8;

  TL0 = 0x00; //定时值初值

  TR0 = 1; //打开定时器0

  while(1)

  {

  if(1 == TF0) //判断定时器0是否溢出

  {

  TF0 = 0;

  TH0 = 0xB8; //一旦溢出后,重新赋值

  TL0 = 0x00;

  counter++;

  if(50 == counter) //判断定时器0溢出是否达到50次

  {

  counter = 0; //counter清0,重新计数

  LED = !LED; //LED取反操作,0--》1,1--》0

  }

  }

  }

  }

  程序都有注释,不难理解,这里要解释一个地方,就是两次if判断,细心的同学会发现,if(1 == TF0)这句,我把1写前边,这个地方我推荐新手按照我这样来写,因为如果我们写if(TF0 == 1),作为新手来说,不小心丢掉一个’=’号后,写成if(TF0 = 1),这样实际上在语法上是可以通过的,我们用的Keil4还会出一个警告说明一下,Keil以前的版本以及一些其他软件,可能根本不会出任何错误或者警告提示,但是这样产生的Hex文件下载到单片机里边,程序就错了,大家可以改改试试看。

  本程序实现的结果是小灯点亮持续一秒,熄灭持续一秒,也就是以0.5HZ的频率进行闪烁。

分享到

QQ空间 QQ好友 微博
取消