网上发现一个很好的软件定时器程序。有移植示例,略加修改,在普中开发板上实现。但是相差很大,不准,请试验后发表意见。
单片机源程序如下:
- #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)
|