源程序:
/*-----------------------------------------------------------------------------
按鍵用變量定義
-----------------------------------------------------------------------------*/
volatile unsigned char idata KEY1=0;//多功能按鍵功能識別器。
volatile unsigned char idata KEY2=0;//多功能按鍵功能識別器。
volatile unsigned char idata KEYBZ2;
volatile unsigned char idata KEY3=0;//多功能按鍵功能識別器。
volatile unsigned char idata KEYBZ3;
volatile unsigned char idata KEY4=0;//多功能按鍵功能識別器。
volatile unsigned char idata KEY5=0;//多功能按鍵功能識別器。
volatile unsigned char idata KEY6=0;//多功能按鍵功能識別器。
volatile bit ZT=0;
volatile bit FWBZ;
/*-----------------------------------------------------------------------------
三變量用于默認的速度,寬度,高度。
-----------------------------------------------------------------------------*/
volatile unsigned char idata b=100;//單位是rpm/min
volatile unsigned char idata BBZ;
volatile unsigned char idata c=2; //寬度單位是毫米
volatile unsigned char idata CBZ;
volatile unsigned char idata d=1;//高度單位是毫米
volatile unsigned char idata DBZ;
/*-------------------------------------------------------------
P0引腳定義: P0口有5種定義,每種定義根據P2口給定功能不同而不同。
每種功能不能同時實現,否則會出現混亂。
-------------------------------------------------------------*/
sbitLED_SD =P0^0; //指示燈
sbit LED_KD =P0^1;
sbitLED_HD =P0^2;
sbitLED_YX =P0^3;
sbitLED_FW =P0^4; //按鍵1--第一路調光
sbit SM_BW =P0^5; //按鍵2--第一路開關
sbitSM_SW =P0^6; //按鍵3--第二路調光
sbitSM_GW =P0^7;
/*-------------------------------------------------------------
P1引腳定義 :P1口為限位檢測口。
-------------------------------------------------------------*/
sbit BUZ=P1^0;
sbit ZZMC=P1^1;//主軸沖檢測
sbitKEY_1=P1^2; // Z軸限位上 ,當高電平表示有限位
sbitKEY_2=P1^3; // Z軸限位下。當高電平表示有限位
sbitKEY_3=P1^4; //主軸中點限位。當高電平表示有限位
sbitKEY_4=P1^5; //角度限位左 。當高電平表示有限位
sbitKEY_5=P1^6; //角度限位右 。當高電平表示有限位
sbitKEY_6 =P1^7; //角度電機輸入2
sbitKEY_7 =P2^7; //角度電機輸入2
/* -------------------------------------------------------------
P3引腳定義:P3口為主軸電機調速端口和
主軸編碼方向編碼,還有鍵盤中斷。
-------------------------------------------------------------*/
sbit CLK = P3^0; //SPI通訊脈沖
sbitDATAS =P3^1; //SPI通訊數據
sbit STB_I =P3^2 ; //SPI通訊反饋
sbitZZZD =P3^4; //主軸中點檢測
sbitZDATA =P3^5; //主軸SPI通訊數據口
sbit ZCLK =P3^6;//主軸SPI通訊脈沖口
sbitZSTB=P3^7; //SPI通訊使能口
/*-----------------------------------------------------------------------------
LED數顯7段編碼,調用時只需table[NUM]即可。
-----------------------------------------------------------------------------*/
unsigned char code table[]=
{
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,
0x71,0x00,0x40,0x00
};
/*-----------------------------------------------------------------------------
函數功能 : MS 毫秒 延遲函數
-----------------------------------------------------------------------------*/
void Delay(unsigned int i)
{
unsigned int j;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
/*-----------------------------------------------------------------------------
函數功能 : us 微秒 延遲函數
-----------------------------------------------------------------------------*/
void MyDelay(unsigned int time)
{
while(time--)
{
_nop_();
}
}
/*-----------------------------------------------------------------------------
函數功能 : us 微秒 精確US延遲 12MHZ延遲6us
-----------------------------------------------------------------------------*/
void MyDelay2()
{
_nop_();
}
/*-----------------------------------------------------------------------------
函數功能 :顯示功能顯示數碼管百位十位個位顯示 工作參數
-----------------------------------------------------------------------------*/
void XSGN(unsigned char a)
{
unsigned char b,c,d;//百位、十位、個位,數顯。
EA=0;//關中斷等待全部數據送完
b=a/100;//求模運算,取A的百位到百位變量。
if(b==0)
{
P2=0xff;//百位沒有數則沒有顯示
SM_BW=1;
}
else
{
P2=~table[b];//百位有顯示則輸出參數
SM_BW=1;
_nop_();
_nop_();
}
SM_BW=0; //關閉百位數顯
c=a%100;//取余數運算,取得數為十位和個位。
d=c; //保存十位和個位數。
c=c/10; //求模運算 取十位數。
if(c==0&&b==0)
{
P2=0xff;
SM_SW=1;
}
else
{
P2=~table[c];
SM_SW=1;
_nop_();
_nop_();
}
SM_SW=0;
d=d%10; //取個位。
Delay(20);
if(d==0&&c==0&&b==0)
{
P2=0xff;
SM_GW=1;
}
else
{
P2=~table[d];
SM_GW=1;
_nop_();
_nop_();
}
SM_GW=0;
IE1=0;
IE0=0;
EA=1;//打開鍵盤中斷
}
/*-----------------------------------------------------------------------------
函數功能 :運行狀態指示LED指示燈,與送入參數。
-----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
函數功能 :SPI通訊(輸出)16BIT輸出,DH的高4位決定輸出控制指令還是參數數據。當DH高4位且低4位全0那么輸出為控制指令
當高4位全高,由低4位決定送出的數據是對應于哪一塊的數據。 具體參數介紹 Control (0,0);系統關閉中。Control (0,1);電源開啟中。
Control (0,2);系統復位中Control (0,3);系統運行中。Control (0,4);系統暫停中。 Control (0,5);系統從暫停開始運行。
送入數據示意:Control( 0xf0,b); 送入的參數是速度參數。Control( 0xf1,c); 送入的參數是寬帶參數。 Control( 0xf2,d);
送入的數據是厚度參數。
-----------------------------------------------------------------------------*/
void Control(unsigned char DH,unsigned char DL)
{
unsigned int i,cmd;
EA=0;
EX0=0;
cmd=DL;
cmd|=DH<<8;
STB_I = 0;//拉低片選
Delay(1);
for(i=0;i<16;i++)
{
CLK = 0;
//這里大約是100us
if(cmd & 0x8000)DATAS = 1;//把datas的參數與16進制數8000進行位與運算把結果給datas(如果有數則DAT=1
else DATAS = 0;//否則DAT=0
MyDelay(50) ;
CLK = 1;
MyDelay(50) ;//這里大約是100us
cmd <<= 1;
}
DATAS = 1;
STB_I = 1;
CLK = 1;
IE1=0;
IE0=0;
EA=1;
}
/*-----------------------------------------------------------------------------
函數功能 :電源開啟下屏閃爍功能
-----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
函數功能 : 數據集中處理
-----------------------------------------------------------------------------*/
void main(void)
{
BBZ=b; //b數據的判斷代碼 用于判斷速度值的改變
CBZ=c; //c數據的判斷代碼
DBZ=d;
KEYBZ2= KEY2;
SM_BW=0; //數碼管百位
SM_SW=0; //數碼管十位
SM_GW=0; //數碼管個位
BUZ=1; //蜂鳴器關斷
EX1=1; //開啟按鍵響應
EA=1; //開啟所有設備響應
IT1=1; //設定鍵盤響應為下降沿響應
IT0=1; //復位識別為下降沿識別
while(1)
{
if(KEY1==0){P2=0XFF;P0=0XFF; Control (0,0); }
while(KEY1==0){;}
if(KEY1==1) {Control( 0,1);}
while(KEY1==1)
{
SM_BW=1;
SM_SW=1;
SM_GW=1;
P2=0;
LED_SD=0;
LED_KD=0;
LED_HD=0;
LED_YX=0;
LED_FW=0;
BUZ=1;
Delay(500);
P2=0XFF;
LED_SD=1;
LED_KD=1;
LED_HD=1;
LED_YX=1;
LED_FW=1;
BUZ=0;
Delay(500);
}
if(KEY1==2){P2=0XFF;LED_SD=1;LED_KD=1;LED_HD=1;LED_YX=1;LED_FW=0;BUZ=1; Control( 0,2); IE0=0; EX0=1; }//復位狀態
while(KEY1==2){Delay(200);}
if(KEY1==3)
{
LED_FW=1;LED_YX=0;LED_SD=0; XSGN(b);
}
while(KEY1==3)
{
if (KEY1==3&&ZT==0){LED_YX=0; Control( 0,3);}
while(KEY1==3&&ZT==0)
{
if(KEYBZ2!=KEY2)
{
if(KEY2==0){ LED_SD=0;LED_KD=1;LED_HD=1;LED_YX=0;LED_FW=1; XSGN(b); }
if(KEY2==1) {LED_SD=1;LED_KD=0;LED_HD=1;LED_YX=0;LED_FW=1; XSGN(c);}
if(KEY2==2){ LED_SD=1;LED_KD=1;LED_HD=0;LED_YX=0;LED_FW=1; XSGN(d);}
KEYBZ2=KEY2;
}
if(BBZ!=b)
{
XSGN(b);
Control( 0xf0,b);
BBZ=b;
}
if(CBZ!=c)
{
XSGN(c);
Control( 0xf1,c);
CBZ=c;
}
if(DBZ!=d)
{
XSGN(d);
Control( 0xf2,d);
DBZ=d;
}
}
if(KEY1==3&&ZT==1){Control( 0,4);} //系統暫停中
while(KEY1==3&&ZT==1)
{
if(KEYBZ2!=KEY2)
{
if(KEY2==0){ LED_SD=0;LED_KD=1;LED_HD=1;LED_YX=0;LED_FW=1; XSGN(b); }
if(KEY2==1) {LED_SD=1;LED_KD=0;LED_HD=1;LED_YX=0;LED_FW=1; XSGN(c);}
if(KEY2==2){ LED_SD=1;LED_KD=1;LED_HD=0;LED_YX=0;LED_FW=1; XSGN(d);}
KEYBZ2=KEY2;
}
if(BBZ!=b)
{
XSGN(b);
Control( 0xf0,b);
BBZ=b;
}
if(CBZ!=c)
{
XSGN(c);
Control( 0xf1,c);
CBZ=c;
}
if(DBZ!=d)
{
XSGN(d);
Control( 0xf2,d);
DBZ=d;
}
LED_YX=~LED_YX;Delay(100);
}
}
}
}
/*-----------------------------------------------------------------------------
函數功能 : 復位功能入口
-----------------------------------------------------------------------------*/
void KEYYXFW() interrupt 0//復位完成入口。
{
EX1=1;
IE1=0;
}
void Keyan() interrupt 2
{
unsigned int idata i, j;
FWBZ=0;
if(KEY_1==0)
{
IT1=1;
BUZ=0;
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
BUZ=1;
KEY1++;
if(KEY1==2){ FWBZ=1;}
while(KEY1 ==4 ) {KEY1=0;ZT=0;}
while(KEY_1==0 ) { ;}
i=50;
for (i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
if(KEY_2==0&&KEY1==3)
{
BUZ=0;
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
BUZ=1;
FWBZ=0;
KEY2++;
while(KEY2==3 ){KEY2=0; }
while(KEY_2==0){ ;}
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
if(KEY_3==0&&KEY1==3)
{
BUZ=0;
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
BUZ=1;
FWBZ=0;
if(KEY2==0){b=b+10;while(b>=250)b=100; }
if(KEY2==1){c++;while(c>=6)c=1; }
if(KEY2==2){d++;while(d>=4)d=1; }
while(KEY_3==0){;}
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
if(KEY_4==0&&KEY1==3)
{
BUZ=0;
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
BUZ=1;
FWBZ=0;
if(KEY2==0){b=b-10;while(b<=100)b=240; }
if(KEY2==1){c--; while(c<1)c=5; }
if(KEY2==2){d--; while(d<1)d=3; }
while(KEY_4==0){;}
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
if(KEY_5==0&&(KEY1==2||ZT==1))//當在復位狀態和暫停狀態下Z周可以調節高。
{
IT1=0; //z軸連續可調。
BUZ=0;
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++) {;}
}
BUZ=1;
FWBZ=0;
}
if(KEY_6==0&&(KEY1==2||ZT==1))//當在復位狀態和暫停狀態下Z周可以調節低。
{
IT1=0;
BUZ=0;
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++){;}
}
BUZ=1;
FWBZ=0;
}
if(KEY_7==0&&KEY1==3)
{
IT1=1;
BUZ=0;
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
BUZ=1;
FWBZ=0;
ZT=~ZT;
while(KEY_7==0){;}
i=50;
for(i;i>0;i--)
{
for(j=0;j<125;j++) {;}
}
}
if(KEY1==2&&FWBZ==1){EX1=1;}//當狀態是復位狀態關閉鍵盤響應,等待復位完成。
else {EX1=1;}
}