|
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define key0 PD0
#define pwm2 PD7
#define pwm1a PD5 //定时器1 OC1A输出
#define pwm1b PD4 //定时器1 OC1B输出
volatile uchar keyv,tempkeyv; //键值
volatile uchar t1pwm1a; //定时器1 pwm1a值
volatile uchar t1pwm1b; //定时器1 pwm1b值
volatile uchar t2pwm;
//************************************************************************************
void timer2_init(void)
{
OCR2=t2pwm;
TCCR2=(0<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(0<<CS22)|(0<<CS21)|(1<<CS20);
}
//***********************************************************************************
void timer1_init(void)
{
OCR1A=t1pwm1a; //设定top值
OCR1B=t1pwm1b;
TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(1<<WGM10);
TCCR1B=(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
//不分频,WGM1=5,快速pwm模式,OC1A,OC1B正向输出
}
//***********************************************************************************
void timer0_init(void) //ctc模式,10ms定时
{
OCR0=38; //设定top值 top=8000000/(2*1024*100)-1 10ms 即频率为100hz
TCCR0=(1<<WGM01)|(0<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<CS02)|(0<<CS01)|(1<<CS00);
//1024分频,ctc模式,oc0为普通io
}
//************************************************************************************
void delay_10ms(uchar t)
{
uint i;
for(i=0;i<t;i++)
_delay_loop_2(20000); //延时10ms
}
//*************************************************************************************
SIGNAL(SIG_OVERFLOW2) //定时器2溢出中断
{
OCR2=t2pwm; //改变比较值
}
//*************************************************************************************
SIGNAL(SIG_OVERFLOW1) //定时器1溢出中断
{
OCR1A=t1pwm1a; //改变比较值
OCR1B=t1pwm1b;
}
//************************************************************************************
SIGNAL(SIG_OUTPUT_COMPARE0) //键盘扫描中断
{
if(!(PIND&(1<<key0))) //是否有键按下
keyv=1;
if(keyv!=0) //如果有键按下
{
delay_10ms(1); //延时10ms
if(!(PIND&(1<<key0))) //再次测试按键
tempkeyv=1;
if(keyv==tempkeyv) //两次键值相等,证明有键按下
{
if(t1pwm1a<254)
{
t1pwm1a+=10;
}
if(t1pwm1b<254)
{
t1pwm1b+=10;
}
t2pwm+=5;
}
}
keyv=0;
tempkeyv=0;
}
//****************************************************************************
int main(void)
{
DDRD&=~(1<<key0); //打开键盘引脚上拉电阻
PORTD|=(1<<key0);
t1pwm1a=25; //设置TOP初值
t1pwm1b=25;
t2pwm=25;
TCNT1=0;
timer0_init(); //定时器0初始化
//timer1_init(); //定时器1初始化
timer2_init(); //定时器2初始化
PORTD&=~((1<<pwm1a)|(1<<pwm1b)|(1<<pwm2));
DDRD=(1<<pwm1a)|(1<<pwm1b)|(1<<pwm2); //设置OC1A为输出
TIMSK=(1<<OCIE0)|(1<<TOIC1)|(1<<TOIE2); //T0输出比较匹配中断使能,T1溢出中断使能,T2溢出中断使能
sei(); //使能全局中断
while(1);
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|