0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C51读写AT24C04源代码及AT24C04测试程序

ss 来源:网络整理 2018-04-04 12:01 次阅读

一、C51读写AT24C04源代码

/*=============================================*/

/*;***********************************/

/*;起动24C01时序*/

void Start()

{

SCL=1;

SDA=1;

SDA=0;

SCL=0;

}

/*;************************************/

/*;停止24C01时序*/

void Stop()

{

SDA=0;

SCL=1;

SDA=1;

}

/*;**************************************/

/*;检测24C01的响应信号*/

bit ACK()

{

bit c;

SDA=1;

SCL=1;

c=SDA;

SCL=0;

return c;

}

/*;************************************/

/*;往24C01发一8位数据*/

void SendChar(unsigned char ch)

{

unsigned char i;

i=8;

do

{

SDA=(ch&0x80);

SCL=1;

SCL=0;

ch《《=1;

}while(--i!=0);

}

/*;**************************************/

/*;从24C01接收一8位数据*/

unsigned char RecChar()

{

unsigned char i,j;

i=8;

do

{

SCL=1;

j=(j《《1)|SDA;

SCL=0;

}while(--i!=0);

return j;

}

//;**************************************

/*;********************************/

/*;往24C01写一字节*/

void WriteChar(unsigned int addr,unsigned char ch)

{

unsigned char c;

c=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|c);

ACK();

SendChar(addr);

ACK();

SendChar(ch);

ACK();

Stop();

// for(addr=4;addr!=0;addr--)

for(ch=0xff;ch!=0;ch--) ;

}

//;**************************************

/*;********************************/

/*;往24C01写多字节*/

void WriteBuf(unsigned int addr,unsigned char idata *buf,unsigned char count)

{

unsigned char c;

c=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|c);

ACK();

SendChar(addr);

ACK();

do

{

SendChar(*buf++);

ACK();

if(count!=1)

{if(((++addr)&0x7)==0)

{

Stop();

for(c=0xff;c!=0;c--) ;

c=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|c);

ACK();

SendChar(addr);

ACK();

}

}

else

{

Stop();

for(c=0xff;c!=0;c--) ;

}

}while(--count!=0);

}

/*;**********************************/

/*;从24C01读一字节*/

/*;入口:R0中为要读出内容的地址*/

/*;出口:A中为读到的内容*/

unsigned char ReadChar(unsigned int addr)

{

unsigned char ch;

ch=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|ch);

ACK();

SendChar(addr);

ACK();

Start();

SendChar(0xa1|ch);

ACK();

ch=RecChar();

Stop();

return ch;

}

/**********************************/

/*至少读2字节*/

void ReadBuf(unsigned int addr,unsigned char idata *buf,unsigned char count)

{

unsigned char ch;

ch=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|ch);

ACK();

SendChar(addr);

ACK();

Start();

SendChar(0xa1|ch);

ACK();

count--;

do

{

*buf++=RecChar();

SDA=0;

SCL=1;

SCL=0;

SDA=1;

}while(--count!=0);

*buf=RecChar();

Stop();

}

二、AT24C04测试程序

/**************************************

芯片 : STC12C5A60S2 (1T)

工作频率: 12.000MHz

**************************************/

#include “REG51.H”

#include “INTRINS.H”

typedef unsigned char BYTE;

typedef unsigned short WORD;

sbit SCL = P3^4; //AT24C04的时钟

sbit SDA = P3^5; //AT24C04的数据

BYTE BUF[16]; //数据缓存区

BYTE code TESTDATA[] =

{

0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,

0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF

};

void Delay5us();

void Delay5ms();

void AT24C04_Start();

void AT24C04_Stop();

void AT24C04_SendACK(bit ack);

bit AT24C04_RecvACK();

void AT24C04_SendByte(BYTE dat);

BYTE AT24C04_RecvByte();

void AT24C04_ReadPage();

void AT24C04_WritePage();

void main()

{

AT24C04_WritePage();

Delay5ms();

AT24C04_ReadPage();

while (1);

}

/**************************************

向AT24C04写1页(16字节)数据

将TESTDATA开始的16个测试数据写如设备的00~0F地址中

**************************************/

void AT24C04_WritePage()

{

BYTE i;

AT24C04_Start(); //起始信号

AT24C04_SendByte(0xa0); //发送设备地址+写信号

AT24C04_SendByte(0x00); //发送存储单元地址

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

{

AT24C04_SendByte(TESTDATA[i]);

}

AT24C04_Stop(); //停止信号

}

/**************************************

从AT24C04读取1页(16字节)数据

将设备的00~0F地址中的数据读出存放在DATA区的BUF中

**************************************/

void AT24C04_ReadPage()

{

BYTE i;

AT24C04_Start(); //起始信号

AT24C04_SendByte(0xa0); //发送设备地址+写信号

AT24C04_SendByte(0x00); //发送存储单元地址

AT24C04_Start(); //起始信号

AT24C04_SendByte(0xa1); //发送设备地址+读信号

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

{

BUF[i] = AT24C04_RecvByte();

if (i == 15)

{

AT24C04_SendACK(1); //最后一个数据需要会NAK

}

else

{

AT24C04_SendACK(0); //回应ACK

}

}

AT24C04_Stop(); //停止信号

}

/**************************************

延时5微秒(STC12C5A60S2@12M)

不同的工作环境,需要调整此函数

此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同

**************************************/

void Delay5us()

{

BYTE n = 4;

while (n--)

{

_nop_();

_nop_();

}

}

/**************************************

延时5毫秒(STC12C5A60S2@12M)

不同的工作环境,需要调整此函数

此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同

**************************************/

void Delay5ms()

{

WORD n = 2500;

while (n--)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

}

/**************************************

起始信号

**************************************/

void AT24C04_Start()

{

SDA = 1; //拉高数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 0; //产生下降沿

Delay5us(); //延时

SCL = 0; //拉低时钟线

}

/**************************************

停止信号

**************************************/

void AT24C04_Stop()

{

SDA = 0; //拉低数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 1; //产生上升沿

Delay5us(); //延时

}

/**************************************

发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/

void AT24C04_SendACK(bit ack)

{

SDA = ack; //写应答信号

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

/**************************************

接收应答信号

**************************************/

bit AT24C04_RecvACK()

{

SCL = 1; //拉高时钟线

Delay5us(); //延时

CY = SDA; //读应答信号

SCL = 0; //拉低时钟线

Delay5us(); //延时

return CY;

}

/**************************************

向IIC总线发送一个字节数据

**************************************/

void AT24C04_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i《8; i++) //8位计数器

{

dat 《《= 1; //移出数据的最高位

SDA = CY; //送数据口

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

AT24C04_RecvACK();

}

/**************************************

从IIC总线接收一个字节数据

**************************************/

BYTE AT24C04_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据

for (i=0; i《8; i++) //8位计数器

{

dat 《《= 1;

SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= SDA; //读数据

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STC12C5A60S2
    +关注

    关注

    35

    文章

    219

    浏览量

    68730
  • AT24C04
    +关注

    关注

    0

    文章

    9

    浏览量

    4443
收藏 人收藏

    评论

    相关推荐

    stc12c5a60s2 AT24C04 I2C

    ; //AT24C04的时钟***it SDA = P2^5; //AT24C04的数据BYTE BUF[16]; //数据缓存区BYTE code TESTDATA[] ={ 0x00
    发表于 10-29 17:25

    凔海笔记之FPGA(八):AT24c04单字节读写的IIC协议

    AT24c04的512字节进行读写操作,高电平则会使前256个地址受保护,只读不能写,后面的则爱咋地咋地了。SDA数据总线,是一个双向口,SCL则是时钟线。IIC总线采用两线制,由数据线SDA和时钟线SCL构成
    发表于 05-23 07:55

    AT24C04系列芯片资料(英文版)

    AT24C04系列芯片资料(英文版)[hide][/hide]
    发表于 03-05 12:55

    仿真电路中的AT24C24通过Image File属性绑定了密码初始文件24C04.bin是什么意思?

    小弟最近用AT24C04做电子密码锁的初始密码存储载体,上面一句话看不懂,意思保存上AT24C04.bin文件是不是密码信息就存储进了AT24C04中去了啊,还是其中还有啥过程
    发表于 09-03 01:08

    电可檫编程只读存储器AT24C04电子资料

    概述:AT24C04是ATMEL公司出品的一款4Kbit(512Bytes)E2PROM芯片,它采用I2C总线设计,AT24C04主要性能指标与AT24C02类似,但与其不同点为:1、
    发表于 04-07 07:33

    请问I2C总线AT24C04的电路图是如何设计的?

    I2C总线AT24C04的电路图是如何设计的?怎样去编写I2C总线AT24C04程序代码
    发表于 07-01 06:47

    怎样去设计AT24C04芯片的电路呢

    AT24C04是什么?怎样去设计AT24C04芯片的电路呢?
    发表于 10-21 07:05

    AT24C02/AT24C04/AT24C08/AT24C1

    AT24C02/AT24C04/AT24C08/AT24C16/AT24C32/AT24C56序
    发表于 08-13 15:28 252次下载

    AT24C04系列芯片资料(英文版)

    AT24C04系列芯片资料(英文版)
    发表于 01-04 11:44 0次下载

    单片机STC12C5A60S2控制AT24C04程序(C语言)

    ; typedefunsignedshortWORD; sbitSCL=P3^4;// AT24C04 的时钟 sbitSDA=P3^5;//AT24C04的数据 BYTEBUF[16];//数据缓存区 BYTEcodeTESTDATA
    的头像 发表于 02-03 03:12 7160次阅读

    at24c04中文资料汇总(at24c04引脚图及功能_工作原理及电路图)

    本文主要介绍了at24c04中文资料汇总(at24c04引脚图及功能_工作原理及电路图)。AT24C04是ATMEL公司生产的4Kbit(512Bytes)E2PROM芯片,该芯片采用I2C总线
    发表于 04-04 16:26 7.7w次阅读
    <b class='flag-5'>at24c04</b>中文资料汇总(<b class='flag-5'>at24c04</b>引脚图及功能_工作原理及电路图)

    使用单片机AT24C04进行LED显示的程序免费下载

    本文档的主要内容详细介绍的是使用单片机AT24C04进行LED显示的程序资料免费下载。
    发表于 10-11 08:00 11次下载
    使用单片机<b class='flag-5'>AT24C04</b>进行LED显示的<b class='flag-5'>程序</b>免费下载

    AT89S52单片机并行端口模拟I2C总线协议读写AT24C04的设计

    AT24C04是具有I2C总线接口的EEPROM.大小为512*8bit.单片机AT89S52本身不具有I2C总线结口,所以可编写程序用并行端口模拟I2C总线协议读写AT24C04.
    发表于 08-14 14:34 2373次阅读

    使用AT24C04和1602LCD设计的电子密码锁仿真和代码资料合集

    本文档的主要内容详细介绍的是使用AT24C04和1602LCD设计的电子密码锁仿真和代码资料合集。
    发表于 06-22 08:00 14次下载
    使用<b class='flag-5'>AT24C04</b>和1602LCD设计的电子密码锁仿真和<b class='flag-5'>代码</b>资料合集

    使用单片机实现I2C接口存储器AT24C04读写与显示的C语言实例

    本文档的主要内容详细介绍的是使用单片机实现I2C接口存储器AT24C04读写与显示的C语言实例免费下载。
    发表于 03-31 11:20 16次下载