单片机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); }
使用PIC单片机的EEPROM
PIC16F886系列单片机的SRAM是368字节,EEPROM是256字节。通过对4个寄存器进行操作就可以实现EEPROM的操作。
以下是对EEPROM的读和写程序代码:
void EEPROMwrite(uchar EEAddr,uchar Cmd)
{
EEADR = EEAddr; //EEPROM的地址
使用PIC单片机的EEPROM
PIC单片机中程序存储器是Flash结构,数据存储器有两种类型SRAM和EEPROM程序设计时,大部分变量特别是全局变量默认是存放在SRAM中,这些数据掉电后不能保存,复位后这些变量又变为默认值。在某些情况下,希望单片机复位后能记忆复位前的数值,这就要用EEPROM来存储这些数值。
GIE = 0Байду номын сангаас
RD = 1;
ReEEPROMread = EEDATA; //EEPROM的读数据
RD = 0;
GIE = 1;
return ReEEPROMread;
}
EEDATA = Cmd; //EEPROM的写数据
EEPGD = 0;
//CFGS = 0; //PIC18F中要用到
GIE = 0;
WREN = 1;
EECON2 = 0x55; //必须按这样的时序
EECON2 = 0xAA;
WR = 1;
while(WR==1); //等待写操作完成
GIE = 1;
}
uchar EEPROMread(uchar EEAddr)
{
uchar ReEEPROMread;
EEADR = EEAddr;
EEPGD = 0;
51单片机读写内部EEPROM详解
程序2:
/***************************************************************
作品:EEPROM实验,开机还原关电前LED的亮灭状况
单片机:STC89C52RC
晶振:12M
编译环境:Keil uVision4 V9.00
***************************************************************/
#define uchar unsigned char
#define uint unsigned int
/****************特殊功能寄存器声明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
{
uchar V;
V = dcx(0x2002);// 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况
if(V == 2){LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
LED1=0;LED2=1;
V = dcx(0x2002);// 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况
if(V == 2){LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
pic16单片机读写
pic16单片机读写Eeprom读写函数用于pic16 系列单片机void write_eeprom(unsigned char addr,unsigned char data) {do{;}while(WR==1); //上一次写操作是否完成EEADR=addr; //EEPROM地址EEDATA=data; //准备写入EEPROM的数据EEPGD=0; //指向EEPROM数据储存器WREN=1; //使能写操作EECON2=0x55; //设置通用参数EECON2=0xAA; //设置通用参数WR=1; //开始写do{;}while(WR==1); //等待写操作完成WREN=0; //禁止写操作}unsigned char read_eeprom(unsigned char addr){unsigned char num;do{;}while(RD==1); //上一次读操作是否完成EEADR=addr; //EEPROM地址为00HEEPGD=0; //指向EEPROM数据储存器RD=1; //开始读do{;}while(RD==1); //等待读操作完成num=EEDATA; //读出return(num); //返回读出的数}下面为pic18系列的eeprom读写程序void write_eeprom(unsigned char addr,unsigned char edata) {do{;}while(WR==1); //上一次写操作是否完成NVMADR=addr; //EEPROM地址NVMADRH:NVMADRLNVMDAT=edata; //准备写入EEPROM的数据NVMDA TNVMREG1 =0; //指向EEPROM数据储存器NVMREG0 NVMREG1 :1;NVMREG0 =0;WREN=1; //使能写操作NVMCON2=0x55; //设置通用参数NVMCON2=0xAA; //设置通用参数WR=1; //开始写do{;}while(WR==1); //等待写操作完成WREN=0; //禁止写操作}unsigned char read_eeprom(unsigned char addr){unsigned char num;do{;}while(RD==1); //上一次读操作是否完成NVMADR=addr; //EEPROM地址为00HNVMREG1 =0; //指向EEPROM数据储存器NVMREG0 NVMREG1 :1;NVMREG0 =0; //指向EEPROM数据储存器RD=1; //开始读do{;}while(RD==1); //等待读操作完成num=NVMDA T; //读出return(num); //返回读出的数}。
关于EEPROM的应用总结
关于EEPROM的应用总结关于EEPROM的应用总结当在程序运行的过程中你希望修改某个变量并且此变量的值在掉电以后不丢失,那么你就可以采用将变量数据写入EEPROM的方式来实现。
什么是EEPROM,即Electrically Erasable ProgrammableRead_Only Memory首先它是一种存储器,并且可以通过高电压来进行反复擦写的存储器。
具有掉电数据不丢失的特点。
比如常用的24C系列,93C系列的器件。
一般这种器件采用I2C的方式与单片机进行通讯,对于这种通讯方式及器件的应用另作总结。
这里主要总结一下,STC12C5204AD芯片内部包含的EEPROM的应用方法。
STC12C5201AD系列单片机内部集成了EEPROM是与程序空间分开的,利用ISP/IAP技术可将内部data flash当EEPROM,擦写10万次以上。
EEPROM可分为若干个扇区,每个扇区包含512字节。
使用时建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。
数据存储器的擦除操作是按扇区进行的。
在程序中可对EEPROM进行字节读写/字节编程/扇区擦除操作。
在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。
以免发生数据错误。
应用的步骤1、声明与EEPROM相关的寄存器2、编写EEPROM初始化函数3、编写字节擦除函数4、编写字节编程函数5、编写字节读取函数6、在需要读取EEPROM字节内容时直接调用字节读取函数即可7、在需要进行写EEPROM字节时,先调用字节擦除函数,将字节内容擦除成FFH后,在调用字节编程函数,将数据写入到EEPROM的地址单元中。
与EEPROM应用相关的寄存器符号描述地位地址及符号复位值址IAP_DATA ISP/IAP flash dataregisterC2H11111111BIAP_AD DRH ISP/IAP flashaddress highC3H00000000BIAP_AD DRL ISP/IAP flashaddress lowC4HIAP_CMDISP/IAP flashcommand registerC5HMS1MSIAP_TRIGISP/IAP flashcommand triggerC6HxxxxxxxxxBIAP_CO NTR ISP/IAP controlregisterC7HIAPENSWBS SWRSTCMD_FAILWT2WT1WT0000X000BPCON Power control87H SOMDSMOD0LVDFPOFGF1GFPDIDL00110000B1、IAP_DATA:ISP/IAP数据寄存器ISP/IAP操作时的数据寄存器。
stc12c5a16s2单片机eeprom的使用
/*********************************************************本程序实现了利用STC12c5a16s2内部的EEPROM来存取数据的功能,这样的功能可以保证数据在掉电后不会丢失,上电后依然会保存。
在这个程序中,只是简单地演示了利用该单片机的一个扇区来存储数码管的值。
数码管的值每一秒增一,日后熟练地话,可以在单片机中存储许多重要的信息。
作者:让梦远航日期:2012年10月18日最后修改:2012年11月6日欢迎对程序的功能进行扩充。
*********************************************************/#include"STC12c5a16s2.h" //stc12c5a16s2单片机的头文件,可以从stc官网上下载#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define RdCommand 0x01#define PrgCommand 0x02#define EraseCommand 0x03#define Error 1#define OK 0#define WaitTime 0x01uchar count,shu,shi,ge;sbit wela=P2^1;sbit wela1=P2^2;uchar code duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void delay(uint z){uint j,k;for(j=0;j<z;j++)for(k=0;k<110;k++);}void display(uchar shu){uchar shi,ge;shi=shu/10;ge=shu%10;wela1=0;P0=duanma[ge];delay(2);wela1=1;wela=0;P0=duanma[shi];delay(2);wela=1;}void ISP_IAP_enable(){EA=0;IAP_CONTR=IAP_CONTR&0x18;IAP_CONTR=IAP_CONTR|WaitTime;IAP_CONTR=IAP_CONTR|0x80;}void ISP_IAP_disable(){IAP_CONTR=IAP_CONTR&0x7f;IAP_TRIG=0x00;EA=1;}void ISPgoon(){ISP_IAP_enable();IAP_TRIG=0x5a;IAP_TRIG=0xa5;_nop_();}uchar byte_read(uint byte_addr){IAP_ADDRH =(uchar)(byte_addr>>8);IAP_ADDRL =(uchar)(byte_addr&0x00ff);IAP_CMD =IAP_CMD&0xf8;IAP_CMD =IAP_CMD|RdCommand;ISPgoon();ISP_IAP_disable();return(IAP_DA TA);}void SectorErase(uint sector_addr){uint iSectorAddr;iSectorAddr=(sector_addr&0xfe00);IAP_ADDRH =(uchar)(iSectorAddr>>8);IAP_ADDRL =0x00;IAP_CMD =IAP_CMD&0xf8;IAP_CMD =IAP_CMD|EraseCommand;ISPgoon();ISP_IAP_disable();}void byte_write(uint byte_addr,uchar original_data) {IAP_ADDRH =(uchar)(byte_addr>>8);IAP_ADDRL =(uchar)(byte_addr&0x00ff);IAP_CMD =IAP_CMD&0xf8;IAP_CMD =IAP_CMD|PrgCommand;IAP_DA TA=original_data;ISPgoon();ISP_IAP_disable();}void main(){// int i;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;shu=byte_read(0x0000); //我们在具体操作的时候,主要就是注意操作单片机的EEPROM 的扇区,0x0000是//第一扇区的起始地址,此单片机共有56个扇区,只需要把数据存到相应的扇区(每个扇//区都有自己的起始地址和结束地址,写程序的时候,只需更改括号里面的扇区地址值就行).while(1){if(count>=20){count=0;shu++;SectorErase(0x0000); //相应的在这里也要修改,比如第二扇区起始地址是200H,只需将0000改成200就行。
STC单片机EEPROM的读写程序
STC单片机EEPROM的读写程序汇编语言写的,依据stc 单片机官方提供的资料,测试ok,另外还有c 语言的大家可到论坛去找。
stc 的eeprom 功能还是不错的,可以简化我们的外围电路,但是缺点是是有就那就是写入速度太慢了,只能按扇区的写,不能字节写.下面是代码AUXR1 EQU 0A2HISPDATA EQU 0E2HISPADDRH EQU 0E3H ISPADDRL EQU 0E4HISPCMD EQU 0E5HISPTRIG EQU 0E6HISPCONTR EQU 0E7HORG 0000HAJMP MAINORG 0030HMAIN:MOV AUXR1,#0INC AUXR1MOV DPTR,#2000HACALL ERASEMOV A,#0FEHACALL EEPROMWACALL EEPROMRINC AUXR1AJMP MAINERASE:;擦除MOV ISPCONTR,#81HMOV ISPCMD,#03HMOV ISPADDRH,DPHMOV ISPADDRL,DPLCLR EAMOV ISPTRIG,#46HMOV ISPTRIG,#0B9HNOPSETB EAACALL ISPXXRETEEPROMW:;写MOV ISPCONTR,#81HMOV ISPCMD,#02HMOV ISPADDRH,DPHMOV ISPADDRL,DPLMOV ISPDATA,ACLR EAMOV ISPTRIG,#46HMOV ISPTRIG,#0B9HNOP SETB EAACALL ISPXXRETEEPROMR:;读MOV ISPCONTR,#81HMOV ISPCMD,#01HMOV ISPADDRH,DPHMOV ISPADDRL,DPLCLR EAMOV ISPTRIG,#46HMOV ISPTRIG,#0B9HNOPMOV A,ISPDATASETB EAACALL ISPXXRET ISPXX:MOV ISPCONTR,#0MOV ISPCMD,#0MOV ISPTRIG,#0RETDEL:MOV R2,#0FFHD1:MOV R1,#0FFHDJNZ R1,$DJNZ R2,D1RETENDtips:感谢大家的阅读,本文由我司收集整编。
stc89c52单片机EEPROM地址读写数据库函数
Read_isp_data=isp_data;
return(Read_isp_data);
}
/**************************************************************/
/*******************************************************************************/
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; /*开中断*/
}
/**************************************************************/
/***************STC89CXX_EEPROM字节读程序*************************/
STC89CXX_EEPROM_Char_Write(0x20,0x01,0x11);
STC89CXX_EEPROM_Char_Write(0x20,0x02,0x22);
STC89CXX_EEPROM_Char_Write(0x20,0x03,0x33);
STC89CXX_EEPROM_Char_Write(0x20,0x04,0x44);
void main (void)
{
unsigned char temp;
Delay1ms(10); //开机延时
STC89CXX_EEPROM_Erase(0x20); //擦除整个扇区
STC89CXX_EEPROM_Char_Write(0x20,0x00,0x00); //指定EEPROM地址写数据
STC单片机EEPROM的读写程序
STC单片机EEPROM的读写程序汇编语言写的,依据stc单片机官方提供的资料,测试ok,另外还有c语言的大家可到论坛去找。
stc的eeprom 功能还是不错的,可以简化我们的外围电路,但是缺点是是有就那就是写入速度太慢了,只能按扇区的写,不能字节写.下面是代码AUXR1 EQU 0A2HISPDATA EQU 0E2HISPADDRH EQU 0E3HISPADDRL EQU 0E4HISPCMD EQU 0E5HISPTRIG EQU 0E6HISPCONTR EQU 0E7HORG 0000HAJMP MAINORG 0030HMAIN:MOV AUXR1,#0INC AUXR1MOV DPTR,#2000H ACALL ERASEMOV A,#0FEH ACALL EEPROMW ACALL EEPROMR INC AUXR1AJMP MAIN ERASE:;擦除MOV ISPCONTR,#81H MOV ISPCMD,#03H MOV ISPADDRH,DPH MOV ISPADDRL,DPL CLR EAMOV ISPTRIG,#46H MOV ISPTRIG,#0B9H NOPSETB EAACALL ISPXXRET EEPROMW:;写MOV ISPCONTR,#81H MOV ISPCMD,#02HMOV ISPADDRH,DPH MOV ISPADDRL,DPL MOV ISPDATA,A CLR EAMOV ISPTRIG,#46H MOV ISPTRIG,#0B9H NOPSETB EAACALL ISPXXRET EEPROMR:;读MOV ISPCONTR,#81H MOV ISPCMD,#01H MOV ISPADDRH,DPH MOV ISPADDRL,DPL CLR EAMOV ISPTRIG,#46H MOV ISPTRIG,#0B9H NOPMOV A,ISPDATA SETB EAACALL ISPXXRETISPXX:MOV ISPCONTR,#0 MOV ISPCMD,#0 MOV ISPTRIG,#0 RETDEL:MOV R2,#0FFHD1:MOV R1,#0FFH DJNZ R1,$DJNZ R2,D1RETEND。
PIC单片机片内EEPROM的读写程序
PIC单片机片内EEPROM的读写程序因为也是摸索着学习PIC单片机,当要用到EEPROM存储部分系统参数,看单片机手册上的资料,觉得还是比较麻烦,然后还是不太会,然后就想找找看网上有没有现成的PIC单片机的片内EEPROM的读写程序,然后都没有找到想要的,而且对汇编语言的也不知道,所以搜索了下最后终于发现PICC编译器里面其实对内部的EEPROM的读写有头文件,可以直接来用,方法如下:PICC的安装目录下C:\Program Files\HI-TECH Software\PICC\9.81\include(这是我的电脑里目录)里面有一个eeprom_routines.h的文件这个就是关于EEPROM 中的读写程序,具体程序如下:// This header file should not be included directly// Inclusion of this file is provided indirectly by including htc.h/******************************************************************** ***//****** EEPROM memory read/write macros and function definitions *******//******************************************************************** ***//* NOTE WELL:The macro EEPROM_READ() is NOT safe to use immediately after anywrite to EEPROM, as it does NOT wait for WR to clear. This is bydesign, to allow minimal code size if a sequence of reads isdesired. To guarantee uncorrupted writes, use the functioneeprom_read() or insertwhile(WR)continue;before calling EEPROM_READ().*/#if EEPROM_SIZE > 0#ifdef __FLASHTYPE// macro versions of EEPROM write and read#define EEPROM_WRITE(addr, value) \do{ \while(WR)continue;EEADRL=(addr);EEDATA=(value); \EECON1&=0x3F;CARRY=0;if(GIE)CARRY=1;GIE=0; \WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \if(CARRY)GIE=1; \}while(0)#define EEPROM_READ(addr)((EEADRL=(addr)),(EECON1&=0x3F),(RD=1),EEDATA)#else // else doesn't write flash#define EEPROM_WRITE(addr, value) \do{ \while(WR)continue;EEADRL=(addr);EEDATA=(value); \CARRY=0;if(GIE)CARRY=1;GIE=0; \WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \if(CARRY)GIE=1; \}while(0)#define EEPROM_READ(addr) ((EEADRL=(addr)),(RD=1),EEDATA) #endif/* library function versions */extern void eeprom_write(unsigned char addr, unsigned char value); extern unsigned char eeprom_read(unsigned char addr);#endif // end EEPROM routines看到这里就知道了。
- 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;