Proteus仿真之IIC通信(AT24C02)

news2024/11/15 7:18:22

1.IIC通信简介:IIC是一种利用时钟线SCL和数据线SDA进行数据传输的通信协议。IIC的时序图如下所示:

 

我们需要看懂时序图中开始信号、数据传输、应答信号和停止信号。

开始信号:SCL为高电平时,SDA出现下降沿信号。

数据传输:SCL为低电平时,SDA进行电平转换(对应着数据的二进制表示0/1),然后给SCL一个高电平信号,告诉它开始读数据,读取的数据即为SDA引脚的电平状态。

应答信号:SCL为高电平期间,将SDA线拉低,产生应答信号。主机每传输一个字节的数据后,从机都需要传输一个应答信号,来向主机汇报是否收到了该字节。

停止信号:在SCL为高电平期间,SDA产生一个上升沿信号。

此外,在SCL和SDA电平变换之后,引脚的电平状态需要保持不变一段时间,这个时间是非常短的,并且,产生不同的信号时这个保持不变的时间是不同的,通常可有延时实习(需要精确延时)。具体的信息可以自行查看IIC的数据手册。

主机发送起始信号后,会发出寻址信号。器件的地址信号一般是两种:10位和8位。此处介绍一下8位的地址信号:高7位为地址信号。最后一位R/W为读写选择信号,为0时表示主机接下来对从机进行写操作,为1时表示主机接下来对从机进行读操作。

2.仿真模块主要有:AT89C52、LCD1602(LM016L)、24C02C和排阻(RESPACK-8)。电路图如下:

 仿真代码:

#include <reg52.h>
#include <intrins.h>

#define unchar unsigned char
#define uint unsigned int
	
unchar code dis_table[] = "0123456789";
	
sbit button = P1^2;		//定义按键
sbit lcden = P2^2;		//定义lcd的E端口
sbit lcdrw = P2^1;		//定义lcd的rw端口
sbit lcdrs = P2^0;		//定义lcd的rs端口
sbit SCL = P3^0;			//定义SCL时钟线端口
sbit SDA = P3^1;			//定义SDA数据线端口

//IIC延时函数,延时必须精确,否则无法准确传输
void Delay()
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}

void DelayMs(uint ms)
{
	uint i;
	while(ms--)
	{
		for(i = 110;i > 0;i--)
		{
			;
		}
	}
}

//往LCD1602中写命令
void Write_Com(unchar com)
{
	lcdrs = 0;				//lcdrs为低电平时,选择指令寄存器
	P0 = com;
	DelayMs(5);
	lcden = 1;
	DelayMs(5);
	lcden = 0;
}

//往LCD1602中写数据
void Write_data(unchar date)
{
	lcdrs = 1;				//lcdrs为高电平时,选择数据寄存器
	P0 = date;
	DelayMs(5);
	lcden = 1;				//当lcden由高电平变为低电平时,LCD1602开始执行命令
	DelayMs(5);
	lcden = 0;
}

//LCD1602的初始化函数
void init()
{
	lcdrw = 0;				//lcdrw高电平时为读操作,低电平时为写操作 
	lcden = 0;
	Write_Com(0x38);
	Write_Com(0x0c);
	Write_Com(0x06);
	Write_Com(0x01);
}

//IIC初始化函数
void IIC_init()
{
	SCL = 1;
	Delay();
	SDA = 1;
	Delay();
}

//IIC起始信号函数
void IIC_start()
{
	//当SCL信号为高电平期间,SDA出现下降沿时,就是起始信号
	SDA = 1;
	Delay();
	SCL = 1;
	Delay();
	SDA = 0;
	Delay();
}

//IIC应答信号函数
void IIC_respons()
{
	//在SCL高电平期间,讲SDA线拉低,产生应答信号,表明数据传输成功
	unchar i = 0;
	SCL = 1;
	Delay();
	while(SDA == 1 && (i < 255))
	{
		i ++;
	}
	SCL = 0;
	Delay();
}

//定义停止信号函数
void IIC_stop()
{
	//当SCL在高电平时,SDA产生一个上升沿信号为停止信号
	SDA = 0;
	Delay();
	SCL = 1;
	Delay();
	SDA = 1;
	Delay();
}

//写一个字节函数
void IIC_writebyte(unchar date)
{
	unchar i,temp;
	temp = date;
	for(i = 0;i < 8;i++)
	{
		temp = temp << 1;	//溢出的一位自动保存到寄存器CY中
		SCL = 0;
		Delay();
		SDA = CY;
		Delay();
		SCL = 1;
		Delay();
	}
	SCL = 0;
	Delay();
	SCL = 1;
	Delay();
}

//IIC读一个字节函数
unchar IIC_readbyte()
{
	unchar i,Data;
	SCL = 0;
	Delay();
	SDA = 1;
	for(i = 0;i < 8;i++)
	{
		SCL = 1;
		Delay();
		SDA = 1;
		Data = (Data << 1) | SDA;
		SCL = 0;
		Delay();
	}
	Delay();
	return Data;
}

//往AT24C02的地址中写数据
void Write_add(unchar date,unchar address)
{
	IIC_start();
	IIC_writebyte(0xa0);
	IIC_respons();
	IIC_writebyte(address);
	IIC_respons();
	IIC_writebyte(date);
	IIC_respons();
	IIC_stop();
}

//从AT24C02的地址中读数据
unchar Read_add(unchar address)
{
	unchar date;
	IIC_start();
	IIC_writebyte(0xa0);		//AT24C02的地址为0xa0时是写入
	IIC_respons();
	IIC_writebyte(address);
	IIC_respons();
	IIC_start();
	IIC_writebyte(0xa1);		//AT24C02的地址为0xa1时是读
	IIC_respons();
	date = IIC_readbyte();	//将数据读取到date中
	IIC_stop();							//停止信号
	return date;
}

//显示数字函数
void display(unchar date)
{
	Write_Com(0x80);
	Write_data(dis_table[date/100]);						//显示百位
	Write_data(dis_table[date%100/10]);					//显示十位
	Write_data(dis_table[date%10]);							//显示个位
}

void main()
{
	unchar num,NUM;
	init();
	IIC_init();
	
	while(1)
	{
		if(button == 0)
		{
			DelayMs(10);
			if(button == 0)
			{
				num = Read_add(0x00);
				num ++;
				Write_add(num,0x00);	//将num写入到0x00地址处
			}
			while(button == 0)
			{
				;
			}
		}
		NUM = Read_add(0x00);			//将0x00处的数据读取出来
		display(NUM);
	}
}

3.运行结果:

4.总结:IIC在数据传输时,需要在SCL高电平期间使SDA保持稳定,读取数据;在SCL为低电平期间,SDA才能进行高低电平转换。 IIC最主要的是SCL和SDA,通过SCL和SDA组合,完成不同的功能。当然,如何使用这些组合功能需要读懂IIC的数据手册。

本文中只是简单介绍了IIC的基本原理和使用方法,读者如需要进一步理解IIC可查看其数据手册。本文中使用是软件模拟IIC通信,使用软件模拟IIC通信的好处之一是方便移植。同样的IIC代码,移植其他的开发板上只需要修改一下引脚即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++类和对象(封装)

4、类和对象 C面向对象的三大特性为&#xff1a;封装、继承、多态 C认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 例如: 人可以作为对象&#xff0c;属性有姓名、年龄、身高、体重...&#xff0c;行为有走、跑、跳、吃饭、唱歌...车也可以作为对象&#xff0c;属性…

python带你制作自动点赞小程序,让我看看谁还在呆呆的手动点赞

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 知识点: 动态数据抓包 requests发送请求 开发环境: 代码所使用软件工具&#xff1a; python 3.8 >>>>>> 运行代码 pycharm 2022.3 >>>>>> 辅助敲代码 需下载的第三方模块&a…

【微信公众平台对接】有关上传pdf到微信

1、微信文档说明 ps:有关微信的一些文档说明我真的是服了&#xff0c;这个文档&#xff0c;抛出来看的人真的是一头雾水&#xff0c;算了&#xff0c;我也不做过多评判&#xff1b;下面看我调用的示例代码 2、示例代码 /*** 上传pdf* https://api.weixin.qq.com/card/invoice…

HTML+CSS实训——Day13——学习MySQL

前言 已经过去三周了&#xff0c;现在是第四周&#xff0c;之前所有的数据都是在本地的&#xff0c;还没有学到数据库&#xff0c;这周开始使用数据库了。 我自用的是navicat 连接服务器 我们新建一个连接&#xff0c;写上主机和端口号&#xff0c;再写上用户名和密码就可以…

【新版】系统架构设计师 - 计算机系统基础知识【补充】

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 计算机系统基础知识【补充内容】计算机语言多媒体系统工程霍尔的三维结构切克兰德方法并行工程方法综合集成法WSR&#xff08;物理-事理-人理&#xff09;系统方法系统工程生命周期7阶段生命周期方…

23年软件测试前景和出路?新人入行测试怎样走“正确“的路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 现在面试&#xf…

Java IO 学习总结(一)输入流/输出流

前言&#xff1a; 学习IO流&#xff0c;记录并分享。文章如有错误&#xff0c;恳请指正。 Java IO流的类图&#xff1a; 1、什么是 Java IO 流&#xff1f; 数据传输是需要通道的&#xff0c;而IO流就是数据传输的通道。IO流可以形象比喻为运送货物的传输带。运送的货物就是…

电子蜡烛灯单片机开发方案

LED蜡烛灯可以像真正的蜡烛一样发出舒适的闪烁光&#xff0c;具有仿真蜡烛效果&#xff0c;适合在一些聚会或庆祝活动中使用。宇凡微推出的低成本LED蜡烛灯IC方案&#xff0c;根据不同电子蜡烛灯方案&#xff0c;主控芯片推荐使用YF单片机。 LED蜡烛灯是有孩子的家庭很好蜡烛替…

【51单片机疑难杂症】:基于普中科技51单片机-A3型号开发板 ds18b20温度传感器和ds1302时钟芯片(板载)冲突现象的解答

项目场景&#xff1a; 当使用普中科技A3型号&#xff0c;准备开发板载的ds1302和温度ds18b20,出现了两者不能共用的问题&#xff0c;以下是问题记录与解答&#xff0c;大家如果觉得有用&#xff0c;请关注点赞哦。谢谢大家。 问题描述 基于普中科技51单片机-A3型号开发板 ds18b…

js 给图片添加水印

如何在图片上添加水印&#xff1f; 1、把图片或者图片文件转成image元素 2、把转成的image转成canvas 3、在生成的canvas中添加水印 先看效果 1、把图片或者图片文件转成image元素 function urlToImg(url) {return new Promise((resolve, reject) > {const img new Image(…

如何实现在线书签内容替换

书签广泛应用于企业的各种办公自动化业务场景中。例如&#xff1a;在范式合同模板中将甲乙方书签自动替换成具体的公司名称&#xff1b;在红头文件模板中将红头标题书签替换成具体的行政指令&#xff1b;在各种协议模板中将协议日期书签替换为当前日期&#xff1b;等等。 在这…

低代码赛道拥挤 生态聚合成为破局关键

在云计算和移动互联网的强劲推动下&#xff0c;企业数字化转型的步伐正在加速&#xff0c;对于软件应用开发的需求也呈现出爆发式的增长。这样的背景下&#xff0c;低代码平台凭借其独特的优势迅速崛起并引发了业界的广泛关注。 自2020年以来&#xff0c;低代码领域已成为投资…

5年测试岗,自动化测试经验总结(真实)他的测试之路高歌猛进...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 8年测试工程师的自…

软考A计划-2023系统架构师-知识点集锦(2/4)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

26键 or 九宫格?不论哪个都不耽误黑客们窃取你的信息!

我妈找我说&#xff0c;可以邮寄杨梅了。我二话不说&#xff0c;直接开始给她我的邮寄地址。快速输入的地址让我想到一个问题&#xff0c;现在的输入法是不是知道的太多了&#xff1f; 我只要打出“浙江省杭州市”&#xff0c;联想出来的就是我所在的市区和街道&#xff0c;下…

【git切换分支/tag】git stash保存暂不提交的更改

目录 问题git stash使用方法git stash pop 还原修改 git stash使用、修改指定tag的代码 其他git指令 问题 情景&#xff1a;分支1上开发新功能&#xff0c;临时切换到其他分支或tag上修改bug。 1、直接切换&#xff1a;如果没有冲突&#xff0c;分支1的修改会带到要切换的分支…

Python-深入不出的字符串

深入不出的字符串 字符串是由独立字符组成的一个序列&#xff0c;通常包含在单引号&#xff08;‘’&#xff09;双引号 &#xff08;“”&#xff09;或者三引号之中&#xff08;‘’’ ‘’或"“” “”"&#xff0c;两者一样&#xff09;&#xff0c;比如下面几种…

感觉被榨干了,被美团拷打一小时...

普通本科毕业后&#xff0c;进了一家互联网公司&#xff0c;这几年里不断在积累经验&#xff0c;最终选择跳到美团&#xff0c;涨薪了50%&#xff0c;下面分享一下我个人的面经和一些心得建议。 面经 面团一面 自我介绍专业技能一条条核对下来 有软件测试流程、用例设计方法…

Layui项目实战

使用语言&#xff1a;C#&#xff0c;Js&#xff0c;Html 使用框架&#xff1a;MVC&#xff0c;Layui 使用插件&#xff1a;JQuery&#xff0c;Layui 一.Layui父窗体前端代码&#xff1a; 1.Html代码&#xff1a; <div class"layui-col-md12" style"paddin…

如今做泛娱乐出海,你需要融云《社交泛娱乐出海作战地图》

出海需要的从来都不是上头&#xff0c;而是专业。关注【融云全球互联网通信云】了解更多 星期四的下午&#xff0c;笔者收到了一份特殊的“投喂”——一份详实到出乎意料的《社交泛娱乐出海作战地图》&#xff08;下称《作战地图》&#xff09;。 内容上&#xff0c;它覆盖了从…