初学定时计数器的疑问

lyang996   2010-6-23 11:40 楼主

题目:设MCS-51系统时钟为12MHZ,编程实现从P1.1输出周期为1s的方波。
分析:这时应产生一个500ms的周期定时,可以利用定时计数器T0定时10ms,用R2对T0溢出计数50次。
因为T0要定时10ms,所以其初值应设为X=65536-10000=55536=1101100011110000B。
即TH0=11011000B=D8H,TL0=11110000B=F0H

程序如下:

  1.         ORG 0000H
  2.         LJMP MAIN

  3.         ORG 000BH
  4.         LJMP INTT0

  5.         ORG 0100H
  6. MAIN:        MOV TMOD,#01H;使T0工作于方式1
  7.         MOV TH0,#0D8H
  8.         MOV TL0,#0F0H
  9.         SETB EA
  10.         SETB ET0
  11.         SETB TR0;        T0开始定时

  12. INTT0:        MOV TH0,#0D8H
  13.         MOV TL0,#0F0H;        T0定时10ms
  14.         INC R2
  15.         CJNE R2,#32H,NEXT;R2对10ms计50次
  16.         CPL P1.1;        满500ms后,P1.1反向
  17.         MOV R2,#00H
  18. NEXT:        RETI
  19.         END


问题
一、从T0产生溢出TF0=1TF0被清0这段时期,T0是否还继续计数?我想应该是继续计数吧。否则T0就不会是定时10ms了。

二、
  1. MOV TH0,#0D8H
  2.         MOV TL0,#0F0H;        T0定时10ms

这两条指令取自定时计数器0的中断程序,它会占用数个机器周期。它的作用是重置T0的初值,那么这样看来T0就不是定时10ms,而是增加了数ns.
因为:T0在溢出后,应该立即置入初值D8F0H,但是这两两条指令是在数个周期后置入初值,延迟了数ns

以上都是我的猜测,我说的合理吗?肯请大家指点,谢谢!

回复评论 (9)

恳请打错了
点赞  2010-6-23 11:43
一 :   你指的是在掉用中断的这段时间  硬件是否还在计数是吧?  我想是的  只要允许位没改就在计数
二:    你可以设置成工作方式2,自动重装,这样就没有你说的延迟的问题了
点赞  2010-6-23 13:01
   单片机书上就有这个例子啊!看看书吧!
点赞  2010-6-23 14:46
要精确计时需要关闭定时后重装初值,并且考虑关闭重装的小延时
点赞  2010-6-23 15:16
引用: 引用 4 楼 zb213015 的回复:

要精确计时需要关闭定时后重装初值,并且考虑关闭重装的小延时
关闭定时??
点赞  2010-6-23 23:53
引用: 引用 2 楼 c__allen 的回复:

一 :   你指的是在掉用中断的这段时间  硬件是否还在计数是吧?  我想是的  只要允许位没改就在计数
二:    你可以设置成工作方式2,自动重装,这样就没有你说的延迟的问题了

因为书上没说这些细节,现在实验室也没上课了。只能到这里求证了。
你的意思是说除方式2外,方式0、1、3都会存在这种延迟,这种延迟包括:产生中断-响应中断-初值置入这段时间。
大家说说自己的看法吧。
点赞  2010-6-23 23:59
你的MAIN有问题....
也许可以改成这样:

    ORG 0100H
MAIN:    MOV TMOD,#01H;使T0工作于方式1
    MOV TH0,#0D8H
    MOV TL0,#0F0H
    SETB EA
    SETB ET0
    SETB TR0;    T0开始定时
LOOP:
    SJMP LOOP
点赞  2010-6-24 09:29
可能有些许误差,但是中断间隔差异很小。采用自动重装好。
点赞  2010-6-24 15:22
to 7楼:谢谢。的确少打了一个,太粗心了。好了,给分!
点赞  2010-6-24 22:09
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复