单片机语言--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 指针和取地址运算符

在这里插入图片描述

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出分析kafka客户端程序设计 ----- 生产者篇----万字总结

前面在深入理解kafka中提到的只是理论上的设计原理, 本篇讲得是基于c语言的kafka库的程序编写!!!!! 首先要编写生产者的代码,得先知道生产者的逻辑在代码上是怎么体现的 1.kafka生产者的逻辑 …

Spark Structured Streaming使用教程

文章目录 1、输入数据源2、输出模式3、sink输出结果4、时间窗口4.1、时间窗口4.2、时间水印(Watermarking) 5、使用例子 Structured Streaming是一个基于Spark SQL引擎的可扩展和容错流处理引擎,Spark SQL引擎将负责增量和连续地运行它&#…

从主从复制到哨兵模式(含Redis.config配置模板)

文章目录 前言一、主从复制1.概述2.作用3.模拟实践搭建场景模拟实践 二、哨兵模式1.概述2.配置使用3.优缺点4.sentinel.conf完整配置 总结 前言 从主从复制到哨兵模式。 一、主从复制 1.概述 主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Red…

Smart Link和Monitor Link

Smart Link和Monitor Link简介 Smart Link,又叫做备份链路。一个Smart Link由两个接口组成,其中一个接口作为另一个的备份。Smart Link常用于双上行组网,提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案,它…

AMEYA360分析兆易创新GD32A490系列车规级MCU

兆易创新GigaDevice今日宣布,正式推出全新GD32A490系列高性能车规级MCU,以高主频、大容量、高集成和高可靠等优势特性紧贴汽车电子开发需求,适用于车窗、雨刷、智能车锁、电动座椅等BCM车身控制系统,以及仪表盘、娱乐影音、中控导…

Google Bard vs. ChatGPT 4.0:文献检索、文献推荐功能对比

在这篇博客中,我们将探讨和比较四个不同的人工智能模型——ChatGPT 3.5、ChatGPT 4.0、ChatGPT 4.0插件和Google Bard。我们将通过三个问题的测试结果来评估它们在处理特定任务时的效能和响应速度。 导航 问题 1: 统计自Vehicle Routing Problem (VRP)第一篇文章发…

Android 11.0 MTK Camera2 设置默认拍照尺寸功能实现

1.前言 在11.0的系统rom定制化开发中,在mtk平台的camera2关于拍照的一些功能修改中,在一些平台默认需要设置最大的分辨率 来作为拍照的分辨率,所以就需要了解拍照尺寸设置流程,然后来实现相关的功能 如图: 2.MTK Camera2 设置默认拍照尺寸功能实现的核心类 \vendor\me…

[数据集][目标检测]拉横幅识别横幅检测数据集VOC+yolo格式1962张1类别

数据集格式:Pascal VOC格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1962 标注数量(xml文件个数):1962 标注数量(txt文件个数):1962 标注类别数&a…

一天一个设计模式---原型模式

基本概念 原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是通过实例化类。原型模式允许在运行时动态创建对象,同时避免了耦合与子类化。 在原型模式中&#xff0…

Django模板,Django中间件,ORM操作(pymysql + SQL语句),连接池,session和cookie, 缓存

day04 django进阶-知识点 今日概要: 模板中间件ORM操作(pymysql SQL语句)session和cookie缓存(很多种方式) 内容回顾 请求周期 路由系统 最基本路由关系动态路由(含正则)路由分发不同的app中…

视频相似度对比 python opencv sift flann

提取SIFT特征的代码,返回关键点kp及特征描述符des def SIFT(frame):# 创建SIFT特征提取器sift cv2.xfeatures2d.SIFT_create()# 提取SIFT特征kp, des sift.detectAndCompute(frame, None)return kp, des 这行代码是使用SIFT(Scale-Invariant Feature…

Go--协程

协程 协程是Go语言最大的特色之一。 1、协程的概念 协程并不是Go发明的概念,支持协程的变成语言有很多。Go在语言层面直接提供对协程的支持称为goroutine。 1.1 基本概念 进程 进程是应用程序启动的实例,每个进程都有独立的内存空间,不同…

WEB组态编辑器(BY组态)介绍

BY组态是一款非常优秀的纯前端的【web组态插件工具】,可无缝嵌入到vue项目,react项目等,由于是原生js开发,对于前端的集成没有框架的限制。同时由于BY组态只是一个插件,不能独立运行,必须嵌入到你方软件平台…

如何在报表工具 FastReport Cloud 中使用 ClickHouse

FastReport Cloud 是一项云服务 (SaaS),旨在为您的企业存储、编辑、构建和发送报告。您的整个团队可以从世界任何地方访问这些报告,并且无需创建自己的应用程序。 FastReport Cloud 试用(qun:585577353)https://chat8.…

高翔《自动驾驶与机器人中的SLAM技术》第九、十章载入静态地图完成点云匹配重定位

修改mapping.yaml文件中bag_path: 完成之后会产生一系列的点云文件以及Keyframe.txt文件: ./bin/run_frontend --config_yaml ./config/mapping 生成拼接的点云地图map.pcd文件 : ./bin/dump_map --pose_sourcelidar 。、 完成第一次优…

数据清洗、特征工程和数据可视化、数据挖掘与建模的主要内容

1.4 数据清洗、特征工程和数据可视化、数据挖掘与建模的内容 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.4节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学…

JVM 虚拟机(二)类的生命周期

类的声明周期描述了一个类加载、使用和卸载的整个过程。 一个类的声明周期包括五个阶段:加载、连接、初始化、使用、卸载,其中连接部分分为验证、准备和解析阶段。 加载阶段 加载阶段是第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式…

CAN总线协议编程实例

1. can.h #ifndef __CAN_H #define __CAN_H#include "./SYSTEM/sys/sys.h"/******************************************************************************************/ /* CAN 引脚 定义 */#define CAN_RX_GPIO_PORT GPIOA #define CAN_RX_GPI…

【Maven】未找到有效的 Maven 安装。在配置对话框中设置主目录,或者在系统上设置 M2_HOME 环境变量。

错误显示 今天导入工程,进行clean的时候报错: 解决方法 重新设置一下maven的目录即可

微机原理14

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 字符’A’的 ASCI 码是() A. OAH B. 41H C. 61H D. OAOH 2, 8086微处理器的地址线有() A. 16条…