51单片机——STC89C52_模拟IIC通讯驱动1.0

写的不知道好不好,有什么不对的地方还请指出,谢了。

1、对于IIC通讯,我觉的有2种通讯方案。

    方案1:每次函数结束后未释放SDA线,且SCL=1;

    方案2:每个函数结束后释放SDA线,且SCL=0;

    本次采用方案1,方案2有时间在试试。

2、对于IIC时序,也就6种:开始信号、结束信号、写1字节、读1字节、接收ACK、发送ACK/NO_ACK

3、由于AT24C02IIC通讯时序很快,51单片机软件模式IIC时序速度慢,故,不用延迟就可以,在这里我均延迟了5us时间。

4、这只是IIC驱动,后面在贴AT24C02驱动代码。

#ifndef __IIC_H__
#define	__IIC_H__

#include <reg52.h>

sbit SCL = P2^1;//时钟连接P2.1口
sbit SDA = P2^0;//时钟连接P2.0口

void START_IIC(void);//1、IIC开始信号
void STOP_IIC(void);//2、结束IIC通讯

//器件的地址共计7位,第8位为0表示要写数据给设备
//为1表示要读取设备的数据
void write_1_byte_IIC(unsigned char);//3、写1字节数据
unsigned char read_1_byte_IIC(void); //4、读取1字节数据
bit read_ACK_IIC(void);//5、读取ACK信号,为1表示no-ack 为0表示ack
void write_ACK_IIC(bit);//6、主机发送ACK信号,为1表示no-ack 为0表示ack

#endif // !__IIC_H__
#include "delay.h"
#include "iic.h"
//金丝草;使用iic通讯方案1
//方案1:每个函数结束后未释放SDA线,且SCL=1; STOP信号均为高。起始前面处理一下
//方案2:每个函数结束后释放SDA线,且SCL=0;STOP信号均为高。后面信号处理一下。
//本次采用方案1
//1、IIC开始信号
void START_IIC(void)
{
	SCL = 0;
	SDA = 1;
	delay_5us();
	SCL = 1;
	delay_5us();
	SDA = 0;
	delay_5us();
}

//2、IIC结束信号
void STOP_IIC(void)
{
	SCL = 0;
	SDA = 0;
	delay_5us();
	SCL = 1;
	delay_5us();
	SDA = 1;
	delay_5us();
}

//器件的地址共计7位,第8位为0表示要写数据给设备
//为1表示要读取设备的数据
//3、IIC写数据
void write_1_byte_IIC(unsigned char datax)
{
	unsigned char i;
	for (i = 0x80;i != 0;i >>= 1)
	{
		SCL = 0;
		delay_5us();
		if ((datax & i) == i)  //马来逼,这个地方原始数据为datax&i==1  &的结果为16进制应该与i比较,并且&没有==优先级高
			SDA = 1;
		else
			SDA = 0;
		delay_5us();
		SCL = 1;
		delay_5us();
	}
}

//4、IIC读数据 
unsigned char read_1_byte_IIC(void) //读取1字节数据
{
	unsigned char i;
	unsigned char datax = 0;
	for (i = 0x80;i != 0;i >>= 1)
	{
		SCL = 0;
		SDA = 1;  //释放SDA线
		delay_5us();
		SCL = 1;
		delay_5us();
		if (SDA)
			datax |= i;//读取SDA线上的数据
		delay_5us();
	}
	return(datax);
}

//5、读取接收ACK应答信号
bit read_ACK_IIC(void)
{
	bit ACK = 0;
	SCL = 0;
	SDA = 1;
	delay_5us();
	SCL = 1;
	delay_5us();
	ACK = SDA;	
	return(ACK);//如果ACK=1,则未收到应答   //如果ACK=0,则收到应答
}

//6、发送应答ACK信号
void write_ACK_IIC(bit ACK)
{
	SCL = 0;
	SDA = ACK; //ACK=1,表示不发送应答,=0表示发送应答
	delay_5us();
	SCL = 1;
	delay_5us();
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STC89C52是一款广泛应用的8位单片机,它具有丰富的外设资源。如果要驱动四脚IIC的OLED显示屏,可以按照以下步骤进行操作: 首先,需要连接STC89C52IIC总线引脚到OLED的SCL和SDA引脚上。SCL引脚用于时钟信号,SDA引脚用于数据信号传输。 在编程方面,需要引入IIC驱动库,例如使用STC官方提供的IIC库函数。 其次,通过相关的代码初始化IIC总线,在STC89C52的头文件中设置相应的寄存器和引脚。 然后,在主程序中编写具体的驱动代码。首先发送OLED显示屏的启动信号,然后通过IIC总线发送指令或数据到OLED屏幕。 在发送数据之前,需要将OLED屏幕的地址发送给IIC总线,可以通过手册或者规格表查找到正确的地址。 在发送指令或数据后,可以选择停止信号或继续发送其他指令或数据。 最后,在循环中不断地更新OLED屏幕的显示内容,可以通过设置每个像素点的亮度来显示文字、图形等。 需要注意的是,具体的驱动方法和代码可能会因为OLED屏幕的型号和制造商而有所不同,所以在编写代码之前,最好查看相关的开发文档和示例代码。 总之,通过STC89C52IIC总线和相应的驱动代码,可以成功驱动四脚IIC的OLED显示屏,并实现各种显示效果。 ### 回答2: STC89C52是一种常用的单片机,而IIC(Inter-Integrated Circuit)是一种串行总线通信协议,经常用于连接微控制器和外部设备。而OLED则是一种有机发光二极管显示技术,具有高对比度、快速响应和低功耗等特点。 要驱动四脚IIC的OLED,我们首先需要连接STC89C52和OLED模块。在STC89C52上,我们需要配置IIC的引脚为SCL(时钟线)和SDA(数据线),然后将其分别连接到OLED模块的对应引脚。同时,还需要给OLED模块供电。 接下来,需要编写程序来控制STC89C52通过IIC协议与OLED进行通信。首先,我们需要通过IIC协议发送控制指令给OLED,包括设置OLED对应的初始化参数和显示选项等。然后,我们可以通过IIC协议发送数据给OLED,实现想要显示的内容,比如文字、图形等。 具体操作过程如下: 1. 配置STC89C52的引脚为IIC功能,并初始化IIC协议。 2. 配置OLED模块,并发送初始化参数和显示选项给OLED。 3. 根据需求,通过IIC协议向OLED发送需要显示的数据。 4. 刷新屏幕,使得OLED显示更新的内容。 通过以上步骤,我们可以实现STC89C52对四脚IIC的OLED的驱动。随着技术的发展,OLED显示技术在各个领域得到广泛应用,比如智能手表、智能手机等。通过掌握STC89C52IIC协议的应用,我们可以开发出更多有创意和实用性的应用。 ### 回答3: STC89C52是一种51系列的单片机,它可以通过I2C(Inter-Integrated Circuit,即IIC)总线驱动OLED(Organic Light-Emitting Diode)显示屏。 首先,我们需要将STC89C52与OLED之间建立有效的I2C通信连接。STC89C52的硬件I2C模块包含SCL(时钟线)和SDA(数据线)两条线路,用于与OLED进行通信。 我们需要先配置STC89C52的I2C模块。通过设置合适的寄存器值,我们可以指定I2C总线的速度、从机地址等参数。然后,我们设计算法来发送数据和命令,实现向OLED发送显示内容。 接下来,将STM89C52连接到OLED的SCL和SDA引脚。SCL与OLED的时钟引脚连接,SDA与OLED的数据引脚连接。这样,STC89C52就可以通过I2C总线与OLED进行通信了。 然后,我们需要编写相应的程序代码来控制STC89C52。通过调用正确的库函数,我们可以发送命令和数据给OLED。例如,我们可以使用库函数向OLED发送显示文本、图像等。 最后,我们需要调试和测试我们的代码。通过在STC89C52上加载程序,并观察OLED是否正确显示内容,我们可以验证驱动是否成功。如果有任何问题,则需要检查硬件连线和程序代码,并进行适当的调整。 总之,通过合理配置STC89C52的I2C模块并编写适当的代码,我们可以顺利驱动四脚I2C的OLED显示屏。这样,我们就可以在STC89C52上通过I2C总线实现图形和文本的显示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金丝草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值