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

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

3天内不再提示

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

算法&编程学院 来源:网络整理 2018-02-03 03:12 次阅读

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

芯片: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<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;

}

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

    关注

    6001

    文章

    43970

    浏览量

    620785
收藏 人收藏

    评论

    相关推荐

    STC12C5A60S2控制12864液晶问题

    我用STC12C5A60S2控制12864,用12864的测试程序显示没问题,用我自己的程序就只有背光或者半屏黑的或者大半屏黑的,由于我单片机
    发表于 06-28 11:09

    stc12c5a60s2 AT24C04 I2C

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

    基于STC12C5A60S2单片机的毕设题目

    大家有哪些基于STC12C5A60S2单片机的毕设题目呀,给我参考参考咯!{:1:}{:1:}
    发表于 04-17 17:28

    为什么STC-isp检测不到我的单片机STC12C5A60S2

    为什么STC-isp检测不到我的单片机STC12C5A60S2
    发表于 06-02 15:55

    关于STC12C5A60S2单片机的EEPROM程序

    是这样,我用的单片机型号是STC12C5A60S2程序需要掉电保存(用到内部EEPROM),对照着手册修改了数次代码,仍不能满足功能。用过这款单片机的发烧友,能给些建议,或者传我一份
    发表于 06-11 16:46

    基于STC12C5A60S2单片机的RFID门禁系统

    基于STC12C5A60S2单片机的RFID门禁系统
    发表于 01-06 13:38

    请问有基于STC12C5A60S2单片机的超声波测距程序吗?

    急求基于STC12C5A60S2单片机的超声波从测距程序,主要是用LCD1602 显示,谢谢给位大神啦~~~~~~
    发表于 03-27 05:55

    STC12C5A60S2单片机11.0592晶振实现115200波特率串口通信 精选资料分享

    /////////STC12C5A60S2单片机11.0592晶振实现115200波特率串口通/////////////////////////////////STC12C5A60S2或者
    发表于 07-20 06:22

    STC12C5A60S2单片机控制OLED12864显示屏的程序

    这里将我写的STC12C5A60S2单片机控制OLED12864显示屏的程序共享一下,如有不足,敬请指出!
    发表于 07-21 07:14

    如何利用stc12c5a60s2单片机控制12864播放视频

    stc12c5a60s2单片机跟普通的51单片机相比有何优点?如何利用stc12c5a60s2单片机
    发表于 08-19 07:46

    STC12C5A60S2单片机串口通信的相关资料推荐

    STC12C5A60S2单片机双串口通信,互相发送STC12C5A60S2单片机拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机
    发表于 11-26 07:07

    基于单片机STC12C5A60S2芯片的1602液晶显示

    基于单片机STC12C5A60S2芯片的1602液晶显示,跳线按照要求连接附上主程序#include "stc12c5a60s2.h"#include "
    发表于 02-07 06:32

    STC12C5A60S2的相关资料分享

    STC12C5A60S2串口通信(使用独立波特率发生器)STC12C5A60S2独立PWMSTC12C5A60S2在LCD1602基本显示程序STC
    发表于 02-18 07:25

    STC12C5A60S2单片机最小系统板电路设计方案

    电路部分1.1总体方案框图图1.1为本项目硬件电路总体方案框图。仪器主要的工作流程如下:给单片机上电,STC12C5A60S2单片机最小系统板正常工作,其中单片机内部已烧录好了
    发表于 02-18 07:32

    AT89C51单片机STC12C5A60S2可以同时使用吗

    AT89C51单片机STC12C5A60S2可以同时使用吗
    发表于 04-09 21:51