单片机编程里软件定时器使用技巧

2020-07-29来源: 51hei关键字:单片机编程  软件定时器  使用技巧

#ifndef __SIMPLE_SOFT_TIME_H_

#define __SIMPLE_SOFT_TIME_H_


#define MIAO                1000ul

#define MIN                60*MIAO


#define UPLOAD_SENSOR_ITV             10*MIN                                //传感器数据上报间隔

#define OFFLINE_WAIT_TIME         8*MIN                                 


typedef enum {

        ST_General_Ov=0,

        ST_HEAT_Ov,                 //1

        ST_M35_HEAT_OV,                //2

        ST_Host_Delay,                //3

        ST_GPS_Ov,                        //4

        ST_Register_Ov,                //5

        ST_IDX_MAX

}ST_IDX;


void ScheduleSimpleTimer(void);

void SetM35OverTime(ST_IDX idx, long overtime);

int GetM35OvTime(ST_IDX idx);

void KillSimpleTime(ST_IDX idx);

void Init_SimpeTime(void);

void LongTimeRun(void);


#endif


简单定时器
*************************/
#include "simplesofttime.h"
#include "common.h"

long m35overtime[ST_IDX_MAX];

void Init_SimpeTime(void)
{
        ST_IDX i;
        
        for(i=ST_M35_OV;i        {
                KillSimpleTime(i);
        }
}

void SetM35OverTime(ST_IDX idx, long overtime)
{
        if(idx>=ST_IDX_MAX)
        {
                while(1);
        }
        m35overtime[idx]=overtime/(1000/HZ);
}

//返回1表示超时了
int GetM35OvTime(ST_IDX idx)
{
        if(m35overtime[idx]<0)
                return 1;
        return 0;
}

//这里只能简单的"杀掉"这个定时器
void KillSimpleTime(ST_IDX idx)
{
        if(idx>=ST_IDX_MAX)
        {
                while(1);
        }
        m35overtime[idx]=((1ul<<31)-1); //2147483647*5ms=10737418s/3600=2982h/24=124day
}

/* 该函数5ms调用一次 */
void ScheduleSimpleTimer(void)
{
        ST_IDX i;
        
        for(i=ST_M35_OV;i        {
                m35overtime[ i]--;
        }
}

//1天调用一次
void LongTimeRun(void)
{
        ST_IDX i;
        
        for(i=ST_M35_OV;i        {
                if(m35overtime[ i]>1e9)
                {
                        m35overtime[ i]=((1ul<<31)-1);
                }
        }
}


main()函数的开始调用下Init_SimpeTime()函数将ScheduleSimpleTimer()函数放到中断频率为HZ的定时器里;

该软件定时器使用起来简单,效率高,最6的地方就是ST_IDX_MAX的使用,有了它,每次新增一个定时器就是在ST_IDX增加一条语句的事情;


如果不使用enum的里技巧,新增一个传感器恐怕至少得修改2处,而且偶尔还容易忘记.

关键字:单片机编程  软件定时器  使用技巧 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic504667.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AT89S52单片机+LCD12864贪吃蛇小游戏(独立按键)
下一篇:51单片机设计的防止幼儿误锁车内报警系统

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

DIY自制PIC单片机编程器电路PCB
简介: K128PICP单片机编程器,由国外PIC单片机爱好者制作,适用于对PIC单片机F系列近百种芯片进行读写。该编程器使用USB接口编程,并且从USB取电,编程高压由监控芯片PICl6F628产生的脉冲信号倍压整流后得到。K128PICP单片机编程器,由国外PIC单片机爱好者制作,适用于对PIC单片机F系列近百种芯片进行读写。该编程器使用USB接口编程,并且从USB取电,编程高压由监控芯片PICl6F628产生的脉冲信号倍压整流后得到。省掉了独立的电源。通过制作和使用K128,感觉对初学者来说有以下困难:1.USB到RS232串口的转换芯片FT232BM是贴片封装,必须使用PCB板安装。不能使用万能板,焊接比较困难
发表于 2020-02-21
DIY自制PIC<font color='red'>单片机编程</font>器电路PCB
MSP430单片机编程思想总结(一)
1.主函数main()中;只调用初始化函数和执行后台程序;2.中断服务子程序函数中不要去写“实质性”的代码。只调用事件检测函数,提高程序的可读性3.WDT 可以作为节拍定时器 在单片机编程中具有重要意义;定时扫描轮询方法可以解决大量CPU阻塞问题4.事件函数对于理解程序意图非常重要;集中放置“事件检测/处理”而不是跟着满世界“乱蹦的”中断去找事件函数,是十分高效的。5.全局变量的使用要非常谨慎,全局变量往往是联系各关键函数的纽带,因此集中放置全局变量也是增加程序可读性的常用做法。6.除了读写寄存器(包括改写IO输出),数学和逻辑运算外,CPU干其他的事例如长延时,死循环类型的查询属于阻塞CPU的行为,应该坚决避免7.当CPU确定
发表于 2020-02-18
PIC单片机编程格式和风格
用“;”号,否则将会出现编译错误。程序说明及注释部分均可缺省;③调用到的.inc文件:用include伪指令来调用。通常.inc文件是与单片机型号相对应的,包括了一些特殊寄存器的定义等内容。PIC单片机各种型号的.inc文件在MPLAB目录中就能找到,不需要自己编写。如果被调用的.inc文件遗失,编译时将会出现编译错误;④通用寄存器定义:用EQU伪指令定义,格式为“寄存器名称 EQU 寄存器标号”,寄存器名称要顶格写。这是程序编写人员为所用到的通用寄存器起的名字,对应了一个实际的通用积存器地址;⑤宏定义:在上面的程序中没有用到宏,缺省;⑥程序初始化:START部分;⑦主程序:MAIN部分;⑧子程序:如本程序的INTSEVER部分
发表于 2020-02-12
PIC单片机编程 (点灯程序)
IO口控制方向寄存器 TRISA~TRISAE            比如 TRISB=0x00; //  1为输入,0为输出,这样就把portB端口全部设为输出数据寄存器 PORTA~PORTE            比如  PORTB=0x01; // 1为置高,0为置低,这样就把portB1口置高,其它portB口置低例:点灯程序#include<pic.h>__CONFIG (0x3B31);//  pic单片机需要进行寄存器配置,详见手册
发表于 2020-01-31
STM8S103F单片机编程——在C文件中嵌入汇编代码
最近在使用STM8S103F单片机,需要在C程序中嵌入汇编代码。经过搜索,找到下面的解决方法。方法1:方法2:上面的内容摘自COSMIC的安装目录下,COSMICCXSTM8_32KDocsCXSTM8_UsersGuide.pdf
发表于 2020-01-31
STM8S103F<font color='red'>单片机编程</font>——在C文件中嵌入汇编代码
51单片机基于一个定时器实现多个软件定时器
软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的不足,这是软件定时器的一个优点,即数量不受限制。但由于软件定时器是通过程序实现的,其运行和维护都需要耗费一定的CPU资源,同时精度也相对硬件定时器要差一些。在RTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件定时器中断到,就对一个全局的时间标记加一,每个软件定时器都保存着到期时间,程序需要定期扫描所有运行中的软件定时器,将各个到期时间与全局时钟标记做比较,以判断对应软件定时器是否到期,到期则执行相应的回调函数,并关闭该定时器
发表于 2020-01-22
51单片机基于一个<font color='red'>定时器</font>实现多个<font color='red'>软件</font><font color='red'>定时器</font>
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved