C51单片机IIC协议的应用

51单片机与AT24C02的IIC通信实战:从原理到毕设应用 本文详细介绍了51单片机与AT24C02的IIC通信实战,从基础原理到毕设应用。通过解析IIC通信协议、硬件连接要点、软件实现技巧及多设备管理方案,帮助读者快速掌握AT24C02的读写操作。文章还提供了典型毕设应用案例和调试技巧,适合电子工程学生和爱好者参考。 阅读详情

总述:

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

1.起始信号

void IIC_Start()
{
sda = 1;
scl = 1;
_nop_();
sda = 0;
_nop_();
}

2.终止信号

void IIC_Stop()
{
sda = 0;
scl = 1;
_nop_();
sda = 1;
_nop_();
}

3.应答信号

发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字 节;
char IIC_ACK()
{
char flag;//????为什么这个位置要用char
sda = 1;//就在时钟脉冲9期间释放数据线
_nop_();
scl = 1;
_nop_();
flag = sda;
_nop_();
scl = 0;
_nop_();
return flag;

}

3.IIC协议发送一个字节封装。

void IIC_Send_Byte(char dataSend)
{
int i;
for(i = 0;i<8;i++){
scl = 0;//scl拉低,让sda做好数据准备
sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda  ??为什么字符串可以进行&运算
_nop_();//发送数据建立时间
scl = 1;//scl拉高开始发送
_nop_();//数据发送时间
scl = 0;//发送完毕拉低
_nop_();//
dataSend = dataSend << 1;//????搞不懂为什么dataSend << 1就是左移
}
}

2.OLED写命令,可以参考ssd1306手册和叁议电子oled说明书。

3.OLED寻址模式:页地址模式、水平地址模式、垂直地址模式。;页地址模式和水平地址模式用的比较多。

页地址模式:

写入入0x08(b00001000),显示如下

首先进行OLED初始化,初始化的代码是怎么来的呢?

void Oled_Init(void){
Oled_Write_Cmd(0xAE);//--display off
Oled_Write_Cmd(0x00);//---set low column address
Oled_Write_Cmd(0x10);//---set high column address
Oled_Write_Cmd(0x40);//--set start line address
Oled_Write_Cmd(0xB0);//--set page address
Oled_Write_Cmd(0x81); // contract control
Oled_Write_Cmd(0xFF);//--128
Oled_Write_Cmd(0xA1);//set segment remap
Oled_Write_Cmd(0xA6);//--normal / reverse
Oled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)
Oled_Write_Cmd(0x3F);//--1/32 duty
Oled_Write_Cmd(0xC8);//Com scan direction
Oled_Write_Cmd(0xD3);//-set display offset
Oled_Write_Cmd(0x00);//
Oled_Write_Cmd(0xD5);//set osc division
Oled_Write_Cmd(0x80);//
Oled_Write_Cmd(0xD8);//set area color mode off
Oled_Write_Cmd(0x05);//
Oled_Write_Cmd(0xD9);//Set Pre-Charge Period
Oled_Write_Cmd(0xF1);//
Oled_Write_Cmd(0xDA);//set com pin configuartion
Oled_Write_Cmd(0x12);//
Oled_Write_Cmd(0xDB);//set Vcomh
Oled_Write_Cmd(0x30);//
Oled_Write_Cmd(0x8D);//set charge pump enable
Oled_Write_Cmd(0x14);//
Oled_Write_Cmd(0xAF);//--turn on oled panel
}
void Oled_Write_Cmd(char dataCmd)
{
// 1. start()
IIC_Start();
// 2. 写入从机地址 b0111 1000 0x78
IIC_Send_Byte(0x78); //???这个0x78是怎么得出来的
// 3. ACK
IIC_ACK();
// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
IIC_Send_Byte(0x00);
// 5. ACK
IIC_ACK();
//6. 写入指令/数据
IIC_Send_Byte(dataCmd);
//7. ACK
IIC_ACK();
//8. STOP
IIC_Stop();
}

清屏函数

void Oled_Clear()
{
unsigned char i,j; //-128 --- 127
for(i=0;i<8;i++){
Oled_Write_Cmd(0xB0 + i);//page0--page7 ??为什么是0xB0,为什么要叫i
//每个page从0列
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
//0到127列,依次写入0,每写入数据,列地址自动偏移
for(j = 0;j<128;j++){
Oled_Write_Data(0);
}
}
}

4.利用OLED来显示文字。



void main()
{
		unsigned char  i;
		//1. OLED初始化
		Oled_Init();
		//2. 选择一个位置
		//2.1 确认页寻址模式
		Oled_Write_Cmd(0x20);
		Oled_Write_Cmd(0x02);
		Oled_Clear();
		//2.2 选择PAGE0   1011 0000
		//								0xB0
		Oled_Write_Cmd(0xB0);
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);
	
		for(i=0;i<16;i++){
			
				Oled_Write_Data(l1[i]);
		}
		for(i=0;i<16;i++){
			
				Oled_Write_Data(p1[i]);
		}
		for(i=0;i<16;i++){
			
				Oled_Write_Data(j1[i]);
		}
		for(i=0;i<16;i++){
			
				Oled_Write_Data(s1[i]);
		}
		for(i=0;i<16;i++){
			
				Oled_Write_Data(g1[i]);
		}
		
		
		Oled_Write_Cmd(0xB1);
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);
		for(i=0;i<16;i++){
			
				Oled_Write_Data(l2[i]);
		}
		for(i=0;i<16;i++){
			
				Oled_Write_Data(p2[i]);
		}
		for(i=0;i<16;i++){
			
				Oled_Write_Data(j2[i]);
		}
		for(i=0;i<16;i++){
			
				Oled_Write_Data(s2[i]);
		}
		for(i=0;i<16;i++){
			
				Oled_Write_Data(g2[i]);
		}
		while(1);
}

5.利用OLED来传入图片信息

void Oled_Show_Image(unsigned char *image)
{
	unsigned char i; //-128 --- 127
unsigned int j;
	for(i=0;i<8;i++){
		Oled_Write_Cmd(0xB0 + i);//page0--page7
		//每个page从0列
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);
		//0到127列,依次写入0,每写入数据,列地址自动偏移
		for(j = 128*i;j<(128 *(i+1));j++){
			Oled_Write_Data(image[j]);
		}
	}
}

C51—OLED屏幕(IIC协议) IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。特点简单性和有效性由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件多主控。 阅读详情

相关推荐

基于51单片机的指纹锁设计(附带密码解锁)

突然在网盘资料里找到了大学毕业设计的资料,非常青涩,但是至少可以用,写出来就当给自己留个纪念。仔细想想,大学上的也不咋地,在校期间也没干啥有意义的事。不过大学四年都一直在做关于单片机的东西,参加了一下学校的机器人队,所以最后就做了一个基于单片机的项目,至于为啥做指纹锁,单纯是因为好奇这个东西。说起系统设计,最开始研究的时候是打算用STM32来写的,最后由于用的proteus软件版本比较低,里面没有stm32的芯片,但是学校还要求必须要有仿真,所以被逼无奈最后用了AT89C52芯片,后期又因为仿真的代码已经敲

隔壁三石哥的博客 1万+

51单片机与Oled显示屏配合显示简单的图片

oled显示图片

杨栋的博客 1518

51单片机IIC初始化与通信代码指南

IIC(Inter-Integrated Circuit),也被称为I2C(读作“I-two-C”),是一种多主机的串行计算机总线,由飞利浦半导体(现为NXP半导体)在1982年引入,主要用于连接低速外围设备到处理器或微控制器的主板上。I2C协议允许设备通过一对双向的串行数据线(SDA)和串行时钟线(SCL)进行通信。

weixin_33557333的博客 808

C51单片机IIC总线通信协议及简单应用例程

首先我们要分清通信协议和通讯协议中的信和讯的含义“通信”仅指数据通信,即通过计算机网络系统和数据通信系统实现数据的端到端传输。通信的“信”指的是信息(Information),信息的载体是二进制的数据,数据则是可以用来表达传统媒体形式的信息,如声音、图像、动画等。“通信”重在传输手段或使用方式,从这个角度,“通信”的概念包括了信息“传输”。因此通信协议主要集中在ISO七层协议中的物理层、数据链路层...

Vuko_Coding Zone 6452

基于C51的单片机IIC总线通信实现详解

经过这一轮深入剖析,我们可以归纳出IIC稳定通信的核心原则:硬件先行:选对上拉电阻,控制好分布电容;时序严谨:Start/Stop/ACK都要符合spec;地址准确:仔细核对Datasheet中的7位地址;异常处理:加入超时、重试、总线恢复机制;工具加持:善用逻辑分析仪快速定位问题。记住一句话:IIC不怕复杂,怕的是马虎。只要你愿意花时间去理解它的每一个细节,哪怕是在资源极其有限的C51平台上,也能构建出高度可靠的通信系统。

weixin_42576186的博客 846

基于51单片机的光强监测系统设计与实现

单片机,又称为微控制器或MCU(Microcontroller Unit),是一种集成电路芯片,它把CPU、RAM、ROM、定时器和I/O端口等集成在一个芯片上,构成一个完整的微型计算机系统。51单片机是早期开发和应用最为广泛的单片机之一,属于8位微控制器,具有简单、易用、成本低廉等优点。PFC8591是一款单片集成的8位模拟至数字转换器,它带有4个模拟输入通道、一个模拟输出通道和一个数字扩展口。这款转换器特别适用于多种传感器信号采集以及对精度和速度要求不高的场合。

weixin_34779181的博客 1036

C51-OLED例程STC89C52:单片机的显示新选择

C51-OLED例程STC89C52:单片机的显示新选择 去发现同类优质开源项目:https://gitcode.com/ C51-OLED例程STC89C52项目的核心功能/场景:适用于STC89C52单片机的OLED显示编程学习与实践。 项目介绍 在单片机开发领域,OLED显示因其低功耗、高对比度和清晰的显示效果而被广泛应用。C51-OLED例程STC89C52项目正是为了满足这一需求而诞生的...

gitblog_06798的博客 374

基于C51单片机+I2C接口0.96英寸OLED显示屏实例源代码+PDF版硬件参考设计原理图.zip

基于C51单片机+I2C接口0.96英寸OLED显示屏实例源代码+PDF版硬件参考设计原理图 /******************************************************************************/ // IIC接口函数声明 /******************************************************************************/ void IIC_Start(void); void IIC_Stop(void); bit IIC_Ack(void); void IIC_Write_Byte(uint8 dataSend); uint8 IIC_Read_Byte(void); void IIC_NoAck(void); /******************************************************************************/ // oled函数声明 /**********************************

学单片机有前途还是嵌入式系统有前途?

就会迷糊。所以一定是学51单片机的结构。和针对51的汇编。学到什么程度呢。能点灯就行了。。不要学的很精。。然后就是周天祥的十天学会单片机C语言。。。OK。。你就到我这个水平了。。。。我的水平就是小学一年级的水平。这半个月来我只会驱动1602CD。视频里的一些视频因为我是电子发烧友电子电子的开发板。所以有点不同。试验基本都做不了。。。但我觉得我能做好。。。因为1602还是被我整会了。。这里还有点建议...

weixin_42976659的博客 1131

ABtest描述统计功效

我们在面试数据分析时,常常会问到如何确定样本量的问题,会有一个指标:统计功效(power),或者是1-β 统计功效会影响实验的可信度,甚至会影响实验所需的样本量,要了解统计功效,首先要理解两类统计错误 假如我们做了一个AB实验,且两组用户的数据均值为μ1和μ2,我们会有两个初始假设: H0:两个实验组的数据没有差别(μ1=μ2),这个假设也叫“零假设”,也叫原假设 H1:两个实验组之间的数据存在差别(μ1≠μ2),这个假设也叫“非零假设”,也叫备择假设 定义两类错误: 实验本身没有效应,但我们觉

qq_38134556的博客 896

别再手动翻译PDF了!手把手教你用Zotero PDF Translate插件搞定外文文献(附最新GitHub下载链接)

本文详细介绍如何利用Zotero PDF Translate插件高效翻译外文文献,包括插件安装、配置及多引擎对比。通过划词翻译、段落翻译和全文翻译功能,显著提升科研工作效率,特别适合处理大量英文PDF文献的研究人员。

weixin_33712987的博客 771

STC89C51学习路线

单片机入门必看。

wwwkkkxxx12138的博客 985

微信内置浏览器抓包全攻略:从ADB配置到Chrome调试(附常见问题解决)

本文提供了一套完整的微信内置浏览器抓包与调试解决方案。从ADB工具的深度配置与稳定性连接开始,详细讲解了如何开启X5内核调试开关,并利用Chrome DevTools建立远程连接。文章重点剖析了Network面板进行网络请求抓取、性能分析和问题定位的实战技巧,并附带了设备连接失败、无网络请求等常见问题的排查指南,帮助开发者高效解决微信H5页面调试难题。

gitlab7runner的博客 541

单片机工程师从零到月薪15K:C语言与STM32实战进阶指南

本文为单片机工程师提供从零基础到月薪15K的实战进阶指南,重点讲解C语言核心与STM32开发。内容涵盖电路基础、51单片机入门、通信协议解析、项目调试技巧及职场面试准备,帮助开发者系统掌握单片机开发技能,实现职业生涯快速成长。

python9snake的博客 145

10xGenomics Loupe Browser实战指南:从数据导入到细胞注释全流程解析

本文提供了10xGenomics Loupe Browser的实战指南,详细解析了从数据导入到细胞注释的全流程。作为一款强大的可视化工具,Loupe Browser能帮助研究者直观探索单细胞测序数据,通过交互式操作进行细胞选择、差异基因分析和细胞类型注释,是单细胞数据分析入门和结果验证的高效平台。

blue42的博客 452

R语言笔记十:独立性检验函数

1.独立性检验函数        独立性检验是根据频数信息判断两类因子彼此相关或相互独立的假设检验。所谓独立性就是指变量之间是独立的,没有关系。 独立性检验算法:卡方检验、Fisher检验、Cochran-Mantel-Haenszel检验 2.假设检验 假设检验(Hypothesis Testing)是数理统计学中根据一定假设条件由样本推断总体的一种方法。 原假设——没有发生 备择假设——发生了 具体做法:根据问题的需要对所研究的总体作

weixin_44384631的博客 4111

E2PROM(AT24C系列)的IIC通信底层原理

iic与eeprom通信 # include"reg51.h" # include"i2c.h" //单片机是主机,AT24C02芯片是从机,其中AT24C02芯片的SCL和SDA //已与硬件连接单片机管脚P21和P20 typedef unsigned int u16; //typedef unsigned char u8; u8 dat; u...

SUR0608的博客 4260

DaVinci Developer和DaVinci Configurator:AutoSAR开发与配置工具

a. 组件创建:DaVinci Developer允许开发人员创建不同类型的AutoSAR软件组件,如应用软件组件(Application Software Component,SWC)、基础软件组件(Basic Software Component,BSWC)等。除了以上功能,DaVinci Developer和DaVinci Configurator还提供了丰富的文档和代码生成功能,以支持开发人员和配置人员进行文档编写、代码生成和文档浏览等任务。用户可以根据具体需求对软件组件进行灵活的配置。

HmoaAmp的博客 2261

每天进步一点点(一)

通过Boot引脚设定,寻找初始地址初始化栈指针__initiala_sp指向复位程序 Reset_Hander设置异常中断HardFault_Handler设置系统时钟SystemInit调用C库函数_main同步通信:I2C半双工,SPI全双工异步通信:RS485半双工、RS232全双工。

qq_41242783的博客 1110

Challenge 4 - OSCP A

在c盘下发现一个windows.old,在里面可以找到SYSTEM和SAM文件,下载到本地,利用samdump2解密发现没解出来,再来试试pwdump.py(https://github.com/CiscoCXSecurity/creddump7)得到压缩包密码bludecode,解压之后发现一个比较特殊的文件configuration.php,里面有两个类似密码的字符串。登录之后在/opt/backups/下发现几个特殊文件,其中sitebackup3.zip是个正常的压缩包。但是这个压缩包是有密码的。

羽的博客 5767

Onnxruntime之YOLOP部署过程记录

魔改YoloP部署过程记录

如果想成为中心,那么就到中心去吧。 1924

嵌入式学习之路

第一种方式 宏定义方式#define 常量名 值注意:不能加分号!!!第二种方式 const 关键字方式const 数据类型 常量名 = 值;数据类型 const 常量名 = 值;== 两种方式的区别==类型检查#define 方式不能进行类型检查const 关键字方式可以进行类型检查执行时机不同#define 方式在预处理阶段进行文本替换const 关键字方式,在程序执行的时候,在内存中分配空间。

qq_45858803的博客 627

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

51单片机之手撸IIC协议,并点亮oled

这里只是写录学习IIC协议遇到的问题,不会对IIC作过多的解释。有兴真的话可以看这篇文章-。

TSC1235的专栏 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于C51单片机的BMP180驱动程序

BMP180是一款气压传感器,直接以数字量的形式表达出气压值,接口是IIC,可以直接挂载在单片机上使用,现在我们使用C51单片机来挂载BMP180进行气压测量 电路连接 LCD1602: 数 程序如下 #include <REG52.H> #include <math.h> #include <stdlib.h> #include <stdio.h> #include <INTRINS.H> #in

狂奔的兔子 5175

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

51单片机常用通信方式之IIC通信(二)

IIC的底层驱动

m0_58832575的博客 1万+

Proteus8仿真:51单片机24C02C(IIC接口EEPROM)使用

**24C02该器件通过IIC总线接口进行操作,有一个专门的写保护功能。用于存储数据,掉电也不丢失数据。** 24C02C引脚作用 引脚 | 作用 -------- | ----- SCK | IIC时钟线 SDA | IIC数据线 WP | 读写保护位,接地关闭读写保护 A0-A2 | 硬件地址更改,接地都为0 >**实验内容:用按键控制计数器增加和减少,然后存入EEPROM内,断电后计数器计数不变。**

darlingqx的博客 4927
上一篇: keil提示“main.c(7): error C231: ‘TL0‘: redefinition”
下一篇: 串口通信实验
CodeThinker66
博客等级 码龄7年 3粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值