51单片机怎么使用内部EEPROM,上电次数、断电记忆,怎么实现计到最大值6千次。

51单片机怎么使用内部EEPROM,上电次数、断电记忆,怎么实现计到最大值6千次。,第1张

STC 很多都有内部EEPROM,如11或12系列的STC单片机,读写内部EEPROM有一定限制,比如写,必须先擦除再写,而且一次必须擦除一个扇区,所以还是很麻烦的,只能覆盖。

要实现你的功能,一点问题没有,上电后先读取上次的计数值,再加1重新写进去就可以了。

以下是EEPROM读写子程序供参考:

------------------------------------------------

读一字节,调用前需打开 IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节

IAP_READ:

MOV IAP_CONTR,#ENABLE_IAP 打开 IAP 功能, 设置 Flash *** 作等待时间

MOV IAP_CMD,#ISP_IAP_BYTE_READ 设置为IAP/ISP/EEPROM字节读模式命令

MOV IAP_ADDRH,DPH 设置目标单元地址的高8位地址

MOV IAP_ADDRL,DPL 设置目标单元地址的低8位地址

CLR EA

MOV IAP_TRIG,#5AH 先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此

MOV IAP_TRIG,#0A5H 送完A5h后,ISP/IAP命令立即被触发起动

NOP

MOV A,IAP_DATA 读出的数据在IAP_DATA单元中,送入累加器A

SETBEA

LCALL IAP_Disable 关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,

一次连续的IAP *** 作完成之后建议关闭IAP功能,不需要每次都关

RET

------------------------------------------------

字节编程,调用前需打开 IAP 功能,入口:DPTR = 字节地址, A=须编程字节的数据

IAP_WRITE:

MOV IAP_CONTR,#ENABLE_IAP 打开 IAP 功能, 设置 Flash *** 作等待时间

MOV IAP_CMD,#ISP_IAP_BYTE_PROGRAM 设置为IAP/ISP/EEPROM字节编程模式命令

MOV IAP_ADDRH,DPH 设置目标单元地址的高8位地址

MOV IAP_ADDRL,DPL 设置目标单元地址的低8位地址

MOV IAP_DATA,A 要编程的数据先送进ISP_DATA寄存器

CLR EA

MOV IAP_TRIG,#5AH 先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此

MOV IAP_TRIG,#0A5H 送完A5h后,ISP/IAP命令立即被触发起动

NOP

SETB EA

LCALL IAP_Disable 关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,

一次连续的IAP *** 作完成之后建议关闭IAP功能,不需要每次都关

RET

------------------------------------------------

擦除扇区, 入口:DPTR = 扇区地址

IAP_Erase:

MOV IAP_CONTR,#ENABLE_IAP 打开 IAP 功能, 设置 Flash *** 作等待时间

MOV IAP_CMD,#03H 设置为IAP/ISP/EEPROM扇区擦除模式命令

MOV IAP_ADDRH,DPH 设置目标单元地址的高8位地址

MOV IAP_ADDRL,DPL 设置目标单元地址的低8位地址

CLR EA

MOV IAP_TRIG,#5AH 先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此

MOV IAP_TRIG,#0A5H 送完A5h后,ISP/IAP命令立即被触发起动

NOP

SETB EA

LCALL IAP_Disable 关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,

一次连续的IAP *** 作完成之后建议关闭IAP功能,不需要每次都关

RET

------------------------------------------------

IAP_Disable:

关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,

一次连续的IAP *** 作完成之后建议关闭IAP功能,不需要每次都关

MOV IAP_CONTR,#0 关闭 IAP 功能

MOV IAP_CMD,#0 清命令寄存器,使命令寄存器无命令,此句可不用

MOV IAP_TRIG,#0 清命令触发寄存器,使命令触发寄存器无触发,此句可不用

MOV IAP_ADDRH,#0FFH 送地址高字节单元为00,指向非EEPROM区

MOV IAP_ADDRL,#0FFH 送地址低字节单元为00,防止误 *** 作

RET

整体看没啥问题,建议楼主用串口看看,也可以先把num1写入,再接着读出来然后显示看看是不是之前的数据,确保数据被正确写入

楼主要注意数据类型的使用,num1是(uint)而write_byte(uchar data)

要做到数据类型的统一以免出现莫名奇妙的问题

uchar read_byte(uint byte_add)

{

ISP_TRIG=0XB9

return ISP_DATA

ISP_CONTR=0//这句放在这不会被执行的,如果有用要放到return之前

}

没用过单片机的E2PROM(我一直以为误认为单片机的E2PROM是用来下载存程序代码用的-_-!),百度了才知道啊

STC单片机EEPROM读写 http://www.51hei.com/bbs/dpj-32639-1.html

楼主自己对比看看是不是存储 *** 作上有地方不对导致显示不对

//AT24C系列读写程序

//本程序调试通过

#include "csh.h"

#include<reg51.h>

#include <intrins.h>

sbit SDA=P3^3//AT24C02数据线

sbit SCL=P3^2//AT24C02时钟线

//sbit SDA=P3^4//AT24C02数据线

//sbit SCL=P3^3//AT24C02时钟线

void start()

// 开始位

{

SDA = 1

SCL = 1

_nop_()

_nop_()

SDA = 0

_nop_()

_nop_()

_nop_()

_nop_()

SCL = 0

}

void stop()

// 停止位

{

SDA = 0

_nop_()

_nop_()

SCL = 1

_nop_()

_nop_()

_nop_()

_nop_()

SDA = 1

}

unsigned char shin()

// 从AT24Cxx移入数据到MCU

{

unsigned char i,read_data

for(i = 0i <8i++)

{

SCL = 1

read_data <<= 1

read_data |= (unsigned char)SDA

SCL = 0

}

return(read_data)

}

bit shout(unsigned char write_data)

// 从MCU移出数据到AT24Cxx

{

unsigned char i

bit ack_bit

for(i = 0i <8i++) // 循环移入8个位

{

SDA = (bit)(write_data &0x80)

_nop_()

SCL = 1

_nop_()

_nop_()

SCL = 0

write_data <<= 1

}

SDA = 1 // 读取应答

_nop_()

_nop_()

SCL = 1

_nop_()

_nop_()

_nop_()

_nop_()

ack_bit = SDA

SCL = 0

return ack_bit // 返回AT24Cxx应答位

}

void write_byte(unsigned char addr, unsigned char write_data)

// 在指定地址addr处写入数据write_data

{

start()

shout(OP_WRITE)

shout(addr)

shout(write_data)

stop()

delay(10) // 写入周期

}

unsigned char read_current()

// 在当前地址读取

{

unsigned char read_data

start()

shout(OP_READ)

read_data = shin()

stop()

return read_data

}

unsigned char read_random(unsigned char random_addr)

// 在指定地址读取

{

start()

shout(OP_WRITE)

shout(random_addr)

return(read_current())

}


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

原文地址: https://outofmemory.cn/yw/12075569.html

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

发表评论

登录后才能评论

评论列表(0条)

保存