IIC代码 基于51单片机的

接口:I2C_SDA = P2_0;    I2C_SCL= P2_1;

 

总代码

#include "iic.h"
#include <REGX52.H>

//接口定义
sbit IIC_SDA = P2^0;
sbit IIC_SCL = P2^1;

/**********************************
函数名称:IIC_Start
参	  数:无
返回  值:无
函数功能:IIC开始
************************************/
void IIC_Start(void)
{
	IIC_SCL = 0;	//开始不确定SDA为低还是高
	IIC_SDA = 1;	//拉高SDA线为高电平
	IIC_SCL = 1;	//拉高SCL线为高电平
	IIC_SDA = 0;	//在SCL为高时,SDA产生下降沿信号
	IIC_SCL = 0;	//钳住SCL总线,准备发送或接收数据
}

/**********************************
函数名称:IIC_Stop
参	  数:无
返回  值:无
函数功能:IIC结束  当SCL为高时,SDA上升沿
************************************/
void IIC_Stop(void)
{
	IIC_SCL = 0;	//开始不确定SDA为低还是高
	IIC_SDA = 0;	//拉低SDA,确保SDA是由低变高
	IIC_SCL = 1;	//拉高SCL
	IIC_SDA = 1;	//SDA产生上升沿
}

/**********************************
函数名称:IIC_SendByte
参	  数:Byte-发送的字节数据
返回  值:无
函数功能:IIC发送一个字节
************************************/
void IIC_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		IIC_SDA=Byte&(0x80>>i);	//先把最高位放在SDA线上
		IIC_SCL = 1;	//再SCL高电平时,读取SDA
		IIC_SCL = 0;	//钳住SCL总线,准备下一次发送或者接收
	}
}

/**********************************
函数名称:IIC_ReceiveByte
参	  数:无
返回  值:Byte-返回接收到的数据
函数功能:IIC接收一个字节
************************************/
unsigned char IIC_ReceiveByte(void)
{
	unsigned char i,Byte=0x00;
	IIC_SDA = 1;	//主机释放SDA
	for(i=0;i<8;i++)
	{
		IIC_SCL = 1;	//再SCL高电平时,读取SDA
		if(IIC_SDA){Byte |= (0x80>>i);}//先取出最高位放在SDA线上
		IIC_SCL = 0;	//钳住SCL总线,准备下一次发送或者接收
	}
	return Byte;
}

/**********************************
函数名称:IIC_SendACK
参	  数:应答位-Ack(0为应答;1为非应答)
返回  值:无
函数功能:IIC发送应答
************************************/
void IIC_SendACK(unsigned char Ack)
{
	IIC_SDA = Ack;
	IIC_SCL = 1;
	IIC_SCL = 0;
}

/**********************************
函数名称:IIC_RecAck
参	  数:无
返 回 值:应答位-Ack(0为应答;1为非应答)
函数功能:IIC接收应答
************************************/
unsigned char IIC_RecAck(void)
{
	unsigned char Ack;
	IIC_SDA = 1;	//主机释放SDA
	IIC_SCL = 1;
	Ack = IIC_SDA;
	IIC_SCL = 0;
	return Ack;
}

分代码,解析

一、IIC开始信号

/**********************************
函数名称:IIC_Start
参	  数:无
返回  值:无
函数功能:IIC开始
************************************/
void IIC_Start(void)
{
	IIC_SCL = 0;	//开始不确定SDA为低还是高
	IIC_SDA = 1;	//拉高SDA线为高电平
	IIC_SCL = 1;	//拉高SCL线为高电平
	IIC_SDA = 0;	//在SCL为高时,SDA产生下降沿信号
	IIC_SCL = 0;	//钳住SCL总线,准备发送或接收数据
}

二、IIC结束信号

/**********************************
函数名称:IIC_Stop
参	  数:无
返回  值:无
函数功能:IIC结束  当SCL为高时,SDA上升沿
************************************/
void IIC_Stop(void)
{
	IIC_SCL = 0;	//开始不确定SDA为低还是高
	IIC_SDA = 0;	//拉低SDA,确保SDA是由低变高
	IIC_SCL = 1;	//拉高SCL
	IIC_SDA = 1;	//SDA产生上升沿
}

三、IIC发送一个字节

/**********************************
函数名称:IIC_SendByte
参	  数:Byte-发送的字节数据
返回  值:无
函数功能:IIC发送一个字节
************************************/
void IIC_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		IIC_SDA=Byte&(0x80>>i);	//先把最高位放在SDA线上
		IIC_SCL = 1;	//再SCL高电平时,读取SDA
		IIC_SCL = 0;	//钳住SCL总线,准备下一次发送或者接收
	}
}

四、IIC接收一个字节

/**********************************
函数名称:IIC_ReceiveByte
参	  数:无
返回  值:Byte-返回接收到的数据
函数功能:IIC接收一个字节
************************************/
unsigned char IIC_ReceiveByte(void)
{
	unsigned char i,Byte=0x00;
	IIC_SDA = 1;	//主机释放SDA
	for(i=0;i<8;i++)
	{
		IIC_SCL = 1;	//再SCL高电平时,读取SDA
		if(IIC_SDA){Byte |= (0x80>>i);}//先取出最高位放在SDA线上
		IIC_SCL = 0;	//钳住SCL总线,准备下一次发送或者接收
	}
	return Byte;
}

五、IIC发送应答

/**********************************
函数名称:IIC_SendACK
参	  数:应答位-Ack(0为应答;1为非应答)
返回  值:无
函数功能:IIC发送应答
************************************/
void IIC_SendACK(unsigned char Ack)
{
	IIC_SDA = Ack;
	IIC_SCL = 1;
	IIC_SCL = 0;
}

六、IIC接收应答

/**********************************
函数名称:IIC_RecAck
参	  数:无
返 回 值:应答位-Ack(0为应答;1为非应答)
函数功能:IIC接收应答
************************************/
unsigned char IIC_RecAck(void)
{
	unsigned char Ack;
	IIC_SDA = 1;	//主机释放SDA
	IIC_SCL = 1;
	Ack = IIC_SDA;
	IIC_SCL = 0;
	return Ack;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
51单片机iic协议oled代码可以通过以下步骤实现: 1. 首先,我们需要包含51单片机的头文件和对应的引脚定义,以便于程序中使用。 ```c #include <reg52.h> sbit SCL=P2^1; // 定义SCL引脚 sbit SDA=P2^0; // 定义SDA引脚 ``` 2. 然后,我们需要定义iic协议中的起始条件、停止条件和数据传输函数。 ```c void iic_start() // IIC起始条件 { SDA=1; SCL=1; Delay5us(); SDA=0; Delay5us(); SCL=0; } void iic_stop() // IIC停止条件 { SDA=0; Delay5us(); SCL=1; Delay5us(); SDA=1; } void iic_writebyte(unsigned char dat) // 写一个字节 { unsigned char i; for(i=0;i<8;i++) { SDA=(bit)(dat&0x80); dat<<=1; SCL=1; Delay5us(); // 调整延时时间,保证IIC操作正常 SCL=0; } SDA=1; SCL=1; Delay5us(); SCL=0; } ``` 3. 最后,我们可以示范如何使用iic协议与oled屏幕进行通信,并将需要显示的内容写入oled屏幕的数据寄存器。 ```c void oled_write_cmd(unsigned char cmd) // 向OLED写控制命令 { iic_start(); iic_writebyte(0x78); // OLED I2C Write address iic_writebyte(0x00); // Control byte: Co = 0, D/C# (bit0 write command) iic_writebyte(cmd); // Write command iic_stop(); } void oled_write_data(unsigned char dat) // 向OLED写数据 { iic_start(); iic_writebyte(0x78); // OLED I2C Write address iic_writebyte(0x40); // Control byte: Co = 0, D/C# (bit0 write data) iic_writebyte(dat); // Write data iic_stop(); } ``` 通过以上代码,我们可以实现51单片机基于iic协议控制oled屏幕的显示,从而实现各种图形和文本的显示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值