0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

单片机

如何达到延时目的而不影响单片机的其他功能

我编程的水平比较菜,最近碰到一个问题:用电容触摸来触发一个子程序。在这个子程序中,有几段100ms的延时。

现在发现这个子程序运行时会导致电容触摸子程序异常(出错,实际摸一次,程序却检测到摸了好多次)。想过用中断来做延时,但是只要进入子程序就必须要延时正好到100ms。否则,如果进入子程序后,延时还没到100ms,跳出子程序后,就没有办法在延时到100ms时回到该子程序的这个延时的地方了。不知道有没有一个好的程序结构可以解决这个问题?多谢!

提问者:wywrtswe 地点:- 浏览次数:2883 提问时间:10-19 09:51
我有更好的答案
提 交
6条回答
ll1589179925 05-18 15:48
定义一个全局变量,用来指示状态。条件满足时触发中断,在中断中改变这一变量的值。
在主程序不断循环判断,根据不同的值执行不同的操作。
当然,如果判断的东西多了,有可能一次循环下来,有多个状态满足条件,那下次循环的时候,还是该按顺序一个一个来,有可能时间就又难控制了。这时就需要更复杂一些的机制了。
杀戮之神 05-12 12:48
需要延时的子程序结构是这样的:
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
那你设个全局变量,执行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
用好定时器和中断,裸奔也基本没什么问题了
撰写答案
提 交
1 / 3
1 / 3
相关单片机
具有音调控制的单片机立体声前置放大器
用于单片机与电子装置中的开关电源
单片机软硬件复位的条件都有啥
电动机的单片机控制
单片机应用系统开发实例导航