📄 step.c
字号:
#include "Step.h"
#include"viic_c51.h"
#include"zlg7290.h"
//--------------------------------变量定义-------------------------------------------
/*sbit KEY_INT=P3^2; //将p3.2外部中断0
unsigned int FLAG=0; //数码管闪烁标志位
unsigned int FLAG1=0; //显示切换标志位 1---速度,0---坐标
unsigned int FLAG2=0; //电机正反转切换标志位 1---正转,0---反转
unsigned char KEY; //键值
unsigned int circle=1; //坐标单位1的步进圈数
int Fm=0; //加工点偏差
unsigned int Xe=0; //终点横坐标
unsigned int Ye=0; //终点纵坐标
unsigned int Nxy=0; //总步数
unsigned int Xi=0; //实时横坐标
unsigned int Yi=0; //实时纵坐标
unsigned int SpeedX=0; //X电机速度(步/秒)
unsigned int SpeedY=0; //Y电机速度(步/秒)
//unsigned int time0_tmp=0xe880; //2ms定时显示初值
//unsigned int time1_tmp=0; //速度控制定时初值
//unsigned int fosc=12; //单片机晶振(MHz)
unsigned char Speed[8]={0,0,0,0,0,0,0,0}; //两个4位数码管数值(速度)
unsigned char Place[8]={0,0,0,0,0,0,0,0}; //两个4位数码管数值(坐标)
unsigned char StepX1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//X步进电机正转节拍
unsigned char StepY1[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//Y步进电机反转节拍
unsigned char StepX2[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//X步进电机正转节拍
unsigned char StepY2[]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};//Y步进电机反转节拍
//unsigned char Led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89,0x86};//数码管0—9,H,E
//unsigned char Led_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x79};//数码管0—9,A,E
//--------------------------------函数声明-------------------------------------------
//void System_init(void); //设定INT0的工作方式,供主程序调用
void delay(unsigned int); //延时程序
void delay10ms(unsigned int);
//void INT0_int(void); //外部中断0处理程序
//void time0_int(void); //定时器0中断
//void time1_int(void); //定时器1定时
//void Key_Scaning(void); //扫描键盘
//void dispxy(unsigned int,unsigned int,unsigned int);//数码管显示子程序
//void display(void); //数码管显示
void Key_Control(void); //键盘控制
void Go_line(void); //直线差补算法---前进
void Back_line(void); //直线差补算法---回零 */
//-----------------------------------------------------------------------------------
main()
{
while(1)
{
Key_Control(); //键盘控制
}
}
//-----------------------------------------------------------------------------------
void delay(unsigned int i)
{
for(;i>0;i--);
}
void delay10ms(unsigned int i) //延时程序????10ms有问题?????
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<1000;j++);
}
//------------------------------------------------------------------------------------
// 函数名称:Key_Control()
// 函数功能:键盘控制
//------------------------------------------------------------------------------------
void Key_Control(void)
{
unsigned char i;
while(1)
{
if(KEY_INT==0)
{
KEY=ZLG7290_GetKey();
delay(200);
if(KEY==1)
{
KEY=0; //清键值
for(i=0;i<8;i++)
{
Speed[i]=0;
}
for(i=0;i<8;i++)
{
Place[i]=0;
}
ZLG7290_SendBuf(Place,8);
delay10ms(1);
//Led1[0]=0;Led1[1]=0;Led1[2]=0;Led1[3]=0;Led1[4]=0;Led1[5]=0;Led1[6]=0;Led1[7]=0;
// Led2[0]=0;Led2[1]=0;Led2[2]=0;Led2[3]=0;Led2[4]=0;Led2[5]=0;Led2[6]=0;Led2[7]=0;
Go_line(); //前进
}
else if(KEY==2)
{
KEY=0; //清键值
FLAG1=0; //显示切换标志位0(显示坐标)
Back_line(); //回零
}
else if(KEY==3)
{
//FLAG1=1; //显示切换标志位1(显示速度)
Speed[0]=SpeedX%10;Speed[1]=(SpeedX%100)/10;Speed[2]=SpeedX/100;Speed[3]=10;//显示当前速度
Speed[4]=SpeedY%10;Speed[5]=(SpeedY%100)/10;Speed[6]=SpeedY/100;Speed[7]=10;
ZLG7290_SendBuf(Speed,8);
delay10ms(1);
while(1)
{
KEY=0; //清键值
FLAG=1; //数码管闪烁标志位1(第1位闪烁)
if(KEY==5)
{
KEY=0; //清键值
Speed[0]+=1;
while(Speed[0]>9)
Speed[0]=0;
}
else if(KEY==3)
break;
}
while(1)
{
KEY=0; //清键值
FLAG=2; //数码管闪烁标志位2(第2位闪烁)
if(KEY==5)
{
KEY=0; //清键值
Speed[1]+=1;
while(Speed[1]>9)
Speed[1]=0;
}
else if(KEY==3)
break;
}
while(1)
{
KEY=0; //清键值
FLAG=3; //数码管闪烁标志位3(第3位闪烁)
if(KEY==5)
{
KEY=0; //清键值
Speed[2]+=1;
while(Speed[2]>9)
Speed[2]=0;
}
else if(KEY==3)
break;
}
while(1)
{
KEY=0; //清键值
FLAG=5; //数码管闪烁标志位5(第5位闪烁)
if(KEY==5)
{
KEY=0; //清键值
Speed[4]+=1;
while(Speed[4]>9)
Speed[4]=0;
}
else if(KEY==3)
break;
}
while(1)
{
KEY=0; //清键值
FLAG=6; //数码管闪烁标志位6(第6位闪烁)
if(KEY==5)
{
KEY=0; //清键值
Speed[5]+=1;
while(Speed[5]>9)
Speed[5]=0;
}
else if(KEY==3)
break;
}
while(1)
{
KEY=0; //清键值
FLAG=7; //数码管闪烁标志位7(第7位闪烁)
if(KEY==5)
{
KEY=0; //清键值
Speed[6]+=1;
while(Speed[6]>9)
Speed[6]=0;
}
else if(KEY==3)
break;
}
KEY=0; //清键值
// FLAG=0; //数码管闪烁标志位0(无闪烁)
SpeedX=Speed[0]+Speed[1]*10+Speed[2]*100;//计算并存储所设速度
SpeedY=Speed[4]+Speed[5]*10+Speed[6]*100;
}
else if(KEY==4)
{
Place[0]=Xe%10;Place[1]=Xe/10;Place[2]=11;Place[3]=11;//显示当前坐标
Place[4]=Ye%10;Place[5]=Ye/10;Place[6]=11;Place[7]=11;
ZLG7290_SendBuf(Place,8);
delay10ms(1);
while(1)
{
KEY=0; //清键值
FLAG=1; //数码管闪烁标志位1(第1位闪烁)
if(KEY==6)
{
KEY=0; //清键值
Place[0]+=1;
while(Place[0]>9)
Place[0]=0;
}
else if(KEY==4)
break;
}
while(1)
{
KEY=0; //清键值
FLAG=2; //数码管闪烁标志位2(第2位闪烁)
if(KEY==6)
{
KEY=0; //清键值
Place[1]+=1;
while(Place[1]>9)
Place[1]=0;
}
else if(KEY==4)
break;
}
while(1)
{
KEY=0; //清键值
FLAG=5; //数码管闪烁标志位5(第5位闪烁)
if(KEY==6)
{
KEY=0; //清键值
Place[4]+=1;
while(Place[4]>9)
Place[4]=0;
}
else if(KEY==4)
break;
}
while(1)
{
KEY=0; //清键值
FLAG=6; //数码管闪烁标志位6(第6位闪烁)
if(KEY==6)
{
KEY=0; //清键值
Place[5]+=1;
while(Place[5]>9)
Place[5]=0;
}
else if(KEY==4)
break;
}
KEY=0; //清键值
FLAG=0; //数码管闪烁标志位0(无闪烁)
Xe=Place[1]*10+Place[0];//Led2[3]*1000+Led2[2]*100+Led2[1]*10+Led2[0];//计算并存储所设坐标
Ye=Place[5]*10+Place[4];//Led2[7]*1000+Led2[6]*100+Led2[5]*10+Led2[4];
}
while(KEY==7) //电机X单独运行
{
Speed[4]=0;Speed[5]=0;Speed[6]=0;Speed[7]=0;
Speed[0]=SpeedX%10;Speed[1]=(SpeedX%100)/10;Speed[2]=SpeedX/100;Speed[3]=10;//显示X电机速度
ZLG7290_SendBuf(Speed,8);
delay10ms(1);
for(i=0;i<8;i++)
{
P1=StepX1[i];
// time1_int(Tx);
delay10ms(6000/SpeedX);
}
}
while(KEY==8) //电机Y单独运行
{
Speed[4]=0;Speed[5]=0;Speed[6]=0;Speed[7]=0;
Speed[0]=SpeedY%10;Speed[1]=(SpeedY%100)/10;Speed[2]=SpeedY/100;Speed[3]=10;//显示X电机速度
ZLG7290_SendBuf(Speed,8);
delay10ms(1);
for(i=0;i<8;i++)
{
P1=StepY1[i];
// time1_int(Tx);
delay10ms(6000/SpeedY);
}
}
}
}
}
//------------------------------------------------------------------------------------
// 函数名称:Go_line()
// 函数功能:直线差补算法---前进
//------------------------------------------------------------------------------------
void Go_line(void)
{
unsigned int i,j;
// time0_tmp=0x4000; //改变定时显示初值
Nxy=Xe+Ye; //计算总步数
if(FLAG2==1) //电机正反转切换标志位1(让电机仅正转1次)
return;
while(Nxy!=0) //差补算法
{
if(Fm>=0)
{
for(j=0;j<circle;j++)
{
for(i=0;i<8;i++)
{
P1=StepX1[i];
delay10ms(6000/SpeedX);
// time1_int(Tx);
}
}
Xi+=1;
Fm-=Ye;
}
else
{
for(j=0;j<circle;j++)
{
for(i=0;i<8;i++)
{
P1=StepY1[i];
delay10ms(6000/SpeedY);
// time1_int(Ty);
}
}
Yi+=1;
Fm+=Xe;
}
Nxy--;
FLAG2=1; //电机正反转切换标志位1(正转)
Place[3]=Xi/1000;Place[2]=(Xi%1000)/100;Place[1]=(Xi%100)/10;Place[0]=Xi%10;//显示当前坐标
Place[7]=Yi/1000;Place[6]=(Yi%1000)/100;Place[5]=(Yi%100)/10;Place[4]=Yi%10;
ZLG7290_SendBuf(Place,8);
delay10ms(1);
}
}
//------------------------------------------------------------------------------------
// 函数名称:Back_line()
// 函数功能:直线差补算法---回零
//------------------------------------------------------------------------------------
void Back_line(void)
{
unsigned int i,j;
// time0_tmp=0x4000; //改变定时显示初值
Nxy=Xe+Ye; //计算总步数
Fm=0; //加工点偏差置0
if(FLAG2==0) //电机正反转切换标志位0(让电机仅反转1次)
return;
while(Nxy!=0)
{
if(Fm>=0)
{
for(j=0;j<circle;j++)
{
for(i=0;i<8;i++)
{
P1=StepX2[i];
// time1_int(Tx);
delay10ms(6000/SpeedX);
}
}
Xi-=1;
Fm-=Ye;
}
else
{
for(j=0;j<circle;j++)
{
for(i=0;i<8;i++)
{
P1=StepY2[i];
// time1_int(Ty);
delay10ms(6000/SpeedY);
}
}
Yi-=1;
Fm+=Xe;
}
Nxy--;
FLAG2=0; //电机正反转切换标志位0(反转)
Place[3]=Xi/1000;Place[2]=(Xi%1000)/100;Place[1]=(Xi%100)/10;Place[0]=Xi%10;//显示当前坐标
Place[7]=Yi/1000;Place[6]=(Yi%1000)/100;Place[5]=(Yi%100)/10;Place[4]=Yi%10;
ZLG7290_SendBuf(Place,8);
delay10ms(1);
}
}
//------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -