89C52单片机的内存8K不够用了怎么办

89C52单片机的内存8K不够用了怎么办,第1张

1可不可以用24C02系列呢?那程序要怎么写了(有关些读一整个函数的),比如我现在有要把温控程序和时钟程序放到52外部,计算器程序放到内部,同时可以使52正常工作,扫描完内部后继续扫描内部。

答:不行

2如果用扩展外部存储芯片,那芯片型号是什么,程序又怎么写?

答:可以扩展典型的并行存储芯片一般都可电路非常经典程序设计上做配合,参考Keil的Band模式

另外,要不直接扩一个足够大的外部程序芯片算了

3如果改用大内存的单片机芯片,那程序又不一样了吧?

答:只要单片机还是51系列的,程序基本不会大变动,甚至不用变动

价格方面不要贵啊,我只会52的C程序的(我是菜鸟),所以要完全兼容的,不需要太大,再有8K或4K就OK。那又怎么办?跪求,献上我的大部分分,搞定了可以追加。内存确实不够了。。。

答:简单啊,直接扩带16k/32K/64k Flash程序空间的51芯片就行了

是FM24C256吗,那是EEPROM,是用I2C总线的,容量是32K,同一系列的还有24C128,24C64,24C16等,引脚都是兼容的。由于容量不同,所以I2C寻址的格式略有不同,我以前也由于格式不动而改过驱动程序。所以,我怀疑是不是你用的24C256的驱动没有兼容。

你拿放大镜好好把芯片型号读一下,再修改对应的程序。

个C语言的,可以给你参考,这都是我项目中用到的程序。给你作个参考,在产品的实际工作中也很稳定。

下面是汇编的:

;;-----启动-----;;

START1:

LCALL DEL5US

SETB SDA1

LCALL DEL5US

SETB SCL1

LCALL DEL5US

CLR SDA1

LCALL DEL5US

CLR SCL1

LCALL DEL5US

RET

;;-----结束-----;;

STOP1:

LCALL DEL5US

SETB SCL1

LCALL DEL5US

SETB SDA1

LCALL DEL5US

RET

;;-----应答检查-----;;

CACK1:

SETB SDA1

LCALL DEL5US

SETB SCL1

LCALL DEL5US

MOV C,SDA1

JC CACK1

CLR SCL1

CLR SDA1

LCALL DEL1MS

RET

;;-----应答-----;;

MACK1:

CLR SDA1

LCALL DEL5US

SETB SCL1

LCALL DEL5US

CLR SCL1

LCALL DEL5US

SETB SDA1

RET

;;-----向从器件指定单元写N个字节数据-----;;

;;入口:传递的地址在POINTER,数据在WR_BUF中,发送字节数在N中

;;资源占用:ACC、R0、R1、R3、C

WR_NB1:

CLR EA

SETB SDA1

SETB SCL1

LCALL START1

MOV A,#0A2H

LCALL WR8BIT1

LCALL CACK1

MOV A,POINTER

LCALL WR8BIT1

LCALL CACK1

MOV R3,N

MOV R1,#WR_BUF

WRNB11:

MOV A,@R1

LCALL WR8BIT1

LCALL CACK1

INC R1

DJNZ R3,WRNB11

LCALL STOP1

LCALL DEL10MS

SETB EA

RET

;;-----从从器件指定单元读N个字节数据-----;;

;;入口:传递的地址在POINTER,接收数据缓冲区RD_BUF,接收字节数在N中

;;资源占用:ACC、R0、R1、R3、C

RD_NB1:

MOV R3,N

RDNB11:

LCALL START1

MOV A,#0A2H

LCALL WR8BIT1

LCALL CACK1

MOV A,POINTER

LCALL WR8BIT1

LCALL CACK1

LCALL START1

MOV A,#0A3H;#0A1H

LCALL WR8BIT1

LCALL CACK1

MOV R1,#RD_BUF

RDB1: LCALL RD8BIT1

MOV @R1,A

DJNZ R3,SACK1

LCALL STOP1

RET

SACK1:INC R1

LCALL MACK1

SJMP RDB1

;;-----字节发送-----;;

;;入口:要发送的数据在ACC中

;;每发送完一个字节,要调用一次CACK,以判断是否有应答

WR8BIT1:

PUSH ACC

MOV R0,#08H

WR_BIT1:

RLC A

MOV SDA1,C

LCALL DEL5US

SETB SCL1

LCALL DEL5US

CLR SCL1

DJNZ R0,WR_BIT1

POP ACC

RET

;;-----字节接收-----;;

;;出口:接收到的数据在ACC中

;;每接收完一个字节,要调用一MCACK/MNACK

RD8BIT1:

MOV R0,#08H

RD_BIT1:

SETB SDA1

LCALL DEL5US

SETB SCL1

LCALL DEL5US

MOV C,SDA1

RLC A

LCALL DEL5US

CLR SCL1

DJNZ R0,RD_BIT1

CLR SDA1

RET

以下的程序是C语言的程序,用于读24C01存贮器,稍加修改可以用于所有的I2C总线驱动。

/

名 称:ReadIIC_24C01

功 能:读24c01指定的地址的数据

输 入: address 24c01的地址

输 出: ddata 读出的数据

全局变量: 无

调用模块: write_8bit();delay();

备注:

/

uint8 ReadIIC_24C01(uint8 data address)

{

uint8 data ddata=0;

uint8 data i=8;

_nop_();

_nop_();

_nop_();

EA=0;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_(); //Tsu:STA

SDA=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_(); //Thd:STA

SCL=0; //START

write_8bit( (address<<1) | 0x01); //写页地址和 *** 作方式

ACK_R();

while (i--)

{

SDA=1;

ddata<<=1;

SCL=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=1;

if (SDA) ddata|=0x01;

}

SCL=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SDA=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SDA=1; //STOP

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

EA=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

delay(50);

_nop_();

_nop_();

_nop_();

return ddata;

}

/

名 称:WriteIIC_24C01

功 能:将数据写入24c01指定地址

输 入: address 24c01的地址

ddata 待写入的数据

输 出: 无

全局变量: 无

调用模块: write_8bit();delay();

备注:

/

void WriteIIC_24C01(uint8 data address,uint8 data ddata)

{

_nop_();

_nop_();

_nop_();

EA=0;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_(); //Tsu:STA

SDA=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_(); //Thd:STA

SCL=0; //START

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

write_8bit( (address<<1) & 0xfe); //写页地址和 *** 作方式,对于24C32-24C256,page不起作用

ACK_R();

write_8bit(ddata); //发送数据

ACK_R();

SDA=0;

_nop_();

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SDA=1; //STOP

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

EA=1;

_nop_();

_nop_();

_nop_();

delay(50);

_nop_();

_nop_();

_nop_();

}

/

名 称:write_8bit

功 能:将一个字节数据写入24c01

输 入: 无

输 出: 无

全局变量: 无

调用模块: 无

备注:

/

void write_8bit(uint8 data ch)

{

uint8 data i=8;

_nop_();

_nop_();

_nop_();

SCL=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

while (i--)

{

SDA=(bit)(ch&0x80);

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

ch<<=1;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

/

名 称:ACK_R

功 能:等待24c01ACK信号

输 入: 无

输 出: 无

全局变量: 无

调用模块: 无

备注:

/

void ACK_R(void)

{

_nop_();

_nop_();

_nop_();

SDA=1;

SCL=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

while(SDA)

{

_nop_();

} //ACK

SCL=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

1、先买一个电脑打印机的打印线(两端有插头);

2、再找一块现在市上卖的多用线路板,两孔相连的,截下一小块;

3、将两个8脚IC插座及相关元件焊好(两个插座并联),

4、将打印插头联线全焊掉,清理干净,留下5根备用,其余包好不用,将小插头线接好(特别注意引脚编号);

5、大插头保留外壳(插头丢掉)焊上线路板,扣上外壳即成一个美观实用的读写器。

一般程序中是用不到这么多全局变量的

可以想办法 让其变为常量

就可以将RAM 变成FLASH 储存

const uchar buf[512]; //具体编译器 不同 关键字不同

如果实在是想要这么多RAM 随机存储器 ,可以选用大一点的IC 如:M32 M64

M128 或是高档一点的MCU。

在之前IC没有这么大的RAM 和FLASH的时候 曾经外扩过

可以用如 RAM 62256;ROM 29C02,29256

关于外扩电路 可以参考AVR的的相关书籍。

补: 你了解EEPROM吗?

他和RAM有什么区别? 你都不了解,还敢用?

RAM基本和IC的寿命是一样的,而EEPROM 最多只能擦写10万,现在最高也只有

100万次,而且写入和读出远远慢于RAM的速度。

注:要么提高MCU的档次,要么采用非常的手段,用在U盘读写上面。

以上就是关于89C52单片机的内存8K不够用了怎么办全部的内容,包括:89C52单片机的内存8K不够用了怎么办、恒星计价器调整时间、I2C总线与存贮器如何接口等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9467425.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存