单片机EEPROM
单片机中EEPROM的异常情况与应对
单片机中EEPROM的异常情况与应对
在单片机设计当中,串行EEPROM的可靠性有目共睹。
但是虽然有着高可靠性,但是串行EEPROM在使用过程中会出现数据出错的情况,并且数据出错的情况大多数发生在插拔电源的情况下。
下面将罗列出几种EEPROM的出错情况,而后提供一些应对方法。
出错情况
1.EEPROM读写的时序可能有小小的不对。
2.在掉电时,在电压降低到一定程度后到完全没电之间的一段时间内,在MCU与EEPROM的读写信号线上出现非控制的快速随机电平,这些电平可能会组合出一些被EEPROM认为合法的写命令,结果将EEPROM中的值修改掉;
3.在上电的复位期间,I/O脚上电平未定,也可能随机组合出一些写命令; 4.在读EEPROM操作过程中,出现了复位(如充电复位)等,形成类似于(二)的情况;
5.在电压降低后,可能会出现MCU跑飞了,结果运行到了写EEPROM的底层驱动程序中,强将数据写入了进去。
解决方法
1.按Datasheet上的时序,发现多数时候读写正确,但有时偶尔不对,这时可以降低读写的速度,多几个NOP。
2.为防止读EEPROM的过程中出现复位,可以在MCU复位后200ms内禁止读写EEPROM,因充电引起的复位抖动,一般在数十毫秒内,过了这段时间,再出现复位的可能性不大,
3.在写EEPROM的底层驱动程序中,在执行写动作时,判断一下某些标。
单片机常用术语
单片机常用术语单片机(Microcontroller)是一种集成了微处理器、存储器和外设接口的单个集成电路芯片。
它广泛应用于电子设备中,用于控制和执行各种任务。
在单片机领域,有一些常用术语被广泛使用,下面将对这些术语进行介绍和解释。
1. GPIO(General Purpose Input/Output)GPIO是单片机中的通用输入输出引脚。
它可以通过软件编程来控制,既可以作为输入口用来读取外部信号,也可以作为输出口用来控制外部设备。
通过控制GPIO,可以实现单片机与外部世界的交互。
2. ADC(Analog to Digital Converter)ADC是模数转换器的英文缩写,用于将模拟信号转换为数字信号。
单片机一般配备有ADC模块,可以将外部的模拟量信号转换成相应的数字量,以供后续的数字处理和分析。
3. UART(Universal Asynchronous Receiver/Transmitter)UART是一种通用的异步串行通信接口。
它用于实现单片机和外部设备之间的数据传输。
UART通过将数据位、停止位和校验位按照一定的规则进行组织,以实现数据的可靠传输。
4. PWM(Pulse Width Modulation)PWM是一种脉冲宽度调制技术。
它通过改变信号的脉冲宽度来控制某个输出端口的电平。
PWM常用于控制电机的速度、LED的亮度等应用场景,可以通过调整占空比来实现精细的控制效果。
5. I2C(Inter-Integrated Circuit)I2C是一种串行通信总线协议,由Philips公司在上世纪80年代推出。
它通过两根线路(串行数据线SDA和串行时钟线SCL)来实现多个设备之间的通信。
I2C常用于连接单片机和传感器、存储器等外设。
6. SPI(Serial Peripheral Interface)SPI是一种串行的外设接口协议,用于在单片机和外部设备之间传输数据。
它使用多线全双工模式,包括一个主设备和一个或多个从设备。
单片机内的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结构,现在已基本上停产了。
单片机断电短暂记忆功能
单片机断电短暂记忆功能在一些应用场景下,单片机需要断电后能够保留一些重要的信息,例如电子秤需要保存当前称量的数值,温湿度传感器需要保存当前的环境信息等。
如果没有断电短暂记忆功能,每次断电后都需要重新初始化这些信息,这不仅浪费时间和资源,还可能导致数据丢失。
一种常用的实现方法是使用EEPROM(电可擦可编程只读存储器)来存储断电前的数据。
EEPROM是一种非易失性存储器,它可以在断电时保存数据,并且在电源重新上电后还能恢复这些数据。
EEPROM主要通过电场效应将数据存储在晶体管的栅极上,因此它不需要外部电源来保持数据的存储状态。
在单片机上,可以使用I2C或SPI接口与EEPROM通信,读写数据。
另一种常见的方法是使用闪存来实现断电短暂记忆功能。
闪存是一种非易失性存储器,通常用于存储程序代码和配置信息。
与EEPROM相比,闪存具有更高的存储密度和更快的读写速度,但相应的价格也更高。
在单片机上,可以通过SPI接口与闪存通信,将断电前的数据保存在闪存中,并在上电后恢复这些数据。
除了EEPROM和闪存外,还可以使用SD卡等外部存储器来实现断电短暂记忆功能。
SD卡是一种常见的存储介质,具有较大的存储容量和较快的读写速度。
在单片机上,可以通过SPI接口与SD卡通信,将断电前的数据保存在SD卡中,并在上电后从SD卡中读取这些数据。
无论是使用EEPROM、闪存还是SD卡,都需要在软件层面做一些工作来实现断电短暂记忆功能。
首先,需要定义一个数据结构,用于保存断电前的数据。
然后,需要在断电前将这些数据存储到外部存储器中,可以使用适当的协议或API来实现数据的读写。
在上电后,需要读取外部存储器中的数据,并将其恢复到相应的变量或寄存器中。
最后,需要在程序中处理可能出现的数据错误或异常情况,以确保数据的正确性和完整性。
总之,单片机断电短暂记忆功能是一种非常有用的功能,它可以保留断电前的信息,简化系统的初始化过程,并提高系统的可靠性和稳定性。
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的应用
(2)向STC12C5A60S2单片机片内EEPROM中某单元写入数据 (假设系统时钟频率为20MHz):
MOV IAP_DATA,#DATA;先将要写入旳数据送至IAP_DATA寄 存器
MOV IAP_ADDRH,#BYTE_ADDRH;送单元地址旳高8位 MOV IAP_ADDRL,#BYTE_ADDRL;送单元地址旳低8位 MOV IAP_CONTR,#10000010B;设置等待时间且允许对
MS1 MS0 • 操作任务旳选择
0
0
待机模式,不操作
0
1
对EEPROM进行读操作
1
0
对EEPROM进行写操作
1
1 对EEPROM进行擦除操作
2.控制寄存器IAP_CONTR
WT2 WT1 WT0 读(2个 时钟)
1 1 1 2个时钟
写(55us) 55个时钟
扇区擦除( 21ms) 21012个时钟
MOV IAP_ADDRH,DPH;送地址旳高8位
MOV IAP_TRIG,#5AH;开启写操作
MOV IAP_TRIG ,#0A5H
LCALL DELAY_55μs ;延时等待
RET
BYTE_READ:
;读
MOV IAP_CONTR,#82H
MOV IAP_CMD,#01H ;读EEPROM命令
• EEPROM分为若干个扇区,每个扇区旳大小为512B,数据 存储器旳擦除操作是按扇区进行旳,能够擦写旳次数在10 万次以上。
• 使用时,同一次修改旳数据应该存储于同一种扇区,不是 同一次修改旳数据最佳存储在不同旳扇区,不一定要存满 。内部EEPROM旳扇区地址如表10-1所示。
起始地址 结束地址 起始地址 结束地址
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的地址匹配,否则无法进行有效的读写操作。
RAM、SRAM、SDRAM、ROM、EPROM、EEPROM、Flash存储器区别
RAM、SRAM、SDRAM、ROM、EPROM、EEPROM、Flash存储器区别常见存储器概念:RAM、SRAM、SDRAM、ROM、EPROM、EEPROM、Flash存储器可以分为很多种类,其中根据掉电数据是否丢失可以分为RAM(随机存取存储器)和ROM(只读存储器),其中RAM的访问速度比较快,但掉电后数据会丢失,而ROM掉电后数据不会丢失。
在单片机中,RAM主要是做运行时数据存储器,FLASH主要是程序存储器,EEPROM主要是用以在程序运行保存一些需要掉电不丢失的数据.FLASH:单片机运行的程序存储的地方。
SRAM:存储单片机运行过程中产生的了临时数据。
EEPROM:视用户的需要而定,一般用来存储系统的一些参数,这些参数可能需要修改,也可能不会修改。
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。
ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。
另外,一些变量,都是放到RAM里的,一些初始化数据比如液晶要显示的内容界面,都是放到FLASH区里的(也就是以前说的ROM区),EEPROM可用可不用,主要是存一些运行中的数据,掉电后且不丢失RAM 又可分为SRAM(Static RAM/静态存储器)和DRAM(Dynamic RAM/动态存储器)。
SRAM 是利用双稳态触发器来保存信息的,只要不掉电,信息是不会丢失的。
DRAM是利用MOS(金属氧化物半导体)电容存储电荷来储存信息,因此必须通过不停的给电容充电来维持信息,所以DRAM 的成本、集成度、功耗等明显优于SRAM。
SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。
DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的。
单片机Flash和EEPROM的区别
单片机Flash和EEPROM的区别FLASH的全称是FLASH EEPROM,但跟常规EEPROM的操作方法不同。
FLASH 和EEPROM的最大区分是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简洁,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。
当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。
至于那个“总工”说的话假如不是张一刀记错了的话,那是连基本概念都不对,只能说那个“总工”不但根本不懂芯片设计,就连MCU 系统的基本结构都没把握。
在芯片的内电路中,FLASH和EEPROM不仅电路不同,地址空间也不同,操作方法和指令自然也不同,不论冯诺伊曼结构还是哈佛结构都是这样。
技术上,程序存储器和非易失数据存储器都可以只用FALSH结构或EEPROM结构,甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区”,但就算如此,概念上二者依旧不同,这是基本常识问题。
没有严谨的工作精神,根本无法成为真正的技术高手。
EEPROM:电可擦除可编程只读存储器,Flash的操作特性完全符合EEPROM的定义,属EEPROM无疑,首款Flash推出时其数据手册上也清晰的标明是EEPROM,现在的多数Flash手册上也是这么标明的,二者的关系是“白马”和“马”。
至于为什么业界要区分二者,主要的缘由是Flash EEPROM的操作方法和传统EEPROM截然不同,次要的缘由是为了语言的简练,非正式文件和口语中Flash EEPROM就简称为Flash,这里要强调的是白马的“白”属性而非其“马”属性以区分Flash和传统EEPROM。
使用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;
单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写
单片机程序设计实践教程_第17章_EEPROM器件AT24C02
读写
本章主要介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
EEPROM是一种非易失性存储器,可以在电源关闭后保持数据的存储,适用于存储一些关键的配置信息或数据。
首先,需要连接单片机与AT24C02,常见的连接方式有两根数据线(SDA和SCL),两根线分别连接到单片机的I2C总线接口上。
在进行读写操作之前,需要进行初始化,设置相关的参数,如器件地址、时钟频率等。
然后,可以使用相应的读写函数对AT24C02进行读写操作。
对于读操作,需要指定读取的地址和数据长度。
可以使用一个循环来
连续读取多个数据,也可以单独读取一些地址上的数据。
读取的数据保存
在单片机的缓存中,可以根据需要进行处理或显示。
对于写操作,同样需要指定写入的地址和数据。
可以通过循环连续写
入多个数据,也可以单独写入一些地址上的数据。
写入操作完成后,要记
得进行等待,等待数据写入完成。
需要注意的是,AT24C02有一定的写入周期,写入速度较慢。
因此,
在进行连续写入操作时,需要考虑到写入速度,避免写入过快导致数据丢
失或写入错误。
本章还介绍了一些常见的应用场景,如存储温度、湿度等传感器数据,存储用户配置信息等。
总的来说,本章介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
通过实践这些内容,可以更好地掌握EEPROM的应用和使用方法,为后续的项目实践提供参考。
单片机片内大容量EEPROM的一种巧妙应用
单片机片内大容量EEPROM的一种巧妙应用引言MCS-51 单片机是目前国内应用最广泛的一种单片机型。
全球各单片机生产厂商在MCS-51 内核基础上,派生了大量的51 内核系列单片机,极大地丰富了MCS-51 的种群。
其中STC 公司推出了STC89 系列单片机,增加了大量新功能,提高了51 的性能,是MCS-51 家族中的佼佼者。
早期的单片机控制系统,采用单片机加片外EEPROM 配合,来存储一些需要预置的重要参数,并在数码管上显示出来。
由于单片机控制的整流器要求实时性很强,而早期EEPROM 的写周期在10 ms 左右,因此运行参数的预置是在整流器待机的情况下进行的。
而很多情况下需要在运行的同时记录数据,如用单片机控制的12脉波汽车电泳整流器要求在运行的同时实时记录重要数据,而且在掉电时不丢失。
由于在12 脉波整流器中运行的单片机程序,其周期必须小于1.67 ms(交流电网的1 个周期是20 ms,除以12 就是l_67 ms),这就要求实时记录的时间在1ms 以下甚至更短(考虑到程序的执行时间)。
经查阅资料发现,目前很多EEPROM 达不到这个要求[1],即使时间最短的AT89S8252 单片机片内。
EEP- ROM 的写周期也是2.5 ms。
本文通过对EEPROM 的巧妙应用,实现了整流器在线记录数据的功能。
1 寻找符合要求的单片机设备使用的是Atmel 公司的AT89C52(40DIP 封装)单片机和EEPROM 芯片2817A。
要想在不改变原设备电路板的情况下完成要求的功能,就只能在兼容的MCS-51 系列单片机中想办法。
AT89S8252 片内含有2 KB 的EEPROM,经编程测试发现,它虽然能实时记录数据并且断电不丢失,但是在向片内EEPROM 中记录1 个数据时,能引起输出电压和电流的波动,不能满足实际运。
51单片机读写内部EEPROM详解
#define uchar unsigned char
#define uint unsigned int
特殊功能寄存器声明****************
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
uchar dat;
ISP_CONTR=0x81;
ISP_CMD= 0x01;/用户可以对"Data Flash/EEPROM区"进行字节读ISP_ADDRL = addr;
ISP_ADDRH=addr>>8;
EA= 0;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
_nop_();
dat=ISP_DATA;
uchar dcx(uint addr);
voidQ0();
/*
*/
/*
void main(void)
uchar V;
V = dcx(0x2002);//开机读取EEPROM区2002h数据,还原关电前LED的亮灭 状况
if(V==2){LED1=0;LED2=1;}
else if(V==6){LED1=0;LED2=0;}
验证第二、第三个程序时需按程序内主程序中的操作说明进行烧录单片
机,以验证是否成功操作单片机内部EEPROM。
程序1:
/***************************************************************
作品:EEP ROM实验,开机还原关电前LED的亮灭状况
ISP_ADDRH=addr>>8;
单片机名词解释
单片机名词解释单片机(Microcontroller),是一种集成电路芯片,主要用于嵌入式系统中的控制和运算。
它集成了处理器核心、存储器、输入输出接口和定时器等外围设备,具备一定的运算能力和控制能力。
单片机由于其体积小、功耗低、性能高、接口丰富等特点,被广泛应用于家电、汽车电子、工控自动化、通信设备等领域。
以下是一些单片机常见的名词解释:1. 处理器核心(Processor Core):单片机的处理器核心是其计算和控制的主要部分,包括中央处理器(CPU)、运算器(ALU)和控制器等。
它负责执行指令、处理数据和控制系统的运行。
2. 存储器(Memory):单片机的存储器分为内部存储器和外部存储器。
内部存储器包括RAM(随机存取存储器)和ROM(只读存储器),用于存储程序指令和数据。
外部存储器可以是闪存、EPROM、EEPROM等,用于扩展单片机的存储容量。
3. 输入输出接口(I/O Interface):单片机的输入输出接口用于与外部设备进行数据交互。
例如,GPIO(通用输入输出口)可以连接开关、LED等外部设备;串口、并口可以连接显示器、打印机等外部设备。
4. 定时器(Timer):定时器是单片机的一个重要外设,用于生成精确的时间延迟和定时事件。
它可以产生定时中断,使程序能够按照一定的时间间隔执行特定的操作。
5. 中断(Interrupt):中断是单片机的一种机制,可以在特定事件发生时打断程序的正常执行,优先执行相应的中断服务程序。
中断可以是外部中断,例如按钮按下;也可以是定时器中断,例如定时器溢出。
6. 片内外设(Peripheral):片内外设是指单片机集成在芯片内部的各种功能模块,例如ADC(模数转换器)、PWM(脉冲宽度调制器)、I2C(串行通信接口)等。
这些外设可以直接与单片机核心进行数据交互,实现更多的应用功能。
7. 编程(Programming):单片机的编程是指将用户的程序代码加载到单片机内存中,使单片机能够执行这些代码。
单片机读写EEPROM例子
单⽚机读写EEPROM例⼦eeprom.c#ifndef _EEPROM_H_#define _EEPROM_H_#include <intrins.h>#include <reg52.h>typedef unsigned int uint;typedef unsigned char uchar;/********STC89C52扇区分布*******第⼀扇区:2000H--21FF第⼆扇区:2200H--23FF第三扇区:2400H--25FF第四扇区:2600H--27FF第五扇区:2800H--29FF第六扇区:2A00H--2BFF第七扇区:2C00H--2DFF第⼋扇区:2E00H--2FFF*******************************/#define RdCommand 0x01 //字节编程数据命令#define PrgCommand 0x02 //字节读数据命令#define EraseCommand 0x03 //扇区擦除数据命令#define Error 1#define Ok 0#define WaitTime 0x01 //定义CPU的等待时间,40M以下为0,20M以下为1,10M以下为2,5M以下为3/*****ISP/IAP特殊功能寄存器声明********/sfr ISP_DATA = 0xE2;sfr ISP_ADDRH = 0xE3;sfr ISP_ADDRL = 0xE4;sfr ISP_CMD = 0xE5;sfr ISP_TRIG = 0xE6;sfr ISP_CONTR = 0xE7;unsigned char byte_read(unsigned int byte_addr);void byte_write(unsigned int byte_addr,unsigned char Orig_data);void SectorErase(unsigned int sector_addr);#endifeeprom.c#include "eeprom.h"/**********打开ISP/IAP功能**************/void ISP_IAP_Enable(void){EA = 0; //关中断ISP_CONTR = ISP_CONTR & 0x18;ISP_CONTR = ISP_CONTR | WaitTime; // 设置等待时间ISP_CONTR = ISP_CONTR | 0x80; //允许ISP/IAP操作}/**********关闭ISP/IAP功能**************/void ISP_IAP_Disable(void){ISP_CONTR = ISP_CONTR & 0x7f; //禁⽌ISP/IAP操作ISP_CMD = 0x00; //去除ISP/IAP命令ISP_TRIG = 0x00; //防⽌ISP/IAP命令⽆触发EA = 1; // 开中断}/**********触发ISP/IAP**************/void ISPTrig(void){ISP_TRIG = 0x46; //先送46h,再送B9h到ISP/IAP触发寄存器,每次都需如此ISP_TRIG = 0xb9; //送完B9h后,ISP/IAP命令⽴即被触发启动_nop_();}/**********字节读**************/unsigned char byte_read(unsigned int byte_addr){unsigned char dat = 0; //读EEPROM数据缓存EA = 0; //关中断ISP_ADDRH = (unsigned char)(byte_addr >> 8); //送地址⾼字节ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); //送地址低字节ISP_IAP_Enable(); //打开ISP/IAP功能ISP_CMD = ISP_CMD & 0xf8; //清除ISP_CMD寄存器低3位ISP_CMD = ISP_CMD | RdCommand; //写⼊读数据命令ISPTrig(); //触发ISP/IAPdat = ISP_DATA; //将ISP_DATA寄存器中的数据保存起来ISP_IAP_Disable(); //关闭ISP/IAP功能EA = 1; //使能中断return dat; //返回读到的数据}/**********字节写**************/void byte_write(unsigned int byte_addr,unsigned char Orig_data){EA = 0; //关中断ISP_ADDRH = (unsigned char)(byte_addr >> 8); //送地址⾼字节ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); //送地址低字节ISP_IAP_Enable(); //打开ISP/IAP功能ISP_CMD = ISP_CMD & 0xf8; //清除ISP_CMD寄存器低3位ISP_CMD = ISP_CMD | PrgCommand; //写⼊写数据命令ISP_DATA = Orig_data; //写⼊数据到ISP_DATA寄存器ISPTrig(); //触发ISP/IAPISP_IAP_Disable(); //关闭ISP/IAP功能EA =1; //使能中断}/**********扇区擦除**************/void SectorErase(unsigned int sector_addr){EA = 0;ISP_ADDRH = (unsigned char)(sector_addr >> 8); //送擦除地址⾼字节 ISP_ADDRL = (unsigned char)(sector_addr & 0x00ff); //送擦除地址低字节 ISP_IAP_Enable();ISP_CMD = ISP_CMD & 0xf8; //清除ISP_CMD寄存器低3位ISP_CMD = ISP_CMD | EraseCommand; //写⼊擦除数据命令ISPTrig(); //触发ISP/IAPISP_IAP_Disable(); //关闭ISP/IAP功能}ISP2.C/********************************************************************************* @file main.c* @author waitstory* @version V1.0* @date 2018-4-11* @brief STC89C52RC内部EEPROM的读写******************************************************************************* @attention** 实验平台:STC89C52RC芯⽚,晶振11.0592MHz*********************************************************************************/#include <eeprom.h>#include <absacc.h>void InitUART(uint baud); //串⼝初始化函数void UartTXData(uchar str[]); //串⼝发送函数void Delay_ms(uint z); //延时函数uchar TxStr[3] = {1};uchar dat[2] ={0x33,0x35};uint ma,mb;char id;char *MCUID;/********STC89C52扇区分布*******第⼀扇区:2000H--21FF第⼆扇区:2200H--23FF第三扇区:2400H--25FF第四扇区:2600H--27FF第五扇区:2800H--29FF第六扇区:2A00H--2BFF第七扇区:2C00H--2DFF第⼋扇区:2E00H--2FFF*******************************/void main(){//ma=0x2000;SectorErase(0x2000); //擦除第⼀扇区byte_write(0x2001,dat[0]); //在地址为0x2001的内存写⼊⼀个字节byte_write(0x2002,dat[1]); //在地址为0x2002的内存写⼊⼀个字节//byte_write(0x2001,'1'); //在地址为0x2001的内存写⼊⼀个字节//byte_write(0x2002,'2'); //在地址为0x2002的内存写⼊⼀个字节Delay_ms(1000); //延时1sInitUART(9600); //串⼝初始化函数ma=0x2e00;while(1){TxStr[0] = byte_read(0X2001); //从地址0x2001读取⼀个字节TxStr[1] = byte_read(0X2002); //从地址0x2002读取⼀个字节ma=ma+2;UartTXData(TxStr); //将读取的字节发送⾄串⼝Delay_ms(1000); //延时2s}}/* 串⼝配置函数,baud-通信波特率 */void InitUART(uint baud){EA = 1; //使能中断总开关SCON = 0x50; //配置串⼝为模式1TMOD &= 0x0F; //清零T1的控制位TMOD |= 0x20; //配置T1为模式2TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值TL1 = TH1; //初值等于重载值ET1 = 0; //禁⽌T1中断ES = 1; //使能串⼝中断TR1 = 1; //启动T1}/*串⼝发送字符串函数*/void UartTXData(uchar str[]){uchar i = 0;while(str[i] != '\0'){SBUF= str[i];i++;while(!TI);TI=0;}}/*延时函数*/void Delay_ms(uint z){uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}结果:打开STC-ISP中的串⼝助⼿-打开串⼝,9600,单⽚机发送33 35,串⼝接收到33 35。
单片机中的EEPROM存储技术
单片机中的EEPROM存储技术单片机(Microcontroller)是一种集成了微处理器、存储器和输入输出设备的微型计算机系统。
在现代科技中,单片机被广泛应用于各种电子设备中,如家电、汽车、医疗仪器等。
其中,EEPROM (Electrically Erasable Programmable Read-Only Memory)存储技术在单片机中起着重要的作用,本文将对其进行详细介绍。
一、EEPROM存储技术概述EEPROM是一种可擦写非易失性存储器,它与传统的ROM(Read-Only Memory)相比,具有可以电擦写的特点。
EEPROM的重要特性是可重复擦写和非易失性,这意味着它可以多次进行数据擦除和写入,并且在断电后仍能保持数据内容。
这使得它成为存储单片机程序和数据的理想选择。
二、EEPROM的工作原理EEPROM的工作原理是通过在芯片内部的晶体管结构中存储电子电荷的不同状态来表示数据的0和1。
在擦写时,通过将电荷注入或释放到晶体管的栅极上,改变晶体管的导电性,从而改变其存储的数据。
EEPROM支持逐字节或逐页擦写,擦写过程可以通过单片机内部的控制电路来完成。
三、EEPROM的应用1. 单片机程序存储在单片机系统中,EEPROM主要用于存储程序代码。
由于EEPROM可以重复擦写并保持数据的非易失性,它可以作为存储器扩展或备份,用于存储关键的程序和指令集。
2. 数据存储单片机中的临时数据(如传感器数据、计数值等)可以通过EEPROM进行存储。
通过使用EEPROM,可以避免在断电情况下丢失数据,并且可以实现对数据的可编程访问。
3. 参数设置EEPROM还可用于存储设备的参数和配置信息。
通过将设备的设置和选项存储在EEPROM中,可以实现对设备行为的灵活调整和个性化配置。
这对于需要频繁更改参数的应用十分有用。
四、EEPROM的优缺点1. 优点EEPROM的主要优点是可重复擦写和非易失性,使得它适用于存储重要的程序和数据。
单片机的存储器
单片机的存储器在单片机的世界里,存储器就如同一个信息的宝库,它承担着存储和管理数据与程序的重要任务。
如果把单片机比作是一个聪明的大脑,那么存储器就是大脑中的记忆区域,负责记住各种关键的信息和指令。
单片机的存储器可以大致分为两类:只读存储器(ROM)和随机存取存储器(RAM)。
只读存储器就像是一本无法修改的百科全书,里面的内容在制造的时候就已经被确定下来,并且在后续的使用过程中无法更改。
而随机存取存储器则更像是一个可以随时记录和修改的笔记本,能够根据我们的需要灵活地存储和更新数据。
先来说说只读存储器(ROM)。
它又可以分为几种不同的类型,比如掩膜 ROM、可编程 ROM(PROM)、可擦除可编程 ROM (EPROM)和电可擦除可编程 ROM(EEPROM)。
掩膜 ROM 是在芯片制造过程中,通过掩膜工艺将信息一次性写入的。
这就好比是在生产一本书的时候,直接把内容印在了书页上,一旦印好就无法更改。
所以掩膜 ROM 通常用于存储那些在单片机运行过程中不会改变的程序或数据,比如一些固化的系统程序。
可编程 ROM(PROM)则给了我们一次写入的机会。
它在出厂时里面的内容是空白的,我们可以通过特定的编程设备将数据写入其中。
但一旦写入,就不能再修改了,就像在一张白纸上写下了字,就无法擦掉重写。
可擦除可编程 ROM(EPROM)则相对灵活一些。
我们可以通过紫外线照射的方式将里面的数据擦除,然后重新写入新的内容。
这就像是用一块可以擦除的黑板,擦干净后又能重新书写。
电可擦除可编程 ROM(EEPROM)则更加方便。
它不需要通过紫外线照射,而是通过电信号就可以实现数据的擦除和重新写入。
这使得在实际应用中,对数据的更新和修改变得更加便捷。
接下来是随机存取存储器(RAM)。
RAM 可以随时进行读和写操作,这使得它非常适合用于存储那些在单片机运行过程中需要频繁改变的数据。
静态随机存取存储器(SRAM)的速度较快,但集成度相对较低,成本也较高。
单片机元件名称及中英对照
单片机元件名称及中英对照单片机是一种在微型计算机系统中占核心地位的集成电路,它包含了中央处理器(CPU)、存储器(ROM和RAM)、输入/输出接口等功能模块。
单片机元件名称在嵌入式系统开发中非常重要,能够准确理解和正确使用这些名称是进行嵌入式开发的基础。
下面,我们将介绍一些常见的单片机元件名称,并提供中英对照。
1. CPU(Central Processing Unit,中央处理器)CPU是单片机的核心部件,负责执行各种指令和控制系统的运行。
在单片机中,CPU通常由微处理器和寄存器组成。
2. ROM(Read-Only Memory,只读存储器)ROM是一种只能读取数据但不能写入数据的存储器,单片机中用于存储程序代码和常量数据。
常见的ROM包括EPROM、EEPROM和闪存。
3. RAM(Random Access Memory,随机存取存储器)RAM是一种能够读写数据的存储器,用于存储单片机运行时的变量和临时数据。
RAM具有较快的读写速度,但是数据在断电后会丢失。
4. 输入/输出接口(Input/Output Interface)输入/输出接口是单片机与外部设备进行数据交互的接口。
通过输入/输出接口,单片机可以接收外部设备的输入信号并向外部设备输出指定的数据。
5. 定时器/计数器(Timer/Counter)定时器/计数器是单片机中用于计时和计数的功能模块。
它可以根据外部触发信号或单片机内部时钟来进行计时和计数操作。
6. 中断(Interrupt)中断是单片机中的一种重要的事件处理方式。
当某个外部事件发生时,单片机会暂停当前的执行,并跳转到预设的中断处理程序中执行相应的操作。
7. 存储器映射(Memory Mapping)存储器映射是指将各种存储器元件(如ROM、RAM等)和外设接口按照一定的地址方式进行映射,并使其能够被CPU访问和操作。
8. 串行通信接口(Serial Communication Interface)串行通信接口是单片机与外部设备进行串行数据传输的接口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ISP_TRIG = 0; // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
}
sfr ISP_ADDRL = 0XE4; //Flash Address Low
sfr ISP_CMD = 0XE5; //Flash Command Register
sfr ISP_TRIG = 0XE6; //Flash Command Register
sfr ISP_CONTR = 0XE7; //Control Register
函数:擦除某一扇区(每个扇区512字节)
入口:addr = 某一扇区首地址
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void cc(uint addr)
{
// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M)
ISP_CONTR = 0x81; // 打开 IAP 功能(ISPEN(ISP_CONTR.7)=1:允许编程改变Flash, 设置 Flash 操作等待时间。
ISP_CMD = 0x03; // 用户可以对"Data Flash/EEPROM区"进行扇区擦除
/***************************************************************
作品:EEPROM实验:保存关电前LED的亮灭状况
单片机:STC89C52RC
晶振:12M
编译环境:Keil uVision4 V9.00
***************************************************************/
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
ISP_DATA = dat; // 数据进ISP_DATA
EA = 0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
sbit K1 = P3^2; //按钮1
sbit K2 = P3^3; //按钮2
void cc(uint addr); //EEPROM擦除
void xcx(uint addr,uchar dat); //EEPROM编程
uchar dcx(uint addr); //EEPROM读取
P1=0X0F;
cc(0x2000); // 擦除第1个扇区(2000h~21FFh)
xcx(0x2002,6); // 对EEPROM区2002h写入6
}
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
ISP_ADDRH = addr>>8;
EA = 0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
dat = ISP_DATA; // 取出数据
ISP_ADDRL = addr; // ISP/IAP操作时的地址寄存器低八位,
ISP_ADDRH = addr>>8; // ISP/IAP操作时的地址寄存器高八位。
EA =0; //关闭中断
ISP_TRIG = 0x46; // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sfr ISP_DATA = 0xE2; //Flash Data Register
sfr ISP_ADDRH = 0XE3; //Flash Address High
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void xcx(uint addr,uchar dat)
{
ISP_CONTR = 0x81;
ISP_CMD = 0x02; // 用户可以对"Data Flash/EEPROM区"进行字节编程
ISP_TRIG = 0xB9; // 再写入B9h,ISP/IAP命令才会生效。
_nop_();
Q0(); // 关闭ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:写一字节
入口:addr = 扇区单元地址 , dat = 待写入数据
_nop_();
Q0(); // 关闭ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:读一字节
入口:addr = 扇区单元地址
出口:dat = 读出的数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0(); //关闭IAP/ISP操作
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
uchar V;
V = dcx(0x2002); // 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况
Q0(); // 关闭ISP/IAP
return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:关闭ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
ISP_CONTR = 0; // 关闭IAP功能
if(V == 2) {P1=0XF0;} //LED的状态
else if(V == 6){P1=0X0F;} //LED的状态
while(1)
{
if(!K1) //按键K1
{
while(!K1); //按键释放
P1=0XF0;
cc(0x2000); // 擦除第1个扇区(2000h~21FFh)
xcx(0x2002,2); // 对EEPROM区2002h写入2
} if(!K2) { while(!K2);
uchar dcx(uint addr)
{
uchar dat;
ISP_CONTR = 0x81;
ISP_CMD = 0x01; // 用户可以对"Data Flash/EEPROM区"进行字节读
ISP_ADDRL = addr;