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

📄 linecheck.h

📁 飞思卡尔系列单片机智能汽车程序源代码
💻 H
字号:
/*******************************
*程序名称:智能小车设计
*作    者:吴聪
*日    期:2008-5-20
********************************/
#include <iom32v.h>

unsigned int T=1000;
unsigned int i=0;
unsigned int k=1;
unsigned int flag=1;
unsigned int temp;
void port_init(void)
{
 PORTA = 0XFF;
 DDRA  = 0x00;//PA 为输入口
 PORTB = 0x00;
 DDRB  = 0xff;//PB 为输出口 
 PORTC = 0X00;
 DDRC  = 0xFF;//PC 为输出口
 DDRD=0XF7;
 PORTD=0X08;
}
/*中断初始化*/
void INT1_init()
{
 SREG=0x80;                      /*使能全局中断*/
 //MCUCR&=~((1<<ISC01)|(1<<ISC00));  /*低电平触发中断*/
 MCUCR=0x0C;
 GICR=(1<<INT1);                 /*使能外部中断1请求*/
 }
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: Hz
// actual value: Out of range
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0x00 /*INVALID SETTING*/; //set count
 OCR0  = 0x00 /*INVALID SETTING*/;  //set compare
 TCCR0 = 0x02; //start timer
}
//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 25Hz
// actual value: 25.000Hz (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0x63; //setup
 TCNT1L = 0xC0;
 OCR1AH = 0x9C;
 OCR1AL = 0x40;
 OCR1BH = 0x9C;
 OCR1BL = 0x40;
 ICR1H  = 0x9C;
 ICR1L  = 0x40;
 TCCR1A = 0x00;
 TCCR1B = 0x01; //start Timer
}
##pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1H = 0x63; //reload counter high value
 TCNT1L = 0xC0; //reload counter low value
 GICR=(1<<INT1);  
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 timer1_init();
 TIMSK = 0x04; //timer interrupt sources
 
 //all peripherals are now initialized
}
//============================================================================================
//函数: void delay(int hh)
//语法:void delay(int hh)
//描述:延时子程序
//参数:
//返回:无
//============================================================================================	
void delay(unsigned int hh )
{
    int i;
    for(i=0;i<hh;i++)
	{
	;
	}
}

//============================================================================================
//函数: void pwma(int hh)
//语法:void pwma(int hh)
//描述: 用于控制右轮
//参数:占空比
//返回:无
//============================================================================================
/*void pwma( unsigned int hh)             
{ 
  unsigned int s=0;
   unsigned  int T0=10000;
   unsigned  int H;
      s=PORTA;
	switch(hh)                //占空比    
	{
		case 0:  s=s&0xfc; delay(T0);break;     //关占空比
		case 1:  delay(1000);s=s&0xfc; delay(9000);break;
		case 2:  delay(2000);s=s&0xfc; delay(8000);break;
		case 3:  delay(3000);s=s&0xfc; delay(7000);break;
		case 4:  delay(4000);s=s&0xfC; delay(6000);break;
		case 5:  delay(5000);s=s&0xfc; delay(5000);break;
		case 6:  delay(6000);s=s&0xfc; delay(4000);break;
		case 7:  delay(7000);s=s&0xfc; delay(3000);break;
		case 8:  delay(8000);s=s&0xfc; delay(2000);break;
		case 9:  delay(9000);s=s&0xfc; delay(1000);break;
		case 10: delay(10000);s=s&0xfc;break;
	}
}
//============================================================================================
//函数: void pwmb(int hh)
//语法:void pwmb(int hh)
//描述: 用于控制左轮
//参数:占空比
//返回:无
//============================================================================================		
void pwmb( unsigned int hh)                                     //设定TA_TIMEOUT/16=(time_cl)/0x1e00)/16=100Hz           
{ 
  unsigned int k=0;
   int T=10000;
   int H;
   k=PORTA;
	switch(hh)                //占空比    
	{
		case 0:  k=k&0xf3;            break;     //关占空比
		case 1:  delay(1000);k=k&0xf3; delay(9000);break;
		case 2:  delay(2000);k=k&0xf3; delay(8000);break;
		case 3:  delay(3000);k=k&0xf3; delay(7000);break;
		case 4:  delay(4000);k=k&0xf3; delay(6000);break;
		case 5:  delay(5000);k=k&0xf3; delay(5000);break;
		case 6:  delay(6000);k=k&0xf3; delay(4000);break;
		case 7:  delay(7000);k=k&0xf3; delay(3000);break;
		case 8:  delay(8000);k=k&0xf3; delay(2000);break;
		case 9:  delay(9000);k=k&0xf3; delay(1000);break;
		case 10: delay(10000);k=k&0xf3;break;
	}
}*/
/*中断服务程序*/ 
#pragma interrupt_handler int1:4 
void int1()
{
 
  /*unsigned char i;
  for(i=0;i<8;i--) //去
 {
   //PORTB=~(1<<i);
   PORTB=0x00;
   delay_ms(5);
  }*/
   if(flag)
   {
   timer0_init();
   temp=TCNT0;
   //delay(10000);
   MCUCR=0x08;
   flag=0;
   //delay_ms(80);
   }
   else
   {
   TCCR0 = 0x00;
   temp=TCNT0-temp;
   MCUCR=0x0c;
   flag=1;
  // delay_ms(80);
  // INT1_init();
   // SREG=0x00; 
    GICR=0x00;      
   }  
} 
//============================================================================================
//描述:车子方向控制子程序
//参数  无
//返回:无
//============================================================================================ 
void STOP()   //停止
{
	 PORTB=0X00;
	 delay(10000); 
}


void GO(unsigned int aa)   //直线前进
{

     PORTB=0X06|0X30;
	 delay(aa);
	// PORTB=0X00;
	// delay(T-aa);
	 
}

void BACK(unsigned int bb)   // 直线后退
{     
	
		PORTB=0X09|0X30;   
	    delay(bb);
		PORTB=0X00;   
	    delay(T-bb);
}

void GTOL(unsigned int cc)    //前左转
{
	PORTB=0X02|0X30;
	delay(cc); 
	PORTB=0X00;
	delay(T-cc);  
}

void GTOR(unsigned int dd)    //前右转
{
	
	 PORTB=0X04|0X30;
	 delay(dd);
	 PORTB=0X00;
	 delay(T-dd);
}
void BTOR(unsigned int cc)    //后左转
{

	PORTB=0X010|0X30;
	delay(cc); 
	PORTB=0X00;
	delay(T-cc);  
}

void BTOL(unsigned int dd)    //后右转
{
	 

	 PORTB=0X08|0X30;
	 delay(dd);
	 PORTB=0X00;
	 delay(T-dd);
	
}
//============================================================================================
//函数: void  line_check_GO(void)
//语法:void  line_check_GO(void)
//描述: 前进黑白寻迹检测
//参数:无
//返回:无
//============================================================================================	
void  Linecheck_GO(void)
{ 
  
  unsigned char ss;
  PORTA = 0XFF;
  DDRA  = 0x00;//PA 为输入口
  delay(1);
    // _NOP();
    ss=PINA;
     switch(ss)
	      {
		      case 0xEF:  GTOL(600);i=0; break;
		      case 0xF7:  GTOL(600); i=0;break;
			  case 0xFB:  GO(700); i=0; break;
		      case 0XFD:  GTOR(600);i=0; break;
	          case 0xFE:  GTOR(600); i=0;break;
		      default :  i++;  
          }        
    //if( i>=300)
	if(0) 
	 {
	  STOP();
	  i=300;
	  }    
    else  GO(1000);  // if (i!=0)
}
//============================================================================================
//函数: void  line_check_BACK(void)
//语法:void  line_check_BACK(void)
//描述: 前进黑白寻迹检测
//参数:无
//返回:无
//============================================================================================	
void  Linecheck_BACK(void)
{ 
  unsigned char ss;
  PORTA = 0XFF;
  DDRA  = 0x00;//PA 为输入口
  delay(1);
    // _NOP();
    ss=PINA;
     switch(ss)
	      {
		      case 0xf0:  BTOR(600); break;
		      case 0xe8:  BTOR(600); break;
			  case 0xe4:  BACK(700); break;
		      case 0Xe2:  BTOL(600); break;
	          case 0xe1:  BTOL(600); break;
		      default :  BACK(700); 
     }                      
}
void blance(void)
{
 if(temp<0x9f)
 GO(1000);
 //Linecheck_GO();
 PORTC = temp;
 if(temp>0xa0)
 BACK(700);
 PORTC = temp;
}

⌨️ 快捷键说明

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