本帖最后由 gxbltao 于 2014-12-9 16:12 编辑
/*****************************************************************************
名字:avr pwm占空比
环境:studio4.16+winAVR
MCU:Atmega16
******************************************************************************/
#define F_CPU 1000000UL
#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#define KEY_ON() (( PINB & _BV(PB0))==0x00)
//#include <macros.h>
int flag_bell=0;
int unsigned x;
/*端口初始化*/
void port_init()
{
DDRD|=(1<<PD5); //配置PD5口为输出
PORTD|=(1<<PD5); //PD5口的初始值为"1"
DDRD|=(1<<PD4);
DDRC|=(1<<PC0); PORTC|=(1<<PC0); // LED 为输出高电平
DDRD&=~_BV(PD2);//PD2为输入
PORTD|=_BV(PD2);
}
/*PWM初始化*/
void pwm_init()
{
DDRB=0X00;PORTB=0XFF; // PB:按键输入
TIMSK=(1<<OCIE1A); //使能比较匹配中断
TCCR1A=0x63; //配置定时器工作在快速PWM模式
TCCR1B=0x19; //无分频
OCR1A=1000; //设置捕捉比较输出初值 /** 调整输出频率 **/
OCR1B=x+40; /** 调整占空比的 **/
}
/** 中断初始化 **/
void INT_intt()
{
GICR|=_BV(INT0);
MCUCR=0x02;
}
/** 中断输入 **/
ISR(INT0_vect )
{
//PORTC=0x00;
//LED_ON=(1<<PC0);
_delay_ms(3000);
}
/*PWM中断服务程序*/
int main()
{
cli();
port_init();
void INT_intt();
pwm_init();
while(1)
{
if( KEY_ON())
{
//cli();
PORTC=0x00;// LED 为输出高电平
x++;
}
//_delay_ms(300);
}
}
|