IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于proteus仿真的单片机IIC(I2C)通信(超详细) -> 正文阅读

[嵌入式]基于proteus仿真的单片机IIC(I2C)通信(超详细)

目录???????

一、前言

二、结构

1、硬件连接

?2、时序图

?3、程序流程

?三、仿真案例

?说明:

原理图

?代码

结果

参考


一、前言

? ? ? ? IIC即Inter-IntegratedCircuit(集成电路总线),是一种多向控制总线,由飞利浦半导体公司在八十年代初设计,主要是用来连接整体电路(ICS)。在IIC中,多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实施数据传输的控制源,这种方式简化了信号传输总线。具有接口小、控制简单、器件封装型式小、通信速率较高等特点。

二、结构

1、硬件连接

?2、时序图

?3、程序流程

?三、仿真案例

?说明:

本仿真案例是用51单片机和存储芯片24C02C进行。所要实现的功能是在芯片的一个位写入数据,然后从该位读取数据,并写入另外一个位上。

原理图

?代码

 #include"reg51.h"
 #include"intrins.h"
 #define uc unsigned char

 sbit SDA = P1^0;
 sbit SCL = P1^1;

 bit NackFlag;      //定义非应答标志

 void delay()	   //微秒延时,大概5us
 {
 	_nop_();
	_nop_();
	_nop_();
	_nop_();
 }

 void delayxms(uc count)	//毫秒延时函数
 {
 	uc i,j;
	for(i=0;i<count;i++)
	{
		for(j=0;j<120;j++)
		;
	}
 }


 void i2_start(void)	  //启动I2C通信
 {
 	 SDA = 1;
	 SCL = 1;
	 delay();
	 SDA = 0;
	 delay();
	 SCL = 0;
 }

 void i2_stop(void)		  //停止I2C通信
 {
 	SDA = 0;
	SCL = 1;
	delay();
	SDA = 1;
	delay();
	SCL = 0;
 }

 void checkACK(void)	   //应答检查
 {
 	SDA = 1;
	SCL = 1;
	NackFlag = 0;
	if(SDA==1)
	{
		NackFlag = 1;
	}
	SCL = 0;
 }

 void send8Bit(uc num)		 //发送一个8位数据子函数
 {
 	uc i = 8;
	uc temp;
	temp = num;
	for(i=8;i>0;i--)
	{
		SDA=temp&0x80;      //根据IIC协议,应该从最高位开始发
		SCL= 1;				//&是与运算符。temp&0x80:表示取temp的最高位。0x80 = 1000 0000
		delay();
		SCL=0;
		temp=temp<<1;		//temp左移移位,0补空位。如temp=1010 0010 左移后temp=0100 0100
	}
 }

 void sendByte(uc addr,uc num)	 //写数据函数
 {
 	i2_start();
	send8Bit(0xa0);		//单片机寻找芯片
	checkACK();			//检查应答信号
	send8Bit(addr);		//确定器件存储位地址
	checkACK();
	send8Bit(num);		//写数据
	checkACK();
	i2_stop();
	delayxms(10);
 }

 uc read8Bit()			 //读8位数据子函数
 {
 	uc i,k;
	SCL = 0;
	delay();
	SDA = 1;
	for(i=0;i<8;i++)
	{
		SCL = 1;
		delay();
		k=(k<<1)|SDA;	  //从最高位读取。(k<<1)|SDA:k先左移一位,然后与SDA按位或
		SCL = 0;
		delay();
	}
	delay();
	return k;
 }

 uc readByte(uc addr)	 //读取数据函数
 {
 	uc data_;
 	i2_start();
	send8Bit(0xa0);		//单片机寻找芯片
	checkACK();
	
	send8Bit(addr);
	checkACK();

	i2_start();
	
	send8Bit(0xa1);		//器件地址+1 ,这是一个读取数据的控制命令字
	checkACK();

	data_ = read8Bit();
	checkACK();

	i2_stop();
	delayxms(10);
	return data_;
 }
 void main()
 {

	uc read_data,i;  //定义要放在最前面

	for(i=0;i<0xff;i++)
	{
		sendByte(i,0);	 //将芯片所有位 置0
		delayxms(5);
	}

	sendByte(0,11);	 //在第0个位置写入0x0B
	delayxms(5);

//	uc test;
	read_data=readByte(0);	 //读取第0个位置的数据
	delayxms(5);

	sendByte(3,read_data);	 //将读取的数据写入到第3个位置
	delayxms(5);

	sendByte(5,read_data);	 //将读取的数据写入到第5个位置
	delayxms(5);
	
	while(1);
 }

结果

测试所用文件进入我的博客下载

参考

【1】新概念51单片机C语言教程.入门、提高、开发;郭天祥

【2】https://www.docin.com/p-2056151540.html

【3】https://mp.weixin.qq.com/s/tQUrlcUovIEUyVeg211e5A

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:39:31  更:2021-07-24 11:42:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:43:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码