89C51系列单片机都不带SPI口,所在在这种情况下,我们可以模拟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
// 函数功能: 发送一个字节
//-------------------------------------------------------------------------------
void SPISendByte(unsigned char ch)
{
unsigned char idata 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
// 返回接收的数据
// 函数功能: 接收一字节子程序
//-------------------------------------------------------------------------------
unsigned char SPIreceiveByte()
{
unsigned char idata n=8; // 从MISO线上读取一上数据字节,共八位
unsigned char tdata;
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 char SPIsend_receiveByte(unsigned char ch)
{
unsigned char idata n=8; // 从MISO线上读取一上数据字节,共八位
unsigned char tdata;
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单片机学习日志[Day1、2022.1.09]
下一篇:51单片机学习二 led流水灯与按键控制
- 热门资源推荐
- 热门放大器推荐
设计资源 培训 开发板 精华推荐
- 盛夏嗨学有礼——和dcexpert一起学ESP8266
- 学《TIVA C Launchpad入门课程》 晒成绩 赢大礼!
- ADI基于ADPD188BI的烟雾探测器集成解决方案 有奖直播 5月13日上午10:00-11:30 为您揭晓!
- 极简主义,足不出户,看东芝在线展会,安心答题送好礼!
- 直播已结束|TI C2000 Piccolo 单芯片——实现双轴伺服电机和马达控制
- 最后一周报名,STM32中国峰会暨粉丝狂欢节,5月12-13日深圳
- Microchip 有奖直播|满足汽车电池管理系统 (BMS) 不断发展的安全标准
- 赛灵思网络通信专题有奖问答
- 【已结束】 电感应用知识分享|MPS 有奖直播