電路原理圖如下:
直線插補.PNG (62.81 KB, 下載次數: 47)
下載附件
2019-3-31 11:38 上傳
直線插補程序
//****************************************
//假設步進電機的步距角=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);
}
}
}
|