ATMEGA128定时器1的使用
扫描二维码
随时随地手机看文章
//环境:winavr+avr studio
char temp=0;
ISR(TIMER1_COMPA_vect )//中断函数
{
// user code here
temp++;
if (temp==10)
temp=0;
PORTA=temp;
DDRA=0xff;
}
void mytimer_init(void)
{
//关总中断
cli();
//TCCR1A为配置引脚输出模式,这里取默认为0,未连接即可,因此不需要为其赋值
//T/C1时钟源选择为clk/64,CLK现为内部晶振4MHZ,因此时钟为4,000,000/64 HZ = 62500 HZ
TCCR1B &= ~0x07;
TCCR1B |= 0x03;
//选择模式 WGM10~WGM13
TCCR1A &= ~0x03;
TCCR1B &= ~(0x03<<3);//模式4 CTC
TCCR1B |= 0x01<<3;
//赋值定时初值 16位
TCNT1=0;
//赋值比较寄存器TOP初值 16位 ,在以上工作模式下,当TCNT1=OCR1A时,TCNT1自动清0
OCR1A = 62500;//一秒中断一次
//使能定时器T/C1溢出中断,T/C1的其它中断屏蔽掉
TIMSK &= ~(0xf0<<2);
TIMSK |= (0x01<<4);
ETIMSK &= ~0x01;
//清中断溢出标志位,进入中断后也会自动清除,以后不用再清了
TIFR |= 1<<2;
//启动定时器
SFIOR &= 0x7e;
//开总中断
sei();
}