基于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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

维度攻城狮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值