?? 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 + -