电路原理图如下:
直线插补程序
//****************************************
//假设步进电机的步距角=90
//假设滚珠丝杠与步进电机直联,导程=4mm
//****************************************
#include<reg51.h>
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^5; //寄存器选择位
sbit RW=P2^6; //读写选择位
sbit E=P2^7; //使能信号位
sbit M1=P1^0;
sbit M2=P1^1;
sbit M3=P1^2;
sbit M4=P1^3;
sbit M5=P1^4;
sbit M6=P1^5;
sbit M7=P1^6;
sbit M8=P1^7;
char b=-1;
char by=-1;
char F=0; //偏差函数
char x=13; //X轴的终点坐标
char y=16; //Y轴的终点坐标
uint NT=0; //总步数
uint N=0;
uchar string1[ ]={"X-Position="};
uchar string2[ ]={"Y-Position="};
//延时
void DelayMS(uint dm)
{
uchar i;
while(dm--)
{
for(i=0;i<120;i++);
}
}
void delay(uchar d)
{
uchar i,j;
for(i=d;i>0;i--);
for(j=120;j>0;j--);
}
//********************写指令
void WriteInstruction(uchar dictate)
{
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(写指令时,E为高脉冲),就是让E从0到1发生正跳变,所以应先置"0"
P0=dictate; //将数据送入P0口,即写入指令或地址
delay(1);
E=1; //E置高电平
//_nop_();
//_nop_();
//_nop_();
//_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//*********************写数据
void WriteData(uchar dat)
{
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //(写指令时,E为高脉冲, 就是让E从0到1发生正跳变,所以应先置"0"
P0=dat; //将数据送入P0口,即将数据写入液晶模块
delay(1);
E=1; //E置高电平
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//*******************初始化
void Init(void)
{
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口/111000
WriteInstruction(0x0c); //显示模式设置:显示开,无光标/1100
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移/110
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除/1
}
//偏差函数F>=0,F=F-y; F<0, F=F+x
//*******************主函数
void XAXIS(void)
{if (b<4)
{ b=b+1;
switch (b)
{
case 0:
M1=1;
DelayMS(360);
M1=0;
M2=1;
break;
case 1:
M2=1;
DelayMS(360);
M2=0;
M3=1;
break;
case 2:
M3=1;
DelayMS(360);
M3=0;
M4=1;
break;
case 3:
M4=1;
DelayMS(360);
M4=0;
M1=1;
b=-1;
break;
}
}
}
void YAXIS(void)
{if (by<4)
{ by=by+1;
switch (by)
{
case 0:
M5=1;
DelayMS(360);
M5=0;
M6=1;
break;
case 1:
M6=1;
DelayMS(360);
M6=0;
M7=1;
break;
case 2:
M7=1;
DelayMS(360);
M7=0;
M8=1;
break;
case 3:
M8=1;
DelayMS(360);
M8=0;
M5=1;
by=-1;
break;
}
}
}
void main(void)
{
uchar a;
char xx=0;
char yy=0;
NT=x+y;
Init();
while(N<NT)
{
if (F>=0)
{N=N+1;
F=F-y;
xx=xx+1;
XAXIS();
a=0;
WriteInstruction(0x80); // 设置显示位置为第一行的第1个字
while(a<11)
{
WriteData(string1[a]);
a++;
}
WriteData(xx/10%10+0x30);
WriteData(xx%10+0x30);
}
if (F<0)
{N=N+1;
F=F+x;
yy=yy+1;
YAXIS();
a=0;
WriteInstruction(0x80+0x40); // 设置显示位置为第二行的第1个字
while(a<11)
{
WriteData(string2[a]);
a++;
}
WriteData(yy/10+0x30);
WriteData(yy%10+0x30);
}
}
}
|