主机发送程序
#include <C:\KeilC707\C51\INC\STC\STC89c5x.H>
//#include <C:\KeilC707\C51\INC\STC\STC12c5a60s2.H>
#include <c:\KeilC707\c51\inc\intrins.h>
sbit SPI_MOS0=P3^2;//主发/从接 数据线
sbit SPI_MOS1=P3^3;//从发/主接 数据线
sbit SPI_Clock=P3^4;//时钟线
sbit SPI_CS=P3^5;//片选线
uchar idata TXD_Buffer[16];
uchar idata RXD_Buffer[16];
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void Ini_mcs51(void);
void SendByte(uchar TXD_Data);
void Delay4us(void);
void Ini_mcs51(void)
{
//P1ASF = B0000_0000;
P1M1 =B0000_0000;
P1M0 =B0000_0000;// 1---模拟(ADC)工作状态。
P1 =B1111_1111;//P1 8bit LED显示数据总线 与 键盘数据输入 端口。
P2M1=B0000_0000;
P2M0=B0000_0000;
P2 =B1111_1111;
P3M1=B0000_0000;
P3M0=B0000_0000;
P3 =B1111_1111;
//-------------
EA =0;
IT0 =0;
IT1 =0;
PX0 =0;
PX1 =0;
PT0 =0;
PT1 =0;
PS =0;
TMOD = 0x11;
TH0 = 0xec;TL0 = 0x78;
TR0 = 1;
TR1 = 0;
ES = 0;
ET0 = 1;
ET1 = 0;
ET2 = 0;
EX0 = 0;
EX1 = 0;
EA = 0;
}//---------------------------------------------------
void Delay4us(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
void SendByte(uchar TXD_Data)
{
uchar data i;
SPI_CS=1;//片选线0
SPI_Clock=1;//时钟置高
Delay4us();
for(i=0;i<8;i++)
{
SPI_Clock=0;//时钟置0
SPI_CS=0;//片选线0
Delay4us();
//Delay4us();
if(TXD_Data&0x80)SPI_MOS0=1; // 若要发送的数据最高位为1则发送位1
else SPI_MOS0=0; // 否则传送位0
SPI_Clock=1;//时钟置高
Delay4us();
TXD_Data=TXD_Data<<1;// 数据左移一位
}
SPI_CS=1;//片选线1
}
void main(void)
{
Ini_mcs51();
while(1)
{
TXD_Buffer[0]=0xaa;
SendByte(TXD_Buffer[0]);
}
}
从机接收程序
#include <C:\KeilC707\C51\INC\STC\STC89c5x.H>
//#include <C:\KeilC707\C51\INC\STC\STC12c5a60s2.H>
#include <c:\KeilC707\c51\inc\intrins.h>
sbit SPI_MOS0=P3^2;//主发/从接 数据线
sbit SPI_MOS1=P2^4;//从发/主接 数据线
sbit SPI_Clock=P3^3;//时钟线
sbit SPI_CS=P3^4;//片选线
sbit LED=P3^7;//LED段选
//uchar idata TXD_Buffer[16];
uchar idata RXD_Buffer[16];
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void Ini_mcs51(void);
void SendByte(uchar TXD_Data);
/*
void Delay4us(void);
void Delay4us(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
} */
void Ini_mcs51(void)
{
//P1ASF = B0000_0000;
P1M1 =B0000_0000;
P1M0 =B0000_0000;// 1---模拟(ADC)工作状态。
P1 =B1111_1111;//P1 8bit LED显示数据总线 与 键盘数据输入 端口。
P2M1=B0001_0000;
P2M0=B0000_0000;
P2 =B1111_1111;
P3M1=B0000_0000;
P3M0=B0000_0000;
P3 =B1111_1111;
//-------------
EA =0;
IT0 =0;
IT1 =0;
PX0 =0;
PX1 =0;
PT0 =0;
PT1 =0;
PS =0;
TMOD = 0x11;
TH0 = 0xec;TL0 = 0x78;
TR0 = 1;
TR1 = 0;
ES = 0;
ET0 = 1;
ET1 = 0;
ET2 = 0;
EX0 = 0;
EX1 = 0;
EA = 0;
}//---------------------------------------------------
uchar ResdByte(void)
{
uchar data i;
uchar data RXT_data;
uchar result=0;
//SPI_CS=1;//片选线0
//SPI_Clock=1;//时钟置1
//SPI_MOS0=1;
delayNOP();
if((!SPI_CS)&&(!SPI_Clock))
{
for(i=0;i<8;i++)
{
while(!SPI_Clock);
if(SPI_MOS0&0x01)result=1;
else result=0;
_nop_();_nop_();
while(SPI_Clock);
RXT_data=result|(RXT_data>>1);
}
}
while(!SPI_CS);
return RXT_data;
}
void main(void)
{
P1=0xff;
RXD_Buffer[0]=0xff;
Ini_mcs51();
while(1)
{
LED=0;
RXD_Buffer[0]=ResdByte();
P1=RXD_Buffer[0];
}
}
我是按着SPI的时序图写的,
发送程序的IO口我用示波器测过是对的,
为什么接受不到数据啊,希望告诉知道啊
QQ879733025 |