📄 main._c
字号:
OCR1BL = 0x20;
OCR1CH = 0x4E;
OCR1CL = 0x20;
ICR1H = 0x4E;
ICR1L = 0x20;
TCCR1A = 0x01;
TCCR1B = 0x12; //start Timer
}*/
//TIMER1 initialize - prescale:256
// WGM: 7) PWM 10bit fast, TOP=0x03FF
// desired value: 40mSec
// actual value: 32.768mSec (18.1%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFC; //setup
TCNT1L = 0x01;
OCR1AH = 0x03;
OCR1AL = 0xFF;
OCR1BH = 0x03;
OCR1BL = 0xFF;
OCR1CH = 0x03;
OCR1CL = 0xFF;
ICR1H = 0x03;
ICR1L = 0xFF;
TCCR1A = 0xAB;
TCCR1B = 0x0C; //start Timer
}
#pragma interrupt_handler timer1_capt_isr:iv_TIM1_CAPT
void timer1_capt_isr(void)
//ICP输入捕获中断处理程序
//SIGNAL(SIG_INPUT_CAPTURE1)
{ PORTF=~PORTF;
if(shang_johu)
{
//ICR1=0;;
temp1 = ICR1;
//TCCR1B |= (1<<ICNC1)|(1<<CS11);//8分频,8M时钟时正好1us
TCCR1B &= ~(1<<ICES1);
//shang_johu=0;
}
else
{
temp2 = ICR1;
TIMSK &= ~((1<<TICIE1)|(1<<TOIE1));//关闭中断使能
//TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));
//TCNT1 = 0;
//temp2 -= temp1;
//TCCR1B=0x00;
TCCR1B |= (1<<ICES1);
count1=0;
//shang_johu=1;
}
shang_johu=!shang_johu;
/*
count1++;
switch(count1)
{
case 2://第一次捕获,则开始计数
{
ICR1=0;
temp1 = ICR1;
TCCR1B |= (1<<ICNC1)|(1<<CS11);//8分频,8M时钟时正好1us
TCCR1B &= ~(1<<ICES1);
}
break;
case 3: //第二次捕获,表示一个周期结束,计数结束
{
temp2 = ICR1;
TIMSK &= ~((1<<TICIE1)|(1<<TOIE1));//关闭中断使能
//TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));
//TCNT1 = 0;
//temp2 -= temp1;
TCCR1B=0x00;
TCCR1B |= (1<<ICES1);
count1=0;
}
break;
default: ;
}
*/
}
#define PWM_ON DDRB|= R_pwm0 | R_pwm1 | L_pwm0 | L_pwm1;
#define PWM_OFF DDRB&= ~(R_pwm0 | R_pwm1 | L_pwm0 | L_pwm1);
main()
{int n;
unsigned char n_jiaodu=0,n_juli=0;
unsigned char n_sec=0;
unsigned int pwm_duoji=0;
unsigned char i=0;
init_devices();
timer1_init();timer0_init();
//OCR1AH = 0x00;
/* OCR1AL = 64;
//OCR1BH = 0x00;
OCR1BL = 64;
//OCR1CH = 0x00;
OCR1CL = 64;
OCR0=64;*/
//while(1);
DDRE|=0x38;//while(1);
/////////LCD
/* DDRB = 0xBF; //SI输入,SO,SCK,SS输出
SPCR = 0x50; //setup SPI
SPSR = 0x01; //setup SPI*/
/*while(!(UCSR0A&(1<<UDRE0)));
UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
UDR0='a';*/
delay_ms(3000);
number_uart1(1010,1);
number_uart1(xx,0);
number_uart1(ADCjohu,1);
delay_ms(3000);
xx=0;
//LCD_Init();
//LCD_clear();
DDRE &= ~0x7c;//if (!(PORTE & STOP)) if (!(PORTE & VOLDOWN)) if (!(PORTE & VOLUP)) if (!(PORTE & NEXTSONG)) if (!(PORTE & PREVSONG))
PORTE |=0x7c;
PORTD=0x01;
//number(0,0,4,-999,1);
/* OCR1AL = pwm_pingjun;
OCR1BL = pwm_pingjun;
OCR1CL = pwm_pingjun;
OCR0=pwm_pingjun;*/
PORTD &= ~(1<<PD4);
DDRD &= ~(1<<PD4);
//初始化TC1
/* TCCR1A = 0x00;
TCNT1 = 0x00;
TCCR1B |= (1<<ICES1);//(1<<ICNC1)|打开输入捕捉噪声抑制器 |上升沿触发捕捉,噪声捕捉器需打开,否则会导致上升沿/下降沿捕捉不准确,出来的结果会相差一半
TCCR1B |= (1<<CS11);//8分频,8M时钟时正好1us
SEI();
TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));*/
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x20;//中断允许
ICR1H = 0xFF;
ICR1L = 0xFF;//输入捕捉匹配值
TCCR1A = 0x00;
TCCR1B = 0x83;//启动定时器
TCCR1B |= (1<<ICES1)|(1<<ICNC1)|(1<<CS11);//|(1<<CS10)8分频,8M时钟时正好1us
TCCR1B |= (1<<ICES1);
//方法一:采用直接测频率的方法,PROTEUS仿真通过
/*while(1)
{
for(i=0; i<50; i++)delay_ms(10);
TCNT1 =0;
TCCR1B = ((1<<CS12)|(1<<CS11)|(1<<CS10));
for(i=0; i<100; i++)delay_ms(10);//此处用简单的延时函数,精度有限,更高精度可以用timer来尝试
TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));
//printf("TCNT1=%8u 频率=%8uHz\r\n", TCNT1, TCNT1);
number_uart1(TCNT1,0);
number_uart1(TCNT1,1);
}*/
//方法二:采用测量周期的方法
while(1)
{
count1=1;
//for(i=0; i<250; i++)
delay_ms(2);
TIMSK |= (1<<TICIE1);//打开输入捕捉器中断使能
while(count1);//count1循环,等待捕获中断处理完成,
//printf("temp1:%6u temp2:%6u width:%6lu\r\n", temp1, temp2, (temp2>=temp1)?(temp2-temp1):(65536-temp1+temp2));
number_uart1(temp1,0);
number_uart1(temp2,0);
//if (temp2>temp1)
// { pwm_duoji=(temp2-temp1); number_uart1(pwm_duoji ,1 );}
//else
{ pwm_duoji=(temp1-temp2); number_uart1(pwm_duoji ,1 );}
}
while(1)
{
if (!(PINE & NEXTSONG))
{delay_ms(50);
if (!(PINE & NEXTSONG))
{
//CLI();
if(pwm_duoji<0x3ff) pwm_duoji++;
OCR1BH = (pwm_duoji>>8)&0x07;
OCR1BL = pwm_duoji;
/*OCR1BH = 0x03;
OCR1BL = 0xF0;
OCR1CH = 0x03;
OCR1CL = 0xF0;
*/
PWM_ON
//SEI();
}
}
if (!(PINE & PREVSONG))
{delay_ms(50);
if (!(PINE & PREVSONG))
{
//CLI();
if(pwm_duoji>0) pwm_duoji--;
OCR1BH = (pwm_duoji>>8)&0x07;
OCR1BL = pwm_duoji;
/*OCR1BH = 0x03;
OCR1BL = 0xF0;
OCR1CH = 0x03;
OCR1CL = 0xF0;
*/
PWM_ON
//SEI();
}
}
}
while(1)
{ //(unsigned char)jiaodu;
PORTF=juli;
if (!(PINE & STOP))jiaodu=100;//PWM_ON//PORTD=~PORTD;
if (ms==1)
{ //if (jiaodu!=n_jiaodu)//test
if (jiaodu!=0)
{//PORTF=jiaodu;
//if (jiaodu<0-20)//test 旋转
if (ADCjohu<jiaodu-20)
{DDRB |=(R_pwm1 | L_pwm0);
DDRB &=~(R_pwm1 | L_pwm0);
PORTB &=~(R_pwm0 |R_pwm1| L_pwm1 | L_pwm0);
OCR1AL = pwm_pingjun;
OCR1BL = pwm_pingjun;
OCR1CL = 0;
OCR0=0;
PWM_ON
}
//else if (jiaodu>0+20)//test
else if (ADCjohu>jiaodu+20)
{DDRB |=(R_pwm0 | L_pwm1);
DDRB &=~(R_pwm0 | L_pwm1);
PORTB =0xf0;
OCR1AL = 0;
OCR1BL = 0;
OCR1CL = pwm_pingjun;
OCR0=pwm_pingjun;
PWM_ON
}
else PWM_OFF
n_jiaodu=jiaodu;
}
if (juli!=0)
if (sec!=n_sec)
{
if (juli>0)
{DDRB |=(R_pwm1 | L_pwm1);
DDRB &=~(R_pwm1 | L_pwm1);
OCR1AL = 0;
OCR1BL = pwm_pingjun+Rpwm0;
OCR1CL = 0;
OCR0=pwm_pingjun;
PWM_ON
juli--;
}
else if (juli<0)
{DDRB |=(R_pwm0 | L_pwm0);
DDRB &=~(R_pwm0 | L_pwm0);
OCR1AL = pwm_pingjun;
OCR1BL = 0;
OCR1CL = pwm_pingjun;
OCR0=0;
PWM_ON
juli++;
}/**/
else PWM_OFF
n_sec=sec;
}
//number(0,2,5,xx,1);
//number(0,4,5,ADCjohu,1);
if (!(PINE & PREVSONG))xx=0;
if (!(PINE & NEXTSONG))
{
//CLI();
number_uart1(xx,0);
number_uart1(ADCjohu,1);
delay_ms(20);
//SEI();
}
ms=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -