专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

AVR定时器0完全资料

作者:huqin   来源:本站原创   点击数:  更新时间:2014年04月01日   【字体:

Atmega16

      

       

 


 

于定时器0相关的寄存器有 SREG 全局中断  bit7   I

TIMSK中断屏蔽寄存器    bit  0:1   TOIE0  OCIE0

 


TOIE0
中断溢出允许标志位   

OCIE0输出比较允许标志位

TCCR0  timer0控制寄存器 bit0:7

 


FOC0
强制输出比较;仅在非PWM模式有效

WGM00:WGM01 模式控制位;

COM01:COM00 各PWM模式中 具体设置位:

 





CS00 CS01 CS02 
时钟选择位   于定时器2公用

 


TCNT0  
定时器0寄存器八位放置定时器初值

OCR0    定时器0比较匹配寄存器与TCNT0值比较

TIFR   中断标志寄存器 

 


TOV0  
定时器0溢出中断标志位

OCF0   比较匹配中断标志位

下边我们编程先从简单的定时器计数开始

           程序部分

#include<iom16v.h>
#include"dis.h"     //595驱动显示头文件
unsigned  char  i,temp;
void   inittimer0(void)//定时器0初始化函数
{
TCCR0|=(1<<CS00)|(1<<CS02);//普通计数模式,1024分频
TCNT0=0X00;                //赋值
SREG=0X80;               //全局中断打开
TIMSK|=(1<<TOIE0);        //定时器0溢出中断使能
}
void   main(void)
{
DDRC|=0X07;       //595控制端口初始化
inittimer0();     //定时器初始化
dis(0);       //显示函数
while(1){ }
}
#pragma interrupt_handler timer0_ovf:10
void  timer0_ovf(void)///定时器中断
{ 
  i++;
  if(i>=4)
  {
    i=0;
    temp++;dis(temp);//数值自加,显示;
    }
}               仿真部分

 



T0输入产生中断程序及仿真

下边源码中更改TCCR0的配置可决定那种跳变沿触发

下降沿触发 TCCT0|=(1<<CS02)|(1<<CS01);

上升沿触发 TCCT0|=(1<<CS02)|(1<<CS01)|(1<<CS00);

注意这里的上升沿是T0口处于低电平状态,发生了高电平的跳变,配置不需要改变,上升沿下降沿端口配置是一样的

//通过T0引脚触发中断
#include<iom16v.h>
void   initTimer0(void)
{
     TCCR0|=(1<<CS02)|(1<<CS01); //下降沿触发,(1<<CS00)上升沿触发
     TCNT0=0XFE;      //赋值通过按键将寄存器值填满产生中断
     TIMSK|=(1<<TOV0);  //定时器0溢出中断
     SREG|=0X80;      //全局中断
     PORTD|=(1<<PD0);      //初始化T0引脚
     DDRC=0XFF;      //中断产生动作端口初始化
}
void  main(void)
{
initTimer0();
while(1);
}
#pragma interrupt_handler timer0_ovf:10
void timer0_ovf(void)
{
  TCNT0=0XFE;    //寄存器重装
  PORTC=~PORTC;    //动作
} 

 




下边介绍定时器0 的PWM功能,通过上边对定时器的了解下边也会很简单的掌握。选择相位修正模式,WGM00=1;WGM01=0;无分频,CS02=0;CS01=0;CS00=1;

比较匹配选择在升序计数发生比较匹配将清零OC0,降序计数发生时比较匹配将OC0置位.相应控制位COM00=0,COM01=1;TCCR0|=(1<<WGM00)|(1<<COM01)|(1<<CS00);

比较匹配寄存器赋值,比较匹配中断向量为:20

#include<iom16v.h>           
void  initpwmt0(void)          //编写人张小强日期13,09,17
{
TCCR0|=(1<<WGM00)|(1<<COM01)|(1<<CS00);//相位修正PWM
TIMSK|=(1<<OCIE0);            //输出匹配使能
SREG|=0X80;              //全局中断使能
TCNT0=0X00;              //定时器寄存器
OCR0=0X80;                //比较匹配寄存器
DDRB|=(1<<DDB3);            //比较匹配输出引脚初始化
}
void delaymsPWM(unsigned  int  z)
{
unsigned  int  x,y;
for(x=1000;x>0;x--)
  for(y=z;y>0;y--);
}
void  main()
{
initpwmt0();              
while(1)
{   
  OCR0++;delaymsPWM(10);         //定时自加
}
}                     //比较匹配中断
#pragma interrupt_handler timer0_comp:20
void timer0_comp(void)
{}





至此定时器0大体应用功能讲解完毕,

关闭窗口

相关文章