⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11.18final.c

📁 使智能车循黑线走简单赛道,具有一定的调速功能,但尚未引入更好的PID控制.
💻 C
字号:
//ICC-AVR application builder : 2007-11-18 10:39:54
// Target : M16
// Crystal: 8.0000Mhz

#include <iom16v.h>
#include <macros.h>

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0xA0;
}

//TIMER1 initialize - prescale:8
// WGM: 14) PWM fast, TOP=ICRn
// desired value: 20mSec
// actual value: 20.000mSec (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xB1; //setup
 TCNT1L = 0xE1;
 OCR1AH = 0x06;
 OCR1AL = 0x1A;
 OCR1BH = 0x4E;
 OCR1BL = 0x1F;
 ICR1H  = 0x4E;
 ICR1L  = 0x1F;
 TCCR1A = 0x82;
 TCCR1B = 0x1A; //start Timer
}

//TIMER2 initialize - prescale:8
// WGM: PWM Fast
// desired value: 4KHz
// actual value:  3.906KHz (2.4%)
void timer2_init(void)
{
 TCCR2 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT2 = 0x01; //setup
 OCR2  = 0xFF;
 TCCR2 = 0x6A; //start
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer1_init();
 timer2_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//
void main(void)
{
 init_devices();
 //insert your functional code here...
 while(1)
 {   
  if(PINA == 0x30 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0000110000
 		  {OCR1AH = 0x06; OCR1AL = 0x1A;}   //前面已定义OCR1=0x0654
//右偏,前轮左转
 else if(PINA == 0x20 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0000100000
 	  	  {OCR1AH = 0x06; OCR1AL = 0x0C;}	  
 else if(PINA == 0x18 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0001100000
 	  	  {OCR1AH = 0x05; OCR1AL = 0xEA;}		   
 else if(PINA == 0x08 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0001000000
 	  	  {OCR1AH = 0x05; OCR1AL = 0xC8; OCR2  = 0x70;}			  
 else if(PINA == 0xC2 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0011000000
 	  	  {OCR1AH = 0x05; OCR1AL = 0xAC; OCR2  = 0x6C;}				  
 else if(PINA == 0x04 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0010000000
 	  	  {OCR1AH = 0x05; OCR1AL = 0x8F; OCR2  = 0x6A;}				  
 else if(PINA == 0x06 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0110000000
 	  	  {OCR1AH = 0x05; OCR1AL = 0x73; OCR2  = 0x68;}				  
 else if(PINA == 0x02 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0100000000
 	  	  {OCR1AH = 0x05; OCR1AL = 0x5A; OCR2  = 0x67;}				  
 else if(PINA == 0x03 && (PINC & 0xC0) == 0x00 ) //即传感器信号为1100000000
 	  	  {OCR1AH = 0x05; OCR1AL = 0x3C; OCR2  = 0x65;}		
 else if(PINA == 0x01 && (PINC & 0xC0) == 0x00 ) //即传感器信号为1000000000
 	  	  {OCR1AH = 0x05; OCR1AL = 0x20; OCR2  = 0x65;}		
 //左偏,前轮右转 
 else if(PINA == 0x20 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0000010000
 	  	  {OCR1AH = 0x06; OCR1AL = 0x2D;}	
 else if(PINA == 0x60 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0000011000
 	  	  {OCR1AH = 0x06; OCR1AL = 0x4D;}
 else if(PINA == 0x40 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0000001000
 	  	  {OCR1AH = 0x06; OCR1AL = 0x70; OCR2  = 0x6A;}
 else if(PINA == 0xC0 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0000001100
 	  	  {OCR1AH = 0x06; OCR1AL = 0x80; OCR2  = 0x67;}
 else if(PINA == 0x80 && (PINC & 0xC0) == 0x00 ) //即传感器信号为0000000100
 	  	  {OCR1AH = 0x06; OCR1AL = 0xAB; OCR2  = 0x65;}	
 else if(PINA == 0x80 && (PINC & 0xC0) == 0x80 ) //即传感器信号为0000000110
 	  	  {OCR1AH = 0x06; OCR1AL = 0xC7; OCR2  = 0x63;}
 else if(PINA == 0x00 && (PINC & 0xC0) == 0x80 ) //即传感器信号为0000000010
 	  	  {OCR1AH = 0x06; OCR1AL = 0xE4; OCR2  = 0x61;}
 else if(PINA == 0x00 && (PINC & 0xC0) == 0xC0 ) //即传感器信号为0000000011
 	  	  {OCR1AH = 0x06; OCR1AL = 0xFF; OCR2  = 0x5F;}
 else if(PINA == 0x00 && (PINC & 0xC0) == 0x40 ) //即传感器信号为0000000001
 	  	  {OCR1AH = 0x07; OCR1AL = 0x2B; OCR2  = 0x5D;}
 //出道
 else if(PINA == 0x00 && PINC == 0x00 ) //即传感器信号为0000000000
 	  	  OCR2  = 0x30;
 else if(PINA == 0x00 && PINC == 0x00 ) //即传感器信号为1111111111
          {OCR1AH = 0x06; OCR1AL = 0x1A; OCR2  = 0xFF;}
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -