当前位置:    首页  虚拟仿真实验平台
I2C存储器读写实验
发布部门:  发布时间: 2017-07-25  浏览次数: 146

实验项目名称:

I2C存储器读写实验

项目介绍:

课程性质及背景:

本课程是测控技术与仪器专业的主干专业课,是一门实践性、应用性较强的课程。通过介绍智能仪器的特点、技术标准、发展概况、基本构成和先进控制技术,使学生掌握智能仪器的分析、设计、控制及选型等工作所需基本知识和技术。

实验课程特点及必要性:

实验教学是本课程的重要环节,是课堂教学的加强与提高,要充分重视学生综合能力的培养,利用实验结果和数据,分析系统的性质,提高学生的设计能力和解决实际问题能力。

项目目的:

1)熟悉I2C存储器24C01的工作原理及工作时序;

2)掌握I2C总线的工作原理及时序的软件实现方法。

面向理论课程:

智能仪器仪表设计

面向专业:

测控技术与仪器、车辆

仪器硬件设备及软件环境:

1)Proteus仿真软件1套;

2)Keil C51编程软件1套;

3)PC机1台;

实验项目功能及效果:

实验内容或任务:

利用Proteus环境,以I2C存储器24C01为例,绘制相应电路原理图,并根据 24C01存储器的读写时序编写数据读写程序,把数据先写入24C01的30H~3FH中,然后再读到系统内存60H~6FH单元中。

实验效果:

1)打开Proteus绘制电路图

2)打开Keil C51建立工程,参数设置

3)编辑源程序

4)运行和调试程序

I2C存储器读写实验C源程序

#include <regx52.h>

#include <stdio.h>

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//各数字的数码管段码(共阴)

//==============I2C, Define==============================================

sbit scl=P2^7;

sbit sda=P2^6;

bit flag;//应答位

//=========================延时,I2C时序用

void delay(void)//延时子程序

{

uchar i;

for(i=0;i<6;i++);

;

}

//=========================I2C模拟时序部分

void I_start(void)//发送I2C总线起始条件子程序

{

sda=1;

scl=1;

delay();

sda=0;

delay();

scl=0;

}

void I_stop(void) //I2C总线停止条件子程序

{

sda=0;

scl=1;

delay();

sda=1;

delay();

}

bit ACK_check(void) //应答位检查子程序

{

bit flag;

sda=1;//ready for receiving ACK

scl=1; //start receiving ack

delay();

if(sda==0)

flag=0;

else

flag=1;

scl=0;

return(flag);//return ACK or NACK

}

void I_send(uchar I_data) //字节数据发送子程序,每发送一字节后要调用一次ACK_check子程序

{

uchar i;

for(i=0;i<8;i++)

{

sda=(bit)(I_data&0x80);//高位在先

I_data=I_data<<1;

scl=1;

delay();

scl=0;

}

}

void ACK_send(void) //发送应答位子程序

{

sda=0;//发送ACK

scl=1;

delay();

scl=0;

}

void NACK_send(void) //发送应答位子程序

{

sda=1;//发送NACK

scl=1;

delay();

scl=0;

}

uchar I_receive(void) //字节数据接收子程序,每取一字节要发送一个应答/非应答信号

{

uchar i;

uchar I_data=0;

sda=1;

for(i=0;i<8;i++)

{

scl=1;

delay();

I_data*=2;//等同于I_data=I_data<<1;

if(sda==1)

I_data++;

scl=0;

}

return(I_data);

}

//N字节数据发送子程序

//slave:器件寻址命令字

//subaddr:器件内部子地址

//num:欲发送字节数

//p_date:发送缓冲区首地址

void I_Nsend(uchar slave,uchar subaddr,uchar num,uchar *p_data)

{

uchar i;

bit flag;

//发送器件寻址命令字

I_start();

I_send(slave);

flag=ACK_check();

if(flag==1)

{

printf(%s,Send Slave NACK);

return;

}

//发送器件内部子地址

I_send(subaddr);

flag=ACK_check();

if(flag==1)

{

printf(%s,Send Subaddr NACK);

return;

}

//发送数据

for(i=0;i<num;i++)

{

I_send(*p_data);

flag=ACK_check();

if(flag==1)

{

printf(%s,Send Date NACK);

return;

}

p_data++;

}

I_stop();

}

//N字节数据接收子程序

//slave:器件寻址命令字

//num:欲接收字节数

void I_Nreceive(uchar slave,uchar num,uchar *p_data) //欲指定读取地址则需要先调用发送程序发送subaddr

{

uchar i;

bit flag;

//发送器件寻址命令字

I_start();

I_send(slave);

flag=ACK_check();

if(flag==1)

{

printf(%s,Send Slave NACK);

return;

}

//接收数据===============

for(i=num;i>0;i--)

{

*p_data=I_receive();

if(i>1)

{

ACK_send();

p_data++;

}

else

NACK_send();

}

I_stop();

}

//============================================================================

//延时

void DelayMS(uint ms)

{

uchar i;

while(ms--) for(i=0;i<120;i++);

}

//显示

void Display_Result(void)

{

P2=0xfe;

P0=0x77;//A

DelayMS(300);

P2=0xfd;

P0=0x39;//显示小数点,分割分和秒

DelayMS(300);

P2=0xfb;

P0=0x73;

DelayMS(300);

}

//主程序

void main()

{

uchar i;

uchar p_send[16];//定义发送缓冲区

uchar p_read[16];//接收缓冲区

uchar slave;//器件寻址命令字

uchar subaddr;//器件内部子地址

uchar num;//发送或接收字节数

for(i=0;i<16;i++)

p_send[i]=i;

slave=0xa0;//24C01C地址字,写操作

subaddr=0x30;//目标地址

num=16;//字节数

I_Nsend(slave,subaddr,num,p_send);//写操作

DelayMS(20);

slave=0xa1;//24C01C地址字,读操作

I_Nreceive(slave,num,p_read);//读操作

while(1)

{

Display_Result();

}

}


备注

要求学生有C语言编程能力



联系方式 网站地图 留言板
李立伟设计
地址:郑州市东风路5号郑州轻工业学院机电工程学院    邮编:450002    电话:0371-63556785