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

📄 text1

📁 通过插补计算实现在51单片机上控制X-Y机械手臂绘图的功能
💻
字号:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define tim 65536-2000
sbit dis0 =P2^4;
sbit dis1 =P2^5;
sbit dis2 =P2^6;
sbit dis3 =P2^7;
sbit dis4 =P3^4;

sbit key3 =P2^0;
sbit key2 =P2^1;
sbit key1 =P2^2;
sbit key0 =P2^3;
int disp[8];
uchar key,keyx,ts;
int para[10],ptr;
uchar code ledtab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code distab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
		               0x80,0x90,0xed,0x6b,0x0f,0xe3,0x4f,0x4d};
void modeproc(),keyproc();
int xm,ym,xe,ye,xx=0,yy=0,fm,xo,yo,x2,y2,shun=0,ni=1,i;

//==================电机驱动=================================
char movx[6]={0x01,0x03,0x02,0x06,0x04,0x05};
char movy[6]={0x10,0x30,0x20,0x60,0x40,0x50};
char inderx=0,indery=0;
char pen=0x80;
void right()
{
if(inderx>5)
inderx=0;
P1=movx[inderx]|pen;
inderx++;
}
void left()
{
if(inderx<0)
inderx=5;
P1=movx[inderx]|pen;
inderx--;
}
void up()
{
if(indery>5)
indery=0;
P1=movy[indery]|pen;
indery++;
}
void down()
{
if(indery<0)
indery=5;
P1=movy[indery]|pen;
indery--;
}
//=======驱动结束===================================


void time(uint t)
{
  uint i;
  for(i=0;i<t;i++);
}

void distran()
{
  disp[3]=distab[para[ptr]%10];//s4
  disp[2]=distab[(para[ptr]/10)%10];//s3
  disp[1]=distab[(para[ptr]/100)%10];//s2
  disp[0]=distab[(para[ptr]/1000)%10];//s1
  disp[4]=~ledtab[ptr];
}

void display()
{
  static dis=0;
  dis=(dis+1)%5;
  dis0=1;dis1=1;dis2=1;dis3=1;dis4=1;
  P1=disp[dis]; 
  switch(dis)
  {
    case 0: dis0=0; break;
	case 1: dis1=0; break;
	case 2: dis2=0; break;
	case 3: dis3=0; break;
	case 4: dis4=0; break;
  }
  if(!key0) keyx=dis+1;
  if(!key1) keyx=dis+5; 
  if(!key2) keyx=dis+9;
  if(!key3) keyx=dis+13; 
}

void modi(uchar p,uchar x)
{
  para[p]=(para[p]%1000)*10+x;
}

void dingwei()
{
 while(xx!=xm||yy!=ym)//画笔定位到设定值
	 {
	 	if(xx<xm)
			{
				xx++;
				pen=0;
				right();
			}
		 if(xx>xm)
		 	{
				xx--;
				pen=0;
				left();
			}
	 	if(yy<ym)
			{
				yy++;
				pen=0;
				up();
			}
		 if(yy>ym)
		 	{
				yy--;
				pen=0;
				down();
			}

	 }
}

void mode_zx()
{
	int xiangxian;
	for(;;)
		{
			if(keyx>0)
  			 {
     			key=keyx;   
     			while(keyx!=0) 
	   			{keyx=0; time(3000);}
				if(key==16)
				break;
     			keyproc();

			 }
		}
	 xm=para[0];
	 ym=para[1];
	 xe=para[2];
	 ye=para[3];
    dingwei();//画笔初始化
	 xx=xe;//下次开始前笔的位置坐标
	 yy=ye;
	 fm=0;	
	 	 if((ye-ym)>0&&(xe-xm)>0)
	 xiangxian=1;
		 if((ye-ym)>0&&(xe-xm)<0)
	 xiangxian=2;	
	 	 if((ye-ym)<0&&(xe-xm)<0)
	 xiangxian=3;
		 if((ye-ym)<0&&(xe-xm)>0)
	 xiangxian=4;	
	 pen=0x80;
  		while(xm!=xe||ym!=ye)
	 {
	 	 if(fm>=0)
		 {
		 	if(xiangxian==2||xiangxian==3)
				{
					xm--;
					left();
				}

			if(xiangxian==1||xiangxian==4)
				{
					xm++;
					right();				

				}

					fm=fm-ye;
		
		 }

		  if(fm<0)
		 {
		 	if(xiangxian==1||xiangxian==2)
				{
					ym++;
					up();
				}

			if(xiangxian==3||xiangxian==4)
				{
					ym--;
					down();

				}

					fm=fm+xe;
		
		 }
		 }

	
}

void mode_yh(int fangxiang)
{
	int xiangxian;
	for(;;)
		{
			if(keyx>0)
  			 {
     			key=keyx;   
     			while(keyx!=0) 
	   			{keyx=0; time(3000);}
				if(key==16)
				break;
     			keyproc();

			 }
		}
	 xm=para[0]-para[4];//01起始23重点45原点
	 ym=para[1]-para[5];
	 xe=para[2]-para[4];
	 ye=para[3]-para[5];
	 xo=0;
	 yo=0;
    dingwei();//画笔初始化
	 xx=para[2];
	 yy=para[3];
	 fm=0;
  	while(xm!=xe||ym!=ye)
	 {	
	 	 if((ym-yo)>0&&(xm-xo)>0)
	 xiangxian=1;
		 if((ym-yo)>0&&(xm-xo)<0)
	 xiangxian=2;	
	 	 if((ym-yo)<0&&(xm-xo)<0)
	 xiangxian=3;
		 if((ym-yo)<0&&(xm-xo)>0)
	 xiangxian=4;	
	 pen=0x80;
  	
	 	 if(fm>=0)
		 {
		 	if((fangxiang==1&&xiangxian==1)||(fangxiang==0&&xiangxian==4))
				{
					xm--;
					left();
					fm=fm-2*xm+1;
				}

			if((xiangxian==3&&fangxiang==1)||(xiangxian==2&&fangxiang==0))
				{
					xm++;
					right();	
					fm=fm-2*xm+1;

				}
			if((fangxiang==0&&xiangxian==1)||(fangxiang==1&&xiangxian==2))
				{
					ym--;
					down();
					fm=fm-2*ym+1;
				}

			if((xiangxian==3&&fangxiang==0)||(xiangxian==4&&fangxiang==1))
				{
					ym++;
					up();	
					fm=fm-2*ym+1;

				}
				
		
		 }

		  if(fm<0)
		 {
		 		if((fangxiang==0&&xiangxian==3)||(fangxiang==1&&xiangxian==2))
				{
					xm--;
					left();
					fm=fm+2*xm+1;
				}

			if((xiangxian==1&&fangxiang==0)||(xiangxian==4&&fangxiang==1))
				{
					xm++;
					right();	
					fm=fm+2*xm+1;

				}
			if((fangxiang==1&&xiangxian==3)||(fangxiang==0&&xiangxian==4))
				{
					ym--;
					down();
					fm=fm+2*ym+1;
				}

			if((xiangxian==1&&fangxiang==1)||(xiangxian==2&&fangxiang==2))
				{
					ym++;
					up();	
					fm=fm+2*ym+1;

				}
		
		 }
		 }

}

void fuwei()
{

}

void mypic()
{

}

void modeproc()
{
	if(key>0)
  {
    switch(key)
	{
	  case 1: mode_zx();break;
	  case 2: mode_yh(shun);break;
	  case 3: mode_yh(ni);break;
	  case 4: mypic();break;
	  case 5: fuwei();	
	 /* case 5: modi(ptr,4);break;
	  case 6: modi(ptr,5);break;
	  case 7: modi(ptr,6);break;
	  case 8: modi(ptr,7);break;
	  case 9: modi(ptr,8);break;
	  case 10:modi(ptr,9);break;

	  case 11:if(ptr<7) ptr++;break;
	  case 12:if(ptr>0) ptr--;break;

	  case 13:para[ptr]+=1;break;
	  case 14:para[ptr]-=1;break;
	  case 15:para[ptr]+=10;break;
	  case 16:para[ptr]-=10;break;*/
	}
  } 
  key=0;
}



void keyproc()
{
  if(key>0)
  {
    switch(key)
	{
	  case 1: modi(ptr,0);break;
	  case 2: modi(ptr,1);break;
	  case 3: modi(ptr,2);break;
	  case 4: modi(ptr,3);break;
	  case 5: modi(ptr,4);break;
	  case 6: modi(ptr,5);break;
	  case 7: modi(ptr,6);break;
	  case 8: modi(ptr,7);break;
	  case 9: modi(ptr,8);break;
	  case 10:modi(ptr,9);break;

	  case 11:if(ptr<7) ptr++;break;
	  case 12:if(ptr>0) ptr--;break;

	  /*case 13:para[ptr]+=1;break;
	  case 14:para[ptr]-=1;break;
	  case 15:para[ptr]+=10;break;
	  case 16:para[ptr]-=10;break;*/

	}
  } 
  key=0;
}

void timer0() interrupt 1
{
  TH0=tim>>8; TL0=tim; display(); 
}

void main()
{ 
  TMOD=0x11;IE=0x82;
  TH0=tim>>8;  TL0=tim; TR0=1;
  ptr=0; 
  distran();  
  for(;;)
  {para[0]=xx;
  para[1]=yy;
  for(i=2;i<6;i++)
  para[i]=0;
   if(keyx>0)
   {
     key=keyx;   
     while(keyx!=0) 
	   {keyx=0; time(3000);}
     modeproc(); 
   }
   time(1000);
   distran();
  } 
}

⌨️ 快捷键说明

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