标题: 单片机定时时间不对,什么原因? [打印本页]

作者: tmxk0574    时间: 2019-2-26 20:36
标题: 单片机定时时间不对,什么原因?
用定时器试了一下小灯的亮灭,结果时间好象不对,(程序应该是亮1秒、灭1秒,而实际亮灭各1.7秒左右),请教是什么原因?
#include<reg52.h>
sbit led=P1^0;
void main()
{
unsigned char cnt=0;
TMOD=0x01;
TH0=0xb8;   //定时20毫秒
TL0=0x00;
TR0=1;
while(1)
{
if (TF0==1)
{
TF0=0;
TH0=0xb8;
TL0=0x00;
cnt++;
if(cnt>=50)  //定时器溢出50次,
{
cnt=0;
led=~led;}   //亮灭各0.02*50=1秒钟
}
}
}

作者: tmxk0574    时间: 2019-2-26 20:38
不好意思,视频没有传好
作者: tmxk0574    时间: 2019-2-26 20:47
http://v.youku.com/v_show/id_XND ... j.8428770.3416059.1

作者: HC6800-ES-V2.0    时间: 2019-2-27 08:37
你的定时器是定的1s,但中断后,你不是还执行了其它语句嘛,它们也是要占用时间的,一次很少,次数多了,误差就会很大的。
作者: 茗焜    时间: 2019-2-27 13:35
多大的晶振?
作者: 茗焜    时间: 2019-2-27 13:39
应该是定时器初值搞错了
作者: wulin    时间: 2019-2-27 14:46
你这定时器设置是按晶振频率11.0592MHz,程序本身没有问题。时间不对可能是你用的晶振频率不是11.0592MHz。
作者: 62黑    时间: 2019-2-27 15:13
定时器是定的1s中断后,你还执行了其它语句,它们也是要占用时间的,一次很少,次数多了,误差就会很大的。
作者: yaoji123    时间: 2019-2-27 15:16
一般这几条程序不会用多长时间,不会有这样多大的误差,可能是定时初值不对。
作者: tmxk0574    时间: 2019-2-27 19:36
茗焜 发表于 2019-2-27 13:35
多大的晶振?

11.0592M
作者: tmxk0574    时间: 2019-2-27 19:47
yaoji123 发表于 2019-2-27 15:16
一般这几条程序不会用多长时间,不会有这样多大的误差,可能是定时初值不对。

初值(十进制)=65536-0.02*12/11059200=47104,转为十六进制是为B800,不会错的
作者: tmxk0574    时间: 2019-2-27 19:50
wulin 发表于 2019-2-27 14:46
你这定时器设置是按晶振频率11.0592MHz,程序本身没有问题。时间不对可能是你用的晶振频率不是11.0592MHz。

晶振频率是对的,我在别的地方用过了,没有错
作者: tmxk0574    时间: 2019-2-27 19:52
HC6800-ES-V2.0 发表于 2019-2-27 08:37
你的定时器是定的1s,但中断后,你不是还执行了其它语句嘛,它们也是要占用时间的,一次很少,次数多了,误 ...

执行了50次,但误差不应该这么大呀
作者: tmxk0574    时间: 2019-2-27 20:31
62黑 发表于 2019-2-27 15:13
定时器是定的1s中断后,你还执行了其它语句,它们也是要占用时间的,一次很少,次数多了,误差就会很大的。

如用延时函数的话,执行次数再多也看不出误差,估计程序有错,但我自己看不出来
作者: wulin    时间: 2019-2-28 07:34
tmxk0574 发表于 2019-2-27 19:50
晶振频率是对的,我在别的地方用过了,没有错

这个程序经仿真验证没有问题,时间不对只能是你的硬件问题,重点怀疑晶振和振荡电容的品质和焊接质量。



作者: HC6800-ES-V2.0    时间: 2019-2-28 08:20
62黑 发表于 2019-2-27 15:13
定时器是定的1s中断后,你还执行了其它语句,它们也是要占用时间的,一次很少,次数多了,误差就会很大的。

抄袭?!!!!!!呵呵呵呵




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1