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
voidtimer0_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);      //比较匹配输出引脚初始化
}
voiddelaymsPWM(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 
voidtimer0_comp(void)
{}



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