打印

本人在很多单片机项目用到的一个定时器,大家玩玩

[复制链接]
5109|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccxlslr|  楼主 | 2013-1-29 11:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
里面有说明,程序有注释。
在51,AVR, ARM7上移值过。标准C写成。

用于一些速度要求不高的,定时任务,几ms 到 65s。

如有测试成功的请跟贴。有什么意见,也请跟贴。

另有IIC,AT24CXX,DS18B20,FIFO,按键扫描,LCD1602 12864等模块。看情况提供。

timer.rar

3.51 KB

相关帖子

沙发
ayb_ice| | 2013-1-29 13:45 | 只看该作者
本帖最后由 ayb_ice 于 2013-1-29 13:46 编辑

我也有一个类似的组件

但有几点明显不同:
1: 我的核心不是在中断中调用的,是在主循环中调用的,当然也可以在中断调用,但可能需要稍加修改
2: 我的支持动态分配定时器,不需要指定定时器的编号,也可以指定编号,定时到期后产生模拟中断,定时器通过ID来识别,主要是提高效率,适应KEEIL C51
3: 设定定时器时可以选择强制覆盖,主动避开,先清除于设置同一ID的定时器
4: 简单的配置操作,移植性强.
5: 其它细节不同

使用特权

评论回复
评论
xlsbz 2013-1-29 15:10 回复TA
我的支持动态分配定时器,不需要指定定时器的编号???? 如何做到?我冥思苦想 没想出来! 
板凳
ayb_ice| | 2013-1-29 13:52 | 只看该作者
你的程序里用到了除法,会导致效率大大降低,对中断影响太大,这点比较致命

使用特权

评论回复
地板
ccxlslr|  楼主 | 2013-1-29 14:07 | 只看该作者
LS上的定时器模块大吗?要用到链表吗?

使用特权

评论回复
5
ayb_ice| | 2013-1-29 14:13 | 只看该作者

没有用到链表,简单的结构体而已

使用特权

评论回复
6
ayb_ice| | 2013-1-29 14:25 | 只看该作者
LZ的其它模块我也有

使用特权

评论回复
7
ccxlslr|  楼主 | 2013-1-29 15:04 | 只看该作者
不用除法,如何得到比较直观的时间呢。 比如1000ms。
还是通过自已先计算好,直接用一个常量初始化。 比如1000ms     时钟源为4ms , 用常量250初始化

使用特权

评论回复
8
xlsbz| | 2013-1-29 15:13 | 只看该作者
楼主的代码共享的比较好。可惜版主有眼无珠  不知道能不能给你加酷贴

使用特权

评论回复
9
ayb_ice| | 2013-1-29 15:26 | 只看该作者
本帖最后由 ayb_ice 于 2013-1-29 15:35 编辑

我的系统基于10MS周期

所以
#define MS /10
#define SECOND *100

sys_simple_timer_set_with_ready_select(true, SYS_SIMPER_TIMER_AUTO_SELECT, SYS_SIMPLE_TIMER_MSG_SAVE_CAL, 20MS);

自动分配定时器是这样的

一般程序员可能有这样的需求
10秒后做某个动作,
这个确实不需要指定哪个定时器完成,只要10秒后能做这个动作即可,通过指定消息的ID来达到目的,比如SYS_SIMPLE_TIMER_MSG_SAVE_CAL, 20M就是20毫秒后执行SYS_SIMPLE_TIMER_MSG_SAVE_CAL动作(保存校准数据),随便分配一个定时器,将时间,ID保存起来即可,定时器动作后通过回调函数完成指定功能,同时将ID作为回调函数参数即可,同时会有一个参数是定时器编号,一般不需要使用,只是为了支持指定定时器编号的传统调用方式,
那么不同的功能只要指定不同的ID即可,回调函数调用一次自动清除相应的定时器数据,下一次又可以被分配了

void sys_simple_timer_isr_interface(U8 n, U8 m)
{
//--------------------------------
// 参数判断
        if(n >= MAX_SYS_SIMPLE_TIMER){
                m = 0;
//                __error();
                __warning();
                return;
        }

//--------------------------------
// 定制代码
#if 1                // 快速屏蔽用户代码
        switch(m){
//                static U8 t = 1000MS;


        case SYS_SIMPLE_TIMER_MSG_ANY:
                __message("空命令,不可使用.");
                break;

        case SYS_SIMPLE_TIMER_MSG_SAVE_CAL:
                c8051f_eeprom_backup(false);
                pcf8576_string_display(0, "S.CAL", 1000MS);
                break;
.................



使用特权

评论回复
10
ayb_ice| | 2013-1-29 15:33 | 只看该作者
多个进程(任务)也可以指定同一个ID,这样就会有多种方式了
1: 如果已经存在,先取消再重新设置定时器
2:如果已经存在,直接退出,不重复设置
如果指定编号,则取消指定的,否则取消所有的

使用特权

评论回复
11
mochou| | 2013-1-30 09:57 | 只看该作者
之前我一同事也是这样做的,还不错,

使用特权

评论回复
12
mochou| | 2013-1-30 10:00 | 只看该作者
之前我一同事也是这样做的,还不错,

使用特权

评论回复
13
xyz769| | 2013-1-30 12:40 | 只看该作者
还不错。关于除法问题,其实只要设置2,4,8之类的数值,大多数编译器都能优化为移位运算的。

使用特权

评论回复
14
xinyipcb| | 2013-2-5 06:41 | 只看该作者
下下来,有空看看。

使用特权

评论回复
15
sunhq02| | 2013-2-5 09:10 | 只看该作者
我也有类似的模块
外围函数其实看个人喜好啦
主要是我觉得你在 tick里面做的太多了
我的tick里面,除了一个 ++操作之外, 什么也没有

使用特权

评论回复
16
piliming| | 2013-2-5 09:42 | 只看该作者
我也得学着积累点这样的组件了,谢谢分享!

使用特权

评论回复
17
流行音乐| | 2013-2-7 00:10 | 只看该作者
不错,值得学习。

使用特权

评论回复
18
zhuanghaiyang| | 2013-2-7 13:49 | 只看该作者
学习

使用特权

评论回复
19
冲动的卡特| | 2013-2-16 21:26 | 只看该作者
不错不错!看看!呵呵

使用特权

评论回复
20
heqiaosheng| | 2015-11-21 20:35 | 只看该作者
mark.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:电位器,可调电阻,微调电阻就选BOURNS 3362 带刻度,温漂小于100ppm/℃。 http://www.szlcsc.com/search/global.html&global_search_keyword=3362%2520BOURNS

68

主题

586

帖子

3

粉丝