微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于mega16的呼吸灯,求助!

基于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);
   }
  }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top