题目:设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
程序如下:
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP INTT0
- ORG 0100H
- MAIN: MOV TMOD,#01H;使T0工作于方式1
- MOV TH0,#0D8H
- MOV TL0,#0F0H
- SETB EA
- SETB ET0
- SETB TR0; T0开始定时
- INTT0: MOV TH0,#0D8H
- MOV TL0,#0F0H; T0定时10ms
- INC R2
- CJNE R2,#32H,NEXT;R2对10ms计50次
- CPL P1.1; 满500ms后,P1.1反向
- MOV R2,#00H
- NEXT: RETI
- END
问题
一、从T0
产生溢出TF0=1 到
TF0被清0的
这段时期,T0是否还继续计数?我想应该是继续计数吧。否则T0就不会是定时10ms了。
二、
- MOV TH0,#0D8H
- MOV TL0,#0F0H; T0定时10ms
这两条指令取自定时计数器0的中断程序,它会占用数个机器周期。它的作用是重置T0的初值,那么这样看来T0就不是定时10ms,而是增加了数ns.
因为:
T0在溢出后,应该立即置入初值D8F0H,但是这两两条指令是在数个周期后置入初值,延迟了数ns
以上都是我的猜测,我说的合理吗?肯请大家指点,谢谢!