标题: C语言如何设定某个程序执行一定的时间后再执行其他命令? [打印本页]

作者: 天下为家129    时间: 2018-12-11 09:32
标题: C语言如何设定某个程序执行一定的时间后再执行其他命令?
我在写寻迹小车的程序,想让小车直行一段时间后执行其他程序,那用keil如何设定小车的直行时间,让它执行完这个命令后再执行其他命令,且在执行直行命令时不管遇到其他任何条件都忽视,例如满足左转,满足右转的条件都忽视,直到直行的时间结束后再考虑其他执行条件。我用的是if语句

if(LED0==1&&LED1==1&&LED2==1&&LED3==0&&LED4==0&&LED5==1&&LED6==1)  //直走
     {
      RUN();
     }

if(LED0==0&&LED1==0&&LED2==0&&LED3==1&&LED4==1&&LED5==1&&LED6==1)  //左转声明
         {
         TurnLeft();
         }         
if(LED0==1&&LED1==1&&LED2==1&&LED3==1&&LED4==1&&LED5==0&&LED6==0) //右转声明
           {
         TurnRight();
         }


作者: mosqu    时间: 2018-12-11 10:57
if的话加delay就好
作者: 测试用户    时间: 2018-12-11 11:37
中断 和 循环都可以满足你的要求

循环 , 比如 for(i=0; i<100; i++);  如果嫌时间短, 多嵌套几层

作者: tanxg    时间: 2018-12-11 11:39
一般可以采用延时函数进行处理。当然若要实现精确的定时,还可以采用定时器实现
作者: sxhwdz    时间: 2018-12-11 12:26
if只是条件判断语句,不是循环语句,你要用while(直行条件)语句,  这样只要满足直行条件,就一直循环。
作者: yzwzfyz    时间: 2018-12-11 12:44
做一个标记,如G。用定时器将你会要运行的时间做个定时,到时间就将G置1,平时G=0(开起初化也=0)。
在你运行的程序结束的地方,加一个G识别,G=1就结束,G0就再回去重复。
作者: 天下为家129    时间: 2018-12-11 15:20
mosqu 发表于 2018-12-11 10:57
if的话加delay就好

delay我试过,小车的速度会慢下来,要怎样写才能既延时有不影响小车的速度?
if(LED0==1&&LED1==1&&LED2==1&&LED3==0&&LED4==0&&LED5==1&&LED6==1)  //直走
     {
      RUN();  delay(50);Xiaoying();

作者: 天下为家129    时间: 2018-12-11 15:21
sxhwdz 发表于 2018-12-11 12:26
if只是条件判断语句,不是循环语句,你要用while(直行条件)语句,  这样只要满足直行条件,就一直循环。

我只直行一段时间,直行完之后就按判断的结果来执行其他命令。
除了用delay,有没有其他的方式呢?
作者: mosqu    时间: 2018-12-11 16:18
天下为家129 发表于 2018-12-11 15:20
delay我试过,小车的速度会慢下来,要怎样写才能既延时有不影响小车的速度?
if(LED0==1&&LED1==1&&LED ...

f(LED0==1&&LED1==1&&LED2==1&&LED3==0&&LED4==0&&LED5==1&&LED6==1)  //直走
{
      RUN();  delay(50);Xiaoying();
TMOD = 0x01;   //设置定时器0为模式1
    TH0  = 0xB8;
    TL0  = 0x00;   //定时值初值
    TR0  = 1;      //打开定时器0
作者: mosqu    时间: 2018-12-11 16:25
天下为家129 发表于 2018-12-11 15:20
delay我试过,小车的速度会慢下来,要怎样写才能既延时有不影响小车的速度?
if(LED0==1&&LED1==1&&LED ...

那用定时器吧,大概流程是这样子
if(LED0==1&&LED1==1&&LED2==1&&LED3==0&&LED4==0&&LED5==1&&LED6==1)  //直走
{
      RUN();
     TMOD = 0x01;   //设置定时器0为模式1
    TH0  = 0xB8;
    TL0  = 0x00;   //定时值初值
    TR0  = 1;      //打开定时器0
    if(1 == TF0)            //判断定时器0是否溢出
        {
            TF0 = 0;
            TH0 = 0xB8;        //一旦溢出后,重新赋值
            TL0 = 0x00;
            counter++;
            if(50 == counter) //判断定时器0溢出是否达到50次
            {
                 counter = 0;  //counter清0,重新计数
                 Xiaoying();
                 TR0  = 0;      //关闭定时器0
            }                 
        }
}

作者: fl6026    时间: 2018-12-11 16:51
使用定时中断
作者: 天下为家129    时间: 2018-12-11 19:20
mosqu 发表于 2018-12-11 16:18
f(LED0==1&&LED1==1&&LED2==1&&LED3==0&&LED4==0&&LED5==1&&LED6==1)  //直走
{
      RUN();  delay(5 ...

请问TH0是什么意思呢?还有如果我要定时2秒,TL0要怎样写?代码小白,求大神讲解
作者: 天下为家129    时间: 2018-12-11 19:45
天下为家129 发表于 2018-12-11 19:20
请问TH0是什么意思呢?还有如果我要定时2秒,TL0要怎样写?代码小白,求大神讲解

我用的是89C51单片机,晶振是11.0592Hz的
作者: mosqu    时间: 2018-12-12 08:28
天下为家129 发表于 2018-12-11 19:20
请问TH0是什么意思呢?还有如果我要定时2秒,TL0要怎样写?代码小白,求大神讲解

TH0是定时器高8位
TL0是定时器低8位
都是设置定时初值的
2秒大概 if(50 == counter) 改为 if(100 == counter)
定时啊中断啊用的挺多的,最好花时间学好,下面这个介绍定时器的可以看一下
http://www.51hei.com/bbs/dpj-19016-1.html
我也是个小白,噶油。51黑还有教程区的,可以去看一下,我也在看。




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