单片机语言--C51语言数据类型与存储类型以及C51的基本运算

news2025/2/25 3:04:54

单片机语言——C51语言

文章目录

  • 单片机语言——C51语言
    • 一、 C51与标准C的比较
    • 二、 C51语言中的数据类型与存储类型
      • 2.1、C51的扩展数据类型
      • 2.2、数据存储类型
    • 三、 C51的基本运算
      • 3.1 算术运算符
      • 3.2 逻辑运算符
      • 3.3 关系运算符
      • 3.4 位运算
      • 3.5 指针和取地址运算符

一、 C51与标准C的比较

C51的基本语法与标准C相同,C51在标准C的基础上进行了适合于51系列单片机硬件的扩展。
深入理解Keil C51对标准C的扩展部分以及不同之处,是掌握C51语言的关键之一。

C51与标准C的主要区别如下:
(1)库函数的不同。
(2)数据类型有一定的区别。
(3)C51的变量存储模式与标准C中的变量存储模式数据不一样。
(4)数据存储类型的不同。
(5)标准C语言没有处理单片机中断的定义。
(6)C51语言与标准C语言的输入/输出处理不一样。
(7)头文件的不同。
(8)程序结构的差异。

但是从数据运算操作、程序控制语句以及函数的使用上来说,Keil C51与标准C几乎没有什么明显的差别。

二、 C51语言中的数据类型与存储类型

Keil C51支持的基本数据类型如表3-1所示。针对AT89S51单片机的硬件特点,C51在标准C的基础上,扩展了4种数据类型(表3-1中最后4行)。

注意:扩展的4种数据类型,不能使用指针对它们存取。
在这里插入图片描述

2.1、C51的扩展数据类型

对扩展的4种数据类型说明:
(1)位变量bit
bit的值可以是1(true), 也可以是0(false)

(2)特殊功能寄存器sfr

特殊功能寄存器分布在片内数据存储区的地址单元80H~FFH之间,“sfr” 数据类型占用一个内存单元。利用它可以访问单片机内部的所有特殊功能寄存器
例如:sfr P1=0x90

3)特殊功能寄存器sfr16

“sfr16”数据类型占两个内存单元。它用于操作占两个字节的特殊功能寄存器。
例如: “sfr16 DPTR=0x82”语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H,高8位字节地址为83H。

(4)特殊功能位 sbit

sbit—片内特殊功能寄存器的可寻址位

例如:
sfr PSW=0xd0; /定义PSW寄存器地址为0xd0/
sbit PSW^2 = 0xd2; /定义OV位为PSW.2/
符号“”`前`是特殊功能寄存器的`名字`,“”的面数字是特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7

注意,不要把bit与sbit混淆
bit是定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能寄存器的可寻址位,它的值是可进行位寻址的特殊功能寄存器的某位的绝对地址

2.2、数据存储类型

51单片机有片内、外数据存储区,还有程序存储区。51单片机片内的数据存储区是可读写的,51单片机的衍生系列最多可有256个字节的内部数据存储区,其中低128字节可直接寻址高128字节(80H~FFH)只能间接寻址,从20H开始的16字节可位寻址。

程序存储区只能读不能写,可能在51单片机内部或者外部,或者外部和内部都有,由51单片机的硬件决定。

内部数据存储区可分为3个不同的数据存储类型:data、idata和bdata。

访问片外数据存储区比访问片内数据存储区,C51提供两种不同数据存储类型xdatapdata来访问片外数据存储区

在这里插入图片描述

下面对表3-2中的各种存储区作以说明。

(1)DATA区。
寻址是最快的,应该把经常使用的变量放在DATA区,但是DATA区的存储空间是有限的,DATA区除了包含程序变量外,还包含了堆栈寄存器组可直接寻址

声明举例如下:

  • unsigned char data system_status=0;
  • unsigned int data unit_id[8];
  • char data inp_string[20];

另外,当内部堆栈溢出的时候,程序会莫名其妙地复位。这是因为51单片机没有报错的机制,堆栈的溢出只能以这种方式表示,因此要留有较大的堆栈空间来防止堆栈溢出。

(2)BDATA区。
是DATA中的位寻址区,在这个区中声明变量就可进行位寻址。BDATA区声明中的存储类型标识符为bdata,指的是内部RAM可位寻址的16字节存储区(字节地址为20H~2FH)中的128个位

下面是在BDATA区中声明的位变量和使用位变量的例子:

  • unsigned char bdata status_byte;
  • unsigned int bdata status_word;
  • sbit stat_flag= status_byte^4;
  • if(status_word^15)
    { …… }
    stat_flag=1;
    C51编译器不允许在BDATA区中声明float和double型变量。

(3)IDATA区。
IDATA区使用寄存器作为指针来进行间接寻址,常用来存放使用比较频繁的变量。与外部存储器寻址相比,它的指令执行周期和代码长度相对较。指的是片内RAM的256字节的存储区只能间接寻址,速度比直接寻址慢。

声明举例如下:

  • unsigned char idata system_status=0;
  • unsigned int idata unit_id[8];
  • char idata inp_string[16];
  • float idata out_value;

(4)PDATA区和XDATA区。
PDATA区和XDATA区位于片外存储区,PDATA区和XDATA区声明中的存储类型标识符分别为pdata和xdata。

PDATA区只有256字节,仅指定256字节的外部数据存储区。但XDATA区最多可达64KB,对应的xdata存储类型标识符可以指定外部数据区64KB内的任何地址。
对PDATA区的寻址要比对XDATA区寻址快,因为对PDATA区寻址,只需要装入8位地址,而对XDATA区寻址要装入16位地址,所以要尽量把外部数据存储在PDATA区中。

对PDATA区和XDATA区的声明举例如下:

  • unsigned char xdata system_status=0;
  • unsigned int pdata unit_id[8];
  • char xdata inp_string[16];
  • float pdata out_value;

(5)程序存储区CODE。
程序存储区CODE声明的标识符为code,储存的数据是不可改变的。在C51编译器中可以用存储区类型标识符code来访问程序存储区。
声明举例如下:

unsigned char code a[ ] ={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

在这里插入图片描述

三、 C51的基本运算

C51语言的基本运算与标准C类似,主要包括算术运算、关系运算、逻辑运算、位运算和赋值运算及其表达式等。

3.1 算术运算符

算术运算的算术运算符及其说明如表3-4所示。
在这里插入图片描述

表3-4中的自增和自减运算符是使变量自动加1或减1,自增和自减运算符放在变量前和变量之后是不同的

例如:
++i,–i:在使用i之先使i值加(减)1。
i++,i–:在使用i之后使i值加(减)1。
例如:若i=4,则执行x=++i时,先使i加1,再引用结果,即x=5,运算结果为i=5,x=5。
再如:若i=4,则执行x=i++时,先引用i值,即x=4,再使i加1,运算结果为i=5,x=4。

3.2 逻辑运算符

逻辑运算符及其说明如表3-5所示。
在这里插入图片描述

3.3 关系运算符

关系运算符就是判断两个数之间的关系。关系运算符及其说明如表3-6所示。
在这里插入图片描述

3.4 位运算

位运算符及其说明如表3-7所示
在这里插入图片描述

3.5 指针和取地址运算符

在这里插入图片描述

取内容和取地址的一般形式分别为:

变量=*指针变量
指针变量=&目标变量

取内容运算是将指针变量所指向的目标变量的赋给左边的变量;取地址运算是将目标变量的地址赋给左边的变量。
注意,指针变量只能存放地址(也就是指针型数据),一般情况下不要将非指针类型的数据赋值给一个指针变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1293651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

freeRtos队列的使用

一.队列的特性 队列是一个环形缓冲区 很多生产者生产很多数据,很多消费者读数据,唤醒之后首先是执行高优先级的,同等优先级先执行等待时间长的。 无论是写数据还是读数据都会有一个超时时间,写数据当队列已经满了就等待一会&…

HMMER学习——(待完善)

HMMER profile HMM files A HMMER profile file looks like this, with …’s marking elisions made for clarity and space: 1.全基因组基因家族的分析系列之HMMER3.1使用 2. hmmalign - align sequences to an HMM profile

vue3日常知识点学习归纳

1&#xff0c;父子组件传递&#xff1a; 父组件传递参数 <template><div><!-- 子组件 参数&#xff1a;num 、nums --><child :num"nums.num" :doubleNum"nums.doubleNum" increase"handleIncrease"></child>&l…

螺旋集污排气阀 微米级微泡排气除污装置螺旋除污器工作原理选型

​ 1&#xff1a;螺旋集污排气阀设备介绍 螺旋除污器&#xff0c;也被称为微泡排气除污装置&#xff0c;是一种有效的水处理设备&#xff0c;其主要功能是净化工作系统中的水。它的主要部分是螺旋管&#xff0c;能够脱除系统中的游离气体和微气泡。 螺旋管是由铜丝焊接制成的…

人工智能企业引入S-SDLC,推动安全能力大跃升,保障AI技术体系深化落地

某人工智能公司是国际知名的上市企业&#xff0c;核心技术处于世界前沿水平。多年来&#xff0c;该企业在智慧教育、智慧医疗、智慧城市、智慧司法、金融科技、智能汽车、运营商、消费者等领域进行深度技术赋能&#xff0c;深入推进各个行业的智能化、数字化转型建设。 人工智能…

解决思维题的一些自我总结

目录 常见思维题类型 排序 区间问题 01串串 字符串串 位运算 gcd 与 lcm 质数相关 二元组 常见思维题类型 思维题很多都可以说是贪心、但贪心种类很多&#xff0c;具体怎么贪&#xff0c;重要的还是在于积累经验吧...有些东西也很难总结&#xff0c;以下算是我的碎碎念…

正则表达式:深度解析与实用指南

目录 引言 正则表达式的基本概念 1. 字面量字符 2. 元字符 3. 量词 4. 分组和捕获 正则表达式的语法规则 1. 字符类 2. 转义字符 3. 锚点 4. 向前查找和向后查找 实际应用中的正则表达式技巧 1. 邮箱验证 2. URL 提取 3. 电话号码格式化 高级正则表达式技巧 1.…

阿里云 ACR 制品中心 AI/大数据镜像专场上新推荐榜

今天&#xff0c;AI 领域的快速发展不仅需要算法的突破&#xff0c;也需要工程的创新。随着容器技术和服务在企业的应用程度不断加深&#xff0c;企业对于容器的使用也越来越多地从在线业务逐渐向 AI、大数据类型的工作负载发展。同时&#xff0c;开发人员在考虑如何通过云原生…

主动而非被动:确保网络安全运营弹性的途径

金融部门处理威胁的经验对网络安全领域的任何人都有启发——没有什么可以替代提前摆脱潜在的风险和问题。 从狂野西部的银行劫匪到勒索软件即服务 (RaaS)&#xff0c;全球金融生态系统面临的威胁多年来发生了巨大变化。技术进步带动了金融业的快速发展&#xff0c;从现金交易到…

node.js和浏览器之间的区别

node.js是什么 Node.js是一种基于Chrome V8引擎的JavaScript运行环境&#xff0c;可以在服务器端运行JavaScript代码 Node.js 在浏览器之外运行 V8 JavaScript 引擎。 这使得 Node.js 非常高效。 浏览器如何运行js代码 nodejs运行环境 在浏览器中&#xff0c;大部分时间你所…

工业4G路由器助力轨道交通城市地铁实现数字化转型

随着城市的科技不断发展&#xff0c;地铁系统的智能化程度也在不断提高。地铁闸机的网络部署已经成为地铁建设中必不可少环节。而4G路由器作为地铁闸机的网络通讯设备&#xff0c;助力轨道交通地铁闸机实现数字化转型。 工业4G路由器在地铁系统光纤宽带网络遇到故障或其他问题…

模式串匹配和字符串哈希

目录 一、字符串暴力匹配 二、字符串哈希解决匹配问题 不使用哈希的递归版本 使用哈希的版本 不太懂哈希表的可以看我上一篇文章。 哈希表及其基础&#xff08;java详解&#xff09;-CSDN博客 一、字符串暴力匹配 public class SubstringMatch {//构造函数设置成私有的&…

echarts图之 底部滚动横轴 缩放图形大小

//折线图-堆叠面积图function pileLineChart(odata, dom){//放大缩小的代码startvar dataZoom [],y240;if(odata.xData.length > 7){dataZoom [{show: true,realtime: true,startValue:0, endValue:5,left:"center",top:"auto",right:"auto"…

探索人工智能领域——每日20个名词详解【day11】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

Python Nuitka打包指南

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python Nuitka打包指南&#xff0c;全文2100字&#xff0c;阅读大约8分钟。 在Python应用程序开发中&#xff0c;打包是将代码和依赖项组合成可执行文件或库的关键步骤之一…

Linux操作系统下对文件的管理

文件的初步理解 C语言中我们了解过一些有关文件处理的函数&#xff0c;如&#xff1a;fopen、fclose、fread……这些函数其实都是封装了系统调用接口&#xff0c;从而利于我们直接使用。 认识文件 了解文件之前我们必须知道&#xff1a;文件内容属性。文件的属性标识着文件的…

混沌映射初始化种群与随机初始化种群初始种群分布图对比

自行切换混沌映射&#xff0c;代码如下&#xff1a; Lb -1; % 搜索空间下界 Ub 1; % 搜索空间上界N_iter 500; % 最大迭代次数 N 30; % 种群个数 dim 2; % 种群维度 Z zeros(N, dim);% 随机生成一个d维向量 Z(1, :) rand(1, dim);% 利用logistic生成N个向量 for i…

【51单片机系列】矩阵按键介绍

本节实现的功能是&#xff1a;通过开发板上的矩阵键盘控制静态数码管显示对应的键值0-F。 文章目录 一、矩阵按键介绍二、硬件设计三、软件设计 一、矩阵按键介绍 独立键盘与单片机连接时&#xff0c;每一个按键都需要单片机的一个I/O口。若某单片机系统需要较多按键&#xff…

QT----Visual Studio输入中文报错,常量中有换行符

问题描述 在VS中写qt时发现在标题中输入了中文直接把报错无法运行 解决方法1 修改文件的编码方式。在VS菜单栏 工具->自定义-》命令-》选择文件-》添加高级保存选项命令。 双加选中添加中文的文件&#xff0c;文件-》高级保存选项-》修改utf-8就可以运行了 解决方法2…

用C语言的循环嵌套打印菱形

这是用循环弄出来的&#xff0c;看的时候可以列一个表&#xff0c;将空格&#xff0c;要打印的*数&#xff0c;行数对应出来&#xff0c;因为里面涉及到一些数学公式&#xff0c;写出来的话方便观察&#xff01; #define _CRT_SECURE_NO_WARNINGS 1//C语言中用scanf可能会警告&…