查看:
735
|
回复:
0
|
分享单片机SPI控制步进伺服电机做运动控制的C代码,各种单片机都可以移植
|
|
发表于2023-03-09 15:49:01
|
只看该作者
1#
电梯直达
#include <intrins.h> #include <reg52.h> //MCU: stc8f2k08s2 //兰峰控制xc1004四轴SPI运动控制芯片 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 FOSC 24000000UL //使 用内部24M晶振 #define BRT (65536 - FOSC / 115200 / 4) //定义115200波特率 sbit b2 = P1^1; 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] = {0}; unsigned char b1_state=0; long sxnum; void initial() { P1M1 = 0; P1M0 = 0x2c; // 引脚模拟通信时,MOSI,SCK, CS 设为推挽输出 SPI1_CSHIGH; //CS不使用时设为高 SPI2_CSHIGH; SPI3_CSHIGH; SPI_SCKLOW;//SCK空闲状态一定要为低电平。 /////// spi模拟通信时不用 SPCTL = 0xd0; //使能SPI主机模 式 SPSTAT = 0xc0; //清中断标志
CKDIV=1;
} 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,单片机作为主机,运动控制芯片为从机。CPHA=0 ,CPOL=0,高位在前,SPI数据宽度为8位。 空闲状态下单片机SCK引脚必须为低电平。每一条指令开始发送前将 CS引脚置低,整条指令发送完成后必须将CS置高。 每条指令间需有时间间隔,推荐延时1MS以上。 */ unsigned char aSPI_SendData(unsigned char outdata) { unsigned char RecevieData=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; } delay_nus(1); //发一个字节延时下 return RecevieData; } unsigned char SPI_SendData(unsigned char outdata) { unsigned char RecevieData=0,i; SPDAT = outdata; //发送数据 while (!(SPSTAT & 0x80)); //查询完成标志 SPSTAT = 0xc0; //清中断标志 return SPDAT; } |
|