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

📄 trace_road2.c

📁 MEGA16的小车沿黑线行驶程序
💻 C
字号:
//小车沿黑线行驶程序
//创建时间:2005年7月25日10:44


#include"iom16v.h"
#include"macros.h"
char a;
 unsigned char iron;
void delay_us(unsigned char  time)
{//微秒级延时程序     
 do
 {
  time--;
 }	
  while (time>1);
}	  

void delay_ms(unsigned int time)
{//毫秒级延时程序
 while(time!=0)
 {		
  delay_us(1000);
  time--;
 }
 }
void init_trace_road(void)
{
  MCUCSR|=0x80;//禁止PC5第二功能,使之为普通I/O口
 MCUCSR|=0x80;
 DDRC&=0x1F;//PC5 6 7为右中左红外传感器输入
 PINC&=0x1F;
 
 TCCR1A=0x81;//COM1A[1:0]=2,WGM1[3:0]=5
 TCCR1B=0x0a;//CS1[2:0]=0b101
 TCCR2=0x6a;//WGM2[1:0]=3,COM2[1:0]=2,CS2[2:0]=0b111
}

void slow_left(void)//向左慢转
{
 OCR1AH=0;     //右轮不变
 OCR1AL=0xef;
 OCR2=0x7f;   //左轮减速
 
}


void slow_right(void)//向右慢转
{
 OCR1AH=0;     //右轮减速
 OCR1AL=0x7f;
 OCR2=0xef;     //左轮不变

}


void quick_left(void)//向左快转
{
 OCR1AH=0;     //右轮不变
 OCR1AL=0xef;
 OCR2=0x3f;   //左轮超低速
 
}


void quick_right(void)//向右快转
{
 OCR1AH=0;     //右轮超低速
 OCR1AL=0x3f;
 OCR2=0xef;   //左轮不变
 
}


void forward(void)//前进
{
 OCR1AH=0;     //左右轮同速
 OCR1AL=0xef;
 OCR2=0xef;

}
void stop(void)
{
 OCR1AH=0;     //右轮停转
 OCR1AL=0x00;
 OCR2=0x00;  //左轮停转
}


void turn_halfl(void)//左转半圈
{
 unsigned long i;
 OCR1AH=0;     //右轮慢速
 OCR1AL=0x3f;
 OCR2=0x00;  //左轮停转
 for(i=30000;i>0;i--)

 if(PINC&0XE0) //若检测到黑线,跳出
  break;
  else ;
   
 a=0;
   
 }
void turn_right(void)//右转
{unsigned long i;
 OCR1AH=0;     //右轮停转
 OCR1AL=0x00;
 OCR2=0x3f;   //左轮慢速
 for(i=55000;i>0;i--)

 if(PINC&0XE0) //若检测到黑线,跳出
  break;
  else ;
   
 a=1;
 
}
void trace_road(void)
  {
     unsigned char pinc;
	  a=1;
   pinc=PINC&0XE0;  //PC7~PC5信号送给变量pinc
  if((pinc==0x40)||(pinc==0xe0))//只有中间传感器有信号,
    forward();                  //或三个均有信号,则直走
	else if(pinc==0xc0)//若右边无信号
	   else if(pinc==0x20)//若左边和中间均无信号
		    quick_right();   //快速右转
			else if(a==1)            //若三个均无信号
			 turn_halfl();  //左转半圈
              else
			    turn_right();
   }
    #pragma interrupt_handler test_iron:2
	 void test_iron(void)
	 {
	   ++iron;
	   PORTA=0x00;
	   delay_ms(500);
	   PORTA=0xff;
	   if(iron==4)
	   {stop();delay_ms(5000);
	   forward();delay_ms(1000);}
	   
	 }
	 
	

void main(void)
{
 iron=0;
 DDRA=0xff;
 GICR|=0X40;
 MCUCR=0X03;
 PORTD&=0Xfb;
 PORTD|=0x04;
 PORTA=0xff;
 init_trace_road();
   while(1)
 {
  SEI();
  trace_road();
 }
}

⌨️ 快捷键说明

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