?? 07校區小車大賽2.txt
字號:
//ICC-AVR application builder : 2007-10-22 17:14:30
// Target : M16
// Crystal: 4.0000Mhz
#include <iom16v.h>
#include <macros.h>
int value[6]; //記錄各傳感器信號
int result=0;
unsigned char admux[]={0x00,0x01,0x02,0x03,0x04,0x05};
unsigned char adi=0,k0=2; //記憶路況
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x0c;
DDRD|=0x80;
PORTD=0x00;
}
//TIMER0 initialize - prescale:64
// WGM: PWM Phase correct
// desired value: 120Hz
// actual value: 122.549Hz (2.1%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x01; //set count
OCR0 = 110; //set compare
TCCR0 = 0x63; //start timer
}
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT2 = 0x01; //setup
OCR2 = 45;
TCCR2 = 0x64; //start
}
//ADC initialize
// Conversion time: 104uS
void adc_init(void)
{
ADCSR = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSR = 0xCD;
}
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
value[adi]=ADCL; //Read 8 low bits first (important)
value[adi]|=(int)ADCH << 8; //read 2 high bits and shift into top byte
adi++;
if(adi==6)
adi=0;
ADMUX=admux[adi];
ADCSR |=(1<<ADSC);
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
adc_init();
timer2_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay(unsigned char n)
{
unsigned short int j;
while(n--)
{
j=5000;
while(--j);
}
}
void contrl(unsigned char num)
{
while(1)
{
unsigned char i,k;
k=50;
for(i=0;i<6;i++)
{
if(value[i]>result)
k=i;
}
if(k==50) //判斷是否沖出跑道還是在直線上
{
if(k0==2||k0==3)
k=50;
else if(k0==0||k0==5||k0==60)
k=60;
}
switch(k)
{
case 0:OCR0=70;OCR2=37;break;
case 1:OCR0=90;OCR2=39;break;
case 2:OCR0=100;OCR2=42;break;
case 3:OCR0=100;OCR2=48;break;
case 4:OCR0=90;OCR2=51;break;
case 5:OCR0=70;OCR2=53;break;
case 50:OCR0=num;OCR2=45;break;
case 60:OCR0=num;break;
default:break;
}
k0=k;
}
}
void main(void)
{
char p=0;
unsigned char speed;
init_devices();
result+=400;
while(p==0)
{
p=PINB&0x13;
}
timer0_init();
switch(p)
{
case 0x01:speed=110;break;
case 0x02:speed=120;break;
case 0x10:speed=130;break;
}
contrl(speed);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -