#include <intrins.h>
#include <reg52.h>
//MCU: stc8f2k08s2 運動模塊:http://www.mpc000.com
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr P5 = 0xC8;
sfr SPSTAT = 0xcd;
sfr SPCTL = 0xce;
sfr SPDAT = 0xcf;
sfr IE2 = 0xaf;
sfr AUXR = 0x8e;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr P_SW2 = 0xba;
#define CKSEL (*(unsigned char volatile xdata *)0xfe00)
#define CKDIV (*(unsigned char volatile xdata *)0xfe01)
#define IRC24MCR (*(unsigned char volatile xdata *)0xfe02)
#define XOSCCR (*(unsigned char volatile xdata *)0xfe03)
#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04)
#define FOSC 16000000UL //使用外部16M晶振
#define BRT (65536 - FOSC / 115200 / 4) //定義115200波特率
sbit b1 = P5^5;
sbit led = P3^5;
sbit cs3 = P3^3;
sbit cs2 = P3^2;
sbit cs1 = P1^2;
sbit sck = P1^5;
sbit in = P1^4;
sbit out = P1^3;
#define SPI3_CSHIGH cs3=1 // CS3
#define SPI3_CSLOW cs3=0
#define SPI2_CSHIGH cs2=1 // CS2
#define SPI2_CSLOW cs2=0
#define SPI1_CSHIGH cs1=1 // CS1
#define SPI1_CSLOW cs1=0
#define SPI_SCKHIGH sck=1 //SCK
#define SPI_SCKLOW sck=0
#define SPI_OUTHIGH out=1
#define SPI_OUTLOW out=0//MOSI
#define SPI_IN in//MISO
unsigned char inbuf[50];
unsigned char b1_state=0;
void initial()
{
P1M1 = 0;
P1M0 = 0x2c; // 引腳模擬通信時,MOSI,SCK, CS 設為推挽輸出
SPI1_CSHIGH; //CS不使用時設為高
SPI2_CSHIGH;
SPI3_CSHIGH;
SPI_SCKLOW;//SCK空閑狀態一定要為低電平。
}
void init_uart()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
}
/*
串口發送一個位元組。
*/
void USART_Txbyte(unsigned char i)
{
SBUF = i;
while(TI ==0);
TI = 0;
}
/*
串口發送一串資料。
*/
void USRAT_transmit(unsigned char *fdata,unsigned char len)
{
unsigned char i;
for(i=0;i<len;i++)
{
USART_Txbyte(fdata[i]);
}
}
void delay_nus(unsigned long n)
{
unsigned long j;
while(n--)
{
j=1;
while(j--);
}
}
//延時n ms
void delay_nms(unsigned long n)
{
while(n--)
delay_nus(1000);
}
/*
函式名: SPI_SendData
功能:軟體模擬SPI通訊發送并接收一個8位位元組資料。
如需使用硬體SPI,單片機作為主機,mpc014為從機。CPHA=0,CPOL=0,高位在前,SPI資料寬度為8位。
空閑狀態下單片機SCK引腳必須為低電平。每一條指令開始發送前將CS引腳置低,整條指令發送完成后必須將CS置高。
每條指令間需有時間間隔,推薦延時1MS以上。
*/
unsigned char SPI_SendData(unsigned char outdata)
{
unsigned char RecevieData=https://bbs.csdn.net/topics/0,i;
SPI_SCKLOW;
// _nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
for(i=0;i<8;i++)
{
SPI_SCKLOW;
_nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
if(outdata&0x80)
{
SPI_OUTHIGH;
}
else
{
SPI_OUTLOW;
}
outdata<<=1;
_nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SPI_SCKHIGH; //
RecevieData <<= 1;
if(SPI_IN)
{
RecevieData |= 1;
}
_nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SPI_SCKLOW;
}
return RecevieData;
}
/*
函式名: enabled_cs
功能:mpc013,mpc014串口SPI運動控制模塊使能對應芯片模塊的CS腳
引數:
cardno 卡號
用單片機不同引腳去控制不同芯片的CS腳,以便多個芯片模塊關聯使用。
*/
void enabled_cs(unsigned char cardno)
{
if(cardno==1)
{
SPI1_CSLOW;
}
if(cardno==2)
{
SPI2_CSLOW;
}
if(cardno==3)
{
SPI3_CSLOW;
}
}
/*
函式名: disabled_cs
功能:mpc013,mpc014串口SPI運動控制模塊禁止對應芯片模塊的CS腳
引數:
cardno 卡號
用單片機不同引腳去控制不同芯片的CS腳,以便多個芯片關聯使用。
*/
void disabled_cs(unsigned char cardno)
{
if(cardno==1)
{
SPI1_CSHIGH;
}
if(cardno==2)
{
SPI2_CSHIGH;
}
if(cardno==3)
{
SPI3_CSHIGH;
}
}
/*
函式名: set_speed
功能:mpc013,mpc014串口SPI運動控制模塊設定軸速度
引數:
cardno 卡號
acc 加減速:值*倍率(Hz/s2)
speed 運行頻率為:值*倍率(Hz)
range 倍率(1-100)
*/
void set_inp_speed(unsigned char cardno ,unsigned int acc ,unsigned int speed ,unsigned char range)
{
unsigned char OutByte[25];
OutByte[0] = 1;
OutByte[1] = acc >>8;
OutByte[2] = acc ;
OutByte[3] = speed >>8;
OutByte[4] = speed ;
OutByte[5] = range;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
SPI_SendData(OutByte[2]);
SPI_SendData(OutByte[3]);
SPI_SendData(OutByte[4]);
SPI_SendData(OutByte[5]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函式名: pmove
功能:mpc013模塊單軸運行 ,僅獨立軸可用。
引數:
cardno 卡號
axis 軸號(1,2,3)
pulse 輸出的脈沖數 >0:正方向移動 <0:負方向移動 范圍(-268435455~+268435455)
mode 0:絕對位移 1:相對位移
*/
void pmove(unsigned char cardno ,unsigned char axis,long pulse , unsigned char mode)
{
unsigned char OutByte[25];
OutByte[0] = 2 ;
OutByte[1] = axis;
OutByte[2] = pulse >>24;
OutByte[3] = pulse >>16;
OutByte[4] = pulse >>8;
OutByte[5] = pulse ;
OutByte[6] = mode ;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
SPI_SendData(OutByte[2]);
SPI_SendData(OutByte[3]);
SPI_SendData(OutByte[4]);
SPI_SendData(OutByte[5]);
SPI_SendData(OutByte[6]);
disabled_cs(cardno);
delay_nms(1) ;
}
/*
函式名: set_command_pos
功能: mpc013,mpc014串口SPI運動控制模塊設定軸邏輯位置
引數:
cardno 卡號
axis 軸號(1,2,3,4)
pulse 位置脈沖數,范圍(-268435455~+268435455)
*/
void set_command_pos(unsigned char cardno ,unsigned char axis, long value )
{
unsigned char OutByte[25];
OutByte[0] = 0x12 ;
OutByte[1] = axis ;
OutByte[2] = value >>24;
OutByte[3] = value >>16;
OutByte[4] = value >>8;
OutByte[5] = value ;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
SPI_SendData(OutByte[2]);
SPI_SendData(OutByte[3]);
SPI_SendData(OutByte[4]);
SPI_SendData(OutByte[5]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函式名: sudden_stop
功能: mpc013,mpc014串口SPI運動控制模塊軸立即停止
引數:
cardno 卡號
axis 停止的軸號(1,2,3,6) 1,2,3:獨立軸1-3軸停 6,插補模塊所有軸停止。
*/
void sudden_stop(unsigned char cardno ,unsigned char axis)
{
unsigned char OutByte[25];
OutByte[0] = 0x17 ;
OutByte[1] = axis ;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函式名: set_special
功能:mpc014串口SPI運動控制模塊設定特別功能
引數:
cardno 卡號
value
0xfb 清除快取
0xfc 快取插補運動暫停
0xfd 取消快取插補暫停
*/
void set_special(unsigned char cardno,unsigned char value)
{
unsigned char OutByte[25];
OutByte[0] = 0xFA ;
OutByte[1] = value;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函式名: get_inp_state
功能: mpc013,mpc014串口SPI運動控制模塊獲取軸狀態,限位狀態,快取剩余量,各軸邏輯位置。
引數:
cardno 卡號
amount 獲取位元組數量。 設為20將取全部資料。
inbuf[] 讀取的資料存放的陣列
*/
void get_inp_state( unsigned char cardno, unsigned char amount,unsigned char inbuf[])
{
unsigned char OutByte[25];
char i;
enabled_cs(cardno);
for(i=0;i<amount;i++)
{
inbuf[i]=SPI_SendData(0);
}
disabled_cs(cardno);
delay_nms(1);
}
/*
函式名: inp_move1
功能:mpc014串口SPI運動控制模塊一軸直線插補
引數:
cardno 卡號
no1 X軸軸號
pulse1 X軸移動的距離,范圍(-8388608~+8388607)
mode 0:絕對位移 1:相對位移
*/
void inp_move1(unsigned char cardno,unsigned char no1 , long pulse1 ,unsigned char mode )
{
unsigned char OutByte[25];
OutByte[0] = 0x7;
OutByte[1] = no1;
OutByte[2] = pulse1>>24;
OutByte[3] = pulse1 >>16;
OutByte[4] = pulse1>> 8;
OutByte[5] = pulse1;
OutByte[6] = mode;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
SPI_SendData(OutByte[2]);
SPI_SendData(OutByte[3]);
SPI_SendData(OutByte[4]);
SPI_SendData(OutByte[5]);
SPI_SendData(OutByte[6]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函式名: inp_move2
功能:mpc014串口SPI運動控制模塊二軸直線插補
引數:
cardno 卡號
no1 X軸軸號
no2 Y軸軸號
pulse1,pulse2 X-Y軸移動的距離,范圍(-8388608~+8388607)
mode 0:絕對位移 1:相對位移
*/
void inp_move2(unsigned char cardno,unsigned char no1 ,unsigned char no2 , long pulse1 ,long pulse2 ,unsigned char mode )
{
unsigned char OutByte[25];
OutByte[0] = 0x8;
OutByte[1] = no1;
OutByte[2] = no2;
OutByte[3] = pulse1>>24;
OutByte[4] = pulse1 >>16;
OutByte[5] = pulse1>> 8;
OutByte[6] = pulse1;
OutByte[7] = pulse2 >>24;
OutByte[8] = pulse2 >>16;
OutByte[9] = pulse2 >>8;
OutByte[10] = pulse2 ;
OutByte[11] = mode;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
SPI_SendData(OutByte[2]);
SPI_SendData(OutByte[3]);
SPI_SendData(OutByte[4]);
SPI_SendData(OutByte[5]);
SPI_SendData(OutByte[6]);
SPI_SendData(OutByte[7]);
SPI_SendData(OutByte[8]);
SPI_SendData(OutByte[9]);
SPI_SendData(OutByte[10]);
SPI_SendData(OutByte[11]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函式名: inp_move3
功能:mpc014串口SPI運動控制模塊三軸直線插補
引數:
cardno 卡號
no1 X軸軸號
no2 Y軸軸號
no3 Z軸軸號
pulse1,pulse2,pulse3 X-Y-Z軸移動的距離,范圍(-8388608~+8388607)
mode 0:絕對位移 1:相對位移
*/
void inp_move3(unsigned char cardno,unsigned char no1 ,unsigned char no2 ,unsigned char no3, long pulse1 ,long pulse2 ,long pulse3 ,unsigned char mode )
{
unsigned char OutByte[25];
OutByte[0] = 0x9;
OutByte[1] = no1;
OutByte[2] = no2;
OutByte[3] = no3;
OutByte[4] = pulse1>>24;
OutByte[5] = pulse1 >>16;
OutByte[6] = pulse1>> 8;
OutByte[7] = pulse1;
OutByte[8] = pulse2 >>24;
OutByte[9] = pulse2 >>16;
OutByte[10] = pulse2 >>8;
OutByte[11] = pulse2 ;
OutByte[12] = pulse3 >>24;
OutByte[13] = pulse3 >>16;
OutByte[14] = pulse3 >>8;
.....
[code=c][/code]
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/91463.html
標籤:單片機/工控
