51单片机使用IO口模拟IIC协议

目录

1、IIC协议的叙述

1.2、特点

1.2.1、简单性和有效性

1.2.2多主控

1.3、构成

 2、IIC协议

起始信号

终止信号

 应答信号

 数据发送的时序

 代码实现

1、IIC协议的叙述

IIC 全称 Inter-Integrated Circuit ( 集成电路总线 )
是由 PHILIPS 公司在 80 年代开发的两线式串行总线,用于连接微控制器及其外围设备。 IIC 属于半双 工同步通信方式

1.2、特点

1.2.1、简单性和有效性

由于接口直接在组件之上,因此IIC总线占用空间非常小,减少了电路板的空间和芯片管脚的数量,降低互联成本。总线长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件

1.2.2多主控

其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

1.3、构成

IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控制器件产生。所有接到IIC总线设备上的串行数据SDA都能接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。对于并联在一条总线上的每个IC都有唯一的地址

 2、IIC协议

IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号。

  • 起始信号

  • 终止信号

这里注意看起来两幅图其实没多大变化,但是仔细看阴影部分起始信号是高电平转低电平、终止信号是低电平转高电平

  •  应答信号

 发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节。应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

 

  •  数据发送的时序

 

 注意sda发生翻转的时候scl处于低电平,当sda在进行数字传输的时候scl处于高电平,scl处于高电平的时候sda保持不变

 代码实现

#include "reg52.h"

sbit scl = P0^0;
sbit sda = P0^1;

void Start_signal()//起始信号
{
	scl = 1;
	sda = 0;
	sda = 1;
	_nop_();
	sda = 0;
	_nop_();
	scl = 0;	
}
void TerminationSignal()//终止信号
{
	scl = 0;
	sda = 0;
	scl = 1; 
	_nop_();
	sda = 1;
	_nop_();
	sda = 0;
	_nop_();
}

char IIC_ACK()//应答信号
{
	char ACK;
	scl = 0;
	_nop_();
	scl = 1;
	_nop_();
	ACK = sda;
	scl = 0;
	_nop_();
	return ACK;
}

void IIC_send_byte(char SendByte)//发送一个字节
{
	int i = 0;
	for(;i<8;i++){
	scl = 0;//数据翻转
	sda = SendByte & 0x80;//发送最高位,发送顺序是由高往低的
	_nop_();//数据准备时间
	scl = 1;//发送数据
	_nop_();//数据发送时间
	SendByte<<= 1;
	}
}
void main()
{

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值