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大体应用功能讲解完毕,