原创 AVR 单片机采用定时器实现精确延时

2010-6-18 16:46 8192 10 10 分类: MCU/ 嵌入式

AVR 单片机采用定时器实现精确延时


       我们在编写程序中经常会用到延时程序,如果对延时的精度不是很高的情况下,采用等待延时就足够用了,但是在某些应用中对延时的精确度较高,这里就简单的介绍使用AVR单片机的定时器产生精确的延时,这里采用的是定时器0,其他单片机采用此方法也很容易实现,在此抛砖引玉,不足之处,请大家指正。如果觉得好请顶一下,转载请注明出处,谢谢!


程序如下:


/**************************************


*文件名称: hal_timer0.c
*摘    要:     时钟定时器,采用定时器,实现精确延时
*当前版本: V1.0
*作    者:    feng423
*创建日期: 2010年02月25日 
*修 改 人:
*修改日期:
****************************************/


#include <iom16v.h>        //调用头文件
#include <macros.h>      //调用宏,主要用于对每一个端口的某一个位的操作
#include "hal_types.h"     //包含数据类型



static uint32 TimingDelay;     //局部变量 
/*声明一些定时变量,根据需要对其进行修改*/
/***************************************
*函数名称:timer0_init
*功    能: 定时器0初始化,定时时间为100us
*输    入:无 
*返    回:无
*备    注:T
//TIMER0 initialize - prescale:8
// WGM: Normal
// desired value: 100uSec
// actual value: 100.000uSec (0.0%)
*当前版本:V1.0
*作    者:feng423
*创建日期:2010年02月25日 
*修 改 人:
*修改日期:
****************************************/


void start_time0(void)
{
 TCCR0 = 0x00;        //停止定时器0
 TIMSK &= ~(1<<TOIE0);      //禁止TIMER0中断,只修改TOIE0的值,而不影响其他位的值,即不影响其它中断
 TCNT0 = 0xCE;        //设置计数器,设置定时时间100us
 TCCR0 = 0x02;      //启动定时器,使用8分频
 
 TIMSK |= (1<<TOIE0);      //启用timer0中断,将原来TOIE0为0的值,修改为1,而不影响其他位的值
 
 //根据实际的需要在此处添加定时变量
}



/***************************************
*函数名称:imer0_ovf_isr
*功    能:定时器0溢出中断函数
*输    入:无  
*返    回:
*备    注:
*当前版本:V1.0
*作    者:    feng423
*创建日期:2010年02月25日 
*修 改 人:
*修改日期:
****************************************/
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
   TCNT0 = 0xCE;              //reload counter value重新装载计数寄存器的初始值,avr的定时器不会自动重装初始值
  TimingDelay--;;
}


 


void Timer0_Delay(uint32 nTime)
{
 
  start_time0();                 //启动定时器
 
  TimingDelay = nTime;


  while(TimingDelay != 0);
 
  TCCR0 = 0x00;              //关闭time0定时器,溢出标志位在进入中断程序之后自动清零,也可以通过向TOV0写1清零
  TIMSK &= ~(1<<TOIE0);      //禁止TIMER0中断,只修改TOIE0的值,而不影响其他位的值
 
}

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条