如何达到延时目的而不影响单片机的其他功能
我编程的水平比较菜,最近碰到一个问题:用电容触摸来触发一个子程序。在这个子程序中,有几段100ms的延时。
现在发现这个子程序运行时会导致电容触摸子程序异常(出错,实际摸一次,程序却检测到摸了好多次)。想过用中断来做延时,但是只要进入子程序就必须要延时正好到100ms。否则,如果进入子程序后,延时还没到100ms,跳出子程序后,就没有办法在延时到100ms时回到该子程序的这个延时的地方了。不知道有没有一个好的程序结构可以解决这个问题?多谢!
提问者:wywrtswe
地点:-
浏览次数:2836
提问时间:10-19 09:51
我有更好的答案
- 6条回答
-
ll1589179925
05-18 15:48
回答数:0
被采纳数:0
定义一个全局变量,用来指示状态。条件满足时触发中断,在中断中改变这一变量的值。
在主程序不断循环判断,根据不同的值执行不同的操作。
当然,如果判断的东西多了,有可能一次循环下来,有多个状态满足条件,那下次循环的时候,还是该按顺序一个一个来,有可能时间就又难控制了。这时就需要更复杂一些的机制了。
-
杀戮之神
05-12 12:48
回答数:0
被采纳数:0
需要延时的子程序结构是这样的:
void Function()
{
uchar i;
A();
B();
__delay_ms(50);
for(i=0;i<6;i++)
{
buf[i]=DATA[i];
}
Send(buf,6);
__delay_ms(100);
C();
__delay_ms(100);
D();
}
由于该驱动的时序要求,必须要有这些延时才能达到相应功能。而且只有A,B,C,D四个函数按照该顺序连续执行,才是有效命令。
现在问题是,如果我在执行到该子程序的中间时(比如到了B函数),如果延时没有到位,MCU就会跳出该子程序。等到我下次进入该子程序时,又是从头开始执行(A函数)。这样就没法跳过已经运行的A,B函数,直接运行C函数了。
-
yqyuqy
05-15 14:51
回答数:
被采纳数:
所有延时用定时中断,在定时中断里做一个公共时标,在各个子程序里对时标计数判断,完成各自的动作. 这样再多的延时也不会相互影响.
时标取多小要统筹兼顾.原则是满足最小定时分辩率的前提下尽可能大点,以便让定时中断程序有足够时间处理.
-
ickey007
05-10 18:42
回答数:0
被采纳数:0
那你设个全局变量,执行B了,就设定一个值,下次进入函数时,首先判断这个变量,再执行相应操作。程序大概是这样
uchar is_A_executed;
uchar is_B_executed;
....
void Function()
{
uchar i;
if(! is_A_executed)
{
A();
is_A_executed=1;
}
if(! is_B_executed)
{
B();
is_B_executed=1;
}
__delay_ms(50);
...
-
zhujiecheng
05-19 03:05
回答数:
被采纳数:
这是我们的教材惹的祸.
光教人家 LoopDelay() 式的延时.
定时时标这种真正实用的定时方法, 却从来不见正规的教材介绍!
-
piaoxuedtian
05-11 19:15
回答数:0
被采纳数:0
用好定时器和中断,裸奔也基本没什么问题了