simple_samll_car.c

来自「该编码实现了简易智能小车循迹、记录金属个数、避障、寻光入库等功能」· C语言 代码 · 共 340 行

C
340
字号
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
xdata unsigned char T2MOD _at_ 0xf500;
#define state1 0x5f//前进
#define state2 0x4f//右转
#define state3 0x1f//左转
#define state4 0x0f//后退
#define state5 0xff//停车
char code led_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
char idata dis_bit[4]={0x0e,0x0d,0x0b,0x07};
char data dis_data[4]={0x00,0x00,0x00,0x00};
sbit en_l=P2^5;
sbit con_l=P2^6;
sbit en_r=P2^7;
sbit con_r=P2^4;
sbit led_cs=P1^2;
sbit ir_l=P1^0;
sbit ir_r=P1^1;
sbit ir_m=P1^3;
sbit Beep=P1^4;
sbit deng=P3^0;
sbit infrare=P3^1;
sbit ll=P1^5;
sbit mm=P1^6;
sbit rr=P1^7;
//sbit CLOCK=P1^7;    /*2543时钟*/
//sbit D_IN=P1^6 ;    /*2543输入*/
//sbit D_OUT=P1^5;   /*2543输出*/
//sbit _CS=P3^5;     /*2543片选*/

uchar metal=0;
uint sum1=0;
uint sum2=0;
uint sum3=0;
uint sum=0;
uchar pwm=0;
uchar pwm_slow=0;
uchar slow=0;

uchar count=0;
uint sec=0;
uint sec5=0;

void delay1ms(int t)
{
  int i,j;
  for(i=0;i<t;i++)
    for(j=0;j<120;j++)
	 ;
}
void display(uint m,uchar *p,uchar n) //数码管显示
{  uchar k;
   dis_data[0]=m%10;
   dis_data[1]=(m%100)/10;
   dis_data[2]=m/100;
   dis_data[3]=metal;
   if(dis_data[2]==0)
     dis_data[2]=0x0a;
  for(k=0;k<n;k++)
   {
    if(k==1)
	{
	  P2=dis_bit[k]|(P2&0XF0);
	  P0 = led_code[p[k]]&0x7F;
      delay1ms(1);
      P0=0xff;
	}
	else
    {
	  P2=dis_bit[k]|(P2&0XF0);
	  P0 = led_code[p[k]];
      delay1ms(1);
      P0=0xff;
	}
   }
}
void xunji() //循迹
{ 
  TR0=1;
  TR1=1;  
  P2=state1;
   if((ir_l==0)&&(ir_r==1)&&(ir_m==1))
  {
     P2=state3;
	 delay1ms(3);
	 if(ir_m==0)
	  P2=state1;
  }
   if((ir_l==1)&&(ir_r==0)&&(ir_m==1))
  {
     P2=state2;
	 delay1ms(3);
	 if(ir_m==0)
	   P2=state1;
  }
   if((ir_l==1)&&(ir_r==1)&&(ir_m==0))
  {
    P2=state1;
  }
}

void stop()	 //停车
{
  P2=state5;
  en_l=1;
  en_r=1;
  TR0=0;
}

void BEEP()
{
  	  //led_cs=1;
	  //deng=1;
	  //Beep=1;
	  delay1ms(100);
	  //led_cs=1;
	  //deng=0;				 
	  Beep=1;
}
void qianjin()//前进
{
  TR0=1;
  //TR1=1;
  P2=state1;
  if(infrare==0)
  {
    stop();
	delay1ms(500);
	P2=state4;
	delay1ms(500);
   }
	P2=state3;
	delay1ms(50);
	P2=state1;
	delay1ms(500);
	P2=state2;
	delay1ms(50);
  if(infrare==0)
  {
     P2=state3;
	 delay1ms(50);
	 P2=state1;
	 delay1ms(500);
	 P2=state2;
	 delay1ms(50);
  }
  else 
    P2=state1;
} 
//AD延时函数
/*void delay_ad(uchar n)
{
   uchar i;
   for(i=0;i<n;i++)
  {
    _nop_();
  }
}
uint read2543(uchar port) 	  //AD程序
{
   uint ad=0,kk;
   CLOCK=0;
   _CS=0;
   port<<=4;
   for(kk=0;kk<12;kk++)
  {
    if(D_OUT) ad|=0x01;
    D_IN=(bit)(port&0x80);
    CLOCK=1;
    delay_ad(4);
    CLOCK=0;
    delay_ad(4);
    port<<=1;
    ad<<=1;
   }
    _CS=1;
    ad>>=1;
    return(ad);
} */
void xunguang()	//寻光函数
{
   if((ll==1)&&(mm==1)&&(rr==1))
     P2=state1;
   if((ll==1)&&(mm==1)&&(rr==0))
    {
	  P2=state2;
	  delay1ms(10);	
	}
   if((ll==1)&&(mm==0)&&(rr==1))
     P2=state1;
   if((ll==1)&&(mm==0)&&(rr==0))
     P2=state2;
	 delay1ms(5);
   if((ll==0)&&(mm==1)&&(rr==1))
   {
      P2=state3;
	  delay1ms(10);
   }
   if((ll==0)&&(mm==1)&&(rr==0))
      P2=state1;
   if((ll==0)&&(mm==0)&&(rr==1))
    { 
	  P2=state3;
	  delay1ms(5);
	}
   if((ll==0)&&(mm==0)&&(rr==0))
   {
     slow=0;
	 P2=state1;	
   }
   
}
void main()
{
  TMOD=0x11;
  TH0=0xff;
  TL0=0x90;
  TH1=0xd8;
  TL1=0xf0;
 /* T2MOD=0x00;
  T2CON=0x00;
  TH2=0x00;
  TL2=0x00;
  RCAP2H=0x00;
  RCAP2L=0x00;
  ET2=1;
  TR2=1;*/
  EA=1;
  EX0=1;
  IT0=1;
  PX0=1;
  ET0=1;
  ET1=1;
  deng=0;
  Beep=0;
  while(1)
  {	
    xunji();
	display(sec,dis_data,4);
	BEEP();
	/*if((metal!=0)&&(metal!=4))
	{
	  led_cs=1;
	  deng=1;
	  Beep=1;
	  delay1ms(100);
	  led_cs=0;
	  deng=0;				 
	  Beep=0;
	 }
	 /* TR2=0;
	  sum1=TL2;
	  sum2=TH2*256;
	  sum3=sum2+sum1;

	  
	  TH2=0x00;
	  TL2=0x00;
	  TR2=1;*/
	
	if(metal==4)
	  break; 
  }
  sec5=sec;	
  while((sec-sec5)<=50)
  {	  
	stop();	
	display(sec,dis_data,4);
	Beep=~Beep;
  }
   while(1)
   {
	 qianjin();
	 if(infrare==1)
	   xunguang();
	 if((ir_l==0)&&(ir_m==0)&&(ir_r==0))
	   break;
   } 
	 P2=state4;
	 delay1ms(50);
	 while(1)
	 {  
	    stop();
		display(sec,dis_data,4);
	 }
}
void intt0() interrupt 0
{
  metal++;
}
void timer0() interrupt 1
{
  TH0=0xff;
  TL0=0x90;
  if(slow==0)
 {
   pwm++;
   if(pwm<=60)
     en_l=0;
   else 
     en_l=1;
   if(pwm<=60)
     en_r=0;
   else
     en_r=1;
   if(pwm>100)
     pwm=0;	
  }
  if(slow==1)
 {
   pwm_slow++;
   if(pwm_slow<=30)
     en_l=0;
   else 
     en_l=1;
   if(pwm_slow<=30)
     en_r=0;
   else
     en_r=1;
   if(pwm_slow>100)
     pwm_slow=0;	
  }
}
void timer1() interrupt 3
{  
  TH1=0xd8;
  TL1=0xf0;
  count++;
  if(count==10)
  {		   
    sec++; 
	count=0;	  
  }  
}
/*void timer2() interrupt 5
{  TF2=0;
   sum++;
} */

⌨️ 快捷键说明

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