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条评论)
登录后参与讨论