找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9157|回复: 17
收起左侧

C语言如何在while循环内让一个语句每隔10分钟运行一次,其他正常循环

  [复制链接]
ID:472156 发表于 2019-7-2 08:58 | 显示全部楼层 |阅读模式
5黑币
代码萌新,最近在看STM32单片机,还没有看完全,但是现在需要用到,所以来求助一下各位:如何在while循环内让一个语句每隔10分钟运行一次,其他正常循环。如图红色区域的语句是需要每十分钟发送一次的。

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


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

    return (EXIT_SUCCESS);
}

感谢~~
1562028826(1).jpg

最佳答案

查看完整内容

打开一个定时器,定时器里面每10分钟就设定一个标志:while里面查标志位,有标志就发送一次即可
回复

使用道具 举报

ID:158375 发表于 2019-7-2 08:58 | 显示全部楼层
打开一个定时器,定时器里面每10分钟就设定一个标志:while里面查标志位,有标志就发送一次即可
回复

使用道具 举报

ID:277550 发表于 2019-7-2 10:05 | 显示全部楼层
建议使用定时器,加计时变量。

~~~~~~~~~~
回复

使用道具 举报

ID:10947 发表于 2019-7-2 10:34 | 显示全部楼层
定时器+计数器,计数到需要的时间就进去这个语句执行一次
回复

使用道具 举报

ID:155467 发表于 2019-7-2 11:01 | 显示全部楼层

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

使用道具 举报

ID:571958 发表于 2019-7-2 11:13 | 显示全部楼层
每次循环,拿现在的时间和你保存的时间比,超过10s, 把当前时间保存,运行你的函数。如果不到10s,忽略,继续跑其他函数。大循环时间长,10s的精度就会差,如果要准确的10s,你要放中断里做了。
回复

使用道具 举报

ID:265458 发表于 2019-7-2 11:14 | 显示全部楼层
先定义一个变量T=0, 用定时器,定时到你想要的时间后,将变量T=1,再在while(1){}
回复

使用道具 举报

ID:265458 发表于 2019-7-2 11:19 | 显示全部楼层
先定义一个变量T=0,再用定时器,到你想要的时间后,将T=1,关闭定时器,在while(1){if(T==1){红色区域内代码;T=0;开启定时器;}}
回复

使用道具 举报

ID:576466 发表于 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;

}
回复

使用道具 举报

ID:576804 发表于 2019-7-3 02:27 | 显示全部楼层
用一个定时器计算每次main的循环所需要的时间,然后累加,大于等于10分钟就执行,然后将累加的时间清零继续
回复

使用道具 举报

ID:576726 发表于 2019-7-3 10:11 | 显示全部楼层
你把需要10分钟执行一次的代码放到一个10分钟的定时器里面执行就可以了
回复

使用道具 举报

ID:577031 发表于 2019-7-3 11:52 | 显示全部楼层
使用硬件定时器即可
回复

使用道具 举报

ID:577031 发表于 2019-7-3 11:54 | 显示全部楼层
打个比方,设置定时器3每秒中断一次,在中断中将全局变量加1,在主循环中判断该变量是否大于等于600(即10分钟),判断成立即执行相应程序并清零该变量
回复

使用道具 举报

ID:577140 发表于 2019-7-3 14:40 | 显示全部楼层
定时器+计数器,计数到需要的时间就进去这个语句执行一次
回复

使用道具 举报

ID:577104 发表于 2019-7-3 14:44 | 显示全部楼层
设置一个定时器,然后采用循环方式就可以了
回复

使用道具 举报

ID:307505 发表于 2019-7-3 15:32 | 显示全部楼层
if 加条件比较就行。
回复

使用道具 举报

ID:431026 发表于 2019-7-3 16:24 | 显示全部楼层
开一个定时器,使用变量计数,每到十分钟,标志位置位,执行一次程序代码清标志,如此循环
回复

使用道具 举报

ID:518788 发表于 2019-7-3 16:48 | 显示全部楼层
用定时器当达到十分钟后产生中断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表