视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
STC单片机SPI功能程序
2025-10-04 16:16:14 责编:小OO
文档
#include "reg51 .h"

#define FOSC 18432000L

#define BAUD (256 - FOSC / 32 / 115200)

typedef unsigned char BYTE;

typedef unsigned int WORD;

typedef unsigned long DWORD;

sfr AUXR = 0x8e; //Auxiliary register

sfr SPSTAT = 0x84; //SPI status register

#define SPIF 0x80 //SPSTAT.7

#define WCOL 0x40 //SPSTAT.6

sfr SPCTL = 0x85; //SPI control register

#define SSIG 0x80 //SPCTL.7

#define SPEN 0x40 //SPCTL.6

#define DORD 0x20 //SPCTL.5

#define MSTR 0x 0 //SPCTL.4

#define CPOL 0x08 //SPCTL.3

#define CPHA 0x04 //SPCTL.2

#define SPDHH 0x00 //CPU_CLK/4

#define SPDH 0x01 //CPU_CLK/ 6

#define SPDL 0x02 //CPU_CLK/

#define SPDLL 0x03 //CPU_CLK/ 28

sfr SPDAT = 0x86; //SPI data register

sbit SPISS = P1^3; //SPI slave select, connect to slave' SS(P .4) pin

void InitUart();

void InitSPI();

void SendUart(BYTE dat); //send data to PC

BYTE RecvUart(); //receive data from PC

BYTE SPISwap(BYTE dat); //swap SPI data between master

///////////////////////////////////////////////////////////

void main()

{

InitUart(); //initial UART

InitSPI(); //initial SPI

while (1 )

{

if (RI)

{

SPCTL = SPEN | MSTR; //set as master

SendUart(SPISwap(RecvUart()));

SPCTL = SPEN; //reset as slave

}

if (SPSTAT & SPIF)

{

SPSTAT = SPIF | WCOL; //clear SPI status

SPDAT = SPDAT; //mov data from receive buffer to send buffer

}

}

}

///////////////////////////////////////////////////////////

void InitUart()

{

SCON = 0x5a; //set UART mode as 8-bit variable baudrate

TMOD = 0x20; //timer as 8-bit auto reload mode

AUXR = 0x40; //timer work at T mode

TH1 = TL1 = BAUD; // 5200 bps

TR1 =1 ;

}

///////////////////////////////////////////////////////////

void InitSPI()

{

SPDAT = 0; //initial SPI data

SPSTAT = SPIF | WCOL; //clear SPI status

SPCTL = SPEN; //slave mode

}

///////////////////////////////////////////////////////////

void SendUart(BYTE dat)

{

while (!TI); //wait pre-data sent

TI = 0; //clear TI flag

SBUF = dat; //send current data

}

///////////////////////////////////////////////////////////

BYTE RecvUart()

{

while (!RI); //wait receive complete

RI = 0; //clear RI flag

return SBUF; //return receive data

}

/////////////////

//////////////////////////////////////////

BYTE SPISwap(BYTE dat)

{

SPISS = 0; //pull low slave SS

SPDAT = dat; //trigger SPI send

while (!(SPSTAT & SPIF)); //wait send complete

SPSTAT = SPIF | WCOL; //clear SPI status

SPISS =1 ; //push high slave SS

return SPDAT; //return received SPI data

}下载本文

显示全文
专题