搜索
bottom↓
回复: 4

51单片机软定时器程序分享

[复制链接]

出10入79汤圆

发表于 2020-7-10 17:08:59 | 显示全部楼层 |阅读模式
之前自己的一个项目请教过坛友,如何对多个任务定时:
https://www.amobbs.com/thread-5735769-1-1.html

不少坛友都说软定时器可以解决。

这两天找到一个可以用的,分享给大家。

typedef enum tmrMode
{
        MODE_ONE_SHOT = 0, //单次模式
        MODE_PERIODIC,           //周期模式
} tmrMode;//定时器模式

typedef enum tmrState
{
        SOFT_TIMER_STOPPED = 0, //停止
        SOFT_TIMER_RUNNING,                //运行
        SOFT_TIMER_TIMEOUT,                //超时
        SOFT_TIMER_WAITING                //等待
} tmrState;//定时器状态。可通过函数获取这个状态。

typedef struct softTimer
{
        unsigned char state; //状态
        unsigned char mode;         //模式
        unsigned int period; //定时周期
        unsigned int count;         //定时计数用
        pFun callback;                 //定时器回调函数
} softTimer;//定时器结构体。存储定时器任务内容及其他参数。


主要函数:
void softTimer_Creat(unsigned char id, tmrMode mode, unsigned int interval, pFun cb)
{
        softTimerList[id].mode = mode;
        softTimerList[id].period = interval;
        softTimerList[id].count = 0;
        softTimerList[id].callback = cb;
        softTimerList[id].state = SOFT_TIMER_STOPPED;
}
创建定时器,后面的变量分别是定时器编号、定时器模式(单次或循环)、定时器触发时间、定时器事件(一个指针,指向函数)

void softTimer_Start(unsigned int id)
{
        softTimerList[id].state = SOFT_TIMER_RUNNING;
}
//开启定时器
void softTimer_Stop(unsigned int id)
{
        softTimerList[id].state = SOFT_TIMER_STOPPED;
}
//停止定时器
void softTimer_Clr(unsigned int id)
{
        if (softTimerList[id].mode == MODE_ONE_SHOT)
        {
                softTimerList[id].state = SOFT_TIMER_STOPPED;
        }
        else
        {
                softTimerList[id].state = SOFT_TIMER_RUNNING;
        }
}
//清除定时器。如果定时器是单次触发模式,则定时器关闭;如果是循环模式,则重新开始计时。
unsigned char softTimer_GetState(unsigned int id)
{
        return softTimerList[id].state;
}
//获取定时器状态。

void softTimer_Update(void) //更新定时器状态,在硬件定时器中1ms调用一次
{
        unsigned char id;
        for (id = 0; id <= SOFT_TIMER_MAX; id++)
        {
                switch (softTimerList[id].state)
                {
                case SOFT_TIMER_STOPPED:
                        break;
                case SOFT_TIMER_RUNNING:
                        if (softTimerList[id].count < softTimerList[id].period)
                        {
                                softTimerList[id].count++;
                        }
                        else
                        {
                                softTimerList[id].count = 0;
                                softTimerList[id].state = SOFT_TIMER_TIMEOUT;
                                softTimerList[id].callback();
                        }
                        break;
                case SOFT_TIMER_TIMEOUT:
                        if (softTimerList[id].mode == MODE_ONE_SHOT)
                        {
                                softTimerList[id].state = SOFT_TIMER_STOPPED;
                        }
                        else
                        {
                                softTimerList[id].count++;
                                softTimerList[id].state = SOFT_TIMER_RUNNING;
                        }
                        break;
                default: //state error
                        break;
                }
        }
}//更新定时器状态,在中断中调用。

这个软定时器的缺点:不是很准确。如果定时时间长的话还好,误差基本上就抵消了,如果只是计时几个周期的话波形宽度会变,不适合做PWM,只适合秒级别的定时。
顺便原作者提供了一个protus的仿真,反正我是打不开。。。谁能打开谁玩玩吧。已经在“中颖”单片机上移植过了,很好用。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入25汤圆

发表于 2020-7-10 17:13:52 | 显示全部楼层
谢谢。 帮顶。。。。

出0入4汤圆

发表于 2020-7-10 22:50:34 | 显示全部楼层
8.9SP2仿真可以运行,回头看看怎样使用。

出16170入6148汤圆

发表于 2020-7-12 02:35:48 来自手机 | 显示全部楼层
打赏!

庆祝论坛“打赏”功能实施, 现在开始发技术主题,可以获得打赏
https://www.amobbs.com/thread-5735948-1-1.html

出20入0汤圆

发表于 2020-7-12 18:02:44 | 显示全部楼层
有问题,楼主 call_back()最好不能在中断里
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 06:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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