新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 学51单片机定时器

学51单片机定时器

作者:时间:2012-08-08来源:网络收藏

在这里,小编带你一起从零开始学。基于单片机的电路原理图如下所示:

学51单片机定时器


  我们学单片机是首先学的就是 led 闪烁,那是用做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们能用来实现灯的闪烁的功能。

  例 1:查询方式

  ORG 0000H

  AJMP START

  ORG 30H

  START:

  MOV P1,#0FFH ;关所 灯

  MOV TMOD,#00000001B ;定时/计数器 0 工作于方式 1

  MOV TH0,#15H

  MOV TL0,#0A0H ;即数 5536

  SETB TR0 ;定时/计数器 0 开始运行

  LOOP:JBC TF0,NEXT ;如果 TF0 等于 1,则清 TF0 并转 NEXT 处

  AJMP LOOP ;不然跳转到 LOOP 处运行

  NEXT:CPL P1.0

  MOV TH0,#15H

  MOV TL0,#9FH;重置定时/计数器的初值

  AJMP LOOP

  END AJMP LOOP

  END

键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。简单地分析一下程序,为什么用 JBC 呢?TF0 是定时/计数器 0 的溢出标记位,当定时器产生溢出后,该位由 0 变 1,所以查询该位就可知宇时时间是否已到。该位为 1 后,要用软件将标记位清 0,以便下一次定时是间到时该位由 0 变 1,所以用了 JBC 指令,该指位在判 1转移的同时,还将该位清 0。

  以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不,不对,我们能在 LOOP:……和 AJMP LOOP 指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件的时候不是也能用一些指令来替代 DJNZ 吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的 DJNZ 循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。

  程序 2:用中断实现

  ORG 0000H

  AJMP START

  ORG 000BH ;定时器 0 的中断向量地址

  AJMP TIME0 ;跳转到真正的定时器程序处

  ORG 30H

  START:

  MOV P1,#0FFH ;关所 灯

  MOV TMOD,#00000001B ;定时/计数器 0 工作于方式 1

  MOV TH0,#15H

  MOV TL0,#0A0H ;即数 5536

  SETB EA ;开总中断允许

  SETB ET0 ;开定时/计数器 0 允许

  SETB TR0 ;定时/计数器 0 开始运行

  LOOP: AJMP LOOP ;真正工作时,这里可写任意程序

  TIME0: ;定时器 0 的中断处理程序

  PUSH ACC

  PUSH PSW ;将 PSW 和 ACC 推入堆栈保护

  CPL P1.0

  MOV TH0,#15H

  MOV TL0,#0A0H ;重置定时常数

  POP PSW

  POP ACC

  RETI

  END


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭