单片机EEPROM的使用函数
单片机内的Flash与EEPROM作用及区别

单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RA M 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPR OM或F LASHR OM 等存储器来实现。
在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC或SPI等接口来进行数据通信。
这样不光会增加开发成本,同时在程序开发上也要花更多的心思。
在ST C 单片机中内置了E EPROM(其实是采用IAP技术读写内部FLAS H 来实现EEPR OM),这样就节省了片外资源,使用起来也更加方便。
下面就详细介绍STC单片机内置EEP ROM 及其使用方法。
f lash是用来放程序的,可以称之为程序存储器,可以擦出写入但是基本都是整个扇区进行的.一般来说单片机里的f lash都用于存放运行代码,在运行过程中不能改;EEPR OM是用来保存用户数据,运行过程中可以改变,比如一个时钟的闹铃时间初始化设定为12:00,后来在运行中改为6:00,这是保存在EE PROM里,不怕掉电,就算重新上电也不需要重新调整到6:00下面是网上详细的说法,感觉不错:F LASH和EEPR OM的最大区别是FL ASH按扇区操作,E EPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLA SH的电路结构较简单,同样容量占芯片面积较小,成本自然比EE PROM低,因而适合用作程序存储器,EE PROM则更多的用作非易失的数据存储器。
当然用FL ASH做数据存储器也行,但操作比EEPR OM麻烦的多,所以更“人性化”的MCU设计会集成F LASH和EEPRO M两种非易失性存储器,而廉价型设计往往只有 FLA SH,早期可电擦写型MCU则都是EEPR M结构,现在已基本上停产了。
stc单片机eeprom读写程序

stc单片机eeprom读写程序以下是STC单片机使用EEPROM进行读写的示例程序:#include <reg52.h>#include <intrins.h>#define EEPROM_ADDR 0xA0 // EEPROM的I2C地址sbit SDA = P2^0; // I2C的数据线sbit SCL = P2^1; // I2C的时钟线// I2C开始信号void I2C_Start(){SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 0;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C停止信号void I2C_Stop(){SDA = 0;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 1;_nop_(); // 延时一段时间}// I2C发送一个字节的数据void I2C_SendByte(unsigned char dat){unsigned char i;for (i = 0; i < 8; i++){SDA = dat & 0x80; // 获取最高位dat <<= 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C接收一个字节的数据unsigned char I2C_ReceiveByte(){unsigned char i, dat = 0;SDA = 1;for (i = 0; i < 8; i++){_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间dat <<= 1;dat |= SDA;SCL = 0;}return dat;}// 在EEPROM中写入一个字节的数据void EEPROM_WriteByte(unsigned char addr, unsigned char dat) {I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令I2C_SendByte(addr); // 发送地址I2C_SendByte(dat); // 发送数据I2C_Stop();}// 从EEPROM中读取一个字节的数据unsigned char EEPROM_ReadByte(unsigned char addr){unsigned char dat;I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令 I2C_SendByte(addr); // 发送地址I2C_Start();I2C_SendByte(EEPROM_ADDR | 1); // 发送读取指令 dat = I2C_ReceiveByte(); // 读取数据I2C_Stop();return dat;}。
STC单片机内部EEPROM的应用

/* 判是否是有效范围,此函数不允许跨扇区操作*/
if(len > PerSector)
return Error?
in_addr = begin_addr & 0x01ff?/* 扇区内偏移量*/
if((in_addr+len)>PerSector)
{
ISP_ADDRH=(unsigned char)(byte_addr>>8)? /* 取地址*/
ISP_ADDRL=(unsigned char)(byte_addr & 0x00ff)?
ISP_CMD&=0xf8?/* 清低3 位*/
ISP_CMD|=PrgCommand?/* 写命令2*/
STC89C58RD+,STC89LE58RD+ 0x8000 共五十八个扇区
寄存器标识地址名称7 6 5 4 3 2 1 0 初始值
ISP_DATA 0xE2 ISP/IAP闪存数据寄存器11111111
ISP_ADDRH 0xE3 ISP/IAP 闪存地址高位00000000
ISP_ADDRL 0xE4 ISP/IAP 闪存地址低位00000000
#define Error 1
#define Ok 0
#define WaitTime 0x01
#define PerSector 512
unsigned char xdata Ttotal[512]?
/*
打开ISP,IAP 功能
*/
void ISP_IAP_enable(void)
AVR单片机内部EEPROM应用方法

AVR 单片机内部EEPROM 应用方法
AVR 单片机内部集成了EEPROM,但是在GCC 写编写EEPROM 应用
程序的时候,经常会出现读写EEPROM 时程序出错,或重启等不正常现象。
在软件仿真时也许结果是正确的,但是在片上运行的时候就不正常。
困扰很
久,终于发现原因在于编译器,已经我们对EEPROM 操作说明的理解不正确
或不仔细。
操作EEPROM 对时序的要求较高。
更加Datasheet 里的写操作范例程序:while(EECR & (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
EECR |= (1
EECR |= (1 以上代码在GCC 中的编译结果,发现EECR |= (1while(EECR & (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
asm volatile(SBI 0x1C,2 \n\t);
asm volatile(SBI 0x1C,1 \n\t);。
单片机函数

单片机函数单片机函数是一种用于编程控制的函数,主要用于单片机的内部功能和外部设备之间的交互。
当我们在单片机中编程时,可以使用已经定义好的函数来实现一些常见的功能,而不必每次都重复编写代码。
本文将介绍一些常见的单片机函数及其用法。
1.延时函数延时函数是单片机编程中最基本的函数之一、它用于在程序中添加延时,以控制程序的时间间隔。
延时函数可以通过软件实现,也可以通过硬件计数器来实现。
例如,对于某些需要精确控制时间的操作,我们可以使用硬件计数器来实现延时,而对于一些简单的延时操作,我们可以使用软件延时函数来实现。
2.输入输出函数输入输出函数用于读取输入设备或控制输出设备。
在单片机中,输入输出通常通过引脚来实现。
通过调用输入输出函数,我们可以读取或控制某个引脚的电平状态。
例如,如果我们希望读取一个传感器的数据,我们可以使用输入函数来读取传感器引脚的电平;如果我们想控制一个LED灯的亮灭,我们可以使用输出函数来控制LED引脚的电平状态。
3.中断函数中断函数是一种特殊的函数,它用于响应硬件中断。
当某个硬件事件发生时,中断函数会被自动调用,以便进行相应的处理。
例如,当一个按钮按下时,可以配置一个中断函数,以便在按钮按下时自动执行特定的操作。
中断函数通常是基于优先级的,可以设置不同的中断优先级来处理不同的中断事件。
4.串口通信函数串口通信函数是用于在单片机和外部设备之间进行串行通信的函数。
串行通信用于将数据以位的形式发送或接收,可以实现单片机与计算机、传感器、显示器等设备的数据传输。
串口通信函数通常包括初始化函数、发送函数和接收函数,通过调用这些函数,可以实现单片机与外部设备的数据交换。
5.定时器函数定时器函数是用于配置和控制单片机内部定时器模块的函数。
定时器可以用来产生特定时间间隔的中断,用于周期性地执行某个任务,例如定时发送数据、定时采集传感器数据等。
定时器函数通常包括配置函数、启动函数和停止函数,通过调用这些函数,可以实现定时器的设置和控制。
STC单片机EEPROM读写程序

STC单片机EEPROM读写程序在单片机中,EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以用于存储数据,即使在断电情况下,数据也会被保留。
因此,掌握STC单片机的EEPROM读写程序对于开发嵌入式系统非常重要。
一、EEPROM简介EEPROM是一种可重复擦写的存储器,可用于存储小量数据。
与Flash存储器相比,EEPROM具有更快的写入和擦除速度。
在STC单片机中,EEPROM的存储容量通常较小,一般在几个字节到几千字节之间。
二、EEPROM读操作在STC单片机中,进行EEPROM读操作需要按照以下步骤进行:1. 初始化I2C总线:STC单片机使用I2C总线进行EEPROM读写操作,因此需要先初始化I2C总线。
通过设置相关寄存器,设置I2C 总线的速度和地址。
2. 发送设备地址:确定要读取的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要读取的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送读命令:向EEPROM发送读命令,以启动读操作。
5. 读取数据:从EEPROM中读取数据,并保存到变量中。
6. 结束读操作:完成读操作后,关闭I2C总线。
三、EEPROM写操作类似于读操作,进行EEPROM写操作也需要按照一定的步骤进行:1. 初始化I2C总线:同样地,首先需要初始化I2C总线。
2. 发送设备地址:确定要写入的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要写入的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送写命令:向EEPROM发送写命令,以启动写操作。
5. 写入数据:将要写入EEPROM的数据发送到I2C总线。
6. 结束写操作:完成写操作后,关闭I2C总线。
四、注意事项在进行EEPROM读写操作时,需要注意以下几点:1. 确保正确的设备地址:要与EEPROM的地址匹配,否则无法进行有效的读写操作。
stc89c52中EEPROM使用方法

单片机STC89C52RC 内部EEPROM单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。
在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。
这样不光会增加开发成本,同时在程序开发上也要花更多的心思。
在STC 单片机中内置了EEPROM(其实是采用ISP/IAP 技术读写内部FLASH 来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。
下面就详细介绍STC 单片机内置EEPROM 及其使用方法STC 各型号单片机内置的EEPROM 的容量最小有2K,最大有16K,基本上很好地满足项目的需要,更方便之处就是节省了周边的EEPROM 器件,达到节省成本的目的,而且内部EEPROM 的速度比外部的EEPROM 的速度快很多。
STC 各型号单片机内置的EEPROM 是以512 字节为一个扇区,EEPROM 的起始地址=FALSH 容量值+1,那么STC89C52RC 的起始地址为0x2000,第一扇区的起始地址和结束地址0x2000~0x21FF,第二扇区的起始地址和结束地址0x2200~0x23FF,其他扇区如此类推。
深入重点:�传统的EEPROM 是电可擦可编程只读存储一种掉电后数据不丢失的存储芯片。
�STC89C52RC 的EEPROM 是通过ISP/IAP 技术读写内部FLASH 来实现EEPROM。
�STC89C52RC 的EEPROM 起始地址为0x2000,以512 字节为一个扇区,EERPOM 的大小为2K 字节。
STC89C52RC 与EEPORM 实现的寄存器有6 个,分别是ISP_DATA、ISP_ADDRH、ISP_ADDRLISP_TRIG、ISP_CMD、ISP_CONTR。
学习笔记之内部eeprom读写

程序修改后重新编译下载到单片机后, 打开串口调试助手, 肯定会发现什么数据都没有, 别急, 重新按下单片机的复位键就可以看到数据了。 因为在主程序中发送数据的指令只执行 了一次, 速度很快, 在你打开串口调试助手前就已经过去了, 因此需复位一下才能看到现象。 现象如下图所示:
读回的数据分别是 00,01,02,03,04,05,06,07,08,09,发现和写入的数据是相同的,那么说 明成功的对 eeprom 进行了读写操作。 只要会了这两个最基本的读写操作,那么 Atmega16 内部的 512 字节的 eeprom 空间就 可以为你所用了。
AVR 学习笔记之内部 EEPROM 读写
AVR 单片机的多数型保存的数据。 Atmega16 内置的 EEPROM 的容量是 512 字节, 可以重复擦写的次数 是 10 万次。
AVRGCC 自带的 EEPROM 读写函数可对 Atmega16 内部的 EEPROM 进行读写操作。如果要使用 AVRGCC 中自带的 EEPROM 读写函数,首先要在程序中包含#include<avr/eeprom.h>这个头文件。 AVRGCC 内置 EEPROM 访问函数库如下: (1)void eeprom_read_block(void *buf, unsigned int addr, size_t n):从 EEPROM 的 addr 地址
} void usart_init() { UCSRA=0X00; UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//写 UCSRC, 异步操作, 禁止奇偶校验, 停止位数为 1,8 位字符长度 UBRRH=(F_CPU/BAUD/16-1)/256;//波特率高 4 位 UBRRL=(F_CPU/BAUD/16-1)%256;//波特率低 8 位 UCSRB|=(1<<TXEN);//使能发送,使能接收,使能接受中断 } void usart_put_char(unsigned char TX_data)//发送一个字节的数据 { while(!(UCSRA&(1<<UDRE)));//检测 UDRE 是否为 1, 只有在 UDRE 为 1 的情况下, 才 能向缓冲器 UDR 中写入数据。 UDR=TX_data; } int main() { unsigned char i; port_init(); usart_init(); for(i=0;i<10;i++)eeprom_write_byte(i,i); while(1); } 上段程序是对 EEPROM 进行写操作,通过 for(i=0;i<10;i++)eeprom_write_byte(i,i);这段 程序实现的是在地址 0—9 分别写数据 0—9。 那么怎么知道我数据是否成功写入了呢?下面 还要进行读操作,作用是把刚才写入的数据读出来,看看是否和写入的一样,只需要修改主 程序即可。修改后的代码如下: int main() { unsigned char i; port_init(); usart_init(); for(i=0;i<10;i++) usart_put_char(eeprom_read_byte(i)); while(1); }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EEt(i,w[j]);
EEinit();
}
void EEe(uint m)
{
uint addr=(m-1)*512,i;
for(i=addr;i<addr+512;i++)
EEs(i);
EEinit();
}
#include"EEPROMus.h"
typedef unsigned char uchar;
typedef unsigned int uint;
void EEinit()//末尾清零
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0x80;
IAP_ADDRL=0x00;
********************************************************************/
/**********************************************
m的最小值是1,n的最小值是0
**********************************************/
#define_EEPROMus_h
#include<STC12C5A60S2.H>
#include<intrins.h>
extern void EEw(unsigned int m,unsigned int,unsigned char w);//将第m扇区的第n个存储空间数据改成w
extern void EEr(unsigned int m,unsigned int n,unsigned char *r);//将第m扇区的第n个存储空间数据读到r
_nop_();
//EEinit();
}
void EEr(uint m,uint n,unsigned char *r)//将第m扇区的第n个存储空间数据读到r
{
*r=EEd((m-1)*512+n);
EEinit();
}
void EEra(uint m,uint n,uchar r[])
{
uint addr=(m-1)*512,i,j;
}
uchar EEd(uint addr)//读数据read
{
uint dat;
IAP_CONTR=0x82;
IAP_CMD=0x01;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>IG=0xa5;
_nop_();
dat=IAP_DATA;
B3:/
B2B1B0:设置CPU等待时间
IAP_TRIG:
每次发送命令后要用此寄存器发送5a,然后a5后,命令生效
IAP_CMD:
对IAP进行命令输入:
0x00:无操作
0x01:读
0x02:写
0x03:擦除
IAP_ADDRH和IAP_ADDRL分别存放地址的高字节和低字节
IAP_DATA:数据读写时的存放地(先写地址,再向此写数据)
extern void EEe(unsigned int m);//删除第m扇区内的内容
extern void EEwa(unsigned int m,unsigned int n,unsigned char w[]);//在m扇区,从0x00写到第n个,写数组w里的数
extern void EEra(unsigned int m,unsigned int n,unsigned char r[]);//在m扇区,从0x00读到第n个,读到数组r里
/********************************************************************
这是EEROM.h文件
********************************************************************/
#ifndef _EEPROMus_h//对EEROM进行操作
#endif
/********************************************************************
这是EEPROM.c文件
********************************************************************/
//EEinit();
return dat;
}
void EEt(uint addr,uint dat)//写数据write
{
IAP_CONTR=0x82;
IAP_CMD=0x02;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0x5a;
for(i=addr,j=0;i<=addr+n;i++,j++)
r[j]=EEd(i);
EEinit();
}
void EEw(uint m,uint n,uchar w)
{
EEt((m-1)*512+n,w);
}
void EEwa(uint m,uint n,uchar w[])
{
uint addr=(m-1)*512,i,j;
/********************************************************************
IAP_CONTR:
B7:
0:禁止IAP
1:允许IAP
B6和B5配合让程序从AP区和ISP监控区复位及程序的开始
B4:当IAP_TRIG触发的5a/a5失败,则为1,且由软件清零
IAP_TRIG=0xa5;
_nop_();
//EEinit();
}
void EEs(uint addr)//擦除数据erase
{
IAP_CONTR=0x82;
IAP_CMD=0x03;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;