当前位置:文档之家› ATmega16方波输出程序

ATmega16方波输出程序


/******************************************
编译环境:ICC-AVR
芯片型号:ATmega16
时钟频率:12.000MHz
函数功能:PA0~PA7分别输出1000Hz、500Hz、
200Hz、100Hz、50Hz、10Hz、5Hz、
1Hz方波。
*******************************************/

#include
#include

#define PA0_0 (PORTA&=0xfe)
#define PA0_1 (PORTA|=0x01)
#define PA1_0 (PORTA&=0xfd)
#define PA1_1 (PORTA|=0x02)
#define PA2_0 (PORTA&=0xfb)
#define PA2_1 (PORTA|=0x04)
#define PA3_0 (PORTA&=0xf7)
#define PA3_1 (PORTA|=0x08)
#define PA4_0 (PORTA&=0xef)
#define PA4_1 (PORTA|=0x10)
#define PA5_0 (PORTA&=0xdf)
#define PA5_1 (PORTA|=0x20)
#define PA6_0 (PORTA&=0xbf)
#define PA6_1 (PORTA|=0x40)
#define PA7_0 (PORTA&=0x7f)
#define PA7_1 (PORTA|=0x80)

unsigned int flag=0;

void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
}

//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// actual value: 2.000KHz (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFD; //setup
TCNT1L = 0x12;
TCCR1A = 0x00;
TCCR1B = 0x02; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
TCNT1H = 0xFD;
TCNT1L = 0x12;

if(flag>=2000)
{
flag = 0;
}
else
{
flag++;
}
}

void init_devices(void)
{
CLI();
port_init();
timer1_init();

TIMSK = 0x04;
SEI();
}

void main(void)
{
init_devices();

while(1)
{
if(flag%2==0) //1000KHz
{
PA0_1;
if((flag/2)%2==0) //500KHz
{
PA1_1;
if((flag/5)%2==0) //200KHZ
{
PA2_1;
if((flag/10)%2==0) //100KHz
{
PA3_1;
if((flag/20)%2==0) //50KHz
{
PA4_1;
if((flag/100)%2==0) //10KHz
{
PA5_1;
if((flag/200)%2==0) //5KHz
{
PA6_1;
if((flag/1000)%2==0) //1KHz
{
PA7_1;
}
else{PA7_0;}
}
else{PA6_0;}
}
else{PA5_0;}
}
else{PA4_0;}
}
else{PA3_0;}
}
else{PA2_0;}
}
else{PA1_0;}
}
else{PA0_0;}
}
}

相关主题
文本预览
相关文档 最新文档