电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
问答
51单片机能做IIC吗?有没有列程
已解决
73482
个问题
已帮助
5993
位优秀工程师
51单片机能做IIC吗?有没有列程
88f9bc38cc9d5238
2018-09-19
浏览量:1843
51单片机能做IIC吗?有没有列程
显示全部
单片机
关注问题
写回答
0
0
收起
我来回答
上传资料:
选择文件
文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
牛妞小小
可以通过IO口模拟IIC
#include "iic.h"
/********************************/
/*函数名称:IICstart
/*函数输入:无
/*函数输出:无
/*函数功能:IIC起始信号
/*编写日期:2017-8-6
/********************************/
void IICstart()
//IIC总线起始信号,在SCL为高电平时,SDA出现一个下降沿表示开始
{
SCL = 1; SDA = 1; delay_us(1);
SDA = 0; delay_us(1);
SCL = 0; delay_us(1);
}
/********************************/
/*函数名称:IICstop
/*函数输入:无
/*函数输出:无
/*函数功能:写数据
/*编写日期:2017-8-6
/********************************/
void IICstop()
//IIC总线结束信号,在SCL为高电平时,SDA出现一个上升沿表示结束
{
SCL = 0; SDA = 0; delay_us(1);
SCL = 1; delay_us(1);
SDA = 1; delay_us(1);
}
/********************************/
/*函数名称:IICwrite
/*函数输入:dat
/*函数输出:ack
/*函数功能:写数据
/*编写日期:2017-8-6
/********************************/
bit IICwrite(uchar dat)
//每写成功一位从机都要返回一个应答值(0),不成功返回费应答值(1)
{
bit ack;
uchar mask;
//mask为分离出dat每一位的掩码变量
for(mask=0X80;mask!=0;mask>>=1)
{
SDA = mask&dat;
//SDA取决于dat这正是我们想要的
delay_us(1); SCL = 1;
delay_us(1); SCL = 0;
}
SDA = 1; delay_us(1);
//释放SDA,如果SDA被拉低读的数始终为0
SCL = 1; ack = SDA; delay_us(1);
SCL = 0;
return ~ack;
//应答位取反符合我们的日常逻辑
}
/********************************/
/*函数名称:IICread
/*函数输入:ack
/*函数输出:dat
/*函数功能:读数据
/*编写日期:2017-8-6
/********************************/
uchar IICread(bit ack)
//单片机读取数据,此时单片机为从机
{
//应答由从机给出(单片机)
uchar dat = 0mask;
SDA = 1;
for(mask=0X80;mask!=0;mask>>=1)
{
SCL = 1; delay_us(1);
dat |= SDA ? mask : 0;
SCL = 0; delay_us(1);
}
SDA = ~ack; delay_us(1);
SCL = 1; delay_us(1);
SCL = 0;
return dat;
//返回读取到的数据
}
发布于
2018-09-19
举报
评论 0
0
0
其他答案
数量:
21
喵不是好兔纸
51可以使用IO的方式来模拟IIC,根据时序来操作就可以
发布于
2018-10-20
举报
评论 0
0
0
«
1
2
»
相关问题
问题达人
换一批
文章
知识经验换现金
换一批
51单片机能做IIC吗?有没有列程
写回答
关注问题
×
我要举报该内容,理由是:
内容质量差:
内容太水、伸手党
垃圾广告信息:
广告、招聘、推广、测试内容等
偏离问答主题:
与技术无关、讨论类
与社区已有内容重复:
违规内容:
色情、暴力、血腥、敏感信息等
不友善内容:
人事攻击、挑衅辱骂、恶意行为
以上选项都不是: