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

📄 timerauto_5am11.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;//正面右
ulong xdata data0[15];
ulong avge=0,avge0=0;
uchar time1=0,time2=0,counter1=0,counter2=0;
uchar a,bb,c,d,e,f,g,right,left;
uchar forward=0,black=0,keykey=0,backward=0,xianshi=1;


unsigned char T0_OF=0,min=0,sec=0;	//T0_OF时T0溢出次数	,t_n=0
unsigned char stage_sec=0,stage_clk_flag=0;		//stage_clk_flag为1是阶段计时标志位.不用stage_min
//unsigned char stage_sec_record[];

// 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        = 0x0A;  //使定时器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];		
		    //delayms(10);
	      }
	   avgad=avgad/15;
	   for(i=0;i<15;i++)
	      {
	   
	   	     data0[i]=state;
		     avgad1+=data0[i];
		     //delayms(10);
	      }
	   avgad1=avgad1/15;
	   avge=(avgad+avgad1)/4;
		
	   //CH452_Write(CH452_DIG1|bb);
	   //CH452_Write(CH452_DIG0|c);
	   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);	
}
void stage_clk_stop()
{
	stage_clk_flag=0;
	//stage_sec_record[ t_n ]=stage_sec;
	//CH452_Write(CH452_TWINKLE | 0x30);
	//t_n ++;
}
/****精确秒延时****/	

void delay_s(uchar n)
{	
	#pragma asm
	//USING 0
n_:
	MOV R2,#50		//系统时钟如果分别是2M,4M,8M,16M
					//则R2值分别为		25,50,100,200
R2_:
	MOV R1,#40
R1_:
	MOV R0,#50	
R0_:
	NOP
	NOP
	NOP
	NOP	   

	NOP
	NOP
	NOP
	NOP		

	NOP
	NOP
	NOP
	NOP		

	NOP
	NOP
	NOP
	NOP		

	NOP
	NOP
	//NOP
	//NOP
	DJNZ R0,R0_	  
	DJNZ R1,R1_	  
	DJNZ R2,R2_	  
	DJNZ n?746,n_  
	#pragma endasm
}
/*void confirm(void)
//{	  
//	uchar i;
	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);
	
//}*/
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;
		forward=0;
		stage_clk_stop();//显示平衡后前进的时间
		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();
  		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)
{	 
	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);
	}
	else 
	{
	 START=0;
	 stage_clk_stop();
	 TR0=0;

	}					
	delayms(dem);
}


void main(void)
{	
	uchar chazhi=4;
	uchar chazhi1;
	Init_Device();
	CH452_Init();	  /* CH452初始化 */
	LEDG=0; 
	SPOKER=0;
	IN0=1;
	IN1=1;
	IN2=1;
	//IN3=1;
	//IN4=1;
	IN5=1;
	IN6=1;
	START=0;
	time1=1;
	time2=1;
	counter1=170;
	counter2=30;
	EA=1;
	
	//BACK=0;         	
	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;
		BACK=0;
		judgementback(90,20,20);
		}

		if(forward==1)
		{ 
		START=1;
		BACK=1;	//前进
		judgement(90,20,20);
		
		}
	   if(black==1)		
	   {
	    START=1;
	    TR1=1; //开定时器
		time2=0;	    
		judgement(90,20,20);
		}
	   if(keykey==1) 

  		{
			chazhi1=abs((int)(avge-avge0));
			if(chazhi1>=20)    
			{
	  			START=1;
				counter2=30;
				if(avge>(avge0+chazhi-3)) 
		 		{ 
		   			BACK=0;
					//delayms(5);
					judgementback(0,50,15);
		 		}
	   			if(avge<(avge0-chazhi)) 
		  		{
		  
		   			BACK=1;
					//delayms(5);
					judgement(0,50,15);
		  
		  		}	
	 		}		
			else if((chazhi1<20)&&(chazhi1>10))
	 		{	
			    counter2=30;
			  	if(avge>(avge0+chazhi-3)) 
		 		{ 
		  			 START=1;					 
		  			 BACK=0;
					 //delayms(5);
		   			 judgementback(0,50,15);
		 		}
	   			if(avge<(avge0-chazhi)) 
		  		{
		   			START=1;
		   			BACK=1;
					//delayms(5);
		   			judgement(0,50,15);
				 }	
	 		}		
	 		else     
			{
				START=0;
				TR1=1; //开定时器
				time1=0; 
				time2=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); 
    }
	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();
	  	  }
 	if(0x7A==key)
      {
	   delayms(2);
	   counter1=counter1+10;
	   	CH452_Write(CH452_DIG3 | 1);
	  }
	  
	if(0x7B==key)	
	  {
	   delayms(2);
	   counter1=counter1-10;
	   CH452_Write(CH452_DIG3 | 0);
	  }	  
  	
	   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++;
		if(sec==59)
		{
			sec=0;
			min++;
			CH452_Write(CH452_DIG3 | min);		 	//先写min,因为人眼分辨不出
			//CH452_Write(CH452_DIG3 | (min/10));
			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;
	}	
}

/*定时器1中断子程序*/
void TIMER1_ISR (void) interrupt 3 using 1
{
	uchar i;
	TF1=0;
	TH1=0x7D;
	TL1=0xFB;
	if(time1==1)	//执行黑线判断程序17s
	{
	   if(--counter1==0)
	   {
	       TR1=0;	//关定时器
		   time1=0;	//标志
		   keykey=1;//执行角度黑线判断程序
		   black=0;	//不执行黑线判断程序
	   }
	  
	}
	if(time2==1)	  //判断3s后5s显示
	{ if(--counter2==0)
	   {
	       TR1=0; //关定时器
		   time2=0;//标志
		   keykey=0;		   
		   stage_clk_stop();//显示平衡的时间
		   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();
           forward=1;//平衡后前进
		   		   
	   } 
	}

}

⌨️ 快捷键说明

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