• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

用定时器定时2秒,为什么实际有将近5秒,这误差怎么破?

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

m++;

if(m>200)

{

timer=1;

m=201;

}

else

{

timer=0;

}

 

全部回复(39)
正序查看
倒序查看
001a
LV.3
2
2014-02-24 17:29
m=201;这句话你要干什么?
0
回复
2014-02-24 17:29
@001a
m=201;这句话你要干什么?
因为m是判断key3按住的时间,超过两秒就切换状态,我一直按住key3时间过长的话,我怕 m加到65535后又变回0
0
回复
close3
LV.5
4
2014-02-24 17:30
@soap泡泡
因为m是判断key3按住的时间,超过两秒就切换状态,我一直按住key3时间过长的话,我怕m加到65535后又变回0
timer清0放在主函数里,中断里m的值要0,不清零下次没法用的
0
回复
2014-02-24 17:32
@close3
timer清0放在主函数里,中断里m的值要0,不清零下次没法用的
m我是在键盘扫描程序里清0的,下面程序我贴出来了
0
回复
elio
LV.2
6
2014-02-24 17:33
看不懂楼主的程序…贴个完整的吧
0
回复
2014-02-24 17:33
@elio
看不懂楼主的程序…贴个完整的吧
判断按住key3的时间是否超过两秒,实际上将近5秒左右,我贴了按键程序
0
回复
2014-02-24 17:34
@soap泡泡
判断按住key3的时间是否超过两秒,实际上将近5秒左右,我贴了按键程序

if(key1==0)

{

Delay_ms(10);

if(key1==0)

{

if(flag==0)

{

num++;

while(!key1);

}

else

{

diandong();

while(!key1);

}

}

}

else if(key2==0)

{

Delay_ms(10);

if(key2==0)

{

if(flag==0)

{

num--;

if(num==-1)

{

num=0;

}

while(!key2);

}

else

{

zidong();

while(!key2);

}

}

}

else if(key3==0)

{

Delay_ms(10);

if(key3==0)

{

m=0;

while(!key3);

if(timer==1)

{

flag=~flag;

led1=~led1;

led2=~led2;

}

else

{

num=0;

}

}

}

0
回复
2014-02-24 17:35
@soap泡泡
if(key1==0){Delay_ms(10);if(key1==0){if(flag==0){num++;while(!key1);}else{diandong();while(!key1);}}}elseif(key2==0){Delay_ms(10);if(key2==0){if(flag==0){num--;if(num==-1){num=0;}while(!key2);}else{zidong();while(!key2);}}}elseif(key3==0){Delay_ms(10);if(key3==0){m=0;while(!key3);if(timer==1){flag=~flag;led1=~led1;led2=~led2;}else{num=0;}}}
我是准备判断按住key3的时间,假如按一下key3就清0,按住key3超过两秒就切换状态
0
回复
vidas
LV.2
10
2014-02-24 17:35
@soap泡泡
我是准备判断按住key3的时间,假如按一下key3就清0,按住key3超过两秒就切换状态

晶振的问题?

0
回复
daylight
LV.4
11
2014-02-24 17:36
keil里面的hz你修改了吗?
0
回复
soap泡泡
LV.4
12
2014-02-24 17:38
@daylight
keil里面的hz你修改了吗?
我改了11.0592
0
回复
daylight
LV.4
13
2014-02-24 17:38
@soap泡泡
我改了11.0592
改keil设置那里那个没用的,代码本身要改,还有你是不是下载的时候选了:单片机以双倍速度运行
0
回复
soap泡泡
LV.4
14
2014-02-24 17:39
@daylight
改keil设置那里那个没用的,代码本身要改,还有你是不是下载的时候选了:单片机以双倍速度运行
对啊,好像是的,另外代码本身怎么改?是什么语句?
0
回复
daylight
LV.4
15
2014-02-24 17:40
@soap泡泡
对啊,好像是的,另外代码本身怎么改?是什么语句?
首先去掉双倍速,然后慢慢微调
0
回复
soap泡泡
LV.4
16
2014-02-24 17:40
@daylight
首先去掉双倍速,然后慢慢微调
微调是一点点改初值吗
0
回复
daylight
LV.4
17
2014-02-24 17:41
@soap泡泡
微调是一点点改初值吗

是的

 

0
回复
stony_s
LV.3
18
2014-02-24 17:42
你应该是用的方式1定时的吧,它每次定时应该得重新复初值,你看看你的初值是不是在循环里边
0
回复
soap泡泡
LV.4
19
2014-02-24 17:43
@stony_s
你应该是用的方式1定时的吧,它每次定时应该得重新复初值,你看看你的初值是不是在循环里边
我用的是方式0,TMOD=0x11,我真不知道怎么回事,偏差这么大
0
回复
heal
LV.3
20
2014-02-24 17:44
@soap泡泡
我用的是方式0,TMOD=0x11,我真不知道怎么回事,偏差这么大
0x11不就应该是定时方式1么
0
回复
soap泡泡
LV.4
21
2014-02-24 17:47
@heal
0x11不就应该是定时方式1么
是方式1,void T0_time() interrupt 1 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; m++; if(m>100) { timer=1; m=101; } else { timer=0; } TR0=0; display(num); TR0=1; }我每次都是重新赋初值的
0
回复
heal
LV.3
22
2014-02-24 17:48
@soap泡泡
是方式1,voidT0_time()interrupt1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;m++;if(m>100){timer=1;m=101;}else{timer=0;}TR0=0;display(num);TR0=1;}我每次都是重新赋初值的
你把定时初值换成50000,m循环改成40试试,看看差多少
0
回复
soap泡泡
LV.4
23
2014-02-24 17:48
@heal
你把定时初值换成50000,m循环改成40试试,看看差多少
m=40,初值为50000的时候大概3秒多,而m=200,初值为10000的时候大概4秒多,确实有点改变,为什么?
0
回复
heal
LV.3
24
2014-02-24 17:49
@soap泡泡
m=40,初值为50000的时候大概3秒多,而m=200,初值为10000的时候大概4秒多,确实有点改变,为什么?
那就是指令周期的问题了。用汇编可以算的更准确点
0
回复
heal
LV.3
25
2014-02-24 17:49
@heal
那就是指令周期的问题了。用汇编可以算的更准确点
每循环一次,m++,if等语句就执行一次,所以循环次数少的话占用时间就少了
0
回复
soap泡泡
LV.4
26
2014-02-24 17:50
@heal
每循环一次,m++,if等语句就执行一次,所以循环次数少的话占用时间就少了
那也就是这误差是不可避免的了吗?
0
回复
heal
LV.3
27
2014-02-24 17:51
@soap泡泡
那也就是这误差是不可避免的了吗?
可以通过计算,让它准确定时2s
0
回复
soap泡泡
LV.4
28
2014-02-24 17:52
@heal
可以通过计算,让它准确定时2s

谢谢啊

0
回复
candyman
LV.2
29
2014-02-24 17:53
嵌入汇编定时,或或直接汇编,可精确至毫秒,c定时是定不准的
0
回复
soap泡泡
LV.4
30
2014-02-24 17:54
@candyman
嵌入汇编定时,或或直接汇编,可精确至毫秒,c定时是定不准的
是c本身的问题吗?但是偏差也太大了吧
0
回复
candyman
LV.2
31
2014-02-24 17:54
@soap泡泡
是c本身的问题吗?但是偏差也太大了吧
因为你不晓得每条c语句的运行时间,而汇编你能准确的算出程序的运行时间,比如12M的晶振 常用的一般 单 是1毫秒 双是 2毫秒 ,还有一个3毫秒的语句 ,
0
回复