📄 main.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/signal.h>
#define uint unsigned int
#define uchar unsigned char
uchar m;
///延时1Ms
void delayMs(uint t)
{
uint i=0;
for(;i<t;i++)
_delay_loop_2(250*4);
}
/////T1的PWM
void time1_PWM_init(void)
{ ///8M/2*1024*TOP=4Hz
OCR1AH=0x03; ///定时TOP值 时间约为5秒 频率为0.2Hz
OCR1AL=0xff; ///8000000/(1024*0.2)=19531 39061
OCR1BH=0x01; ///设定0C1B的PWM值 时间约为2秒 占空比40%
OCR1BL=0xff; ///8000000/(1024*0.5)=7812.5 15624
TCCR1B|=_BV(CS12)|_BV(CS11)|_BV(CS10); ///1024分频
TCCR1A|=_BV(WGM10)|_BV(COM1B0); ///PWM模式9 OCB1输出PWM
TCCR1B|=_BV(WGM13)/*|_BV(WGM12)*/; ///OCA1为普通I/O口
TCNT1H=0;
TCNT1L=0;
}
int main(void)
{
DDRD=0xff;
DDRB|=_BV(PB2);
PORTB&=~_BV(PB2); //设置0CB1为输出
time1_PWM_init();
while(1)
{
PORTD=0x0F;
}
return(0);
}
////匹配中断服务程序
/*
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
OCR1AH=0x1e;
OCR1AL=0x84;
m++;
if(m==255) {m=0;}
// PORTB&=~_BV(PB1);
}
void time1_init(void)
{
OCR1AH=0x1e;
OCR1AH=0x1e;
OCR1AL=0x84; ///TOP=8000000/(2*64*1000)-1=61.5 选61
TCCR1B=(0<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);
TCCR1A=(0<<WGM11)|(0<<WGM10)|(0<<COM1A1)|(1<<COM1A0);
///当比较匹配OC1B取反
///1024分频,CTC模式
}
int main(void)
{
DDRD=0xff;
DDRB|=_BV(PB1);
PORTB|=_BV(PB1);
time1_init();
sei();
TIMSK|=_BV(OCIE1A);
TCNT1H=0;
TCNT1L=0;
while(1)
{
PORTD=m;
delayMs(100);
}
return(0);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -