历史上的今天
返回首页

历史上的今天

今天是:2025年06月09日(星期一)

正在发生

2020年06月09日 | 如何使用单片机模拟读写24C01EEPROM数据

2020-06-09 来源:elecfans

实验目的:

熟悉使用单片机模拟读写24C01EEPROM


1、首先向24C01EEPROM写入数据

2、在从24C01EEPROM中读取数据,并用LED显示

硬件设置:

1、SW4开关全部闭合

2、SW2开关1闭合,其它断开

3、SW3开关7和8闭合,其它断开


#include

__CONFIG(0x3545);

如何使用单片机模拟读写24C01EEPROM数据

//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护

//RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器

#defineucharunsignedchar

#defineuintunsignedint

#defineSCLTRISC3

#defineSDATRISC4

定义写入EEPROM数据

ucharcode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

定义读取EEPROM数据变量

ucharack,data[8];

//函数名:delayus(uchartime);

//入口参数:TIme

//出口参数:无

//函数作用:微妙延时

//说明:

voiddelayus(ucharTIme)

{

while(TIme--)

{

asm(“nop”);

}

}

//函数名:delayms(ucharTIme);

//入口参数:time

//出口参数:无

//函数作用:延时

//说明:

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

voiddelayms(uchartime)

{

uinti;

while(time--)

{

for(i=93;i》0;i--){;}

}

}

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

//函数名:i2c_start(void);

//入口参数:无

//出口参数:无

//函数作用:产生启动信号

//说明:

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

voidi2c_start(void)

{

SDA=1;//当SCL为高电平时使SDA产生一个负跳变

delayus(1);

SCL=1;

delayus(5);

SDA=0;

delayus(2);

SCL=0;//钳住I2C总线,准备发送数据或接收数据

delayus(2);

}

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

//函数名:i2c_stop(void);

//入口参数:无

//出口参数:无

//函数作用:产生停止信号

//说明:

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

voidi2c_stop(void)

{

SDA=0;//当SCL为高电平时使SDA产生一个正跳变

delayus(1);

SCL=1;

delayus(5);

SDA=1;

delayus(4);

}

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

//函数名:i2c_writebyte(uchardata);

//入口参数:data

//出口参数:无

//函数作用:写一个字节函数

//说明:

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

voidi2c_writebyte(uchardata)

{

uchari;

for(i=0;i《8;i++)//写8位数据

{

if(data&0x80){SDA=1;}//先写高位

else{SDA=0;}

delayus(1);

SCL=1;

delayus(5);

SCL=0;

data=data《《1;//写下一位

}

delayus(2);

SDA=1;

delayus(2);

SCL=1;

delayus(3);

while(RC4){;}//等待应答信号,RC4=0则有应答

SCL=0;

delayus(2);

}

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

//函数名:i2c_writedata(ucharaddr,uchar*ptt);

//入口参数:addr,*ptt

//出口参数:无

//函数作用:按地址向EEPROM写数据块

//说明:

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

voidi2c_writedata(ucharaddr,uchar*ptt)

{

uchari;

i2c_start();//产生启动信号

i2c_writebyte(0XA0);//I2C写指令和IC地址

i2c_writebyte(addr);//写EEPROM地址

for(i=0;i《8;i++,ptt++)//写8个数据

{

i2c_writebyte(*ptt);

}

i2c_stop();//产生停止信号

}

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

//函数名:i2c_readbyte(void);

//入口参数:无

//出口参数:SSPBUF

//函数作用:从EEPROM读取一个字节数据

//说明:

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

unsignedchari2c_readbyte(void)

{

uchardata,i;

data=0;

SDA=1;

for(i=0;i《8;i++)//读8位数据

{

delayus(1);

SCL=0;

delayus(5);

SCL=1;

delayus(2);

data=data《《1;

if(RC4)//判断读取数据是否为1

{

data=data|0x01;

}

delayus(2);

}

SCL=0;

delayus(2);

return(data);//返回读取的数据

}

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

//函数名:i2c_readdata(ucharaddr);

//入口参数:addr

//出口参数:data[8]

//函数作用:按地址从EEPROM读取数据块

//说明:

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

voidi2c_readdata(ucharaddr)

{

uchari;

for(i=0;i《8;i++,addr++)

{

i2c_start();//产生启动信号

i2c_writebyte(0xA0);//I2C写指令和IC地址

i2c_writebyte(addr);//读EEPROM数据的地址

i2c_start();//重新产生启动信号

i2c_writebyte(0xA1);//I2C读指令和IC地址

data[i]=i2c_readbyte();//读取数据

i2c_stop();//产生停止信号

}

}

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

//函数名:main(void);

//入口参数:无

//出口参数:无

//函数作用:MAIN函数

//说明:

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

voidmain(void)

{

uchari;

TRISA=0X00;//设置RA口为输出口

PORTA=0X00;//RA口输出低电平

ADCON1=0X07;//设置RA口和RE口为普通IO口

TRISC=0Xff;//RC3和RC4为输入,RC3为SCL线,RC4为SDA线。

TRISD=0X00;//RD口为输出

OPTION=0X8F;//分频给WDT,分频比为128

PORTC=0X00;

PORTD=0X00;

i2c_writedata(0x00,code);//调用写数据函数,写EEPROM地址,要写的数据

delayms(250);

CLRWDT();//清看门狗

i2c_readdata(0x00);//调用读数据函数,读EEPROM数据地址

while(1)

{

for(i=0;i《8;i++)

{

CLRWDT();//清看门狗

PORTD=data[i];//输出指示

delayms(250);

}

}

}

推荐阅读

史海拾趣

EMBEST公司的发展小趣事

随着国内市场的逐步稳固,EMBEST开始寻求更广阔的发展空间。XXXX年,EMBEST的开发工具成功进入国际市场,并获得了多家芯片公司的认可,成为他们的第三方工具伙伴。这一举措不仅提升了EMBEST的品牌影响力,也为其带来了更多的商业机会。EMBEST凭借过硬的技术实力和优质的服务,逐渐在国际市场上崭露头角。

CHENMKO公司的发展小趣事

在XXXX年12月,EMBEST成为了Microsoft银牌合作伙伴。这一荣誉的获得标志着EMBEST在软件开发和服务方面得到了业界的广泛认可。作为Microsoft银牌合作伙伴,EMBEST将能够更好地利用Microsoft的技术和资源,为客户提供更优质的服务和解决方案。

飞翼科技(FEIYI)公司的发展小趣事

在XXXX年12月,EMBEST成为了Microsoft银牌合作伙伴。这一荣誉的获得标志着EMBEST在软件开发和服务方面得到了业界的广泛认可。作为Microsoft银牌合作伙伴,EMBEST将能够更好地利用Microsoft的技术和资源,为客户提供更优质的服务和解决方案。

Device Engineering Incorporated公司的发展小趣事

在电子行业快速发展的背景下,DEI公司意识到只有不断创新才能保持竞争力。因此,公司加大了对研发的投入,积极引进新技术和人才。通过不断的努力,DEI公司成功推出了一系列具有自主知识产权的创新产品,涵盖了多个领域。这些产品不仅提升了公司的竞争力,也为公司赢得了更多的市场份额。

Afero公司的发展小趣事

Afero的物联网平台在智能家居领域取得了显著的突破。他们与多家智能家居设备制造商合作,推出了一系列基于Afero平台的智能家居产品。这些产品通过统一的嵌入式、移动和云技术,实现了跨设备的安全通信和云通信,为用户提供了更加便捷、智能的家居体验。Afero平台还支持从制造到消费者使用的全过程设备连接,确保设备的安全性和可靠性。

Chengdu Sino Microelectronics Technology Co Ltd公司的发展小趣事

2000年3月,成都华微科技诞生。当时,集成电路设计行业刚刚起步,市场竞争激烈。然而,公司凭借对中国电子信息产业集团的坚定信任,以及对中国集成电路设计市场的深刻洞察,毅然决然地踏上了这条充满挑战的道路。初创期的华微科技,虽然规模较小,但团队成员都怀揣着对技术的热情和对未来的憧憬,为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

一种嵌入式微调度器的实现方法

智能仪表是自动控制技术的重要组成部分。随着智能仪表在工业控制、通信和汽车电子中的广泛应用,智能仪表逐渐向数字化、网络化、智能化方向发展;同时,智能仪表复杂度不断增加,对实时性要求几乎达到了苛刻的程度。在编程方式和代码重复利用等方面 ...…

查看全部问答>

华为通信入门教材

华为通信入门教材…

查看全部问答>

请教高手93C46的8位、16位读写程序怎么区分

请教高手93C46的8位、16位读写程序怎么区分 SB+OP1=10B,OP0+写允许=01100000B 比如93C46的写允许8位是  1001100000既  00000010,01100000(0X02,0X60)                 ...…

查看全部问答>

nesC中文手册

ZIGBEE 中的NESC语言…

查看全部问答>

请问哪位有图灵的《8051微控制器》这本书的PDF

图灵电子《8051微控制器》  有的麻烦上传一下行吗?谢谢…

查看全部问答>

从小看到的电鱼的东东会不会电死人了

看了quanzxhttps://bbs.eeworld.com.cn/viewthread.php?tid=86872&extra=&page=3 的帖子。似乎超过36V就很危险了…

查看全部问答>

打开串口成功,但是ReadFile确不成功,为什么

我在WinCE下作GSM打电话程序,有CreateFile可以打开串口,但是在串口接收线程里用ReadFile读数据却不成功 但是CreateFiel打开串口确实成功了啊,用GetLastError得到的错误码是:〖6〗-句柄无效。为什么 下面是我的程序 BOOL fReadState = ReadFi ...…

查看全部问答>

程序获取wince系统密码

我通过BOOL NTLMSetUserInfo( LPTSTR pszUser, LPTSTR pszPassword )这个函数给系统添加了用户名和密码,请问如何通过过程序来获取这个密码呢?我看了看Ntlmssp.h 这个头文件,好像没有类似NTLMGetUserInfo函数用来获取用户信息的。 …

查看全部问答>

程序错在哪里啊,请高手指点一下,都写了一天了,还不知道错在哪里

//保存为1.h #ifndef lcd1602_h #define lcd1602_h sbit rs= P2^7; //定义接口 sbit rw= P2^6; sbit e = P2^5; #define shuju P0 #define unch unsigned char #define unin unsigned int void shortdelay(unin m); //延时 vo ...…

查看全部问答>