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

C51语言

本文主要涉及C51语言的一些基本知识,比如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.mzph.cn/news/209095.shtml

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

相关文章

奇数位字符反转算法

题目描述: 题目描述 编写函数void oddReverse(char *s),将所有奇数位的字符反转。输入格式 输入一个字符串 s保证输入字符串 s 的长度大于等于1小于等于100输出格式 输出修改后的字符串 s。输入样例1 012345输出样例1 052341输入样例2 01234输出样例2 03214输入样例…

Pycharm Jupyter ModuleNotFoundError 问题解决

Pycharm Jupyter ModuleNotFoundError 问题解决 0. 问题描述1. 解决方法 0. 问题描述 通过 Pycharm 启动的 Jypyter,发生 ModuleNotFoundError 的问题。 实际上相关 Module 已经通过 pip install 安装完成,所以怀疑是 Jupyter 的问题。 1. 解决方法 …

什么是HTML以及超链接,特殊符号转义的简单使用

目录 什么是HTML🌸 HTML版本 版本说明🌸 XHTML和HTML的区别 超链接🌸基本语法🌸链接的分类 特殊符号 什么是HTML HTML 不是编程语言,没有逻辑处理能力,没有计算能力,不能动态地生成内容&#x…

docker学习(七、搭建mysql8.2主从)

一、主库搭建 1.构建主库镜像 # 运行mysql镜像,配置端口3307为主库 docker run -p 3307:3306 --name mysql-master --privilegedtrue -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc…

前端:HTML+CSS+JavaScript实现轮播图2

前端:HTMLCSSJavaScript实现轮播图2 1. 和之前版本的区别2. 实现原理3. 针对上述的改进3. 参考代码 1. 和之前版本的区别 之前发布的那篇关于轮播图的文章在这:前端:HTMLCSSJavaScript实现轮播图,只能说存在问题吧!比…

HuggingFace学习笔记--Prompt-Tuning、P-Tuning和Prefix-Tuning高效微调

1--Prompt-Tuning 1-1--Prompt-Tuning介绍 Prompt-Tuning 高效微调只会训练新增的Prompt的表示层,模型的其余参数全部固定; 新增的 Prompt 内容可以分为 Hard Prompt 和 Soft Prompt 两类; Soft prompt 通常指的是一种较为宽泛或模糊的提示&…

搭乘“低代码”快车,引领食品行业数字化转型全新升级

数字化技术作为重塑传统行业重要的力量,正以不可逆转的趋势改变着企业经营与客户消费的方式。 在近些年的企业数字化服务与交流过程中,织信团队切实感受到大多数企业经营者们从怀疑到犹豫再到焦虑最终转为坚定的态度转变。 在这场数字化转型的竞赛中&a…

VS2009和VS2022的错误列表可复制粘贴为表格

在VS2019或VS2022中,可看到如下错误列表: 如果复制这两行错误信息: 然后把它粘贴到word文件,就可以看到以下表格: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E0020 未定义标识符 "dd"…

0基础学java-day16-(坦克大战[1])

一、 坦克大战游戏演示 1 游戏演示 2.为什么写这个项目 3.写项目前的提醒 二、java 绘图坐标体系 1 坐标体系-介绍 2 坐标体系-像素 3 介绍-快速入门 package com.hspedu.draw;import javax.swing.*; import java.awt.*;/*** author 林然* version 1.0* 演示如何在面板画圆…

【python可视化系统源码】基于爬虫与可视化的电影推荐系统课题背景、目的、意义、研究思路、研究方法

该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等学习内容。 目录 一、项目介绍: 二、文档学习资料: 三、模块截图: 四、开发技术与运行环境: 五、代码展示: 六、数据库表截图&#xff1a…

从简单到入门,一文掌握jvm底层知识文集。

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

【Linux systemctl命令控制软件的启动和关闭】

文章目录 Linux systemctl命令:控制软件的启动和关闭1. 查看服务状态2. 启动服务3. 停止服务4. 重启服务5. 设置开机自启6. 取消开机自启7. 重新加载配置 Linux systemctl命令:控制软件的启动和关闭 1. 查看服务状态 要查看系统上所有服务的状态&#…

matlab RGB三元组和十六进制的转换

matlab画柱状图改颜色的时候,用三元组的形式,范围是[0,1] 我们获得了十六进制 到网站转换为[0,255] https://c.runoob.com/front-end/55/ 然后将得到的值/255 输入matlab就可以了

Bean作用域和生命周期

小王学习录 前言Bean的作用域什么是Bean的作用域Bean的六种作用域1. 单例作用域 singleton2. 原型作用域 prototype (多例作用域)3. 请求作用域 request4. 会话作用域 session5. 全局作用域 application6. Http WebSocket作用域 websocket Spring的执行流程和Bean的生命周期Spr…

网页设计--第6次课后作业

试用Vue相关指令完成对以下json数据的显示。显示效果如下: 其中:gender1 显示为女,gender2显示为男。价格超过30元,显示“有点小贵”。价格少于等于30元,则显示“价格亲民”。 data: {books: [{"id": "…

springboot集成字典注解

又是想下班的一天 文章目录 前言springboot使用AOP简单集成字典注解 一、通过注解进行字典赋值二、使用步骤1.添加注解2.序列化处理类3.实体类添加注解4.json返回值 总结 前言 springboot使用AOP简单集成字典注解 一、通过注解进行字典赋值 使用AOP切面实现字典的赋值,自动将…

MongoTemplate 常用查询

MongoTemplate是Spring Data MongoDB提供的一个Java编程接口,用于操作MongoDB数据库。它提供了一系列方法和功能,以便进行数据的插入、更新、删除和查询等操作。 使用MongoTemplate,你可以通过编写Java代码与MongoDB进行交互,而无…

二百一十四、Linux——Linux系统时间比电脑时间慢5分钟

一、目的 服务器重启后,发现Linux的系统时间比电脑时间慢5分钟,于是看了些博客,终于找到了解决方法,记录一下,以防止后面出现同样的问题 二、问题 通过date查看,Linux系统时间比电脑时间慢5分钟 &#…

IEEE RAS 机器人最优控制(Model-based Optimization for Robotics)学习资料

系列文章目录 前言 电气和电子工程师学会机器人模型优化技术委员会 一、学习资料 1.1 教程和暑期学校 2020 年 Memmo 欧盟项目暑期班2019年Memmo欧盟项目冬季学校Matthias Gerdts(德国慕尼黑联邦国防军大学)在拜罗伊特 OMPC 2013 上举办的最优控制教程…

详解vue生命周期

vue2 生命周期 Vue.js是一个流行的JavaScript框架,它使用了一套生命周期钩子函数来管理组件的创建、更新和销毁过程。以下是Vue组件的生命周期钩子函数: beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watch…