单片机软定时器

一直想在单片机上实现一个像MFC和WPF一样的软定时器,花了点时间终于写出来了,使用时需把timer_run函数放到定时器中断服务函数里面

typedef struct _TIMER
{
	unsigned char isEnable;
	unsigned int  count;
	unsigned int  countNeed;
	void (*func)();	
}TIMER;



void timer_Run(TIMER *timer)
{
	if(timer->isEnable)
	{
		timer->count ++;
		if(timer->count == timer->countNeed)
		{
			timer->count = 0;
			timer->func();
		}
	}	
}

void startTimer(TIMER *timer)
{
	timer->count = 0;
	timer->isEnable = 1;
}

void stopTimer(TIMER *timer)
{
	timer->isEnable = 0;
	timer->count =0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机中实现定时器的功能可以使用定时器中断来实现。以下是一个基本的定时器的实现示例: ```c #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> #define TIMER_INTERVAL_MS 10 // 定时器间隔时间,单位为毫秒 #define TIMER_COUNT_MAX 100 // 定时器最大计数值 #define TIMER_COUNT_STEP 1 // 定时器计数步长 volatile int timer_count = 0; // 定时器计数器 void timer_init() { // 设置定时器1为CTC模式 TCCR1B |= (1 << WGM12); // 设置定时器1的比较值 OCR1A = (F_CPU / 1000) * TIMER_INTERVAL_MS / 64 - 1; // 设置定时器1的预分频系数为64 TCCR1B |= (1 << CS11) | (1 << CS10); // 使能定时器1的比较匹配中断 TIMSK1 |= (1 << OCIE1A); } ISR(TIMER1_COMPA_vect) { // 定时器计数器加上步长 timer_count += TIMER_COUNT_STEP; if(timer_count >= TIMER_COUNT_MAX) { // 定时器计数器达到最大值时执行定时器超时的操作 // ... // 重置定时器计数器 timer_count = 0; } } int main() { // 初始化定时器 timer_init(); // 启用中断 sei(); while(1) { // 主程序执行任务 // ... } return 0; } ``` 在这个示例中,我们使用了AVR单片机定时器1来实现定时器的功能。在程序启动时,我们通过`timer_init`函数初始化定时器1,并设置定时器间隔为10毫秒。在每次定时器比较匹配中断触发时,我们将定时器计数器加上步长,并判断计数器是否达到最大值。如果达到最大值,就执行定时器超时的操作,并重置计数器。 需要注意的是,在单片机程序中使用定时器时,需要将中断处理函数声明为`ISR`类型,并使用`sei`函数启用中断。此外,还需要根据具体的单片机型号和编译器设置定时器的预分频系数和比较值,以确保定时器的间隔时间正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值