51单片机SPI总线的实现
#include
#include
sbit SCK=P1^0;// 将p1.0口模拟时钟输出
sbit MOSI=P1^1;// 将p1.1口模拟主机输出
sbit MISO=P1^2;// 将p1.1口模拟主机输入
sbit SS1=P1^3;// 将p1.1口模拟片选
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
//-----------------------------------------------------------------------------------------------
// 函数名称: SPISendByte
// 入口参数: ch
// 函数功能: 发送一个字节
//------------------------------------------------------------------------------------------------
voidSPISendByte(unsignedcharch)
{
unsignedcharidata n=8;// 向SDA上发送一位数据字节,共八位
SCK = 1 ;//时钟置高
SS1 = 0 ;//选择从机
while(n--)
{
delayNOP();
SCK = 0 ;//时钟置低
if((ch&0x80) == 0x80)// 若要发送的数据最高位为1则发送位1
{
MOSI = 1;// 传送位1
}
else
{
MOSI = 0;// 否则传送位0
}
delayNOP();
ch = ch<1;// 数据左移一位
SCK = 1 ;//时钟置高
}
}
//------------------------------------------------------------------------------------------------
// 函数名称: SPIreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//------------------------------------------------------------------------------------------------
unsignedcharSPIreceiveByte()
{
unsignedcharidata n=8;// 从MISO线上读取一上数据字节,共八位
unsignedchartdata;
SCK = 1;//时钟为高
SS1 = 0;//选择从机
while(n--)
{
delayNOP();
SCK = 0;//时钟为低
delayNOP();
tdata = tdata<1;// 左移一位,或_crol_(temp,1)
if(MISO == 1)
tdata = tdata|0x01;// 若接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe;// 否则数据的最后一位置0
SCK=1;
}
return(tdata);
}
//------------------------------------------------------------------------------------------------
// 函数名称: SPIsend_receiveByte
// 入口参数: ch
// 返回接收的数据
// 函数功能:串行输入/输出子程序
//------------------------------------------------------------------------------------------------
unsigned
{
unsignedcharidata n=8;// 从MISO线上读取一上数据字节,共八位
unsigned
SCK = 1;//时钟为高
SS1 = 0;//选择从机
while(n--)
{
delayNOP();
SCK = 0;//时钟为低
delayNOP();
{
tdata = tdata<1;// 左移一位,或_crol_(temp,1)
if(MISO == 1)
tdata = tdata|0x01;// 若接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe;// 否则数据的最后一位置0
}
{
if((ch&0x80) == 0x80)// 若要发送的数据最高位为1则发送位1
{
MOSI = 1;// 传送位1
}
else
{
MOSI = 0;// 否则传送位0
}
ch = ch<1;// 数据左移一位
}
SCK=1;
}
return(tdata);
}
51单片机SPI总 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)