|
在AT89C51上计数器用来定时怎么都准确不了.
[复制链接]
在AT89C51上计数器用来定时怎么都准确不了.
在Kiel模拟测试,选定芯片为AT89C51,在频率为12MHz
实验:用计数器每隔10秒把P1.0的位置反一次.
设置计数器0在以16位计数器模式工作,已50毫秒为一次溢出中断.50MS*200=10S
计数器初值计算出为:3CB0
代码如下:
ORG 0000H
LJMP MAIN
ORG 000BH ;外部中断0入口
SJMP IF0BREAK
ORG 0030H ;程序的开始地址
MAIN:
SETB EA ;设置让外部中断0起作用,硬件初始化
ET0 ;计数器0溢出中断设置
SETB PT0 ;设置为最高优先级
MOV TMOD,#01H ;设置计数器0工作为方式1,16位计数器
MOV TL0,#0B0H ;设置计数器0初值,12MHz频率,计数器50ms执行一次就溢出中断
MOV TH0,#3CH
MOV R0,#200 ;循环20次为1S,200次为10秒
SETB TR0
FINISH: SJMP $
;子程序:IF0BREAK
;功能:计数器0溢出中断入口
IF0BREAK:
CLR ET0 ;关闭中断响应
CLR TR0 ;停止计数器
DJNZ R0,EXIT ;满10s就把P1.0位置反,方便查看结果
JB P1.0,SP1 ;如P1.0=1->SP1
SETB P1.0
LJMP STARV ;跳转到赋初值的地方
SP1:
CLR P1.0
STARV: ;200次完毕后重赋初值
MOV R0,#200
MOV TL0,#3CH
MOV TH0,#0B0H
EXIT:
SETB TR0 ;启动定时器
SETB ET0 ;启动中断
RETI
END
但是实验结果是1s(可能没到1s)P1.0的信号就会被置反一次.
这是我那里计算出错了吗???
|
|