24c02驱动程序
模拟IIC驱动24C02

MC430F14例程:模拟IIC驱动24C02这是国内卖得最为火热的MSP430单片机实验板之一!【作者】: 微控设计网DC版主原创【例程简介】: 利用MC430F14开发板上MSP430与AT24C02进行IIC总线模拟实验。
MSP430模拟IIC向AT24C02写入4个字节数据,然后读出4个字节.最后做数据校验。
如果读出来的数据与写入的原数据相同,则D2-LED会亮.否则D2-LED不亮。
【例程】://基于MC430F14开发板实验例程#include "msp430x14x.h"#include "define.h"//IIC总线操作成失标志#define error 0x01 //错误#define right 0x00 //正确#define AT24_ADD 0xA0 //24c02芯片地址#define write 0x00 //写#define read 0x01 //读#define Quantity 4 //操作数量#define incept_add 0x00 //操作内部地址首址//写入AT24C02数据表unsigned char write_table[4]={'a','b','c','d'};//读出AT24C02数据缓冲区unsigned char read_Buff[4]={'x','x','x','x'};unsigned char iic_check; //检查标志,可选的.//******************************************************//MSP430F14初始化void init (void){P1DIR |= BIT1; //LED输出P1OUT |= BIT1; //关LED}//******************************************************//软延时void delay(unsigned int n){ unsigned int k;for(k=0;k<n;k++);}//******************************************************//检验两组数据是否正确,如在检验数据中有一组不正确,则退出.//*Data_REF参考值数组,*Data_CHK被检验数组,n检验数量//并返回一个成败标志.unsigned char data_check(unsigned char *Data_REF, unsigned char *Data_CHK, unsigned char n){ unsigned char chk ;while(n){if(Data_REF[n-1]==Data_CHK[n-1]) //进行校对{ chk = right; //正确n--; //下一位}else{ chk = error; //校对有错continue; //马上退出}}return chk ; //返回校对成败标志.}//******************************************************void main(void){WDTCTL=WDTPW+WDTHOLD; //停止WDTinit(); //初始化//向AT24C02芯片写入4字节数据iic_check=IIC(write_table,Quantity,incept_add,(AT24_ADD|write));delay(600); //写入后,做一个适当的延时//向AT24C02芯片读出4字字节数据iic_check=IIC(read_Buff,Quantity,incept_add,(AT24_ADD|read));//判别校验是否成功if(!(data_check(write_table,read_Buff,Quantity)))P1OUT ^= BIT1; //LED亮则表示IIC总线写读操作成LPM1; //最后进入低功耗模式1}//******************************************************。
STM32----6----I2C读写AT24C02

STM32----6----I2C读写AT24C02文章发表于:2011-05-09 13:51STM32作为主机I2C,读写24C02 EEPROM1、时钟和数据的传输:开始和停止条件,数据在SCL的高电平期间有效,在SCL的低电平期间改变。
2、开始条件:在SCL高电平期间,SDA产生一个下降沿3、停止条件:在SCL高电平期间,SDA产生一个上升沿4、应答:成功接收到数据(地址和数据),产生一个应答位(在第9个时钟周期,将SDA拉低)下面是源程序:原理上说,下面程序再移植时,只要将数据类型变化,可以应用到任何处理器AT24c02.h#ifndef __24CXX_H#define __24CXX_H#include "i2c.h"/***************************************************************- 说明:以下参数是AT24Cxx的寻址空间,C0x ,X 表示XK 如C01表示1K- 127表示2^7 1Kbit/8=128Byte 128字节- 255表示2^8 2Kbit/8=256Byte 256字节- 512表示2^9 4Kbit/8=512Byte 512字节-***************************************************************/#define AT24C01 127#define AT24C02 255#define AT24C04 511#define AT24C08 1023#define AT24C16 2047#define AT24C32 4095#define AT24C64 8191#define AT24C128 16383#define AT24C256 32767/**************************************************************--板子使用的是24c02,所以定义EE_TYPE为AT24C02**************************************************************/#define EE_TYPE AT24C02/**************************************************************--EEPROM的操作函数--24CXX驱动函数**************************************************************/u8 AT24CXX_ReadOneByte(u16 ReadAddr); //指定地址读取一个字节void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite); //指定地址写入一个字节void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len);//指定地址开始写入指定长度的数据u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len); //指定地址开始读取指定长度数据void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite); //从指定地址开始写入指定长度的数据void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead); //从指定地址开始读出指定长度的数据u8 AT24CXX_Check(void); //检查器件void AT24CXX_Init(void); //初始化IIC#endif----------------------------------------------------------------------------------------------------------------------------------------- AT24c02.c#include "at24cxx.h"#include "delay.h"/*************************************************************************** - 功能描述:STM32f103 EEPORM初始化函数- 隶属模块:STM32 EEPROM操作- 函数属性:外部,使用户使用- 参数说明:无- 返回说明:无- 函数功能:实现I2C的初始化。
24C02 驱动程序

Number[3]=0;
RdFromROM(Number,4,4); //调用存储数据
while(1)
{
P0=Number[i]; //显示存储数据
NoAck();
Stop();
}
}
/*------------------------------------------------
主程序
------------------------------------------------*/
/*-----------------------------------------------
名称:IIC协议 EEPROM24c02
公司:上海浩豚电子科技有限公司
编写:师访
日期:2009.5
修改:无
内容:此程序用于检测EEPROM性能,测试方法如下:写入24c02一些数据,然后在内存中清除这些数据,
Scl=0;
}
/*------------------------------------------------
应答IIC总线
------------------------------------------------*/
void Ack(void)
非应答IIC总线
------------------------------------------------*/
void NoAck(void)
{
Sda=1;
_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
24c02读写程序大全

CLR SCLK24
CALL START24;启动
MOV A,#0A0H
CALL SHIFT8;移位
CALL ACK;响应
POP ACC
>SETB;应答毕,SDA置1
>RET
>程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传
送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正
脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。
>
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
>ACALL SUBS
>MORE: ACALL SUBR
>MOV@R1,A
>INCR1
>DJNZ R7,MORE
>CLR
>ACALL DELAY
>SETB
>ACALL DELAY
>SETB;送停止信号
>RET
>SUBR: MOVR0,#08H ;接受单字节子程序
>LOOP2: SETB
>ACALL DELAY
TT2:MOV30H,A
MOVCA,@A+DPTR
CLR;开数码管
MOVP0,A;送显示
MOVA,30H
INCA
MOVB,A
MOVA,#00H
LCALLWT24
AJMP$
TAB:DB28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H
RD24: PUSH ACC;读24C02子程序。
E2PROM芯片24C02的读写程序

E2PROM芯片24C02的读写程序一、实验目的:给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。
然后再把这组数据读出来,检验写入和读出是否正确。
在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。
二、理论知识准备:上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。
(一)、I2C总线概念I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。
目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。
(二)、I2C总线结构I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。
具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。
连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。
一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件):我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。
所以,I2C总线结构的硬件结构非常简洁。
当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。
(三)、I2C总线上的数据传送下面我们看看I2C总线是如何进行数据传送的。
我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。
1、位传输I2C总线每传送一位数据必须有一个时钟脉冲。
被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。
24C02读写C语言程序

2010-09-01 10:08
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
,希望各位读者批评指正!!!
>/***********************************************************
> for(i=0;i<n;i++)//写入8字节数据
> {
> SendData(s);
> Test_Ack();
> if(flag==0) return(0);
> }
> I2C_Stop();
> return(1);
>}
>/*************************************************************
> SCL=0;
> delay();
> SDA=0;
> delay();
>}
>/********************************************************
>**名称:Test_Ack()
>**功能:检测应答位
>*********************************************************/
>void Ack()
>{
> SDA=0;
> delay();
> SCL=1;
> delay();
AT24C02 E2PROM介绍及驱动程序

SDAE=1;
}
/************************************************************************/
void NoAck() {
SDAE=1;
SCL=1;
SCL=0;
}
/***********************************************************************/
#include<reg52.h>
#include<intrins.h> sda=P3^2; //IO口 //不同自己定义
sbit scl=P3^1;
/////////24C02读写驱动程序////////////////////
Write8Bit(ReadDviceAddress|ddd);
TestAck();
while(bytes!=1) {
*RamAddress=Read8Bit();
Ack();
RamAddress++;
bytes--;
}
*RamAddress=Read8Bit();
NoAck();
Write8Bit(*Wdata);
TestAck();
Wdata++;
}
Stop();
DelayMs(10);
}
/***************************************************************************/
unsigned char Read8Bit() {
电子密码锁AT24C02C驱动程序

void start()// 开始位{SDA = 1; //SDA初始化为高电平“1”SCL = 1; //开始数据传送时,要求SCL为高电平“1”_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA = 0; //SDA的下降沿被认为是开始信号_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)}/***************************************************函数功能:结束数据传送***************************************************/void stop()// 停止位{SDA = 0; //SDA初始化为低电平“0”_nSCL = 1; //结束数据传送时,要求SCL为高电平“1”_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA = 1; //SDA的上升沿被认为是结束信号_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA=0;SCL=0;}/***************************************************函数功能:从A T24Cxx读取数据出口参数:x***************************************************/unsigned char ReadData()// 从A T24Cxx移入数据到MCU{unsigned char i;unsigned char x; //储存从A T24Cxx中读出的数据for(i = 0; i < 8; i++){SCL = 1; //SCL置为高电平x<<=1; //将x中的各二进位向左移一位x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存入x中SCL = 0; //在SCL的下降沿读出数据}return(x); //将读取的数据返回}/***************************************************函数功能:向A T24Cxx的当前地址写入数据入口参数:y (储存待写入的数据)***************************************************///在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0bit WriteCurrent(unsigned char y){unsigned char i;bit ack_bit; //储存应答位for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(y&0x80); //通过按位“与”运算将最高位数据送到S//因为传送时高位在前,低位在后_nop_(); //等待一个机器周期SCL = 1; //在SCL的上升沿将数据写入A T24Cxx_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 0; //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲y <<= 1; //将y中的各二进位向左移一位}SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,//以让SDA线转由接收设备(A T24Cxx)控制_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 1; //根据上述规定,SCL应为高电平_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期ack_bit = SDA; //接受设备(A T24Cxx)向SDA送低电平,表示已经接收到一个字节//若送高电平,表示没有接收到,传送异常SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)return ack_bit; // 返回A T24Cxx应答位}/***************************************************函数功能:向A T24Cxx中的指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据)***************************************************/void WriteSet(unsigned char add, unsigned char dat)// 在指定地址addr处写入数据WriteCurrent{start(); //开始数据传递WriteCurrent(OP_WRITE); //选择要操作的A T24Cxx芯片,并告知要对其写入数据WriteCurrent(add); //写入指定地址WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据stop(); //停止数据传递delay(4); //1个字节的写入周期为1ms, 最好延时1ms以上}/***************************************************函数功能:从A T24Cxx中的当前地址读取数据出口参数:x (储存读出的数据)***************************************************/unsigned char ReadCurrent(){unsigned char x;start(); //开始数据传递WriteCurrent(OP_READ); //选择要操作的A T24Cxx芯片,并告知要读其数据x=ReadData(); //将读取的数据存入xstop(); //停止数据传递return x; //返回读取的数据}/***************************************************函数功能:从A T24Cxx中的指定地址读取数据入口参数:set_addr出口参数:x***************************************************/unsigned char ReadSet(unsigned char set_addr)// 在指定地址读取{start(); //开始数据传递WriteCurrent(OP_WRITE); //选择要操作的A T24Cxx芯片,并告知要对其写入数据WriteCurrent(set_addr); //写入指定地址return(ReadCurrent()); //从指定地址读出数据并返回}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**********************************************************************
24c02驱动的使用方法
1、要想出入数据时只要使用write_data24c02(uchar address,ulong date);函数即可
2、要想读出数据时只要使用read_address24c02(uchar address)即可返回其内容值
**********************************************************************/
//uchar shuju_24c02;//需要显示我们存入24c02的内容时才要使用此变量,否则将其屏蔽sbit SCK24c02=P1^5;
sbit SDA24c02=P1^4;
void delay24c02(uint z) //6us延时函数
{
while(z--);
}
void init24c02() //总线初始化函数
{
SCK24c02=1;
delay24c02(1);
SDA24c02=1;
delay24c02(1);
}
void start24c02() //2402开始信号函数
{
SDA24c02=1;
delay24c02(1);
SCK24c02=1;
delay24c02(1);
SDA24c02=0;
}
void stop24c02() //2402停止信号函数
{
SDA24c02=0;
delay24c02(1);
SCK24c02=1;
delay24c02(1);
SDA24c02=1;
delay24c02();
}
void yingda24c02() //2402应答函数
{
uchar i;
SCK24c02=1;
delay24c02(1);
while((SDA24c02==1)&&(i<250))
i++;
SCK24c02=0;
delay24c02(1);
}
void write24c02(uchar date) //2402写一个字节函数
{
uchar i,k;
k=date;
for(i=0;i<8;i++)
{
k=k<<1;
SCK24c02=0;
delay24c02(1);
SDA24c02=CY;
delay24c02(1);
SCK24c02=1;
delay24c02(1);
}
SCK24c02=0; //产生第9个脉冲
}
read24c02() //24c02读一个字节函数
{
uchar i,date1;
for(i=0;i<8;i++)
{
SCK24c02=1;
delay24c02(1);
date1=(date1<<1)|SDA24c02;
SCK24c02=0;
delay24c02(1);
}
return date1;
}
void write_data24c02(uchar address,ulong date)//写数据到24c02存储器的某一地址中{
init24c02();
start24c02();
write24c02(0xa0);
yingda24c02();
write24c02(address);
yingda24c02();
write24c02(date);
yingda24c02();
stop24c02();
}
read_address24c02(uchar address) //读取24c02存储器中某一地址的内容,并将其返回{
uchar date24c02;
start24c02(); //读开始
write24c02(0xa0);
yingda24c02();
write24c02(address);
yingda24c02();
start24c02();
write24c02(0xa1);
yingda24c02();
date24c02=read24c02();
stop24c02();
return (date24c02);
}
/*void display_24c02()//需要显示我们存入24c02的内容时才要使用此函数,否则将其屏蔽{
uchar shuju;
write_com12864(0x80);
shuju=shuju_24c02/100;
write_data12864(0x30+shuju);
shuju=shuju_24c02%100/10;
write_data12864(0x30+shuju);
shuju=shuju_24c02%10;
write_data12864(0x30+shuju);
} */。