基于mega16的呼吸灯,求助!
时间:10-02
整理:3721RD
点击:
程序有什么问题吗?
#include <iom16v.h>
#include <macros.h>
//功能:是OCRO的变化速率变小
//名称:延时函数
void delay(unsigned int timer)
{
unsigned i,j;
for(i=0;i<1000;i++)
for(j=0;j<timer;j++);
}
/*
功能:端口初始化
注意:要想在引脚上得到输出信号还必须将OC0 的数据方向设置为输出,即PB3为输出。
PB3输出电平变化控制小灯,则控制小灯A口也为输出。
*/
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0xff;
PORTB = 0x00;
DDRB = 0x08;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//TIMER0 initialize - prescale:64
// WGM: PWM Fast
// desired value: 100KHz
// actual value: 0.984KHz (-10140.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x01; //set count T/C 寄存器- TCNT0设置初值
OCR0 = 0x05; //set compare 输出比较寄存器- OCR0设置初值
TCCR0 = 0x7B; //start timer 非强制输出比较
//快速 PWM
//比较匹配发生时OC0 置位
//clkI/O/64 ( 来自预分频器)
}
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
TCNT0 = 0x01; //reload counter value
PORTA=0X01;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
unsigned char i;
init_devices();
while(1)
{
for(OCR0=0X05;OCR0<0xFB;OCR0++) //OCRO增大,占空比减小
delay(20);
for(OCR0=0xFB;OCR0>0x05;OCR0--) //OCRO减小,占空比增大
delay(20);
}
}