📄 步进电机画圆和走定点.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 + -