发送程序
#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 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=B0011_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 SendByte(uchar TXD_Data)
{
uchar data i;
SPI_CS=0;//片选线0
SPI_Clock=1;//时钟置高
for(i=0;i<8;i++)
{
delayNOP();
SPI_Clock=0;//时钟置0
if(TXD_Data&0x80)SPI_MOS0=1; // 若要发送的数据最高位为1则发送位1
else SPI_MOS0=0; // 否则传送位0
delayNOP();
SPI_Clock=1;//时钟置高
TXD_Data=TXD_Data<<1;// 数据左移一位
}
SPI_CS=1;//片选线1
}
void main(void)
{
Ini_mcs51();
while(1)
{
TXD_Buffer[0]=0x55;
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=P2^4;//主发/从接 数据线
sbit SPI_MOS1=P3^2;//从发/主接 数据线
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 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=B0011_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;
//SPI_CS=0;//片选线0
//SPI_Clock=1;//时钟置1
for(i=0;i<8;i++)
{
if(!SPI_CS)
{
delayNOP();
SPI_Clock=1;//时钟置1
if(RXT_data&0x01)SPI_MOS0=1;
else SPI_MOS0=0;
delayNOP();
SPI_Clock=0;//时钟置0
RXT_data=RXT_data>>1;
}
}
SPI_CS=1;
return RXT_data;
}
void main(void)
{
uchar data a;
Ini_mcs51();
while(1)
{
LED=0;
a=ResdByte();
P1=a;
}
}
我是按着时序图写,可是我就不知道程序问题去在那里,
不管我改变TXD_Buffer[0]的直,接收P1口老是低电平,
希望高手多多指点
谢谢 |