stc89c52rc单片机具有硬件SPI功能吗?不具有的话如何模拟spi?

stc89c52rc单片机具有硬件SPI功能吗?不具有的话如何模拟spi?,第1张

STC89C52RC单片机是没有硬件SPI功能的,是需要模拟的。普通的I/O即可模拟的。给你一个参考程序:\x0d\x0a//-----------------------函数声明,变量定义-------------------------------------------------------- \x0d\x0a#include \x0d\x0a#include \x0d\x0asbit SCK=P1^0// 将p1.0口模拟时钟输出 \x0d\x0asbit MOSI=P1^1// 将p1.1口模拟主机输出 \x0d\x0asbit MISO=P1^2// 将p1.1口模拟主机输入 \x0d\x0asbit SS1=P1^3// 将p1.1口模拟片选 \x0d\x0a#define delayNOP(){_nop_()_nop_()_nop_()_nop_()}\x0d\x0a//-------------------------------------------------------------------------------------------------- \x0d\x0a// 函数名称: SPISendByte \x0d\x0a// 入口参数: ch \x0d\x0a// 函数功能: 发送一个字节 \x0d\x0a//-------------------------------------------------------------------------------------------------- \x0d\x0avoid SPISendByte(unsigned char ch) \x0d\x0a{ \x0d\x0aunsigned char idata n=8// 向SDA上发送一位数据字节,共八位 \x0d\x0aSCK = 1 //时钟置高 \x0d\x0aSS1 = 0 //选择从机 \x0d\x0awhile(n--) \x0d\x0a{ \x0d\x0adelayNOP()\x0d\x0aSCK = 0 //时钟置低 \x0d\x0aif((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1 \x0d\x0a{ \x0d\x0aMOSI = 1// 传送位1 \x0d\x0a} \x0d\x0aelse\x0d\x0a{ \x0d\x0aMOSI = 0// 否则传送位0 \x0d\x0a} \x0d\x0adelayNOP()\x0d\x0ach = ch 回答于 2022-11-17

这是我复制的,一搜一大堆

#include <reg52.h>

sbit SPI_DI =P0^1//MMC数据输入

sbit SPI_DO =P0^0//MMC数据输出,可不接

sbit SPI_SCL=P0^2//时钟线

void Write_Byte(unsigned char value)

{

unsigned char i

for (i=0i<8i++)

{

if (((value>>(7-i))&0x01)==0x01)

SPI_DI=1

else SPI_DI=0

SPI_SCL=0

delay(5)

//必须要加延时,否则会因为 *** 作太快而不响应。

SPI_SCL=1

delay(5)

//必须要加延时,否则会因为 *** 作太快而不响应。

}

}

unsigned char Read_Byte()

{

unsigned char temp=0

unsigned char i

for (i=0i<8i++)

{

SPI_DO=1

SPI_SCL=0

delay(5)

temp=(temp<<1)+(unsigned char)SPI_DO

SPI_SCL=1

delay(5)

}

return (temp)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/10919441.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存