• 大小: 60KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-11
  • 语言: C/C++
  • 标签: 24C16  单片机  C51  PROTEUS  

资源简介

此程序为C51编写的24C01-24C16读写驱动程序,晶振22.1148,如果是其他的晶振,需要更改其中的两个延时函数,要保证1MS和5US的延时,在调用其中的write函数后,最好是延时10MS以上,否则容易失败,我最初就是这个地方延时时是5MS始终失败,搞了很久,后来把这个地方更改以后就成功了.在其中包括了一个PROTEUS仿真电路,运行时首先会写入一个字节到24C02中,然后读出取反给P1显示,显示结果是01100110B,中间间隔2个LED亮,2个不亮.

资源截图

代码片段和文件信息

	  #include “reg52.h“
#include “intrins.h“
#define uchar unsigned char
#define uint unsigned int

sbit sda=P0^1;//;模拟I2C 数据传送位
sbit scl=P0^0;//;模拟I2C 时钟控制状态标志

void delay1(uint z)//延时为 1ms

unsigned char abc;
for(c=0;c     for(b=80;b>0;b--)
        for(a=10;a>0;a--);


void delay()//5us延时
{
    unsigned char a;
    for(a=3;a>0;a--);
}

void star()//开始
{
sda=1;
delay();//5us延时
scl=1;
delay();//5us延时
sda=0;
delay();//5us延时

}

void stop()//停止
{
sda=0;
delay();//5us延时
scl=1;
delay();//5us延时
sda=1;
delay();//5us延时

}

void ack()//应答
{ uchar z=0;
while((sda==1)&&(z<50))z++;//条件判断, sda=1,则没有应答。如果没有应答则延时:z<50,z++;后返回
scl=0;
delay();//5us延时
}

///写一个数据函数
//器件写地址 slave_write_address
//字节地址 byte_address
//待写入数据 data_data
void write(uchar slave_write_addressuchar byte_addressuchar data_data)//写一个数据
{
uchar temptemp1iii;

star();//开始

for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据

if(ii==0)
{
temp=slave_write_address;//送 器件写地址
temp1=slave_write_address;
}
else if(ii==1)
{
temp=byte_address;//送 字节地址
temp1=byte_address;
}
else if(ii==2)
{
temp=data_data;//送 数据
temp1=data_data;
}


for(i=0;i<8;i++)
{
scl=0;
delay();//5us延时
temp=temp1;
temp=temp&0x80;// 相 与 后,把不相关的位清零

if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1

sda=1; 
else
sda=0;

delay();//5us延时
scl=1;
delay();//5us延时
scl=0;
delay();//5us延时
temp1=temp1<<1;//向左移出1位

}
sda=1;
delay();//5us延时
scl=1;
delay();//5us延时
ack();
}
stop();//停止
}

///读一个数据函数
//器件写地址 slave_write_address
//器件读地址 slave_read_address
//字节地址 byte_address
//读出的数据 data_data

uchar read(uchar slave_write_addressuchar byte_addressuchar slave_read_address)//读一个数据
{
uchar temptemp1iiixdata_data;

star();//开始

for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址

if(ii==0)
{
temp=slave_write_address;//送 器件写地址
temp1=slave_write_address;
}
else if(ii==1)
{
temp=byte_address;//送 字节地址
temp1=byte_address;
}
else if(ii==2)

star();//开始

temp=slave_read_address;//送 器件读地址
temp1=slave_read_address;
}

 

for(i=0;i<8;i++)//开始读数据
{
scl=0;
delay();//5us延时
temp=temp1;
temp=temp&0x80;// 相 与 后,把不相关的位清零

if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1

sda=1; 
else
sda=0;

delay();//5us延时
scl=1;
delay();//5us延时
scl=0;
delay();//5us延时
temp1=temp1<<1;//向左移出1位
}
sda=1;
delay();//5us延时
scl=1;
delay();//5us延时
ack();//应答
}

for(x=0;x<8;x++)
{
data_data=data_data<<1;//向左移入1位

sda=1;
delay();//5us延时
scl=0;
delay();//5us延时
scl=1;
delay();//5us延时

if(sda==1)//判断 数据线是否是高电平
data_data|=0x01;//把读到的数据 或 0X01 
//else 
//data_data|=0x00;
}
ack();//应答
stop();//停止
return data_data;//返回读到的数据

}

void main()


write(0xa00xff0x66);//向器件写一个数据:(0xa0 是器件写地址;0xff 是字节地址;0x66 是待写入的数据)

delay1(30);//写与读的时间间隔应大于10ms取决于器件 24C02的响应速度

//向器件读一个数据
//把读出的数据送 P1口显示
P1=~read(0xa00xff0xa1);//向器件读一个数据:(0xa0 是器件写地址;0xff 是字节地址;0xa1 是器件读

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       7905  2010-08-13 16:04  24c02-16

     文件       3521  2010-08-13 16:04  24c02-16.c

     文件       8224  2010-08-13 16:04  24c02-16.OBJ

    .......     13421  2010-08-13 16:04  24c02-16.uvproj

     文件       1041  2010-08-13 16:04  24c02-16.hex

     文件         64  2010-08-13 16:04  24c02-16.lnp

     文件       7538  2010-08-13 16:04  24c02-16.LST

     文件      12704  2010-08-13 16:04  24c02-16.M51

    .......     56644  2010-08-13 16:04  24c02-16.uvopt

    .......     57622  2010-08-11 08:40  24c02-16_uvopt.bak

    .......     13421  2010-08-10 23:19  24c02-16_uvproj.bak

     文件      99723  2010-08-13 16:04  24c64.DSN

     文件        885  2010-08-13 16:04  24c64.PWI

     文件         19  2010-08-11 08:40  ExtDll.iex

     文件      99700  2010-08-11 08:40  Last Loaded 24c64.DBK

     文件        749  2010-08-13 16:04  STARTUP.OBJ

     文件       6376  2009-05-07 14:37  STARTUP.A51

     文件      14048  2010-08-13 16:04  STARTUP.LST

     文件       1002  2010-08-13 16:04  24c02-16.plg

----------- ---------  ---------- -----  ----

               404607                    19


评论

共有 条评论