完善二
源程序:
/*-----------------------------------------------------------------------------
工作板源程序
-----------------------------------------------------------------------------*/
#include <REG52.H> //各個(gè)特殊功能寄存器地址定義
#include <intrins.h>
/*-----------------------------------------------------------------------------
用于串行輸入SPI的數(shù)據(jù)接收口
-----------------------------------------------------------------------------*/
volatile unsigned int data zd0; //功能1的時(shí)候調(diào)整蜂鳴器時(shí)間
volatile unsigned char data SPI_DH,SPI_DL;//串行口高位和低位高位用于識別功能指令和地址指令,低位用于數(shù)據(jù)傳輸
volatile unsigned char data SPI_ZL,SPI_DZ,SPI_SJ;
volatileunsigned int data m,z;
/*-----------------------------------------------------------------------------
三變量用于默認(rèn)的速度,寬度,高度。
-----------------------------------------------------------------------------*/
volatile unsigned char data b=100; //單位是rpm/min
volatile unsigned char data BBZ;
volatile unsigned char data c=1; // 寬度單位是毫米
volatile unsigned char data CBZ;
volatile unsigned char data d=4; // 高度單位是毫米
volatile unsigned char data DBZ;
/*-----------------------------------------------------------------------------
三變量用于速度,寬度,高度的翻譯中間變量
-----------------------------------------------------------------------------*/
unsigned char data e;// 用于速度
unsigned char data f; //用于寬度
unsigned char data g;//用高度
/*-------------------------------------------------------------
P0引腳定義: P0口有5種定義,每種定義根據(jù)P2口給定功能不同而不同。
每種功能不能同時(shí)實(shí)現(xiàn),否則會出現(xiàn)混亂。
-------------------------------------------------------------*/
sbitCLK1=P0^0; //步進(jìn)電機(jī)1脈沖
sbit CW1 =P0^1; //步進(jìn)電機(jī)1方向
sbitEW1=P0^2; //步進(jìn)電機(jī)1使能
sbitCLK2 =P0^3; //步進(jìn)電機(jī)2脈沖
sbitCW2 =P0^4; //步進(jìn)電機(jī)2方向
sbitEW2 =P0^5; //步進(jìn)電機(jī)2使能
sbitEN1 =P0^6; //角度電機(jī)使能
sbitIN1 =P0^7; //角度電機(jī)脈沖
/*-------------------------------------------------------------
P1引腳定義 :P1口為限位檢測口。
-------------------------------------------------------------*/
sbit LED_SD =P1^0;
sbit LED_KD =P1^2;
sbit LED_GD=P1^3;
sbit LED_YX=P1^4;
sbit LED_FW=P1^5;
sbit CLK =P1^6; //角度限位右 。當(dāng)高電平表示有限位
sbitDATAS =P1^7; //角度電機(jī)輸入2
/*-------------------------------------------------------------
P2引腳定義 :
-------------------------------------------------------------*/
sbit VSW = P2^0;
sbit FXXWZ = P2^1;
sbitFXXWY=P2^2; // 驅(qū)動(dòng)控制,=0該為Q=D.=1時(shí)為高阻態(tài)。
sbitZXWX=P2^3; //鍵盤控制,該位=0時(shí)為跟隨變化Q=D,=1時(shí)為高阻態(tài)。
sbitZXWS=P2^4; //指示燈LED控制該位=0時(shí)為保持,=1時(shí)為數(shù)據(jù)Q=D
sbit XXWZ=P2^5; //數(shù)碼管個(gè)位控制該位=0時(shí)為保持,=1時(shí)為數(shù)據(jù)Q=D
sbit XXWY=P2^6; //數(shù)碼管十位控制該位=0時(shí)為保持,=1時(shí)為數(shù)據(jù)Q=D
sbitIN2 =P2^7; //角度電機(jī)脈沖
/*-------------------------------------------------------------
P3引腳定義:P3口為主軸電機(jī)調(diào)速端口和
主軸編碼方向編碼,還有鍵盤中斷。
-------------------------------------------------------------*/
sbit STB_IO =P3^2 ;
sbit JT =P3^3 ;
sbitZZZD=P3^4;
sbitFXMC=P3^5;
sbitPOWSW=P3^7;
/*-----------------------------------------------------------------------------
函數(shù)功能 : MS 毫秒 延遲函數(shù)
-----------------------------------------------------------------------------*/
void Delay(unsigned int i)
{
unsigned int j;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
unsigned char code table[]=
{
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,
0x71,0x00,0x40,0x00
};
/*-----------------------------------------------------------------------------
函數(shù)功能 : us 微秒 延遲函數(shù)
-----------------------------------------------------------------------------*/
void MyDelay(unsigned int time)
{
while(time--)
{
_nop_();
}
}
/*-----------------------------------------------------------------------------
函數(shù)功能 : us 微秒 精確US延遲 12MHZ延遲6us
-----------------------------------------------------------------------------*/
void MyDelay2()
{
_nop_();
}
/*-----------------------------------------------------------------------------
函數(shù)功能 :X軸電機(jī)驅(qū)動(dòng)脈沖
-----------------------------------------------------------------------------*/
void XZDJQD()
{
CLK1=0;
MyDelay2();
CLK1=1;
Delay(1);
}
/*-----------------------------------------------------------------------------
函數(shù)功能 :Z軸電機(jī)驅(qū)動(dòng)脈沖
-----------------------------------------------------------------------------*/
void ZZDJQD()
{
CLK2=0;
MyDelay2();
CLK2=1;
Delay(1);
}
/*-----------------------------------------------------------------------------
函數(shù)功能 :機(jī)構(gòu)復(fù)位程序 復(fù)位x軸z軸以及角度軸。
-----------------------------------------------------------------------------*/
void jgfw ( )
{
unsigned int g=0; //中點(diǎn)計(jì)數(shù)中間變量
EX0=0;//關(guān)閉鍵盤中斷等待復(fù)位完成。
EW1=0;
CW1=1;
while(XXWZ==0)
{
CW1=1;
XZDJQD();
}
CW1=0;
while (XXWY==0)
{
CW1=0;
XZDJQD();
g=g+1;
}
g=g/2;
CW1=1;
while (g>0)
{
CW1=1;
XZDJQD();
g=g-1;
}
P2=0XF0;
EX0=1;
}
/*-----------------------------------------------------------------------------
函數(shù)功能 :運(yùn)行狀態(tài)中X軸和Z軸角度軸的控制。
-----------------------------------------------------------------------------*/
void YXQD ( )
{
f=c*20;
while(f>0)
{
XZDJQD();
f=f-1;
if(XXWZ==1)CW1=0;
if(XXWY==1)CW1=1;
if(XXWZ==1||XXWY==1)
{
g=d*5;
while(g>0)
{
ZZDJQD();
g=g-1;
}
}
}
}
/*-----------------------------------------------------------------------------
函數(shù)功能 :運(yùn)行狀態(tài)電機(jī)參數(shù)送出(串行方式)
-----------------------------------------------------------------------------*/
void Control(unsigned char cmd)
{
unsigned char i;
STB_IO = 0;//拉低片選
Delay(20);
for(i=0;i<8;i++)
{
CLK = 0;
//這里大約是100us
if(cmd & 0x80)DATAS = 1;//把datas的參數(shù)與16進(jìn)制數(shù)8000進(jìn)行位與運(yùn)算把結(jié)果給datas(如果有數(shù)則DAT=1
else DATAS = 0;//否則DAT=0
MyDelay(200) ;
CLK = 1;
MyDelay(200) ;//這里大約是100us
cmd <<= 1;
}
DATAS = 1;
STB_IO = 1;
CLK = 1;
}
/*-----------------------------------------------------------------------------
函數(shù)功能 : 主函數(shù)
-----------------------------------------------------------------------------*/
void main(void)
{
unsigned char YSJS=5 ;
EX0=1;//開中斷0
EA=1; //開總中斷
IT0=1; //設(shè)定中斷0方式為下降沿觸發(fā)。
while (1)
{
if (SPI_ZL==0) {POWSW=1;LED_SD=1;LED_KD=1;LED_GD=1;LED_YX=1;LED_FW=1;} // 關(guān)閉電源狀態(tài)
while(SPI_ZL==0){; }
if (SPI_ZL==1){VSW=0; POWSW=0;} //啟動(dòng)電源的狀態(tài)。
while(SPI_ZL==1) {LED_SD=~LED_SD;LED_KD=~LED_KD;LED_GD=~LED_GD;LED_YX=~LED_YX;LED_FW=~LED_FW;Delay(300); }
if (SPI_ZL==2){ LED_SD=1;LED_KD=1;LED_GD=1;LED_YX=1;LED_FW=0; } //復(fù)位狀態(tài)
while(SPI_ZL==2){;}
if (SPI_ZL==3){ LED_SD=0;LED_KD=1;LED_GD=1;LED_YX=0;LED_FW=1; VSW=1; POWSW=0; } //運(yùn)行狀態(tài)
while(SPI_ZL==3)
{
if(BBZ!=b)
{
LED_SD=1;
LED_KD=1;
LED_GD=1;
while(--YSJS){LED_SD=~LED_SD;Delay(100);}
LED_SD=0 ;
BBZ=b;
YSJS=5 ;
}
if(CBZ!=c)
{
LED_SD=1;
LED_KD=1;
LED_GD=1;
while(--YSJS){LED_KD=~LED_KD;Delay(100);}
LED_KD=0;
CBZ=c;
YSJS=5 ;
}
if(DBZ!=d)
{
LED_SD=1;
LED_KD=1;
LED_GD=1;
while(--YSJS){LED_GD=~LED_GD;Delay(100);}
LED_GD=0;
DBZ=d;
YSJS=5 ;
}
}
if (SPI_ZL==4) //暫停狀態(tài)
{
LED_SD=0;LED_KD=1;LED_GD=1;LED_YX=0;LED_FW=1; POWSW=1;
}
while (SPI_ZL==4) //參數(shù)調(diào)整
{
if(BBZ!=b)
{
LED_SD=1;
LED_KD=1;
LED_GD=1;
while(--YSJS){LED_SD=~LED_SD;Delay(100);}
LED_SD=0 ;
BBZ=b;
YSJS=5 ;
}
if(CBZ!=c)
{
LED_SD=1;
LED_KD=1;
LED_GD=1;
while(--YSJS){LED_KD=~LED_KD;Delay(100);}
LED_KD=0;
CBZ=c;
YSJS=5 ;
}
if(DBZ!=d)
{
LED_SD=1;
LED_KD=1;
LED_GD=1;
while(--YSJS){LED_GD=~LED_GD;Delay(100);}
LED_GD=0;
DBZ=d;
YSJS=5 ;
}
LED_YX=~LED_YX;
Delay(100);
}
}
}
/*-----------------------------------------------------------------------------
函數(shù)功能 : 串行中斷接收
-----------------------------------------------------------------------------*/
void SPI_IO(void) interrupt 0
{
IE0=0;
m=0;
if(STB_IO==0)
{
for(m=0;m<16;m++)
{
while(CLK==1){;}
if(CLK==0)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(DATAS==1){ z|=1;}
else{ z|=0;}
}
zd0=z;
z=z<<1;
while(CLK==0){;}
}
SPI_DL=zd0;
zd0>>=8;
SPI_DH=zd0;
if(SPI_DH==0)
{
SPI_ZL = SPI_DL;
}
if(SPI_DH==0xf1)
{
c = SPI_DL;
}
if(SPI_DH==0xf0)
{
b = SPI_DL;
}
if(SPI_DH==0xf2)
{
d = SPI_DL;
}
}
IE0=0;
}