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

📄 totol1.c

📁 motor_control.zip
💻 C
字号:
/////////////////////////////////////
//  COPYRIGHT RESERVED BY DU  //
/////////////////////////////////////

#include "c8051F020.h"
#include "intrins.h"
#include "CH452CMD.H"	// 定义常用命令码及外部子程序
#include "pin.h"
#include "math.h"
#include "key_display.h"		  


//定义端口
sbit LEDG	=	P3^4;
sbit BACK	=	P3^0;
sbit START	=	P3^2;
sbit IN0	=	P0^5;//左
sbit IN1	=	P0^6;//中
sbit IN2	=	P0^7;//右
sbit IN3	=	P1^0;//斜右
sbit IN4	=	P1^1;//斜左
//sbit IN5	=	P1^2;
//sbit IN6	=	P1^3;

//定义全局变量
ulong xdata data0[15];
uchar time1=0,time2=0,time3=0,time4=0;
uchar counter1=0,counter2=0,counter3=0,counter4=0;
ulong avge=0,avge0=0;
uchar keykey=0,timein;
uchar times_of_overflow1=0;
uchar duty=80,duty0=0,duty1=0;


// Peripheral specific initialization functions,
// Called from the Init_Device() function 系统设置,020初始化  DA_OUT  AD_IN

 
void Port_IO_Init()
{
    // P0.0  -  CEX0 (PCA),  Open-Drain, Digital
   // P0.1  -  CEX1 (PCA),  Open-Drain, Digital
       XBR0      = 0x10;	/*CEX0-->P0.0,CEX1-->P0.1*/
       XBR2      = 0x40;	
}

void Interrupts_Init()
{   
	IE        = 0x08;
    IP        = 0x08;
    EIE1      = 0x08; //使能PCA0中断
    EIE2      = 0x20;
    EIP2      = 0x20;

}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    Reset_Sources_Init();
    ADC_Init();
	PCA_Init();
	Timer_Init();
	Oscillator_Init();
    Voltage_Reference_Init();
    Port_IO_Init();
    Interrupts_Init();
}



ulong pingjun (void)
{	  uchar i;
      ulong avgad1=0,avgad=0,state=0;
	  state=AD_IN();
      for(i=0;i<12;i++)
	      {
		
	   	    data0[i]=state;
		    avgad+=data0[i];		
		    //delayms(10);
	      }
	   avgad=avgad/12;
	   for(i=0;i<12;i++)
	      {
	   
	   	     data0[i]=state;
		     avgad1+=data0[i];
		     //delayms(10);
	      }
	   avgad1=avgad1/12;
	   avge=(avgad+avgad1)/4;
		
	   //CH452_Write(CH452_DIG1|b);
	   //CH452_Write(CH452_DIG0|c);
	   return(avge);



}

//定时n秒。不要放在循环语句中调用
void timecontrol(float n)
{
	timein=(uchar)(n*10);
	TR1=1;
	//TR0=1;
}

//改变占空比 i=0控制右轮 i=1控制左轮
void speedchange(uchar duty,uchar i)
{
     if(i==0) PCA0CPH0 =(uchar)((100-duty)*2.56);		//把duty值转换,赋值给控制占空比的寄存器
	 if(i==1) PCA0CPH1=(uchar)((100-duty)*2.56); 

}

//主函数main

void main(void)
{	
	
	uchar a,b,c,d,e,left=0,right=0;
	uchar chazhi=10,chazhi1;//,i,t;
	Init_Device();
	CH452_Init();	  /* CH452初始化 */
	LEDG=0; 
	START=0;         	
	while(1)
	{	 
	   LEDG=~LEDG;
	   EA=1;
	   IN0=1;
	   IN1=1;
	   IN2=1;
	   IN3=1;
	   IN4=1;
	   
	   avge=pingjun();
	   BCDdisplay_l(avge-200); 	   
	   
  if(keykey==1) 
  {
	chazhi1=abs((int)(avge-avge0));
    if(chazhi1<15)
	 { d=IN3;
	   e=IN4;
	   if(time1==0)
            {if(d==1){PCA0CPH1=0xff;
	            PCA0CPH0=0x80;}
             if(e==1){PCA0CPH0=0xff;
	            PCA0CPH1=0x80;}
                   if(avge>(avge0+20)) 
                       { 
	           	        START=1;
	  			BACK=1;
			}

		   else if(avge<(avge0-20)) 
			{
				START=1;
				BACK=0;
			}

		   else if((chazhi1>10)&&(chazhi1<=20))
	 		{

				START=0;
	    		        time1=1;
				counter1=1;
	  		}
	 	   else if(chazhi1<=10)
     		        {
		   		START=0;
			}
   		   else;
	 }	
		   //for(t=4;t<8;t++)    CH452_Write((CH452_DIG0+ (t<<8))|16);
		   //CH452_Write(CH452_DIG7|5);
		  // for(i=5;i>0;i--)
		  // {
			//	timecontrol(1);
			//	CH452_Write(CH452_DIG7|(i-1));
			
		  // }
      }
    else
   	{  
	a=IN0;
	b=IN1;
	c=IN2;
	d=IN3;
	e=IN4;
	//delayms(1);
	if(d==0&&e==0)
	{
	if((a==0&&b==1&&c==0))
	{   
	    EA =0;
	    left=0;
		right=0;
	    PCA0CPH0 = 0x33;
		PCA0CPH1 = 0x33;
		EA =1;
	}

	else if((a==1&&b==0&&c==0)||(a==1&&b==1&&c==0))
	{	  
	      EA =0;
	      left=1;
		  right=0;		  
	      duty1=duty-50;
		  speedchange(duty1,1);
		  EA =1;

	}
	else if((a==0&&b==0&&c==1)||(a==0&&b==1&&c==1))
	{   
	 	 EA =0;
		 left=0;
		 right=1;	 
	     duty0=duty-50;
	     speedchange(duty0 ,0);
		 EA =1;
	     
	 }
	else if (a==0&&b==0&&c==0)
	{
	     if(left==1)
		 {
		  EA =0;
	      duty1=duty-50;
		  speedchange(duty1,1); }
		 else if(right==1)
		 {
		 	   EA =0;
	          duty0=duty-50;
	          speedchange(duty0 ,0);}
	    else
		  {
		 	 EA =0;
	        PCA0CPH0 = 0x33;
		    PCA0CPH1 = 0x33;}
		EA =1;
	 }
 	else 
	 {
	    EA =0;
	    PCA0CPH0 = 0x33;
		PCA0CPH1 = 0x33;
		EA =1;
	  } 
	  
	  
	  }
  if((d==1)&&(e==0))	 //急左拐
  {
  	PCA0CPH1=0xff;
	PCA0CPH0=0x80;
 
}	  
if(d==0&&e==1)	 //急右拐
  {
  	PCA0CPH0=0xff;
	PCA0CPH1=0x80;
  
 }	  
	  
	   
   
    }
	
	  }
    }
}
/*PCA中断子程序*/
void PCA_ISR (void) interrupt 9
{
	CCF0 = 0;			/*清匹配中断标志*/
} 


 /*键盘中断子程序*/
void led(void)  interrupt 19
{ 
   uchar key;
   EA=0;
   key=CH452_Read();
   
   if(0x62==key)
   {
   	delayms(2);
	avge0=avge;
	keykey=1;
	BCDdisplay_h(avge0-200); 
    }
   EA=1;
   //if(0x63==key)
	  // {
	  // delayms(2);
	   //avga=pingjun();
	   //CH452_Write(CH452_DIG1|b);
	   //CH452_Write(CH452_DIG0|c);
	  // BCDdisplay(avga);

	  // }

}
 /*定时器中断子程序*/
void TIMER1_ISR (void) interrupt 3 using 1
{
	TR1=1;
	TF1=0;
	TH1=0x7D;
	TL1=0xFB;
	if(time1==1)
	{
	   if(--counter1==0)
	   {
	       START=1;
		   time1=0;

	   }
	}
	
	
	
	/*if(times_of_overflow1 < timein)
	 {	
	   times_of_overflow1 ++ ;	
	   TR1=1;
	   }
	else
	{	TR1=0;
	    //TR0=0;
		//Frequence=TH0*0x100+TL0;
		times_of_overflow1=0;
		TH1=0x7D;
	    TL1=0xFB;
		START=1;
		//JIA+=(float)timein/10 ;
		//BCDdisplay_l(JIA);
		//TH0=0;
		//TL0=0;
		//TR0=1;  
		
	 }*/
}
		


	 

⌨️ 快捷键说明

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