标题:
单片机软件多定时器multi_timer实现程序 目前相差很大,不准 有兴趣可以改进下
[打印本页]
作者:
zmc419
时间:
2021-12-16 20:57
标题:
单片机软件多定时器multi_timer实现程序 目前相差很大,不准 有兴趣可以改进下
网上发现一个很好的软件定时器程序。有移植示例,略加修改,在普中开发板上实现。但是相差很大,不准,请试验后发表意见。
单片机源程序如下:
#include <reg51.h>
#include "multi_timer.h"
/*定义3个定时器*/
Timer timer1 ;
Timer timer2 ;
Timer timer3;
/*用于定时10s的计数器*/
int Counter = 0 ;
/*根据板子原理图,灯位于P0^0,P0^1*/
sbit LED = P0^0 ;
sbit LED2 = P0^1;
/*晶振频率为12M*/
#define FOSC 12000000L
/*指令速度为12T*/
#define command_speed 12
/*用multi_timer创建的定时器1定时时间 单位:ms*/
#define TIMER_TIMEOUT_500MS 500
/*用multi_timer创建的定时器2定时时间 单位:ms*/
#define TIMER_TIMEOUT_1S 1000
#define TIMER_TIMEOUT_10S 10000
void timer0_init(void);
void timer1_callback(void);
void timer2_callback(void);
void timer3_callback(void);
void main(void)
{
LED = 0;
timer0_init(); //系统定时器0初始化
/*判断是否到达定时时间(timeout参数),如果到达了定时时间,没有指定循环定时触发时间(repeat参数)的时候,
这时就会把当前定时器句柄给移除,如果指定了循环定时触发时间(repeat参数),则定时时间会被重新赋值,
直到下一个定时到来,接下来会一直循环触发。*/
timer_init(&timer1, timer1_callback, TIMER_TIMEOUT_500MS, TIMER_TIMEOUT_500MS);
timer_init(&timer2, timer2_callback, TIMER_TIMEOUT_1S, TIMER_TIMEOUT_1S);
timer_init(&timer3, timer3_callback, TIMER_TIMEOUT_10S,TIMER_TIMEOUT_10S);
timer_start(&timer1);
timer_start(&timer2);
timer_start(&timer3);
while(1)
{
timer_loop();
}
}
/*multi_timer回调函数1调用*/
void timer1_callback(void)
{
/*LED灯电平翻转*/
LED = !LED ;
}
/*multi_timer回调函数2调用*/
void timer2_callback(void)
{
/*当计数器到达10次以后删除所有创建的软件定时器
计数器清0,将LED电平置为1,常亮
*/
++Counter ;
if(10 == Counter )
{
Counter = 0 ;
LED = 1 ;
timer_stop(&timer1);
timer_stop(&timer2);
}
}
/*multi_timer回调函数3调用*/
void timer3_callback(void)
{
/*LED灯电平翻转*/
LED2 = !LED2 ;
}
/*硬件定时器初始化*/
void timer0_init(void)
{
TMOD = 0x00;
TH0 = (65536-FOSC/command_speed/1000) >> 8;
TL0 = (65536-FOSC/command_speed/1000);
EA = 1;
ET0 = 1;
TR0 = 1;
}
/*利用系统定时器产生1ms的定时中断*/
void timer0() interrupt 1
{
TH0 = (65536-FOSC/command_speed/1000) >> 8;
TL0 = (65536-FOSC/command_speed/1000);
/*multi_timer计数器自增*/
timer_ticks(); //系统滴答
}
复制代码
Keil代码下载:
Ok-普中多定时器multi_timer.rar
(3.52 MB, 下载次数: 15)
2021-12-16 20:56 上传
点击文件名下载附件
作者:
gongzhu
时间:
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, 下载次数: 8)
2022-4-7 21:42 上传
点击文件名下载附件
stc15移植
作者:
zmc419
时间:
2022-4-8 10:14
时间不准的问题找到了,是定时器模式问题。原程序是用的stc单片机定时器模式特殊,和别的不一样,自己重设TMOD就好了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1