定时本质上也是延时操作,但是长时间的延时操作会影响到其他模块正常运行,所以可以采取定时器+计数+标志位的方式来完成一些较长时间的定时。

uint tick_num;        //用于计时的变量
uint tick_max;        //用于设定计时的时间
uchar tick_flag;      //计时的状态    0计时,1计时完成,其他计时停止
void tim0_isr() interrupt 1{if(0==tick_flag){                 //允许计时if(++tick_num>=tick_max){   tick_flag=1;            //计时完成,设置标志位,提供给任务函数检测}}
}void main(){tim0_init();         //1ms定时器初始化tick_num=0;          //初始化计时变量tick_max=1000;       //设置需要及时的时间,基数是定时器时间,这里是1ms,1000就是1秒tick_flag=0;         //初始化定时标志位,也意味着定时开始while(1){//实现一个1秒LED变换if(tick_flag==1){   //检测计时是否完成LED=!LED;//重新开始计时tick_num=0;tick_max=1000;tick_flag=0; }}
}

本质上就是定时计数,例如1ms的定时中断里,计1000就是1秒,计60000就是1分钟,然后这个计数再用一个标志位来控制。

但是这样始终还是有点麻烦(不够花里胡哨),例如在需要多路计时时,需要复制黏贴好多变量,所以可以在这个原理的基础上,用结构体和函数封装一下,用得比较方便。


//定义一些软件定时器的状态
#define TICK_RUN    0   //计时
#define TICK_STOP   1   //停止
#define TICK_SUCCE  2   //定时完成
//用到了enum,用来确定软件计时器的最大数量
enum TICK_HANDLE_ENUM{TICK1,      //enum第一个默认是0TICK2,      //1TICK3,      //2TICK_MAX,   //3     最后一个的大小是enum里面的参数数量-1,所以在TICK_MAX前添加软件定时器名字,这样TICK_MAX就刚好能够说明你需要多少个软件定时器
};
//把三个用于计时的变量放结构体里
typedef struct TICK_STRUCT{u16 tick_max;u16 tick_now;u8  status;
}tick_st;
tick_st tick[TICK_MAX];     //用到了结构体数组,方便多个软件定时的时候使用。就是tick_st这个结构体类型的数组,数组里的每一个参数都是一个tick_st结构体
//这个函数放在定时器中断里,完成定时中的计数行为
void tick_callback(void){u8 i;for(i=0;i<TICK_MAX;i++){            //查询数组里的所有结构体if(tick[i].status == TICK_RUN){if(++tick[i].tick_now>=tick[i].tick_max){tick[i].status=TICK_SUCCE;}}}
}
//计时开始---其实就初始化那三个变量
void tick_creat(u8 tick_handle, u16 tick_time){tick[tick_handle].status    =   TICK_RUN;tick[tick_handle].tick_max  =   tick_time;tick[tick_handle].tick_now  =   0;
}
//获取软件定时器的状态
u8 tick_read_status(u8 tick_handle){return tick[tick_handle].status;
}
//关闭定时器,复位定时器状态
void tick_rst(u8 tick_handle){tick[tick_handle].status = TICK_STOP;
}
//
void tim0_isr() interrupt 1{tick_callback();
}
void main(){tim0_init();    //1ms定时器初始化tick_creat(TICK1,1000);tick_creat(TICK2,2000);tick_creat(TICK3,3000);/*示例:计时1:1秒执行一次,循环计时2:计时3执行后2秒执行一次计时3:3秒执行一次,循环*/while(1){if(tick_read_status(TICK1)==TICK_SUCCE){//功能函数tick_creat(TICK1,1000);}if(tick_read_status(TICK2)==TICK_SUCCE){tick_rst(TICK2);//功能函数}if(tick_read_status(TICK3)==TICK_SUCCE){//功能函数tick_creat(TICK2,2000);tick_creat(TICK3,3000);}}
}// tick_handle也可以用enum TICK_HANDLE_ENUM作为传参类型,避免脑子一抽,给了一个过大的参数

这样使用就4个函数

tick_creat:开始一个定时

tick_read_status:读取一个定时的状态

tick_rst:复位一个定时任务

tick_callback:放硬件定时器中断里,

要添加软件定时器数量也只需要在枚举里对应位置添加定时器名字就可以。

单片机裸机-软件定时相关推荐

  1. 单片机裸机实用组件--软件定时器、时间戳

    单片机裸机实用组件–软件定时器.时间戳 之前写过一篇关于单片机定时器延时计时功能的博客 ,刚工作的时候搞得现在看来还是比较糙的,是时候整一个新的了. base_timer 单片机裸机适用的定时器小组件 ...

  2. 工程师实战:单片机裸机程序框架是怎样炼成的?

    前言 前不久,我有位做测试的朋友转去做开发的工作,面试遇到了一个问题,他没明白,打电话问了我.题目大概就是: 在单片机裸机开发时,单片机要处理多个任务,此时你的程序框架是怎样的呢? 这其实是个经典面试 ...

  3. 单片机编程软件很简单(八),Keil单片机编程软件辅助功能讲解

    单片机编程软件的应用很多,在单片机编程软件的帮助下,我们对单片机的控制才变得如此简单.在市场上流通的单片机编程软件中,小编最为喜爱Keil单片机编程软件.在本文中,小编将为大家介绍Keil单片机编程软 ...

  4. c语言编写闹钟主程序流程图,[]C51单片机课程设计--定时闹钟.doc

    []C51单片机课程设计--定时闹钟 单片机课程设计定时闹钟PAGE \* MERGEFORMATiii 计算机及信息工程学院 课程设计报告 学年学期 题 目 专业.学号 授课班号 学生姓名 指导教师 ...

  5. VS2019调试查看变量_单片机编程软件一点通,IAR单片机编程软件工程调试方法

    单片机编程软件通常以Keil和IAR为主,大家在选择适合自己的单片机编程软件时可依据工程要求而定.本文内容针对IAR单片机编程软件,主要讲解该单片机编程软件的工程调试使用方法.如果你对本文将要讲解的内 ...

  6. 间隔一段时间重复自动登录网站、定时自动登录网站的软件 —— 定时执行专家,无需复杂编程,简单配置即可使用

    常常有网友在网上发帖求助,想找一个定时自动登录网页(网站)的软件,大致需求如下: 1.打开网页 → 2.填写用户名.密码 → 3.点击登录按钮 → 4.登录成功 另外,还有诸如:要求间隔是每3个小时自 ...

  7. AR单片机编程软件的菜单栏功能及用法

    <转载>IAR单片机编程软件的菜单栏功能及用法全面介绍 原网站 原网站 原网站 网站内介绍如下内容 选取部分 Ⅴ.View视图菜单 这个菜单的意思就是打开或关闭视图窗口,比如我们的工作空间 ...

  8. 单片机编程软件很简单(17),Keil单片机编程软件之编译、链接

    单片机编程软件使用较多,诸多朋友大学期间便接触单片机编程软件.因此,大家对于单片机编程软件或多或少有所了解.本文中,将对Keil单片机编程软件加以介绍,主要在于介绍如何在这款单片机编程软件中进行项目设 ...

  9. 学习笔记 51单片机通用软件延时方法

    对于STC51单片机来说,延时函数,想必都不陌生.而用的最多的延时基本都是通过软件方法实现的,但由于STC51不同系列的芯片所采用的指令集不同,各指令执行所用机器周期不同.例如STC12Cx的一个振荡 ...

最新文章

  1. SQL Server 临时表
  2. APACHE如何里一个站点绑定多个域名?用ServerAlias
  3. Spring4新特性——核心容器的其他改进
  4. 验证中文的正则表达式
  5. ios nslog 例子_iOS Block实例
  6. Cocos Creator棋牌开发-部署经验总结
  7. mysql5.7.13编译安装_MySQL 5.7.13 源码编译安装配置方法图文教程
  8. git 命令行(一)-版本回退
  9. Struts2中动态的指定返回的结果集
  10. shell终端行首行尾命令介绍
  11. ReentrantLock梳理和总结
  12. U盘加密软件测试自学,利用联想USB接口加密软件给你的U盘加密、设定访问权限...
  13. mysql数据存固态盘和硬盘区别_对机械硬盘和SSD固态硬盘IOPS、吞吐量的压测对比...
  14. Ubuntu18.04 下载与安装
  15. 【PHP】\r \r\n \t是什么
  16. 北航计算机专业怎么样考研好考不,计算机专业考研,北航和北邮各有什么优势...
  17. 你还在以为打马赛克就安全了吗?AI消除马赛克,GitHub开源项目上线三天收获近7000星
  18. 智能设备系统的测试分析——语音识别系统和面部识别系统
  19. 网页右侧的漂浮广告代码,随滚动条滚动
  20. 【北邮国院大二下】产品开发与营销知识点整理 Topic4

热门文章

  1. 美团:百亿规模API网关服务Shepherd的设计与实现
  2. Razor项目所感(上)
  3. pythonturtle艺术字_让你的电脑秒变绘画大师的几行代码(Pythonturtle)
  4. iOS上下联动框架(Swift)
  5. 关于kettle加载job找不到转换文件路径的问题解决
  6. c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构
  7. 124-OutputStreamWriter介绍(以writer结尾是字符流父类是writer)
  8. vue高德单条(可批量)路线规划+单条(可批量)路线带途径节点marker+单条(可批量)路线分段渲染各颜色
  9. 聚乙烯为什么低压高密度,高压低密度?
  10. 2019车联网产业发展报告