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

📄 111.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	=	P0^4;
sbit START	=	P0^5;
sbit SPOKER =   P0^6;
sbit IN0	=	P1^1;//左
sbit IN1	=	P1^3;//中
sbit IN2	=	P1^0;//右
//sbit IN3	=	P1^5;//斜右
//sbit IN4	=	P1^2;//斜左
sbit IN5	=	P1^2;//正面左
sbit IN6	=	P1^6;//正面右
sbit LASTS	=	P1^4;
sbit LASTB	=	P1^5;
sbit LASTF  =   P3^0;

//定义全局变量
ulong xdata data0[15];    								//存储AD进来的数再进行运算
ulong avge=0,avge0=0;									//avge为每30次的AD平均值 avge0为一开始的标准值
uchar time1=0,time2=0,counter1=0,counter2=0,counter3=2; 			//定时器0,1的标志位
uchar a,bb,c,d,e,f,g,right,left;						//各红外传感器的输入值
uchar forward=0,black=0,keykey=0,backward=0,xianshi=1;	//各段程序的标志位
uchar T0_OF=0,min=0,sec=0;								//T0_OF时T0溢出次数	,t_n=0
uchar stage_sec=0,stage_sec1=0,stage_clk_flag=0;						//stage_clk_flag为1是阶段计时标志位.不用stage_min
uchar transform=1;				 						//1,2两程序互换
uchar chazhi=5;

uchar wending=1,look=1,lalala=3;
ulong huang0,huang1;
uint wucha;					 						//键盘控制差值
// Peripheral specific initialization functions,
// Called from the Init_Device() function 

 
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        = 0x0A; //使能定时器1中断//使能定时器0中断
    IP        = 0x02;  //使定时器1,0优先级高
    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();
}
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); 
}
ulong pingjun (void)
{	  uchar i;
      ulong avgad1=0,avgad=0,state=0;
	  state=AD_IN();
      for(i=0;i<15;i++)
	  {		
	   	   data0[i]=state;
		   avgad+=data0[i];		
	  }
	   avgad=avgad/15;
	   for(i=0;i<15;i++)
	   {	   
	   		data0[i]=state;
		    avgad1+=data0[i];		     
	    }
	   avgad1=avgad1/15;
	   avge=(avgad+avgad1)/4;
	   
	   if(look==1)			  /*确定是否晃动太厉害*/
	   {
	       look=0;
		   
		   huang1=huang0;
		   huang0=avge;
		   wucha=abs(huang1-huang0);
		   if(lalala--==0)
		   {
		   	CH452_Write(CH452_DIG0 | wucha%10);
			CH452_Write(CH452_DIG7 | wucha/10);
			lalala=3;
			}
		   if(wucha>=6)
		   {
		       wending=0;
			   START=0;
			   LASTS=1;
			   delayms(700);
		   }
		   else wending=1;
	   }		
	   return(avge);
}
void stage_clk_start()
{		
	CH452_Write(CH452_TWINKLE);
	DELAY_1US;DELAY_1US;DELAY_1US;DELAY_1US;DELAY_1US;
	stage_clk_flag=1;
	stage_sec=0;
	CH452_Write(CH452_DIG4);
	CH452_Write(CH452_DIG5 | 16);	
}
/****精确0.5 * n秒延时****/	
void delay_s(uchar n)
{	unsigned char i,j;
  	for(i=0;i<200;i++)
		for(j=0;j<25*n;j++)
		{
		 	DELAY_10US;
			DELAY_10US;
			DELAY_10US;
			DELAY_10US;
			DELAY_10US;
			DELAY_10US;
			DELAY_10US;
			DELAY_10US;
			DELAY_10US;
			DELAY_10US;	//100us
		} 
	

}
void judgement (uchar modi,uchar modi1,uchar dem)
{	
	uchar i;
	if((a&&bb==0&&c==0)||(a&&bb&&c==0))
	{	left=1;
		right=0;
		speedchange(modi1,1);
		speedchange(modi,0);
		delayms(dem);
	}
	else if((a==0&&bb==0&&c)||(a==0&&bb&&c))
	{
		left=0;
		right=1;	 
	    speedchange(modi1,0);
		speedchange(modi,1);
		delayms(dem);
	}
	else if(a==0&&bb&&c==0)
	{   
		left=0;
		right=0;
	    speedchange(modi,0);
		speedchange(modi,1);
		delayms(dem);
	}
	else if(a&&bb&&c)	 //停止&&(d||e)
  	{
  					
		START=0;
		LASTS=1;
		forward=0;
		stage_clk_flag=0;//stage_clk_stop();显示平衡后前进的时间
		CH452_Write(CH452_DIG0|11);
		 CH452_Write(CH452_TWINKLE | 0x31);	
		for(i=5;i>0;i--)
	    {	
			CH452_Write(CH452_DIG7 | i);
			SPOKER=1;
			delay_s(1);
			SPOKER=0;
			delay_s(1);
		}
		CH452_Write(CH452_DIG7);
		stage_clk_start();
		CH452_Write((CH452_DIG0)|16);		
  		if(transform==1)	
		{
			forward=0;
			black=0;
			keykey=0;
			xianshi=0;
			backward=1;		
		}
 	}	  
	else //if (a==0&&bb==0&&c==0)
	{
	     if(left==1)
		 {
		 	speedchange(modi1,0);
			speedchange(modi,1); }
		 else if(right==1)
		 {
		 	speedchange(modi,0);
			speedchange(modi1,1);}
		 else
		 {
	        speedchange(modi,0);
			speedchange(modi,1);}
			delayms(dem);
	}
}
void judgementback (uchar modi,uchar modi1,uchar dem,uchar i)
{	if(i==1)
	{if(stage_sec>29)
	{
	 START=0;
	 LASTS=1;
	 stage_clk_flag=0;//stage_clk_stop();	
	 CH452_Write(CH452_DIG0|10);
	 CH452_Write(CH452_TWINKLE | 0x31);	
	 TR0=0;
	 forward=0;
	 black=0;
	 keykey=0;
	 backward=0;
	 xianshi=0;	 
	}}				 
	if(f==1&&g==0)
	{
	 speedchange(modi1,1);
	 speedchange(modi,0);
	 
	}
	else if(f==0&&g==1)
	{
	 speedchange(modi,1);
	 speedchange(modi1,0);
	 
	}						
	else //if(f==0&&g==0)
	{
		speedchange(modi,1);
	 	speedchange(modi,0);
	}
   	
	delayms(dem);
}


void main(void)
{	
	uchar chazhi1;
	Init_Device();
	CH452_Init();	  /* CH452初始化 */
	LEDG=0; 
	SPOKER=0;
	forward=0,
	black=0,
	keykey=0,
	backward=0,
	xianshi=1;
	IN0=1;
	IN1=1;
	IN2=1;
	//IN3=1;
	//IN4=1;
	IN5=1;
	IN6=1;
	START=0;
	LASTS=1;
	LASTB=0;
	LASTF=0;
	time1=1;
	time2=1;
	counter1=170;
	counter2=50;
	chazhi=2;
	EA=1;	     	
	while(1)
	{	 
		LEDG=~LEDG;		
		avge=pingjun();
		if(xianshi==1)
		{BCD_H_L(avge-200,0); }	   
		a=IN0;
		bb=IN1;
		c=IN2;
		//d=IN3;
		//e=IN4;
		f=IN5;
		g=IN6;
		if(backward==1)
		{
			START=1;
			LASTS=0;
			BACK=0;
			LASTB=1;
			LASTF=1;
			counter2=0;
			judgementback(90,20,20,1);
		}
		if(forward==1)
		{ 
			START=1;
			LASTS=0;
			BACK=1;	//前进
			LASTB=0;
			LASTF=0;
			judgement(90,20,20);		
		}
	   if(black==1)		
	   {
	    	START=1;
			LASTS=0;
	    	TR1=1; //开定时器
			time2=0;	    
			judgement(90,20,20);
		}
	   if(keykey==1) 
  		{
			speedchange(40,1);
			speedchange(40,0);
			chazhi1=abs((int)(avge-avge0));
			if(wending==1)
			{
			
			
			
			    if(chazhi1>chazhi)    	 //chazhi1>=20
			    {
	  		    	START=1;
					LASTS=0;
					counter2=50;

					if(avge>avge0-1) 
		 			{ 
		   				BACK=0;//后退
						LASTB=1;
						LASTF=1;
						delayms(3);
						judgementback(40,1,15,0);
		 			}
	   				if(avge<avge0) 
		  			{
		  
			   			BACK=1;	 //前进
						LASTB=0;
						LASTF=0;
						delayms(3);
						judgement(40,1,15);
		  
			  		}	
		 				
				 }
		
		 		else     
				{
					START=0;
					LASTS=1;
					delayms(500);
					TR1=1; //开定时器
					time1=0; 
					time2=1;
	
				}
			
			 }
			 else   
			 {
			     START=0;
				 LASTS=1;
		      }
							
			
    	}
	   
	}
}
/*PCA中断子程序*/
void PCA_ISR (void) interrupt 9
{
	
	CCF0 = 0;			/*清匹配中断标志*/

} 
 /*键盘中断子程序*/
void led(void)  interrupt 19
{ 
	uchar key,t;
	EA=0;   
	key=CH452_Read();   
	if(0x62==key)
	{
		delayms(2);
		avge0=avge;
		black=0;	
		BCD_H_L(avge0-200,1); 
    }
	else if(0x63==key)
	{	
		delayms(2);
	  	black=1;
	  	xianshi=0;
	  	TR0=1;
	  	for(t=0;t<8;t++)
      		CH452_Write((CH452_DIG0+ (t<<8))|16);
	  	CH452_Write(CH452_DIG1);
	  	stage_clk_start();
	}
	else if(0x7A==key)
	{
		delayms(2);
	   	counter1=counter1+10;
	   	CH452_Write(CH452_DIG3 | 1);
	}	  
	else if(0x7B==key)	
	{
		delayms(2);
	   	counter1=counter1-10;
	   	CH452_Write(CH452_DIG3 | 0);
	}
	else if(0x50==key)	
	{
		delayms(2);
		transform=1;
		CH452_Write(CH452_DIG7 | 1);
	   	
	}
	else if(0x58==key)	
	{
		delayms(2);
	   	transform=0;
		CH452_Write(CH452_DIG7 | 2);
	}
	else if(0x78==key)	
	{
		delayms(2);
	   	chazhi=chazhi+1;
		CH452_Write(CH452_DIG7 | chazhi);
	}
	else ;	  	  	  	  
	EA=1;
}

/*定时器0中断子程序*/
 void T0_ISR(void) interrupt 1	using 0
{
	TR0=0;
	TF0=0;
	TH0=0x7D	;					
	TL0=0xCC	;	//0xCC由0xCB+1得来
	TR0=1;
	if(T0_OF<10)
		T0_OF++;
	else
	{	
		
		if(sec<59)
			sec++;
		else
		{
			sec=0;
			min++;
			CH452_Write(CH452_DIG3 | min);		 	//先写min,因为人眼分辨不出		
			CH452_Write(0x1FB);
		}
		CH452_Write(CH452_DIG1 | (sec%10));
		CH452_Write(CH452_DIG2 | (sec/10));
		if(stage_clk_flag)
		{
			stage_sec++;
			CH452_Write(CH452_DIG4 | (stage_sec%10));
			if(stage_sec/10)  CH452_Write(CH452_DIG5 | (stage_sec/10));
		}
		T0_OF=0;
	}
	if(--counter3==0)
	{
	    counter3=2;
		look=1;

	}
	
}

/*定时器1中断子程序*/
void TIMER1_ISR (void) interrupt 3 using 1
{
	uchar i;
	TR1=0;
	TF1=0;
	TH1=0x7D;
	TL1=0xFB;
	TR1=1;
	if(time1==1)	//执行黑线判断程序17s
	{
	   if(--counter1==0)
	   {
	       TR1=0;	//关定时器
		   time1=0;	//标志
		   black=0;	//不执行黑线判断程序
		   START=0;
		   keykey=1;//执行角度黑线判断程序
	   }
	  
	}
	if(time2==1)	  //判断3s后5s显示
	{ 
		if(--counter2==0)
		{
	       TR1=0; //关定时器		   
		   time2=0;//标志
		   keykey=0;
		   counter2=0;		   
		   stage_clk_flag=0;//stage_clk_stop();//显示平衡的时间
		   CH452_Write(CH452_SELF_BCD|0x39);
		   CH452_Write(CH452_DIG0|0x1E);
		    CH452_Write(CH452_TWINKLE | 0x31);	
		   for(i=5;i>0;i--)
			{	
				CH452_Write(CH452_DIG7 | i);
				SPOKER=1;
				delay_s(1);
				SPOKER=0;
				delay_s(1);
			}
		   CH452_Write(CH452_DIG7);//计数显示	
		   stage_clk_start();
		   CH452_Write(CH452_DIG0|16);
		   if(transform==0)
		   { 
		   		forward=0;
				backward=0;
				black=0;
				xianshi=0;
				transform=0;
		   		keykey=1;
				
		   }//循环角度判断 
           if(transform==1) 
		   {
		   		keykey=0;
				black=0;
				backward=0;
				xianshi=0;
				transform=1;
				forward=1;
				
		   }//平衡后前进
		   		   
	   } 
	}

}

⌨️ 快捷键说明

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