单片机编程中软件定时器
来源:互联网 发布:淘宝发错货怎么理赔 编辑:程序博客网 时间:2024/05/29 07:38
在单片机编程中,有时候需要不同步长的定时器,我之前的做法是设置各种各样的标志位,然后在while(1)里去处理,可是写着写着发现几乎每个项目里都会用到一些定时器,用之前标志位的方法写的程序看起来框架不是很好.
那么就想着能不能写个简单点定时器函数呢?
这是可以的,网上随便搜索就能搜到一大堆,我就当写日记了,在这里就写下,如果你们喜欢也可以参考下.
首先软件定时器应用于非操作系统中,非常适合我们单片机这种前后台模式.
我们先看下代码,这个代码我在51单片机调试通过.
soft_timer.h文件
#ifndef __SOFT_TIM_H_#define __SOFT_TIM_H_#define MAX_SOFT_TIMER_NUM 10//根据实际需求来定义大小typedef char H_TIMER; //定时器句柄,一定是有符型变量哈typedef unsigned int TIM_CNT; //根据用户需要来修改该变量类型typedef struct{ unsigned char onoff; //是否开启该定时器 unsigned char ovflag; //定时时间是否到 TIM_CNT current_count; //当前计数值 TIM_CNT setting_count; //设定的计数值}SOFT_TIMER;extern SOFT_TIMER soft_timer[MAX_SOFT_TIMER_NUM];H_TIMER CreatSoftTimer(TIM_CNT setcnt);void StartTimer(H_TIMER timer_id);void PauseTimer(H_TIMER timer_id);void KillTimer(H_TIMER timer_id);void ScheduleTimer(void);#endif
#include "soft_timer.h"SOFT_TIMER soft_timer[MAX_SOFT_TIMER_NUM];H_TIMER CreatSoftTimer(TIM_CNT setcnt){ H_TIMER i; if(!setcnt) return -1; for(i=0;i<MAX_SOFT_TIMER_NUM;i++) { if(!soft_timer[i].setting_count) { soft_timer[i].setting_count=setcnt; return i; } }return -1;}void StartTimer(H_TIMER timer_id){ if(timer_id>MAX_SOFT_TIMER_NUM-1) return; soft_timer[timer_id].onoff=1;}void PauseTimer(H_TIMER timer_id){ if(timer_id>MAX_SOFT_TIMER_NUM-1) return; soft_timer[timer_id].onoff=0;}void KillTimer(H_TIMER timer_id){ if(timer_id>MAX_SOFT_TIMER_NUM-1) return; soft_timer[timer_id].onoff=0; soft_timer[timer_id].setting_count=0; soft_timer[timer_id].ovflag=0;}//放在定时器里调用void ScheduleTimer(void){ H_TIMER i; for(i=0;i<MAX_SOFT_TIMER_NUM;i++) { if(soft_timer[i].onoff) { soft_timer[i].current_count++; if(soft_timer[i].current_count==soft_timer[i].setting_count) { soft_timer[i].current_count=0; soft_timer[i].ovflag=1; } } }}
main.c文件
/**********************************************************************模块名称:软件定时器说明:注意:使用软件定时器要确保定时的周期小于1个大循环的周期创建人:yunjie167创建日期:2015年4月11日22:32:15版本:V1.0修改日志:**********************************************************************/#include <REGX52.H>#include "soft_timer.h"unsigned int Cnt[5];void InitTimer(void){TMOD=0x01; TH0=(65536-1000)>>8; //1ms@12MHzTL0=(65536-1000);IE=0x82;TR0=1;}void main(){H_TIMER t[5];char i;/* 调用CreatSoftTimer()函数应该要对返回值进行判断的! */t[0]=CreatSoftTimer(10);t[1]=CreatSoftTimer(20);t[2]=CreatSoftTimer(30);t[3]=CreatSoftTimer(40);t[4]=CreatSoftTimer(50);InitTimer();while(1){ for(i=0;i<5;i++){if(P1&(1<<i))StartTimer(t[i]);elsePauseTimer(t[i]);if(soft_timer[t[i]].ovflag){soft_timer[t[i]].ovflag=0;Cnt[i]++;}}}}void Timer0(void) interrupt 1{TH0=(65536-1000)>>8;TL0=(65536-1000);ScheduleTimer();}
0 0
- 单片机编程中软件定时器
- 单片机编程-定时器中断
- 单片机软件定时器的使用方法
- 单片机中定时器的使用
- 51单片机自定义多个软件定时器
- 52单片机定时器/计数器编程汇总
- 8052单片机中定时器T2的应用
- 单片机定时器
- proteus 单片机编程软件的安装
- 单片机C语言编程-定时器/计数器(查询方式)
- 单片机C语言编程-定时器/计数器(中断方式)
- 单片机C语言编程-定时器/计数器(计数方式)
- 单片机C语言编程定时器的几种表达方式
- 单片机控制定时器或计数器之模块化编程
- 单片机C语言编程定时器的几种表达方式
- 51单片机汇编语言编程:用定时器控制输出矩形波
- 51单片机定时器编程:这么简单的要求,不用大动干戈
- 用链表+函数指针+定时器中断实现的一个软件定时器(试用于所有单片机)
- Hduoj1074【DP状态压缩】
- USACO:2.1.5 Hamming Codes 汉明码
- datastage报Windows Scripting Engine错误的解决办法
- 智能指针陷阱
- 细说 HttpHandler 的映射过程
- 单片机编程中软件定时器
- NEUOJ 1484概率dp
- SQL索引一步到位
- CentOS安装
- 第一章第十一题
- B. Fox And Two Dots
- JavaScript编程规范-有利于效率和可读性
- 自学历程
- Android编译服务器的管理之二:管理用户