• 大小: 40.94 KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2024-11-03
  • 语言: 其他
  • 标签: 24C02  24C04  24C08  

资源简介

proteus_24C08—有注释(proteus里面使用的是24c02)(注释比较全面,适合初学者)

资源截图

代码片段和文件信息

/**************************************************************************************
*使用24C08的时候,只要使用下面这两个函数即可
*uchar read_e2p(uint address):在24c02中的某地址读取一个字节
*void write_e2p(uchar chuint address):在24c02的某地址写入一字节ch
******************************************************************************************/
#include 
#include 
/***定义数据类型*****/
#define uchar unsigned char 
#define uint  unsigned int
#define ulong unsigned long
#define delay5NOP() {_nop_();_nop_();_nop_();_nop_();_nop_();}
/*********由于使用的是24C08,所以有四个地址****/
#define WriteDeviceAddress 0xa0 //定义器件在IIC总线中的地址
#define WriteDeviceAddress1 0xa2
#define ReadDviceAddress 0xa1
#define ReadDviceAddress1 0xa3
/*******定义管脚******/
sbit SCL=P2^0;//24C08的管脚6连接的连线
sbit SDA=P2^1;//24C08的管脚5连接的连线
sbit BUTTON=P1^0;
/***定时函数***/
void DelayMs(uint number) 
{
uchar temp;
for(;number!=0;number--) 
{
for(temp=112;temp!=0;temp--);
}
}
/**************
*IIC总线的开始位
*****************/
void Start() 
{
SDA=1;
delay5NOP();
SCL=1;
delay5NOP();
SDA=0;//在SCL高电位的时候,数据线由高变低
delay5NOP();
SCL=0;
}
/*****************
*IIC总线的结束位
****************/
void Stop() 
{
SCL=0;
delay5NOP();
SDA=0;
delay5NOP();
SCL=1;//在SCL高电位的时候,数据线由低变高
delay5NOP();
SDA=1;
}
/**************
*测试位:用于检查24C08这个器件有没有收到数据
**************/
bit TestAck() 
{
bit ErrorBit;
SDA=1;
delay5NOP();
SCL=1;//SDA和SCL同时拉高,看看SDA会不会被24C08给拉低了
delay5NOP();
ErrorBit=SDA;
SCL=0;
return(ErrorBit);//如果这时的ErrorBit是低电位的时候,说明是正确的
}
/********************
*这个函数和TestAck() 是一样的,只是TestAck() 有错误返回
*********************/
void NoAck() 
{
SDA=1;
delay5NOP();
SCL=1;
delay5NOP();
SCL=0;
}
/********************
*传输8个数据到24C08上面去
******************/
Write8Bit(uchar input) 
{
uchar temp;
for(temp=8;temp!=0;temp--) 
{
SDA=( bit )( input&0x80 );//这里采用强制转换的方式,数据被强制转换成bit的形式
//8位数据被强制转化成bit后,只保留最高位
SCL=1;
delay5NOP();
SCL=0;//数据准备好后,在SCL的下降沿读入数据
input=input<<1;//继续分解这个8位数
}
}
/*********************
*指定一个地址,对这个地址写入一个数
**********************/
void write_e2p(uchar chuint address) 
{
Start();
if(address<256)
{
Write8Bit(WriteDeviceAddress);//24C08器件的地址,可以理解为24C08的一个block
TestAck();
Write8Bit(address);//写入这个block具体的地址
TestAck();
}
else
{
Write8Bit(WriteDeviceAddress1);
TestAck();
Write8Bit(address-256);
TestAck();
}

Write8Bit(ch);//对这个地址写入一个数据
TestAck();

Stop();
DelayMs(10);//这个延时是为了防止两次调用write_e2p的间隔太短,而导致数据重叠
}
/******************************
*从24C08读出8个bit的数据
***************************/
uchar Read8Bit() 
{
uchar tempread_byte=0;
for(temp=8;temp!=0;temp--) 
{
SCL=1;
read_byte <<= 1;
read_byte |= SDA;//对位进行强制转换成uchar后,高位全为零,只有最低位才是“这个bit”
SCL=0;
}
return( read_byte );
}
/**************************
*指定一个地址,并从这个地址里面读出一个数,返回这个数
************************/
uchar read_e2p(uint address) 
{
uchar ch;

Start();

if(address<256)
{
Write8Bit(Write

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

     文件        517  2010-04-11 11:44  24C08\24c08.plg

     文件       4088  2010-04-11 11:43  24C08\main.c

     文件         26  2010-04-11 11:43  24C08\24c08.lnp

     文件      10377  2010-04-11 11:43  24C08\24c08.M51

     文件       1035  2010-04-11 11:43  24C08\24c08.hex

    .......         0  2010-04-11 10:11  24C08\24c08_Uv2.Bak

     文件       2158  2010-04-11 11:43  24C08\24c08.Uv2

     文件       1261  2010-04-11 11:43  24C08\24c08.Opt

     文件     110390  2010-04-11 10:45  24C08\Last Loaded 24C08.DBK

     文件     114420  2010-04-11 11:43  24C08\24C08.DSN

     文件       1507  2010-04-11 11:44  24C08\24C08.PWI

     文件       8823  2010-04-11 11:43  24C08\main.LST

     文件       9237  2010-04-11 11:43  24C08\main.OBJ

     文件       8413  2010-04-11 11:43  24C08\24c08

     目录          0  2010-04-10 21:31  24C08

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

               272252                    15


评论

共有 条评论