ATmega32的有三个定时器,T0和T2是8位的,T1是16位的,各自提供了很多功能 都是以前用studio写的,那时还没用iar
*****************************************************************
//定时器0溢出中断
//CPU:mega32
//编译器:winavr
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
DDRC |= (1 << 7);//PC7置为输出
TIMSK |= 1<<TOIE0;//不屏蔽T0溢出中断
TCCR0 |= (1 << CS02) |(0 << CS01) | (1 << CS00);//1024分频
sei();//使能全局中断
while(1);
}
SIGNAL(SIG_OVERFLOW0)//TIMER0 溢出中断服务程序
{
PORTC ^= 1<<7;//PC7取反
}
******************************************************************
*****************************************************************
//定时器0普通匹配模式中断
//CPU:mega32
//编译器:winavr #include <avr/io.h>
#include <avr/interrupt.h> int main(void)
{
DDRC |= (1 << 7);//PC7置为输出
TIMSK |= 1<<OCIE0;//不屏蔽T0匹配中断
OCR0 = 0X10;//匹配值
TCCR0 |= (1 << CS02) |(0 << CS01) | (1 << CS00);//1024分频
sei();//使能全局中断
while(1);
}
SIGNAL(SIG_OUTPUT_COMPARE0)//TIMER0 匹配中断服务程序
{
TCNT0 = 0;//计数值清0
PORTC ^= 1<<7;//PC7取反
} ******************************************************************
*****************************************************************
//定时器0匹配时清零模式(CTC)中断
//CPU:mega32
//编译器:winavr
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
DDRC |= (1 << 7);//PC7置为输出
DDRB |= (1 << 3);//PC7置为输出 TIMSK |= 1<<OCIE0;//不屏蔽T0匹配中断
OCR0 = 0X10;//匹配值
TCCR0 |= (1 << WGM01) | (0 << WGM00) | (1 << CS02) | (0 << CS01) | (1 << CS00);//CTC模式,1024分频
sei();//使能全局中断
while(1);
} SIGNAL(SIG_OUTPUT_COMPARE0)//TIMER0 匹配中断服务程序
{
PORTC ^= 1<<7;//PC7取反
} ******************************************************************
*****************************************************************
//定时器0输出正弦波
//CPU:mega32
//编译器:winavr
#include <avr/io.h>
#include <avr/interrupt.h>
const char sindata[128] = {128,134,140,147,153,159,165,171,177,182,188,
193,199,204,209,213, 218,222,226,230,234,237,240,243,245,248,250,251,253,254,
254,255, 255,255,254,254,253,251,250,248,245,243,240,237,234,230,226,222, 218,
213,209,204,199,193,188,182,177,171,165,159,153,147,140,134, 128,122,116,109,
103,97,91,85,79,74,68,63,57,52,47,43, 38,34,30,26,22,19,16,13,11,8,6,5,3,2,2,1,
1,1,2,2,3,5,6,8,11,13,16,19,22,26,30,34, 38,43,47,52,57,63,68,74,79,85,91,97,
103,109,116,122}; unsigned char x=0; int main(void)
{
DDRB |= (1 << 3);//PB3 (OC0) 置为输出 TIMSK |= 1<<OCIE0;//不屏蔽T0匹配中断
TCCR0 |= (1 << WGM01) | (1 << WGM00) | (1 << COM01) | (0 << COM00) |(0 << CS02) | (0 << CS01) | (1 << CS00);//CTC模式,“高低”占空比,不分频
sei();//使能全局中断
while(1);
} SIGNAL(SIG_OUTPUT_COMPARE0)//TIMER0 匹配中断服务程序
{
OCR0 = sindata[x];
if( ++x > 127 ) x=0;
}
******************************************************************
*****************************************************************
//定时器1捕捉中断
//CPU:mega32
//编译器:winavr
#include <avr/io.h>
#include <avr/interrupt.h> int main(void)
{
TIMSK |= 1<<TICIE1;//不屏蔽T1捕捉中断
TCCR1A |= (0<<WGM11) | (0<<WGM10);
TCCR1B |= (0<<WGM13) | (0<<WGM12) | (0 << CS12) |(1 << CS11) | (0 << CS10);//普通模式,不分频
sei();//使能全局中断
while(1);
} SIGNAL(SIG_INPUT_CAPTURE1)//TIMER1 捕捉中断服务程序
{
//……
} ****************************************************************** *****************************************************************
//定时器1溢出中断
//CPU:mega32
//编译器:winavr
#include <avr/io.h>
#include <avr/interrupt.h> int main(void)
{
DDRC |= (1 << 7);//PC7置为输出
TIMSK |= 1<<TOIE1;//不屏蔽T1溢出中断
TCCR1A |= (0<<WGM11) | (0<<WGM10);
TCCR1B |= (0<<WGM13) | (0<<WGM12) | (0 << CS12) |(1 << CS11) | (0 << CS10);//普通模式,不分频
sei();//使能全局中断
while(1);
}
SIGNAL(SIG_OVERFLOW1)//TIMER1 溢出中断服务程序
{
TCNT1H = 0X99;//先写高位,后写低位
TCNT1L = 0X88;
PORTC ^= 1<<7;//PC7取反
}
******************************************************************
*****************************************************************
//定时器测频率
//定时器1计数,定时器2定时
//CPU:mega32
//编译器:winavr
#include <avr/io.h>
#include <avr/interrupt.h>
#define F 1000000 int main(void)
{
DDRC |= (1 << 7);//PC7置为输出 TIMSK |= 1<<OCIE2;//不屏蔽T2匹配中断
OCR2 = 0.1 *F/1024;//定时0.1s
TCCR2 |= (1 << WGM01) | (0 << WGM00) | (1 << CS02) | (1 << CS01) | (1 << CS00);//CTC模式,1024分频
sei();//使能全局中断 TCCR1A |= (0<<WGM11) | (0<<WGM10);
TCCR1B |= (0<<WGM13) | (0<<WGM12) | (1 << CS12) |(1 << CS11) | (0 << CS10);//普通模式,T1下降沿计数
while(1);
} SIGNAL(SIG_OUTPUT_COMPARE2)//TIMER2 匹配中断服务程序
{
PORTC ^= 1<<7;//PC7取反
TCNT1H = 0;
TCNT1L = 0;
}
******************************************************************
*****************************************************************
//定时器测1捕捉中断
//可以测周期用
//CPU:mega32
//编译器:winavr
#include <avr/io.h>
#include <avr/interrupt.h> int main(void)
{
TIMSK |= 1<<TICIE1;//不屏蔽T1捕捉中断
TCCR1A |= (0<<WGM11) | (0<<WGM10);
TCCR1B |= (0<<WGM13) | (0<<WGM12) | (0 << CS12) |(1 << CS11) | (0 << CS10);//普通模式,不分频
sei();//使能全局中断
while(1);
} SIGNAL(SIG_INPUT_CAPTURE1)//TIMER1 捕捉中断服务程序
{
TCNT1H = 0;
TCNT1L = 0;
}
******************************************************************
|