单片机STC12C5A60S2控制AT24C04的程序(C语言) 您所在的位置:网站首页 stc12c5a60s2开发环境 单片机STC12C5A60S2控制AT24C04的程序(C语言)

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

2023-06-27 15:38| 来源: 网络整理| 查看: 265

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

主芯片:STC12C5A60S2(1T)工作频率:12.000MHz**************************************/

#include"REG51.H"#include"INTRINS.H"

typedefunsignedcharBYTE;typedefunsignedshortWORD;

sbitSCL=P3^4;//AT24C04的时钟sbitSDA=P3^5;//AT24C04的数据

BYTEBUF[16];//数据缓存区

BYTEcodeTESTDATA[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};

voidDelay5us();voidDelay5ms();voidAT24C04_Start();voidAT24C04_Stop();voidAT24C04_SenDACK(bitack);bitAT24C04_RecvACK();voidAT24C04_SendByte(BYTEdat);BYTEAT24C04_RecvByte();voidAT24C04_ReadPage();voidAT24C04_WritePage();

voidmain(){AT24C04_WritePage();Delay5ms();AT24C04_ReadPage();

while(1);

}

/**************************************向AT24C04写1页(16字节)数据将TESTDATA开始的16个测试数据写如设备的00~0F地址中**************************************/voidAT24C04_WritePage(){BYTEi;

AT24C04_Start();//起始信号AT24C04_SendByte(0xa0);//发送设备地址+写信号AT24C04_SendByte(0x00);//发送存储单元地址

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{

dat 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{

dat SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= SDA; //读数据

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有