找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1318|回复: 2
收起左侧

单片机软件多定时器multi_timer实现程序 目前相差很大,不准 有兴趣可以改进下

[复制链接]
ID:137736 发表于 2021-12-16 20:57 | 显示全部楼层 |阅读模式
网上发现一个很好的软件定时器程序。有移植示例,略加修改,在普中开发板上实现。但是相差很大,不准,请试验后发表意见。

单片机源程序如下:
  1. #include <reg51.h>
  2. #include "multi_timer.h"
  3. /*定义3个定时器*/
  4. Timer timer1 ;
  5. Timer timer2 ;
  6. Timer timer3;
  7. /*用于定时10s的计数器*/
  8. int Counter = 0 ;
  9. /*根据板子原理图,灯位于P0^0,P0^1*/
  10. sbit LED = P0^0 ;
  11. sbit LED2 = P0^1;

  12. /*晶振频率为12M*/                                                         
  13. #define FOSC 12000000L
  14. /*指令速度为12T*/
  15. #define command_speed 12
  16. /*用multi_timer创建的定时器1定时时间  单位:ms*/
  17. #define TIMER_TIMEOUT_500MS 500
  18. /*用multi_timer创建的定时器2定时时间  单位:ms*/
  19. #define TIMER_TIMEOUT_1S 1000
  20. #define TIMER_TIMEOUT_10S 10000
  21. void timer0_init(void);
  22. void timer1_callback(void);
  23. void timer2_callback(void);
  24. void timer3_callback(void);

  25. void main(void)
  26. {         
  27.    LED = 0;
  28.    timer0_init(); //系统定时器0初始化
  29.    /*判断是否到达定时时间(timeout参数),如果到达了定时时间,没有指定循环定时触发时间(repeat参数)的时候,
  30.    这时就会把当前定时器句柄给移除,如果指定了循环定时触发时间(repeat参数),则定时时间会被重新赋值,
  31.    直到下一个定时到来,接下来会一直循环触发。*/
  32.    timer_init(&timer1, timer1_callback, TIMER_TIMEOUT_500MS, TIMER_TIMEOUT_500MS);
  33.    timer_init(&timer2, timer2_callback, TIMER_TIMEOUT_1S, TIMER_TIMEOUT_1S);
  34.    timer_init(&timer3, timer3_callback, TIMER_TIMEOUT_10S,TIMER_TIMEOUT_10S);
  35.    timer_start(&timer1);
  36.    timer_start(&timer2);
  37.    timer_start(&timer3);
  38.    while(1)
  39.    {
  40.               timer_loop();
  41.    }
  42. }

  43. /*multi_timer回调函数1调用*/
  44. void timer1_callback(void)
  45. {
  46.    /*LED灯电平翻转*/
  47.    LED = !LED ;
  48. }
  49. /*multi_timer回调函数2调用*/
  50. void timer2_callback(void)
  51. {
  52.         /*当计数器到达10次以后删除所有创建的软件定时器
  53.           计数器清0,将LED电平置为1,常亮
  54.         */
  55.         ++Counter ;
  56.         if(10 == Counter )
  57.         {
  58.                 Counter = 0 ;
  59.                 LED = 1 ;
  60.                 timer_stop(&timer1);
  61.                 timer_stop(&timer2);
  62.         }
  63. }
  64. /*multi_timer回调函数3调用*/
  65. void timer3_callback(void)
  66. {
  67.    /*LED灯电平翻转*/
  68.    LED2 = !LED2 ;
  69. }

  70. /*硬件定时器初始化*/
  71. void timer0_init(void)               
  72. {
  73.         TMOD = 0x00;
  74.     TH0 = (65536-FOSC/command_speed/1000) >> 8;
  75.     TL0 = (65536-FOSC/command_speed/1000);
  76.     EA = 1;
  77.     ET0 = 1;
  78.     TR0 = 1;
  79. }

  80. /*利用系统定时器产生1ms的定时中断*/
  81. void timer0() interrupt 1
  82. {
  83.         TH0 = (65536-FOSC/command_speed/1000) >> 8;
  84.     TL0 = (65536-FOSC/command_speed/1000);
  85.         /*multi_timer计数器自增*/
  86.         timer_ticks(); //系统滴答
  87. }  
复制代码

Keil代码下载:
Ok-普中多定时器multi_timer.rar (3.52 MB, 下载次数: 15)
回复

使用道具 举报

ID:90212 发表于 2022-4-7 21:43 | 显示全部楼层
本帖最后由 gongzhu 于 2022-4-7 21:49 编辑

移植到stc15w4k32s4运行正常,没有理解所谓的差别大是什么意思。P0.0以1s为周期闪烁10下后常亮,P0.1亮10s再灭掉,10s后再亮,跟电脑时间核对没有超过人眼识别范围。 multi_timer.rar (46.55 KB, 下载次数: 7)
回复

使用道具 举报

ID:137736 发表于 2022-4-8 10:14 | 显示全部楼层
时间不准的问题找到了,是定时器模式问题。原程序是用的stc单片机定时器模式特殊,和别的不一样,自己重设TMOD就好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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