单片机断电后不保存程序_51单片机运行过程

本文介绍了51单片机的工作原理,重点讨论了ROM和RAM的区别。51单片机使用EPROM,断电后程序可保存,而RAM中的数据无法保留。通过code指令可将变量存储在ROM以节省RAM资源。程序执行涉及程序计数器、地址寄存器、指令寄存器等组件,运算器和控制器协同工作,完成数据处理和器件控制。
摘要由CSDN通过智能技术生成

51单片机的简要图示

a195cb7aec219f8f744b484407e979ff.png

注:
1.ROM:只读存储器,单片机的只读存储区大多用于存储程序固又称程序存储器。

  • 51单片机是EPROM,所谓的EPROM是可擦除的只读存储器。可以把原来的程序擦除了,再写一个新的进去。
  • 断电后是可以保存的,数据存储器(RAM)是不能保存的。
  • RAM只能在程序执行的时候不断地重新存储定义的变量。如int x,int y
  • 可以通过code这个指令来将定义的变量放在ROM,而不是RAM中,节省RAM资源

2.RAM:随机存取存储器,用于存储定义的变量等,速度快

  • 51单片机的RAM存储容量远小于ROM,但是速度非常之快

内部详细图示

acdfa72b7d4dba3440076424555ea61a.png

内部的结构看似十分复杂,但是大致上可以分为两个部分:运算器(红色框)和控制器(蓝色框)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
51单片机断电保存数据一般有两种方法: 1. 使用EEPROM存储数据 EEPROM是一种非易失性存储器,它可以在51单片机断电保存数据。在51单片机中,使用EEPROM保存数据可以通过IAP(In-Application Programming)方式实现。具体代码如下: ``` #include <reg51.h> // 定义EEPROM数据存储地址 #define EEPROM_ADDR 0x1000 // 写EEPROM数据函数 void WriteEEPROM(unsigned int addr, unsigned char dat) { // 关闭中断 EA = 0; // 写使能 IAP_CONTR = 0x82; // 设置地址和数据 IAP_ADDRH = (unsigned char)(addr >> 8); IAP_ADDRL = (unsigned char)addr; IAP_DATA = dat; // 执行写操作 IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; // 开启中断 EA = 1; } // 读EEPROM数据函数 unsigned char ReadEEPROM(unsigned int addr) { // 关闭中断 EA = 0; // 读使能 IAP_CONTR = 0x81; // 设置地址 IAP_ADDRH = (unsigned char)(addr >> 8); IAP_ADDRL = (unsigned char)addr; // 执行读操作 IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; // 开启中断 EA = 1; // 返回读取的数据 return IAP_DATA; } void main() { unsigned char data = 0x55; // 写数据到EEPROM WriteEEPROM(EEPROM_ADDR, data); // 从EEPROM读取数据 data = ReadEEPROM(EEPROM_ADDR); // 延时等待EEPROM写入完成 delay(10); // 重启单片机 EA = 0; SWRST = 1; } ``` 2. 使用外部SRAM存储数据 外部SRAM是一种非易失性存储器,它可以在51单片机断电保存数据。在51单片机中,使用外部SRAM保存数据需要先初始化SRAM的地址和数据线,然后才能进行读写操作。具体代码如下: ``` #include <reg51.h> // 定义SRAM地址 #define SRAM_ADDR 0x8000 // 初始化SRAM函数 void InitSRAM() { // 关闭中断 EA = 0; // 设置SRAM地址和数据线 AUXR |= 0x0C; // 开启中断 EA = 1; } // 写SRAM数据函数 void WriteSRAM(unsigned int addr, unsigned char dat) { // 关闭中断 EA = 0; // 设置SRAM地址和数据 ES = 0; *(unsigned char __xdata *)(addr + SRAM_ADDR) = dat; ES = 1; // 开启中断 EA = 1; } // 读SRAM数据函数 unsigned char ReadSRAM(unsigned int addr) { unsigned char dat = 0; // 关闭中断 EA = 0; // 读取SRAM数据 ES = 0; dat = *(unsigned char __xdata *)(addr + SRAM_ADDR); ES = 1; // 开启中断 EA = 1; // 返回读取的数据 return dat; } void main() { unsigned char data = 0x55; // 初始化SRAM InitSRAM(); // 写数据到SRAM WriteSRAM(0, data); // 从SRAM读取数据 data = ReadSRAM(0); // 延时等待SRAM写入完成 delay(10); // 重启单片机 EA = 0; SWRST = 1; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值