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

📄 新建 文本文档 (4).txt

📁 全国机器人机械创新大赛的程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	/****************
	手动机器人程序
	2006,5,4   王不更
	*****************
	-----------------------------------------
	REF I/0:
	P2.7 - ICA - RIGHT WHEEL
	P2.0 - ICB - LEFT WHEEL
	-----------------------------------------
	P2.6 - OCA - P1.0(REVERSE)		右轮
	P1.6 - OCB - P1.1				升降
	P1.7 - OCC - P1.2				伸缩
	P2.1 - OCD - P1.3				左轮
	P1.4							挟持
	P0.0 - AD01
	P0.1 - AD10
	P0.4:P0.7 - KBFUNC:LOAD,CAST,GATE,STOPALL
	
	AD AXIS:
					   00
					   │	DEADZONE
					   │7A	/
				   ┌─┼─┐
				 7A│  │  │95
		 00────┼─┼─┼────→FF
				   │80│  │
				   └─┼─┘
					   │95
					   FF
	-----------------        JACKIE'S COMMENTS        -------------*/
	#include <Reg935.h> 				//Keil header file name
	#include <stdio.h>
	#define uchar unsigned char
	#define uint unsigned int
	#define ulong unsigned long
	#define ccu_inter_count 2
//	#define gei_ding 70
//	#define out_direction_enter 25 
	#define TH0_data  0xB8 
	#define TL0_data  0x00
	#define CSM  5 		 //参数设定范围,有9个参数
	#define CMID 0x80 
	#define WAITFORADDATA _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	sbit P02=P0^2;
	sbit P03=P0^3;
	sbit P04=P0^4;
	sbit P05=P0^5;
	sbit P06=P0^6;
	sbit P07=P0^7;
	sbit P10=P1^0;
	sbit P11=P1^1;
	sbit P12=P1^2;
	sbit P13=P1^3;
	sbit P14=P1^4;
	sbit P15=P1^5;
	sbit P16=P1^6;
	sbit P17=P1^7;
	sbit P20=P2^0;
	sbit P21=P2^1;
	sbit P22=P2^2;
	sbit P23=P2^3;
	sbit P24=P2^4;
	sbit P25=P2^5;
	sbit P26=P2^6;
	sbit P27=P2^7;
	sbit RCLK=P2^4;
	sbit IN=P2^2;          //数据发送口
	sbit SCLK=P2^5;        //同步时钟信号
	sbit KEY=P2^3;         //读键口      
	sbit st=P1^5 ;		   //复位
	bit data kflag = 0;	   //手柄按键标志位
	bit SF=0;              //闪烁标志位
//	bit Q=0;               //外环调整标志位
	bit run=0;             //电机左右轮运行标志,1时运行,0时停
	bit data flag = 0;	   //电机左右轮给定值标志位
	bit data rwa = 0;		//RIGHT WHEEL APPRO
	bit data lwa = 0;		//左轮方向标志
	uchar TK=0x09;         //按键按下位寄存器1
	uchar DATA0[8],DATA1[8];//发送数据库
	uchar EDATA[2];			//E^2PROM读写暂存器
	uint CS[CSM];            //修改参数寄存器组(CS[0],CS[1]为,CS[2]为RA,CS[3]为KPB,CS[4]为KIB,CS[5]为RB,CS[6]为外环调整基量)
	uchar x=0,y=0,k=0,j=0,p=0,l=0; //指针型变量,k对DATA0&DATA1&selectable;x&y对digitable;j对EDATA;p/l对FA&FB;
	uchar w=0;             //取数计数器	,定时器T0中断计数
	uchar M=0,R=4;         //M用于参数选择,M等于0时没有键按下,不等到0时有键按下;R为右移选择.
	uchar S=0;             //寻迹传感器状态寄存器
	uchar d;
	uchar deadzonel0 = 0x00; //死区范围设计
	uchar deadzoner0 = 0x00;
	uchar deadzonel1 = 0x00;
	uchar deadzoner1 = 0x00;
//	uchar mid0;
//	uchar mid1;
	uint circl_count_A;
	uint circl_count_B;
	uint cod = 0;				//CMP OUTPUT D
	uint coa = 0;
	uint addata;			  //A/D转换结果值
	uint CAP1=0x0000;  
	uint CAP2=0x0000;	   
	uint CBP1=0x0000;
	uint CBP2=0x0000;      //定义捕获值寄存器组
	uint RESHIP=0x0000;	   //CCU重装值寄存器
	uchar  AD_0;
	uchar  AD_1;
	uint PLSA=0;  
	uint PLSB=0; //捕获脉冲总次数寄存器
	bit HA=0,HB=0;         //首次捕获标志位
	uint FAA=0;
	uint FAB=0;	   //捕获信号频率寄存器
	uint I=0x0000;    //CCU溢出次数计数器
	void ICA_int();
	void ICB_int();
	void CCU_int();
	signed int idata EKA1=0,EKA2=0,EKB1=0,EKB2=0,EKA3=0,EKB3=0;//,EK1,EK2;   //误差寄存器 
	uint idata UKA,UKB;         //输入值
	uint idata FA[8];
	uint idata FB[8];   //捕获信号频率寄存器组
	ulong idata TFAA=0;
	ulong idata TFAB=0; //滑动平均暂存器
	ulong idata TPI=0;  //CCU溢出次数暂存器
	uchar idata TCAP2H;
	uchar idata TCAP2L;
	uchar idata TCBP2H;
	uchar idata TCBP2L;          //捕获值暂存器组
	uint idata TPNA;
	uint idata TPNB;            //捕获次数暂存器
	uint idata NA=0x00;
	uint idata NB=0x00;		    //捕获次数累加器
	uchar idata digitable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
	uchar idata selectable[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
	uint idata VA;    //电机转速A
	uint idata VD;	   //电机转速D
	extern void _nop_(void);
//	void delay(void)
 /*********************************************************
	 A/D调用服务程序
 **********************************************************/

void delay( uchar time)
{
	uchar i;
	uchar j;
	uchar k;
	for(i=0;i<=time;i++)
	{
		for(j=0;j<=100;j++)
		for(k=0;k<=100;k++);						 	
	}
}

  /*********************************************************
	 A/D调用服务程序
  **********************************************************/	

void AD(void)
{
	//    ADINS  =  0x12;
	AD_0 = AD1DAT0;  //对应AD10与P01口
	AD_1 = AD0DAT1;  //对应AD01与P00口
	ADCON0 |= 0x03;
	ADCON1 |= 0x03;
}
	
  /*********************************************************
	手柄按键盘中断服务程序
  **********************************************************/

	void KBI(void) interrupt 7  
	{   

		kflag = 1;
		EKBI = 0;
	}
	
  /*********************************************************
	//手柄按键盘中断服务子程序
  **********************************************************/

	void SCANKEY(void)
	{ 
	   if(kflag)
	   {
	   if(P02==0)
		 {
//		  delay(1);
	      if(P02==0)
		   {
			 P11 = 1;
//			 delay(1);
			 OCRBH = CS[1]*10>>8;
			 OCRBL = CS[1]*10&0xFF;
			 TCR21 |= 0x80;			 
			 OCB= 1;
		     }
//		  OCB = 0;
//		  P11 = 0;
		  }

		else if(P03==0)
		 {
//		   delay(1);
		   if(P03==0)
		   {
			  P11 = 0;
//			  delay(1);
			  OCRBH = CS[2]*10>>8;
			  OCRBL = CS[2]*10&0xFF;
			  TCR21 |= 0x80;			  
			  OCB = 1;
		    }
//		  OCB = 0;
//		  P11 = 0;
		 }

		else if(P04==0)
	 	 {
//		   delay(1);
		   if(P04==0)
		   {
			  P12 = 0;
//			  delay(1);
			  OCRCH = CS[3]*10>>8;
			  OCRCL = CS[3]*10&0xFF;
			  TCR21 |= 0x80;			  
			  OCC = 1;
		     }
//		  OCC = 0;
//		  P12 = 0;
		   }  
	    else if(P05==0)
	     {
//		  delay(1);
	      if(P05==0)
	       {
			  P12 = 1;
//			  delay(1);
			  OCRCH = CS[4]*10>>8;
			  OCRCL = CS[4]*10&0xFF;
			  TCR21 |= 0x80;			  
			  OCC = 1;
	       }
//			OCC = 0;
//			P12 = 0;
	     }     
		else if(P06==0)
	     {
//	       delay(1);
	       if(P06==0)
	        {
	          P24 = 0;
//			  delay(1);
			  P14 = !P14;
			  	
			 }
	
		  }
	
		else if(P07==0)
	     {
//	 	  delay(1);
		   if(P07==0)
		   {
            
			P24 = 1;
//			delay(10);
			P14 = !P14;
			
		     }
//		  P14 = 0;
//		  P24 = 0;
		  }	
			KBCON &= 0xFE;
			EKBI = 1;
			kflag = 0;
		}
	 else
	 {
	   OCB=0;
	   OCC=0;
//	   P14=0;
	   P24=0;
	 }
	}

  /*********************************************************
	设计运行死区范围
  **********************************************************/	

	void refreshMV()
	{
		WAITFORADDATA					   					
		WAITFORADDATA
		deadzonel0=AD0DAT1-0x20;	deadzoner0=AD0DAT1+0x20;  //死区范围0x75至0x90,在该范围内电机不会运行	
		WAITFORADDATA										   
		WAITFORADDATA
		deadzonel1=AD1DAT0-0x20;	deadzoner1=AD1DAT0+0x20;													
//		mid0=AD0DAT1;
//		mid1=AD1DAT0;
	}
	

  /*********************************************************
	前进后退方向控制
  **********************************************************/	
	
	void CTRLUD(void) //P01口
	{
		//ACC OR BACK CONTROL USE AD10
		if(AD1DAT0 >= deadzoner1)
		{
			addata = (AD1DAT0-CMID)*CS[0];//向前
			coa = addata;
			cod = addata;
			rwa = 0;
			lwa = 0;
 			flag = 1;
		}
		else if(AD1DAT0 <= deadzonel1)
		{
			addata = (CMID-AD1DAT0)*CS[0];//向后
			coa = addata;
			cod = addata;
			rwa = 1;
			lwa = 1;
			flag = 1;
		 }
	}	 
	 
  /*********************************************************
	左右方向控制
  **********************************************************/	

	void CTRLLR(void)	  //P00口
	{
		//LTURN OR RTURN CONTROL USE AD01
		if(AD0DAT1 >= deadzoner0)
		{
			addata = (AD0DAT1-CMID)*CS[0];	 //向左转
		/*	if(coa >= addata)
			   coa -= addata;
			else 
			{
				coa = addata - coa;
				rwa = !rwa;
			}	 */
			coa = addata;
			flag = 1;
	
		}
		else if(AD0DAT1 <= deadzonel0)
		{
			addata = (CMID-AD0DAT1)*CS[0];	//向右转
		/*	if(cod >= addata)cod -= addata;
			else 
			{
				cod = addata - cod;
				lwa = !lwa;
			}	*/	  
			cod = addata;			
			flag = 1;
			
		}
		//END
	}	
	
  /*********************************************************
	方向驱动程序
  **********************************************************/

	void CTRLEXE(void)
	{
		if(flag)
		{	
			UKA = coa;
			UKB = cod;
			P13 = lwa;
			P10 = rwa;
			delay(1);
		    if(VA==0) 
			 { 
			    P26=0;
				P21 = 1;
			  }
			else if(VD==0)
			  {
			    P21=0;
				P26 = 1; 
			  }
			else
			  {
			   P26 = 1;
		  	   P21 = 1;
			  }
			lwa = 0;
			rwa = 0;
			coa = 0;
			cod = 0;
			flag = 0;
			run=1;	
		 }
	   else 
		{
		    P21=0;
			P26=0;
			run=0;
			flag = 0;
		} //P2 &= 0xBD;       P2=1011 1101,关掉左右电机,显示变黑
	}
	
  /*********************************************************
	CCU中断服务程序
  **********************************************************/

	void CCU_ISR() interrupt 11
	{
	  while(TISE2)
	   {
	     switch(TISE2)
	      {
		     case 0x07: CCU_int();   //执行CCU溢出中断服务子程序
		     break;
		     case 0x06: ICA_int();   //执行ICA捕获中断服务子程序
		     break;
			 case 0x05: ICB_int();	 //执行ICB捕获中断服务子程序
			 break;
	      };						 
	   };

	}	

  /*********************************************************
	 捕获中断服务子程序
  **********************************************************/	
	//ICA捕获中断服务子程序
	void ICA_int()
	{
	  if(HA==0)
	  {
		   CAP1=(ICRAH*0x100+ICRAL);   //A首次捕获值
		   HA=1;
		   NA++;
	  }
	  else
	  {
	       NA++;
	  }
	 TIFR2=TIFR2&0xFE;  //将ICA中断标志位清零
	 PLSA++;					

	}
	
	//ICB捕获中断服务子程序
	void ICB_int()
	{
	  if(HB==0)
	    {
		   CBP1=(ICRBH*0x100+ICRBL);   //B首次捕获值
		   HB=1;
		   NB++;
	     }
	  else
	       NB++;
	 TIFR2=TIFR2&0xFD;  //将ICB中断标志位清零
	 PLSB++;

⌨️ 快捷键说明

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