历史上的今天
返回首页

历史上的今天

今天是:2025年02月01日(星期六)

2018年02月01日 | STC12C5A60S2控制AT24C04 C程序

2018-02-01 来源:eefocus

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


推荐阅读

史海拾趣

正泰公司的发展小趣事

为了在全球市场上保持领先地位,正泰建立了北美、欧洲、亚太等三大全球研发中心,并与清华大学、上海交大等国内外知名院校、机构展开合作,探索“产学研”融合模式。通过整合全球创新资源,正泰在智能电网、新能源电车充电设施等前沿领域取得了一系列创新进展。这种全球研发体系的建立,不仅提升了公司的研发能力,也增强了公司的市场竞争力。

Alliance Fiber Optics Products Inc公司的发展小趣事

随着技术的不断进步,AFOP在光纤元件领域取得了重大突破。公司成功研发出一系列高品质的光纤元件和集成模块,如波分复用光电二极管、光衰减器等,这些产品在光网通信领域具有广泛的应用。同时,AFOP还注重产品升级和迭代,根据市场需求和客户反馈,不断优化产品性能和质量,赢得了客户的广泛认可。

安美通(APPCON)公司的发展小趣事

在创业初期,安美通面临着激烈的市场竞争和技术瓶颈。然而,公司的创始团队凭借对无线通信技术的深刻理解和丰富经验,成功研发出了一系列低功耗无线远传产品,为水气电及工控行业提供了创新的解决方案。这些产品迅速获得了市场的认可,为公司的初步发展奠定了坚实的基础。

博流(Bouffalo Lab)公司的发展小趣事

随着公司的发展壮大,博流积极寻求与全球知名企业的合作机会。其中,与谷歌的合作尤为引人注目。作为Google Matter EAP合作伙伴,博流与谷歌共同推动Matter协议在智能家居生态系统中的应用,为用户提供更加便捷、智能的家居体验。此外,博流还与多家产业链上下游企业建立了紧密的合作关系,共同推动物联网产业的发展。

Amphenol Piher公司的发展小趣事

随着公司的发展壮大,博流积极寻求与全球知名企业的合作机会。其中,与谷歌的合作尤为引人注目。作为Google Matter EAP合作伙伴,博流与谷歌共同推动Matter协议在智能家居生态系统中的应用,为用户提供更加便捷、智能的家居体验。此外,博流还与多家产业链上下游企业建立了紧密的合作关系,共同推动物联网产业的发展。

Cypress(赛普拉斯)公司的发展小趣事

在发展历程中,Cypress经历了多次并购和业务整合。这些并购不仅扩大了公司的规模和业务范围,也带来了更多的技术和人才资源。通过并购和整合,Cypress能够更好地满足客户的需求,提供更加全面的解决方案。同时,公司还加强了内部管理和资源整合,提高了整体运营效率。

问答坊 | AI 解惑

集成电路基础知识之:电容知识大全

第1讲:电容的特性(隔直通交)    电容器是一种能储存电荷的容器.它是由两片靠得较近的金属片,中间再隔以绝缘物质而组成的.按绝缘材料不同,可制成各种各样的电容器.如:云母.瓷介.纸介,电解电容器等.在构造上,又分 ...…

查看全部问答>

PCB板型

如何用ProtelDXP将pcb板型设计成大半圆形(即圆形切掉了一小部分),是板子的外观。我知道在机械层放置圆圆弧可以。我的意思是能不能利用重新定义板型把PCB板画成大半圆形状?…

查看全部问答>

安顿双绞线传输器的传输效果对比与示意

在实际工程中,选用何种传输方式需要结合工程的具体情况和工程预算来综合考虑。对于传输距离超过2Km的监控网络,应该考虑选用光纤和光端机。如果传输距离达到数公里或者几十公里,就只有使用光纤了。另外,在一些干扰很强的场合,比如受到工业干扰 ...…

查看全部问答>

CE printf不能用咋办啊??CE 提示建议使用StringCchVPrintfA函数??

最近移植个库,库以前是在PC上编译的,都是用多字节的printf,在CE下报错, 情况如下: error C2065: \'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA\' : undeclared identifier 然后我就按它的提示使用StringCchPrintfA; 定义了 ...…

查看全部问答>

按电源按键启动不了咋整?

按开机电源启动不了,要再按重启或者再按几次电源键才能启动 机子去年十一配的,原来也有类似问题,后来换了一个电源就没这种情况了,现在又出现这种情况,难道又是电源问题?哪位达人帮解决一下~…

查看全部问答>

cadence问题求助------5!

这个问题非常基础但是有几个地方不是很明白: 在画原理图时,大部分需要自己画芯片,一些主要的芯片,库里面总是没有 在画芯片时,关于芯片引脚习惯上都是定义成什么? 我看芯片引脚有:3 state、Bidirectional 、 Input 、Open Collector &nbs ...…

查看全部问答>

FPGA中遇到的一个奇怪的问题!

在FPGA中遇到的一个奇怪的问题!我在Stratix II GX 中要实现这样一个功能:用20M时钟采集120路数据,然后将这些数据组成每字节10bit,每11字节一帧的数据,其中包括一个帧头。这帧数据每字节速率是260M(因为加了10位的帧头),通过一个GXB将这帧数据 ...…

查看全部问答>

有关串口调试助手的困惑

如果我给串口调试助手发送一个字符串“zhangkai”,如果勾上16进制显示,是不是就是串口调试助手把字符串转换为7A 68 61 6E 67 6B 61 69这个了?   在串口调试助手给单片机发数据时,如果选上16进制发送和不选16进制发送有啥区别?发送区填 ...…

查看全部问答>

MSP-EXP430FR5739实验板团购

这次机会真是难得呀,一个字实惠。…

查看全部问答>

MSP430系列的一些另类问题(上)

一般是刚开始入门会遇到的问题: 1、 接上仿真器,发现不能下载,这个问题想必大家都有遇到过,IAR提示找不到目标? 可能的原因:A、 并口驱动能力不足,在电脑的BIOS界面下设置成ECP或者ECP+EPP模式B、 JTAG线太长,一般超过20CM不推荐,而且这个线最好不 ...…

查看全部问答>