标题: C语言如何在while循环内让一个语句每隔10分钟运行一次,其他正常循环 [打印本页]

作者: 13588195971    时间: 2019-7-2 08:58
标题: C语言如何在while循环内让一个语句每隔10分钟运行一次,其他正常循环
代码萌新,最近在看STM32单片机,还没有看完全,但是现在需要用到,所以来求助一下各位:如何在while循环内让一个语句每隔10分钟运行一次,其他正常循环。如图红色区域的语句是需要每十分钟发送一次的。

单片机C语言源程序如下:
while(1){
    proRS485();
    proTask();


    p=(u8*)DO_autocalib;
    Send2RSSENCE(p,13);

    return (EXIT_SUCCESS);
}

感谢~~

1562028826(1).jpg (5.27 KB, 下载次数: 103)

1562028826(1).jpg

作者: 笨笨兔    时间: 2019-7-2 08:58
打开一个定时器,定时器里面每10分钟就设定一个标志:while里面查标志位,有标志就发送一次即可
作者: devcang    时间: 2019-7-2 10:05
建议使用定时器,加计时变量。

~~~~~~~~~~
作者: lfc315    时间: 2019-7-2 10:34
定时器+计数器,计数到需要的时间就进去这个语句执行一次
作者: 单片学子    时间: 2019-7-2 11:01

加一个计数器,用定时器中断给这个计数器+1。
循环里面判断上次运行到现在计数器增加了多少,如果达到你的10分钟的计数值,就运行程序,同时记录这次运行后的计数器值。

作者: lihaijun7781    时间: 2019-7-2 11:13
每次循环,拿现在的时间和你保存的时间比,超过10s, 把当前时间保存,运行你的函数。如果不到10s,忽略,继续跑其他函数。大循环时间长,10s的精度就会差,如果要准确的10s,你要放中断里做了。
作者: lhl139679    时间: 2019-7-2 11:14
先定义一个变量T=0, 用定时器,定时到你想要的时间后,将变量T=1,再在while(1){}
作者: lhl139679    时间: 2019-7-2 11:19
先定义一个变量T=0,再用定时器,到你想要的时间后,将T=1,关闭定时器,在while(1){if(T==1){红色区域内代码;T=0;开启定时器;}}
作者: swk51    时间: 2019-7-2 16:20
/**把需要定时发送的模块放在if语句中,时间达到10分钟则执行一次,否则跳过。**/


           if (n>=12000)        //n=12000=10分钟
           {
                ......;   //需要定时发送的模块
                 n=0;
           }

/******************************************************************************
** 函数功能 : 定时器初始化子程序
******************************************************************************/

void Init_Timer0(void)                  //定时器初始化子程序
{
        TMOD = 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
        TH0=0x00;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
        TL0=0x00;
        EA=1;            //总中断打开
        ET0=1;           //定时器中断打开
        TR0=1;           //定时器开关打开
}


/*******************************************************************************
** 函数功能 : 定时器中断程序
*******************************************************************************/

void Timer0_isr(void) interrupt 1 using 1
{
        TH0=0x00;                  //重新赋值,方式1是16位计数器,不能硬件重装初始值
        TL0=0x00;
//        LED=0X08;        //指示灯反相,可以看到闪烁
        n++;
//        if (n>100)
//        LED = ~LED;

}
作者: lehwa    时间: 2019-7-3 02:27
用一个定时器计算每次main的循环所需要的时间,然后累加,大于等于10分钟就执行,然后将累加的时间清零继续
作者: 殊途同归19    时间: 2019-7-3 10:11
你把需要10分钟执行一次的代码放到一个10分钟的定时器里面执行就可以了
作者: laok321    时间: 2019-7-3 11:52
使用硬件定时器即可
作者: laok321    时间: 2019-7-3 11:54
打个比方,设置定时器3每秒中断一次,在中断中将全局变量加1,在主循环中判断该变量是否大于等于600(即10分钟),判断成立即执行相应程序并清零该变量
作者: W1107182774    时间: 2019-7-3 14:40
定时器+计数器,计数到需要的时间就进去这个语句执行一次
作者: houcong    时间: 2019-7-3 14:44
设置一个定时器,然后采用循环方式就可以了
作者: yachcs    时间: 2019-7-3 15:32
if 加条件比较就行。
作者: 追一抹月光    时间: 2019-7-3 16:24
开一个定时器,使用变量计数,每到十分钟,标志位置位,执行一次程序代码清标志,如此循环
作者: 二狼神666    时间: 2019-7-3 16:48
用定时器当达到十分钟后产生中断




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