您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页在11.0592 MHz 下已经通过的 AT24C1024芯片程序

在11.0592 MHz 下已经通过的 AT24C1024芯片程序

来源:华佗小知识
在11.0592 MHz 下已经通过的 AT24C1024芯片程序

AT24C1024拥有128KB的容量,体积小巧,可单独读写任意地址字节,在存储数据量不多的情况下,相当方便实用。

以下程序已经在STC12L5A6032中以3.3VDC的电压情况下,使用11.0592 MHz 晶振实测多次通过,可进行简单的变换后使用。

注意事项:

1. AT24C1024的可使用范围为2.7~5.5VDC.

2. 在AT24C1024使用时,头3字节为芯片及内部地址数据,在此程序中已经针对第一字

节头5位必须为10100,然后2位芯片硬连接和内部页地址数据,紧接着就是读写位这样的情况进行了考虑,所以使用时直接在库函数中加入地址和数据长度即可。 3. 要存入和被取出的数据都在stack[]中进行缓存。

#include #include \"stdio.h\" #include

sbit SCL=P1^0; sbit SDA=P1^1;

delay(unsigned long i);

unsigned char a, b, c,d,temp,count; unsigned long address, i,j,k,l; unsigned char stack[];

I2C_START() //I2C 启动 { SDA=1; SCL=1; SDA=0; SCL=0; }

I2C_STOP() //I2C 结束 { SDA=0; SCL=1; SDA=1; }

1 / 6

I2C_WRITE_BYTE() //I2C 写入字节数据,上升沿输入 { for(count=0;count<8;count++) { SCL=0; SDA=temp&0x80; SCL=1; SCL=0; temp=temp<<1; }

SDA=0; SCL=1; SCL=0; SDA=1; }

I2C_READ_BYTE() //I2C 读取数据,上升沿后读取 { for(count=0;count<8;count++) { SDA=1; temp=temp<<1; SCL=1; temp=temp|SDA; SCL=0; } }

I2C_SEND_ACK() //I2C 发出应答 { SDA=0; SCL=1; SCL=0; }

I2C_ADDRESS_WRITE() //I2C 写入的第一个地址位的转换,因为1024的头5个输入固定为10100,然后两位地址,接着读写位,所以要进行变换 { temp=0xa0; for(count=0;count<5;count++) { SCL=0; SDA=temp&0x80;

2 / 6

SCL=1; SCL=0; temp=temp<<1; } SCL=0; SDA=address&0x200000; SCL=1; SCL=0; SCL=0; SDA=address&0x10000; SCL=1; SCL=0; SCL=0; SDA=0; SCL=1; SCL=0; SDA=0; SCL=1; SCL=0; SDA=1; }

I2C_ADDRESS_READ() //I2C 读取的第一个地址位的转换,定为10100,然后两位地址位,接着是读写位,所有要进行变换 { temp=0xa0; for(count=0;count<5;count++) { SCL=0; SDA=temp&0x80; SCL=1; SCL=0; temp=temp<<1; } SCL=0; SDA=address&0x200000; SCL=1; SCL=0;

1024的头5位固 3 / 6 因为

SCL=0; SDA=address&0x10000; SCL=1; SCL=0; SCL=0; SDA=1; SCL=1; SCL=0; SDA=0; SCL=1; SCL=0; SDA=1; }

I2C_WRITE_DATA(unsigned long address, unsigned char d) 堆栈stack[]中的数据存入1024。 { I2C_START(); I2C_ADDRESS_WRITE(); temp=(address&0xff00)>>8; I2C_WRITE_BYTE(); temp=address&0xff; I2C_WRITE_BYTE(); for(c=0;cI2C_READ_DATA(unsigned long address,unsigned char d) stack[]中的数据读出。 { I2C_START();

//按指定的地址和长度,把//按指定的地址和长度,把堆栈 4 / 6

I2C_ADDRESS_WRITE(); temp=(address&0xff00)>>8; I2C_WRITE_BYTE(); temp=address&0xff; I2C_WRITE_BYTE(); I2C_START(); I2C_ADDRESS_READ(); for(b=0;bvoid main (void) { SDA = 1; SCL = 1;

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2 TMOD|= 0x20; //定时器工作方式2 PCON|= 0x80; //波特率提高一倍 TH1 = 0xFf; //baud*2 /* 波特率57600、数据位8、停止位1。效验位无 (11.0592M) TL1 = 0xFf; TR1 = 1; //开启定时器1 for(a=0x0;a<;a++) //先给堆栈stack[]设预值 { stack[a]=a+1; temp=stack[a]; SBUF=temp;

5 / 6

while(!TI); delay(1000); } I2C_WRITE_DATA(0x024600,); //在指定地址处写入规定长度的数据; delay(500); //在芯片写入期间不能读取,强行读取会出现错误,必须延时。 dd: I2C_READ_DATA(0x024600,); //重复在指定的位置读取指定长度的数据,并通过串口进行显示。 for(c=0;c<;c++) { temp=stack[c]; SBUF=temp; while(!TI); delay(1000); }

goto dd; }

/************************************************** 延时处理程序

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

delay(unsigned long i) { while(i--); }

6 / 6

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务