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

📄 cheku.c

📁 简易智能电动小车程序
💻 C
字号:
//			   写命令子程序			//
//			                        写数据子程序			//
//			                        建立自定义字符库		//
#include <reg51.h>
#include<intrins.h>
#include<lcd1602.h>

#define uchar unsigned char
#define uint unsigned int


sbit  IRON=P2^1;
sbit  beep=P1^7;
sbit  lgt=P1^6;

sbit  XJL=P2^4;
sbit  XJM=P2^3;
sbit  XJR=P2^2;

sbit moto_en2 =P1^0;
sbit moto_2   =P1^1;	     //=1 move; =0 back
sbit moto_pwm2=P1^2;
sbit moto_en1 =P1^3;
sbit moto_1   =P1^4;		 //=1 move; =0 back
sbit moto_pwm1=P1^5;

sbit DI=P3^5;
sbit DO=P3^4;
sbit CS=P3^1;
sbit CLK=P3^0;

uint adout[2];
uint g,h;
uchar ironcounter=1;
uchar  distance[3]={0,0,0};
uint juli=0;
uchar state=0,cstop=0;


uchar code run[]={"RUN:"};
uchar code limit[]={"LIMIT:"};
uchar code irondisplay1[]={"IRON:"};
uchar code irondisplay2[]={"JL:"};
uchar code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39} ;


 uint lim=0,jj=0,min=0;
 uchar dis=0;

timer0() interrupt 1
{
    
  uchar ss, m=0,n=0,pp,qq;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
//	cc=min;
    lim++;
	ss=lim%20;
    if(ss==0)
	 { dis++;
	   m=dis/10;
	   n=dis%10;
	   lcd_wrcmd(0x86);	
	   lcd_wrdata(table[m]); 
	   lcd_wrdata(table[n]); 
	        if(moto_en1==1 && moto_en2==1)
	        {
			  pp=m;
			  qq=n;
	          lcd_wrcmd(0x8e);	
	          lcd_wrdata(table[m]); 
	          lcd_wrdata(table[n]); 
		     }
			  else  if(moto_en1==0 && moto_en2==0 && cstop==1)
			 {
			    
				lcd_wrcmd(0x8e);
			    lcd_wrdata(table[pp]);
				lcd_wrdata(table[qq]);	
			 } 
	        
      }
   

    if(lim==1800)
    {
       moto_en1=0;
       moto_en2=0;		           //check	stop()
       lim=0;
	   TR0=0;
    }

}

void ext0(void) interrupt 0
{ 
 juli++;
}

measure()
{
  
   uint mout;
   uchar i;
   mout=juli;
   mout=mout*19/72;
   distance[0]=mout/100;
   mout=mout%100;
   distance[1]=mout/10;
   distance[2]=mout%10;  

   lcd_wrcmd(0xcb);
   for(i=0;i<3;i++)  lcd_wrdata(0x30+distance[i]); 
}


ironcnt()
{	uchar a,b,c,j;
    uint i;  		 
 //    uint cc;

	if(IRON==0)
	{	  
	        measure();	
            beep=1; 
			lgt=1;
			delay(65000);  
			beep=0;
			lgt=0;	
  	  
			b=ironcounter/10;
         	c=ironcounter%10;
	
			lcd_wrcmd(0xc5);
	        lcd_wrdata(table[b]);  
	        lcd_wrdata(table[c]); 
		
			while(1)
		        {
		        a=IRON;
				if((a & 0xff)==0x01) break;
				}	 
			
			ironcounter++;  
				
	         if( XJL==0 && XJR==0 && XJM==0) 	//检测到c点铁片
		     {
			   
                moto_en1=0;
			    moto_en2=0; 	
			    for(i=0;i<10;i++)
				{ beep=1;lgt=1; 
				for(j=0;j<10;j++)
				  delay(5000);
				  beep=0;lgt=0;
				for(j=0;j<10;j++)
				  delay(5000);
				 }
	
	                moto_en1=1;
					moto_en2=1;
			        state=1;	
             }	
	}
}

moveforward()
{ moto_1=1;
  moto_2=1;

 
  moto_en1=1;
  moto_pwm1=0;

  moto_en2=1;
  moto_pwm2=0;
               
}



turn(uchar x,uchar y)
{ moto_1=1;
  moto_2=1;

  if(x==0) {moto_en1=0;	 delay(y);moto_en1=1;}
  if(y==0) {moto_en2=0;	 delay(x);moto_en2=1;}

} 

unsigned char adc_0838convert(uchar channel)
{  
    uchar i;
    uchar T1,T2=1;
     CS=1;
   _nop_();_nop_();_nop_();_nop_();

    CLK=0;
    CS=0;            //使AD通道打开
    DI = 1;          //Start bit=1
    CLK = 1;

    CLK=0;
    CS=0;          
    DI = 1;          
    CLK = 1;

    for(i=0;i<3;i++)
	{
      CLK = 0;
      if(channel&1)DI=1;
	  else DI=0;
	  channel=channel>>1;       
      CLK = 1;
    }
    CLK=0;
    CLK=1;
     for(i=0;i<=6;i++)
	 {
         CLK = 0;                  //时钟为低电平
		 DO=1;
         if(DO)
		 {                         //如果采集到的位为1
           T1=T1+1;          //给临时存储Temp1加1
           T1=T1<<1;
		 }                    //临时存储器左移一位
         else
           T1=T1<<1;          //如果采集到的数位为0,临时存储器左移一位
		 _nop_();
         _nop_();
         _nop_();
         _nop_();
         CLK = 1;    
      }                             //时钟为高电平,完成一个时钟周期数据采集
       CLK = 0;
       if(DO)  T1=T1+1;
       if(DO)  T2=0x80;

       CLK = 1; 
                                      //采集数据校验          
       
       for(i=0;i<=6;i++)
         {
           CLK=0;
           if(DO){
             T2=T2>>1;
             T2=T2+0x80;  }
           else
             T2=T2>>1;
           CLK = 1; 
         }
   CS = 1;
   return T2;
}


garage(void)
{
	  signed char  ii,jj;
	  adout[0]=adc_0838convert(0); 
      g=adout[0];
      delay(5);  
	  adout[1]=adc_0838convert(1); 
	  h=adout[1];
	  ii=g-h;
	  jj=h-g;
	  if(ii>5 ) 
	   {  moto_en1=0;
	      moto_en2=1;
 
	    }  
 	   if(jj>5) 
	   {  moto_en2=0;
	      moto_en1=1;
 
		}   
	   if(ii<5 && jj<5) 
	     moveforward(); 

	     XJL=1;
         XJM=1;
         XJR=1;
		 if(XJL==1 && XJM==1 && XJR==1)  {moto_en1=0;moto_en2=0;cstop=1;} 
	   	
	   
 }	  

move()
{
     
		 XJL=1;
         XJM=1;
         XJR=1;

	     if(XJL==0 && XJM==1 && XJR==0 ) moveforward();		
	     if(XJL==0 && XJM==1 && XJR==1 ) turn(0,500);		   //right	
		 if(XJL==1 && XJM==0 && XJR==0 ) turn(65000,0);
	     if(XJL==0 && XJM==0 && XJR==1 ) turn(0,65000);
    	 if(XJL==1 && XJM==1 && XJR==0 ) turn(500,0);		   //left       
         if(XJL==0 && XJM==0 && XJR==0 ) {moto_1=0;moto_2=0;delay(20000);}

	     ironcnt();
} 	 

main()
{ 
  uchar k;
  moto_en1=1;
  moto_en2=1;
  moto_1=1;
  moto_2=1;                           // check	 
  moto_pwm1=0;
  moto_pwm2=0;
  lgt=0;
  beep=0;
  IRON=1;

  TMOD=0x01;				         
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;

 EA=1; 
 ET0=1;
 TR0=1;
 EX0=1;
 IT0=1;
 
  //display menu
	 lcd_ini();
     lcd_wrcmd(1);
	 lcd_wrcmd(0x80);
	 for(k=0;k<6;k++) lcd_wrdata(limit[k]);
	 lcd_wrcmd(0x8a);
	 for(k=0;k<4;k++) lcd_wrdata(run[k]);

     lcd_wrcmd(0xc0);	
	 for(k=0;k<5;k++) lcd_wrdata(irondisplay1[k]);
	 lcd_wrcmd(0xc8);
 	 for(k=0;k<3;k++) lcd_wrdata(irondisplay2[k]);
	 //cm
	 lcd_wrcmd(0xce);	   
	 lcd_wrdata('c');
	 lcd_wrdata('m'); 	
	 
	 lcd_wrcmd(0xc5);
	 lcd_wrdata(0x30);
	 lcd_wrdata(0x30);
   
	 lcd_wrcmd(0xcb);
	 for(k=0;k<3;k++) lcd_wrdata(0x30);   


  while(1)
  {	   
    // look for cute and iron
       if(state==0)   move(); 
	     
		           
	 // 找光源
	   if(state==1)   garage();
	 
  }	



}

⌨️ 快捷键说明

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