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

📄 步进电机画圆和走定点.c

📁 程序资料共享 希望大家共同进步 共同努力 加油 !
💻 C
字号:
#include<reg52.h>
#include<math.h>
#include<INTRINS.H>
#include<ABSACC.h>

#define Uchar unsigned char
#define Uint  unsigned int
#define Lcd1602WdataPort 0x8101
#define Lcd1602CmdPort  0x8100
#define Lcd1602StatusPort 0x8102
#define Busy 0x80 
sbit R = P3^7;
sbit W = P3^6;

Uint code key[5]={0xf8f0,0xf8e8,0xf8d8,0xf8b8,0xf878};
Uchar k=0,keyvalue=0;
Uchar code str5[]="X:              ";
Uchar code str6[]="Y:              ";
Uchar f;
float m[2],n[2];
Uchar a[10],b[10];
Uchar code c[]={'0','1','2','3','4','5','6','7','8','9'};

void keyscan(void);
void inputd(void);
void move(void);
//void jisuan2(float data1,float data2);
void LcdReset( void );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdWriteData( Uchar dataW );
void ShowChar(Uchar pos,Uchar c);
void ShowString(Uchar line,char *pr);
void Delay400Ms(void);
void Delay5Ms(void);
void circle(void);
void jisuan(float a);
void jisuan1(float a1);
void xianshi(float dataw,float dataw1);

main()
{ Uchar code str1[]="X:                 ";
  Uchar code str2[]="Y:                 ";
  IE=0x84;
  for( ; ; )
    { EA=1;
      keyscan();
      /*if(k==1)circle();
	  else if(k==2){inputd();move();}*/
	  switch(k)
        { case 1: {ShowString(0,str1);ShowString(1,str2);circle();break;}
          case 2: {inputd();move();break;}
        }
      k=0;
      _nop_();
    }
}

void keyscan(void)
{ f=1;
  XBYTE[0xf800]=0;
  while(f);
  switch(keyvalue)
    { case 0x70:k=1;break;
      case 0xb0:k=2;break;
      case 0xd0:k=3;break;
      case 0xe0:k=4;break;
      case 0x71:k=5;break;
      case 0xb1:k=6;break;
      case 0xd1:k=7;break;
      case 0xe1:k=8;break;
      case 0x72:k=9;break;
      case 0xb2:k=0;break;
     }   
}

Int1_process()  interrupt 2 using 0
{   Uchar i;
    Uchar w=0;
    keyvalue=0;
    Delay400Ms();
    for(i=0;i<5;i++)
	{  
	  w=XBYTE[key[i]]&0x0f;
		if(w!=0x0f)
		{
			keyvalue=(w<<4)|i;		
			f=0;
			EA=0;
			break;
		}
		else f=0;		
	}
    XBYTE[0xf800]=0; 
} 

void inputd(void)
{ Uchar i,n=0x02;
  LcdReset();
  ShowString(0,str5);
  Delay400Ms();
  for(i=0;i<10;i++)
    { 
      EA=1;
      keyscan();
      Delay400Ms();
      Delay400Ms();
      a[i]=k;
      ShowChar(n++,c[k]);
    }
  ShowString(1,str6);
  n=0x12;
  for(i=0;i<10;i++)
    { 
      EA=1;
      keyscan();
      Delay400Ms();
      Delay400Ms();
      b[i]=k;
      ShowChar(n++,c[k]);
    }
  _nop_();
}

void move(void)
{  Uchar j1,j2,j3,j4,i5,j5=0,i=0,j=0; 
   Uchar k1,k2;
   int n1,n2;
   float x,y;
   j1=0x01;j2=0x08;j3=0x01;j4=0x08;
   m[0]=41.2;
   n[0]=48.8;
   for(i5=0;i5<5;i5++)
     {  k1=j5;
        x=a[j5]*10+a[++j5];
        j5=k1;
        y=b[k1]*10+b[++k1];
       // jisuan2(x,y);
	    m[1]=sqrt((55-y)*(55-y)+x*x);
        n[1]=sqrt((55-y)*(55-y)+(38-x)*(38-x));
            n1=(m[1]-m[0])*8.3;
            n2=(n[1]-n[0])*8.3;
            if(n1>=0)k1=1; //放线
            else {k1=0;n1=(-1)*n1;}     //收线
            if(n2>=0)k2=1; //放线
            else {k2=0;n2=(-1)*n2;}     //收线
            while(i<=n1||j<=n2)
              {  if(i<=n1){
       	              if(k1){ 
       	     	              P1=j1;Delay5Ms();j1=j1<<1;if((j1^0x10)==0)j1=0x01;
       	     	             }
       	              else  {P1=j2;Delay5Ms();j2=j2>>1;if((j2^0x00)==0)j2=0x08;}
   	                      }  
   	             if(j<=n2){ 
   	                        if(k2){ 
   	        	                         P2=j3;Delay5Ms();j3=j3<<1;if((j3^0x10)==0)j3=0x01;
   	        	                   }
   	                        else {   
   	        	                       P2=j4;Delay5Ms();j4=j4>>1;if((j4^0x00)==0)j4=0x08; 
   	                              }
   	                       } 
   	               i++;j++;
              }
            i=0;j=0;j5=j5+2;
         m[0]=m[1];n[0]=n[1];ShowString(0,str5);ShowString(1,str6);xianshi(x,y);Delay400Ms();
      Delay400Ms();Delay400Ms();
      Delay400Ms();
      Delay400Ms();
     }
}

void circle(void)
{ float x,y,n1,n2;
  Uchar k1,k2,i=0,j=0,i1=0;
  Uchar j1=0x01,j2=0x08,j3=0x01,j4=0x08;
  x=10;y=15;
  xianshi(x,y);
  m[0]=sqrt((55-y)*(55-y)+x*x);
  n[0]=sqrt((55-y)*(55-y)+(38-x)*(38-x));
  while(x<=19.5999)
   { x=x+0.2;
     jisuan(x);
     n1=(m[1]-m[0])*7.1;
     n2=(n[1]-n[0])*7.1;
     if(n1>=0)k1=1; //放线
     else {k1=0;n1=(-1)*n1;}     //收线
     if(n2>=0)k2=1; //放线
     else {k2=0;n2=(-1)*n2;}     //收线
     while(i<=n1||j<=n2)
       {  if(i<=n1){
       	     if(k1){ 
       	     	      P1=j1;Delay400Ms();j1=j1<<1;if((j1^0x10)==0)j1=0x01;
       	     	   }
       	     else {_nop_();_nop_();_nop_();P1=j2;Delay400Ms();j2=j2>>1;if((j2^0x00)==0)j2=0x08;}
   	         }  
   	      if(j<=n2){ 
   	        if(k2){ for(i1=0;i1<1;i1++){
   	        	    P2=j3;Delay400Ms();j3=j3<<1;if((j3^0x10)==0)j3=0x01;
        	          }
   	        	  }
   	        else {   for(i1=0;i1<1;i1++){
   	        	    P2=j4;Delay400Ms();j4=j4>>1;if((j4^0x00)==0)j4=0x08;
        	          } 
   	        	 }
   	       } 
   	  i++;j++;i1=0;
       }
    m[0]=m[1];n[0]=n[1];i=0;j=0;
  }
  xianshi(x,y);
  i=0;j=0;j1=0x01;j2=0x08;j3=0x01;j4=0x08;
  while(x>=9.7)
    { x=x-0.3;
      jisuan1(x);
      if(x==9.700013)break;
      n1=(m[1]-m[0])*7.1;
      n2=(n[1]-n[0])*7.1;
      if(n1>=0)k1=1; //放线
      else {k1=0;n1=(-1)*n1;}     //收线
      if(n2>=0)k2=1; //放线
      else {k2=0;n2=(-1)*n2;}     //收线
      while(i<=n1||j<=n2)
       { 
       	 if(i<=n1){
       	     if(k1){ P1=j1;Delay400Ms();j1=j1<<1;if((j1^0x10)==0)j1=0x01;}
       	     else {P1=j2;Delay400Ms();j2=j2>>1;if((j2^0x00)==0)j2=0x08;}
       	   }
   	  if(j<=n2){ 
   	    if(k2){ P2=j3;Delay400Ms();j3=j3<<1;if((j3^0x10)==0)j3=0x01;}
   	     else {P2=j4;Delay400Ms();j4=j4>>1;if((j4^0x00)==0)j4=0x08;}
   	         } 
   	  i++;j++;
       }
      m[0]=m[1];n[0]=n[1];i=0;j=0;
    }
  xianshi(x,y);
  _nop_();
}

void jisuan(float a)
{  float y;
   y=sqrt(25-(a-15)*(a-15))+15;
   m[1]=sqrt((55-y)*(55-y)+a*a);
   n[1]=sqrt((55-y)*(55-y)+(38-a)*(38-a));
   xianshi(a,y);
}

void jisuan1(float a1)
{  float y;
   y=15-sqrt(25-(a1-15)*(a1-15));
   m[1]=sqrt((55-y)*(55-y)+a1*a1);
   n[1]=sqrt((55-y)*(55-y)+(38-a1)*(38-a1));
   xianshi(a1,y);
}

void xianshi(float dataw,float dataw1)
{ Uchar n1=0x02;
  float d,n=1000000;
  Uint i;
  Uchar j;
  d=dataw*100000;
  for(j=0;j<6;j++)
    { i=(Uint)(d/n);
      d=d-i*n;
      n/=10;
      if(j==2){ShowChar(0x04,'.');n1++;}
      ShowChar(n1,c[i]);
      n1++;
    }
  n=1000000;  
  n1=0x12;
  d=dataw1*100000;
  for(j=0;j<6;j++)
    { i=(Uint)(d/n);
      d=d-i*n;
      n/=10;
      if(j==2){ShowChar(0x14,'.');n1++;}
      ShowChar(n1,c[i]);
      n1++;
    }  
}

/*void jisuan2(float data1,float data2)
{
   m[1]=sqrt((55-data2)*(55-data2)+data1*data1);
   n[1]=sqrt((55-data2)*(55-data2)+(38-data1)*(38-data1));
}*/

void Delay400Ms(void)
{   Uchar i=5;
	Uint j;
	while(i--)
	{
		//j=7269; //400Ms
        j=1817;   //100Ms
		while(j--);
	}
}

void Delay5Ms(void)
{
	Uint i = 5552;
	while(i--);
}

void LcdReset( void ) {
        LcdWriteCommand( 0x38, 0);			// 显示模式设置(不检测忙信号)
		Delay5Ms();
	LcdWriteCommand( 0x38, 0);			// 共三次
		Delay5Ms();
	LcdWriteCommand( 0x38, 0);
		Delay5Ms();

	LcdWriteCommand( 0x38, 1);			// 显示模式设置(以后均检测忙信号 参数--"1")
    LcdWriteCommand( 0x08, 1);			// 显示关闭
   	LcdWriteCommand( 0x01, 1);			// 显示清屏
	LcdWriteCommand( 0x06, 1);			// 显示光标移动设置
	LcdWriteCommand( 0x0c, 1);			// 显示开及光标设置
}

void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
       
    W = 1;R = 1;
	if (AttribC) 
	{
		P0=0xff;
		while( XBYTE[Lcd1602StatusPort] & Busy );		// 检测忙信号?
	}
	XBYTE[Lcd1602CmdPort] = CMD;
}

void LcdWriteData( Uchar dataW ) {
        
        W = 1;R = 1;
	while( XBYTE[Lcd1602StatusPort] & Busy );					// 检测忙信号

       	XBYTE[Lcd1602WdataPort] = dataW;
}

void ShowString(Uchar line,char *ptr)
{ Uchar l,i;
  l=line<<4;
  for(i=0;i<16;i++)
    ShowChar(l++,*(ptr+i));
} 

void ShowChar(Uchar pos,Uchar c)
{ Uchar p;
  if(pos>=0x10)
    p=pos+0xb0;
  else 
    p=pos+0x80;
  LcdWriteCommand(p,1);
  LcdWriteData(c);
}

⌨️ 快捷键说明

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