单片机编程中软件定时器

来源:互联网 发布:淘宝发错货怎么理赔 编辑:程序博客网 时间: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


soft_timer.c文件

#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