当前位置: 首页 > news >正文

STC单片机RAM在KEIL编程使用

随着STC推出的各种新型号的单片机,其RAM空间大小也已经远超传统8051单片机RAM空间,本文主要总结传统8051单片机RAM和STC单片机RAM使用问题。并且介绍如何在编程中使用STC单片机的高容量RAM。

目录

  • 1 单片机RAM简述
  • 2 传统98C51单片机RAM
  • 3 单片机扩展RAM
    • 3.1 89C52扩展RAM
    • 3.2 STC扩展RAM
  • 4 寻址方式
    • 4.1 汇编语法
      • 4.1.1 直接寻址
      • 4.1.2 寄存器寻址
      • 4.1.3 寄存间接器寻址
      • 4.1.4 立即寻址
      • 4.1.5 其它寻址
    • 4.2 C语法
      • 4.2.1 data
      • 4.2.1 xdata
  • 5 KEIL中关于RAM的设置(Target)

1 单片机RAM简述

单片机的RAM主要用于储存编程中我们定义的各种变量。随着变量的增加,所占用的RAM空间也会随着变多,一旦定义变量超出了RAM空间,程序在编译的时候便会出现“MAIN.c(12): error C249: ‘DATA’: SEGMENT TOO LARGE”这样的报错。

2 传统98C51单片机RAM

数据存储器也称为随机数据存储器。89C51单片机的数据存储器在物理上和逻辑上都分为两个地址空间:一个内部数据存储区,一个外部数据存储区。

89C51内部RAM共有256个单元,这256个单元共分为两部分。
一部分是00H-7FH单元(共128B),为用户数据RAM,它们用于存放执行的中间结果和过程数据。89C51的数据存储区均可读可写,部分单元还可以位寻址。;
另一部分是80H-FFH单元(也是128B),为特殊功能寄存器(SRF)单元。结构如下图所示:
89C51单片机内部RAM分布图

3 单片机扩展RAM

传统 89C51 内部 RAM 只有128字节,这128字节 RAM 既可直接寻址也可间接寻址

3.1 89C52扩展RAM

在 89C52中扩展了高 128 字节 RAM。高 128 字节 RAM 与特殊功能寄存器区共用相同的逻辑地址,都使用 80H~FFH,但在物理上是分别独立的,使用时通过不同的寻址方式加以区分。高 128 字节 RAM 只能间接寻址,特殊功能寄存器区只可直接寻址。

3.2 STC扩展RAM

现在的 STC 单片机 RAM 动辄 1K 起步。以 STC8G 系列单片机为例,STC8G 系列单片机片内除了集成 256 字节的内部 RAM 外,还集成了内部的扩展 RAM。且内部扩展 RAM 有1K字节。只能间接寻址。在 C 语言中,可使用 xdata 声明存储类型即可。

4 寻址方式

4.1 汇编语法

4.1.1 直接寻址

MOV A,35H

仅限于内部RAM进行寻址

4.1.2 寄存器寻址

MOV A,R3

用于操作8个工作寄存器

4.1.3 寄存间接器寻址

MOV A,@R1

寄存器间接寻址可用于访问内部RAM或外部数据存储器。

4.1.4 立即寻址

MOV A,#0CH

4.1.5 其它寻址

变址寻址、位寻址、相对寻址

4.2 C语法

4.2.1 data

data 用于寻址片内RAM的低128字节,可在一个周期内直接寻址。该关键字定义的变量存储在片内低128BRAM中;编程中一般省略该关键字,即默认为此寻址方式。

unsigned char data buf[10];
unsigned char      buf1[10];//两种定义方式相同

4.2.1 xdata

xdata 用于外部数据存储区,使用DPTR间接寻址,该关键字定义的变量存储在外部数据存储区中;

unsigned char xdata buf[10];

5 KEIL中关于RAM的设置(Target)

在这里插入图片描述
MEMARY MODEL:

  • Small:变量存储在内部 RAM 里
  • Compact:变量存储在外部 RAM 里,使用页8位间接寻址
  • Large:变量存储在外部 RAM 里,使用16位间接寻址

默认使用Small来存储变量,就是说单片机优先把变量存储在内部 RAM 里,如果内部 RAM 不够了,才会存到外部去。

Small 的模式:

unsigned char a;       // 变量a就存储在内部的RAM
unsigned char xdata a; // 变量a就存储在外部的RAM

Large 的模式:

unsigned char a;       // 变量a就存储在外部的RAM
unsigned char xdata a; // 变量a就存储在外部的RAM

总结:这几个选项只是影响没有特别指定变量的存储空间的时候,默认存储在哪里。

参考博文
[1] Keil C51详细设置

相关文章:

  • Git的版本控制(查看文件内容和文件的变化状态、版本日志、版本回退以及找回覆盖的版本等)
  • ijkplayer源码分析 —— 事件消息设计
  • 水文科技新仪器——地埋式积水探测器
  • Jackson ImmunoResearch通过 SDS-PAGE 进行蛋白质分离
  • FLUME 安装配置及使用示例
  • 高等教育心理学:学生的个性与社会性的发展
  • Web前端:Angular的优缺点以及何时使用Angular?
  • Redis基础与高可用集群架构进阶详解
  • 如何翻译图片上的英文?建议收藏这三个方法
  • 微信网页开发——JS-SDK接入以及微信二次分享图标和标题丢失
  • 外汇监管机构哪个好?怎么选择?
  • 基于Springboot+vue的电影票预定管理系统 elementui
  • 标签类目体系(面向业务的数据资产设计方法论)-读书笔记5
  • Python统计学01——数据可视化
  • BUUCTF:8月做题记录
  • Flex布局到底解决了什么问题
  • HTTP中GET与POST的区别 99%的错误认识
  • Java基本数据类型之Number
  • nodejs实现webservice问题总结
  • rabbitmq延迟消息示例
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • vue-cli3搭建项目
  • 大数据与云计算学习:数据分析(二)
  • 力扣(LeetCode)357
  • 使用Swoole加速Laravel(正式环境中)
  • 小程序开发之路(一)
  • 正则表达式小结
  • 《码出高效》学习笔记与书中错误记录
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #define用法
  • #ifdef 的技巧用法
  • #if和#ifdef区别
  • #pragma pack(1)
  • $NOIp2018$劝退记
  • (8)STL算法之替换
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot教学评价 毕业设计 641310
  • (三分钟)速览传统边缘检测算子
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net Core与存储过程(一)
  • .net FrameWork简介,数组,枚举
  • .Net小白的大学四年,内含面经
  • .考试倒计时43天!来提分啦!
  • []error LNK2001: unresolved external symbol _m
  • []Telit UC864E 拨号上网
  • [Android]How to use FFmpeg to decode Android f...
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [c++] 单例模式 + cyberrt TimingWheel 单例分析
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算