哪位大哥给发一个单片机IO口模拟IIC时序的程序啊? 谢谢
2个回答
展开全部
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#include <intrins.h>
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);
}
#include <reg51.h>
#include <intrins.h>
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);
}
追问
你好,我想请问下,您的程序是SPI还是IIC,因为我的题目和你的文件名都是IIC,但是程序和注释都是向SPI?有点疑惑。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
2013-09-18
展开全部
IIC的基本模拟时序函数都在里边了,你可以针对不同的器件再编写相应的函数,希望对你有帮助。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询