51单片机(四).C51编程语言

2023-05-16

一.常量与变量

1.常量

      又称为标量,在程序执行过程中不能改变,常量数据类型有整形(int)、浮点型(float)、字符型和字符串型。应用中一般使用“#define”定义在程序中经常用到的常量。

2.变量

是一种在程序执行过程中,数值不断变化的量。C51对变量的定义格式:【存储种类】数据类型【存储器类型】变量名

C51中的四中存储种类:auto(自动)、extern(外部)、static(静态)、register(寄存器)。默认为:auto。

根据变量的作用域的不同,变量还可以分为局部变量和全局变量两种。

局部变量。内部变量,只在定义它的函数模块内有效,必须定义在该函数模块的开头。

全局变量。外部变量,程序开始处或各个功能函数外面定义的变量,对于整个程序都有效。一般定义在程序的开始。

二.数据类型

【存储种类】数据类型【存储器类型】变量名

C51相对于c增加了bit、sfr、sfr16、sbit的特殊数据类型。

                 C51变量的数据类型

数据类型

长度/bit

长度/Byte

值域

unsigned char

8

1

0~255

Signed char/char

8

1

-128~+127

unsigned int

16

2

0~65535

Signed int

16

2

-32786~+32786

Unsigned long

32

4

0~4294967295

Signed long

32

4

-2147483678~+2147483677

float

32

4

-1.175494E-38~+3.402823E

*指针

 

13

 

bit

2

 

0或1

 

1.Char字符类型   

  长度是8位,1字节(1B),用于定义处理字符变量数据的变量或常量。无符号型(unsigned char)和符号字符类型(signed char),默认signed char。-128~+127。Unsigned char常用于处理ASCLL字符或处理小于255的整型数。

2.Int整形  

长度为16位,双字节(2B),用于存放一个双字节数据。分有符号int整型数signed int和无符号int整型数unsigned int。

   Unsigned int用字节中的最高位表示数据符号位。0正数,1负数。

3.Long长整型

长度为32位,4字节(4B)。

4.Float浮点型

十进制数中具有7位有效数据,符合IEEE754标准的单精度浮点型数据,占4B,24位精度。

5.*指针型
本身就是一个变量,这个变量中存放指向另一个数据的地址。 指针变量要占据一定的内存单元,不同处理器长度不尽相同,C51 中长度一般为1~3个字节。

 

 

6. Bit类型
存放逻辑变量,占用一个位地址,C51编译器把bit类型的变 量安排在单片机内RAM的位寻址区。

三.变量的存储器类型

存储器类型与存储空间的对应关系

存储类型

与存储空间的对应关系

DATA

直接寻址片内数据存储区,访问速度快(128B)

BDATA

可位寻址片内数据存储区,允许位与字节混合访问(16B)

IDATA

间接寻址片内数据存储区,可访问片内全部RAM地址空间(256B)

PDATA

分页寻址片外数据存储区(256B)

XDATA

片外数据存储区(64KB)

CODE

代码存储区(64KB)

1.DATA区
    
使用存储类型data、bdata定义变量时,C51编译器会将它   们定位在片内数据存储区中(RAM)STC89C52存储长度为512B,   能快速存取各种数据,片内数据存储区是临时存放传递变量或使   用频率较高的变量的理想存储场所。Data区除了包含程序变量外,   还保护了堆栈和数据寄存器组。在SMALL存储模式下,未说明存   储器类型时,变量默认被定义在DATA区。

2.BDATA区
    
如果在DATA区的位寻址BDATA区定义变量,这个变量就可以   进行位寻址,并且申明位变量。这种可位寻址的变量对状态寄存   器十分有用,可以单独使用变量的每一位,而不一定要用位变量   名引用变量。但不允许在BDATA区定义float和double类型的变   量。

3.IDATA区
    
也可以存放使用频繁的变量,使用寄存器作为指针进行位寻址。   在寄存器中设置8位地址间寻址,与外部存储器相比,指令执行   周期和代码行长度都比较短。

4.PDATA和XDATA区
    
单片机的片外RAM区,声明变量和其他区语法相同。

5.CODE区
     
单片机的程序代码区,代码区的数据是不可以改变的。可存放   数据表,跳转向量和状态表。
四.存储模式
   在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由SMALL、COMPACL、和LARGE存储模式(Memory Models)指令决定。存储模式是编译器的编译选项,用于决定变量的默认存储类型、参数传递区和无声明存储类型说明变量的存储类型。各种不同模式对于哦哦哦那个不同的实际硬件系统,也将有不同的编译结果。

1.小模式(SMALL Model)
    
所有未声明存储器类型变量,都默认驻留在内部数据区,即这   种方式和用DATA进行显示说明一样。变量访问速度快,当所有数   据对象(包括堆栈)都必须放在内部数据存储区中,空间有限。
   2.紧凑模式(Compact Model)
    
所有未声明存储器的变量类型,默认驻留在外部数据存储区的   一个页上。即PDATA进行存储器类型的说明一样的。该模式利用   R0和R1寄存器进行间接寻址(@R0和@R1)。该模式存取速度笔小   模式慢但比大模式快。

   3.大模式(Large Model)
    
所有未声明存储器的变量类型,默认驻留在外部数据存储区,   即和利用XDATA进行显示说明一样。
例:

在不同存储器类型下等价下面的变量说明:

Unsigned chardata var1; //Small模式,被定位在DATA区,片内RAM

Unsigned charpdata var1;//Compact模式片外按页面间接寻址RAM

Unsigned charxdata var1;//Large模式,片外间接寻址RAM
为了提高运行速度,建议在编写源程序时,把存储模式设定为Small,必要时在程序中XDATA、PDATA和IDATA等类型变量进行专门声明。
   sbit和bit的区别:sbit定义特殊功能寄存器中的可寻址位;而bit则定义了一个普通的位变量,一个函数可包括bit类型的参数也可作为返回值。sbit可以访问MCS-51单片机内20H~2FH范围内的位对象。
五.C51语言的数组、指针与结构

1.数组  是一个由同类型的变量组成的集合,它保存在连续的存储区域中,第一个元素保存在最低地址中,最末一个保存在最高地址中。
   定义方式:数据类型【存储器类型】数组名【常量1】···【常量n】
   2.指针  指针是指某个变量所占用存储空间的首地址。用来存放指针变量的类型。
   类型说明符 *指针变量名
   char *s; char *str[4]; int *numptr;
   这样声明的指针要占用3B。对于MCS-C51存储结构的特殊性,也可以指定存储器类型的指针,声明时定义指针指向的存储器类型,也称为给予存储器类型的指针。

例如:char data *str;char xdata *numtab;

unsigned  char code *powtab;
   3.结构   结构变量是将相互关联、多个不同类型的变量结合在一起形成一个组合变量。定义格式:
   struct 结构名{

结构成员说明;

}
六.对绝对地址进行访问
  1.使用指针   *:取指令;&:取地址
   具体运算:变量=*指针变量   指针变量=&目标变量
   取内容运算时将指针变量所指向的目标地址的值赋给左边的变量,取地址运算是将目标变量的地址赋给左边的变量。变量中只能存放地址(也就是指针型数据),一般情况下不要将非指针类型数据赋给一个指针变量。

MCS-51单片机工作在总线方式下,P0/P2口作为地址/数据总线使用。对外部扩展的数据存储器RAM的读写,可采用指针的方法,实现在C51程序中对任意指定的存储器地址进行操作。
   2.使用C51扩展关键字_at_对确定地址进行访问
   使用_at_对指定的存储器空间的地址进行定位,例如对外部接口的地址进行读写。
   【存储器类型】 数据类型 标识符 _at_常数
   数据类型通常为uchar的1字节类型;常数规定变量的绝对地址,由译码电路产生;使用_at_定义的变量必须为全局变量。
   3.使用C51运行库中预定义宏
  
函数原型:

#defineCBYTE((unsigned char volatile code*)0)

#defineDBYTE((unsigned char volatile idata*)0)

#definePBYTE((unsigned char volatile pdata*)0)

#defineXBYTE((unsigned char volatile xdata*)0)
函数原型放在absacc.h文件中。

七.C51的运算符和表达式
  1.赋值运算符 
“=” 变量=表达式;
   2.算术运算符   C51中的算术运算符中只有取正值和取负值元素运算符是单目运算符,其他的都为双目运算算符
   +:加或取正值运算符  -:减或取负值运算符  *:乘法运算符
   /:除法运算符  %:模(取余)运算符
   3.自增自减预算  “++”、“--”
   4.关系运算符

 >:大于;<:小于;>=:大于等于;<=:小于等于;!=:不等于
5.逻辑运算符
  
逻辑与:条件1&&条件2;  逻辑或:条件1||条件2;
   逻辑非:!条件式
6.位运算符   变量1  位运算符  变量2
   &:按位与。|:按位或。^:按位异或。~:按位取反。

<<:左移。 >>:右移。
   位运算符的优先级从低到高:“~”、“<<”、“>>”、“&”、“^”、“|”。

7.复合运算符  
      +=:加法运算符  >>=:右移位负值  -=:减法赋值

   &=:逻辑与赋值  *=:乘法赋值  |=:逻辑或赋值
      /=:除法赋值  ^=:异或赋值  %=:取模赋值 

~=:逻辑非赋值  <<=:左移位赋值
   一般形式: 变量  复合赋值运算符  表达式

八.C51语言的程序结构
  1.顺序结构
  
    是指程序由低地址向高地址顺序执行指令代码的过程,是最简   单的程序结构。从地址0000H开始执行。
   2.选择结构
    
if语句和switch语句构成。
      ①if语句   if(表达式) 语句1 else 语句2

switch语句   处理多路分支的情况
   case分支常量的表达式的值必须是整型、字符型,不能使用条件运算符
   break语句用于跳出switch结构
3.循环结构
  
for、while、do···while 3种语句构成循环结构。

九.C51语言的函数
     实现程序的模块化,同c语言。
   十.中断服务函数
     void函数名() interrupt n
               
中断号和中断源的对应关系

中断号

中断源

中断号

中断源

0

外部中断0

3

定时、计数器1

1

定时/计数器0

4

串行口

2

外部中断1

5

定时、计数器2

中断函数运行过程中完成的任务:
   (1)中断产生时,中断函数被系统所使用。
   (2)中断函数运行完成退出时,堆栈保存的数据将被恢复。
   (3)中断函数退出时,其对应的汇编代码使用RETI指令退出。
   中断函数应遵循以下规则:
   (1)不能进行参数传递。
   (2)没有返回值

(3)不能再子函数中直接调用

(4)如中断调用了其他函数,必须保证函数和中断函数使用了相同的寄存器。

(5)对中断函数不需要声明。

十一.C51库函数与头文件
     1.C51的库函数
     2.本征库函数
        <intrinis.h>
文件下的

_cror_()、_crol_():将char型变量循环左移或右移
   _iror_()、_irol_():将int型变量循环左移或右移
   _lrol_()、_lrol_():将long型变量循环左移或右移
   _nop_():空指令12M晶振下为1us常用于IIC通信
   _testbit_:测试该为变量并跳转同时清除
   _chkfloat_:测试并返回浮点数的状态。

3.几类重要的库函数
    
(1).专用寄存器include文件。
      (2).绝对地址include文件absacc.h
      (3).动态内存分配函数malloc(stdilb.h)。
      (4).缓冲区处理数,string.h,包括复制、比较、移动函   数···
      (5).输入输出流函数

4.C51的预处理
    
(1)预处理命令以“#”开头,后面不加分号;
      (2)预处理命令在编译前执行,编译是对预处理的结果进行的,如词法、语法分析等。
      (3)多数预处理命令习惯放在头文件的开头。

5.使用C51时的注意事项
  
   (1).采用短变量;(2)避免浮点运算。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机(四).C51编程语言 的相关文章

随机推荐

  • VS控制台程序被暂停,回车继续运行

    最近用vs调试程序时 用控制台定时1s打印一次信息 xff0c 调试过程发现偶尔出现控制台停止打印 不管是否开启多线程 xff0c 都会出现该问题 xff0c 而且也怀疑可能是sleep xff08 xff09 延时阻塞导致的问题 后来多次
  • VS如何设置显示代码行数

    设置VS显示代码行数 可以方便调试代码 xff0c 工具 选项 文本编辑器 C C 43 常规 行号勾选上 参考了https jingyan baidu com album af9f5a2d2e193543140a4533 html pic
  • 程序员自我介绍

    转自https www cnblogs com univeryinli p 5838781 html 一个常规的面试 xff0c 寒暄之后面试官提出的第一个问题几乎千篇一律 xff1a 请您简单地做一下自我介绍 有些被面试者都会问 xff1
  • win10磁盘占用率过高解决办法

    最近总觉得系统用起来很卡 xff0c 一看任务管理器发现win10磁盘占用率接近100 xff0c 而且在任务管理器中也关不掉 xff0c 然后百度了一下 xff0c 发现可能是家庭组导致 xff0c 结果还真是 xff0c 下面给出解决方
  • 2020届华为C++软件开发实习面试经验

    前几天去华为实习面试 xff08 虽然笔试0AC xff0c 还是收到面试通知 xff09 xff0c 现在记录一下面试心得 xff0c 后面继续好好准备 实习面试分技术面和综合面 xff1a 1 感觉技术面试重视基础 xff0c 问c 4
  • 自己编写的字符串分割函数mysplit()

    利用strtok 函数封装成的字符串分割函数mysplit sourceStr为源字符串 splitSymbol为分隔符号 strArray为分割后的字符串 xff0c 以vector形式返回 include lt iostream gt
  • OVS Bond lacp源码分析

    近期项目中要使用Ovs bond接口 xff0c Ovs Bond 只有三种模式 xff1a balance tcp xff0c balance slb xff0c active backup 这三种模式的工作方式如下 xff1a 1 ac
  • VNC

    VNC Virtual Network Computing 是 虚拟网络 计算机的缩写 VNC 是一款优秀的 远程控制工具软件 xff0c 由著名的 AT amp T 的欧洲研究实验室开发的 VNC 是在基于 UNIX 和 Linux 操作
  • ubuntu 安装图形界面 tasksel不成功

    1 执行tasksel相关的安装命令一直报错 xff0c 经过改源等操作都不行 sudo tasksel install ubuntu desktop 2 参考下面的博客Ubuntu安装图形界面 xff08 桌面 xff09 yangxin
  • 【ChatGPT】比尔·盖茨最新分享:ChatGPT的发展,不止于此

    作者简介 xff1a 在读博士 xff0c 伪程序媛 xff0c 人工智能领域学习者 xff0c 深耕机器学习 xff0c 交叉学科实践者 xff0c 周更前沿文章解读 xff0c 提供科研小工具 xff0c 分享科研经验 xff0c 欢迎
  • 51单片机(十).避障与循迹小车

    实验简介 使用STC89C53单片机作为主控制器芯片实现了带全向轮的两轮驱动避障以及循线小车 xff0c 感知模块为超声波和红外传感器 本实验分为3个独立的部分 xff1a 1 利用超声波实现小车的避障功能 xff1b 2 利用红外传感器实
  • 一点小小的感悟

    从2017年发表了第一篇CSDN文章 xff0c 到现在已经过去了快五年的时间 五年前的我是一名学生 xff0c 五年后的今天我依旧是一名学生 xff0c 区别是从一名大二学生成为了现在的研二学生 这一路走来 xff0c 经历了很多很多事情
  • Arduino单片机(五).基于OpenWrt模块的无线视频遥控小车设计

    1 功能介绍 本项目所设计的机器人需要实现的功能为 xff1a 操作员在操作终端 xff08 手机或PC端 xff09 通过Wi Fi连接到小车上Wi Fi模块所在的网络中 xff0c 向其发出相关操作指令 xff0c 在Wi Fi模块接收
  • STM32单片机(二).STM32系列单片机的介绍

    STM32系列芯片是为要求高性能 低成本 低功耗的嵌入式应用设计的ARM Cortex M0 M0 43 M3 M4和M7内核 xff0c 按照内核架构分成不同的产品 其主流的产品有STM32F0 STM32F1和STM32F3 xff1b
  • STM32单片机(六). 传感器的使用

    传感器是单片机外围电路中最常见的模块 xff0c 在搭配了各种形式的传感器电路后 xff0c 就可以采集到的更多的环境信息 在本章节中 xff0c 主要介绍呼吸灯 温度传感器 RTC实时时钟以及红外遥控模块的控制使用 1 PWM实现呼吸灯的
  • STM32单片机(七). USART串口、IIC和CAN通信

    在简单的学习过了STM32中的简单外设以及中断系统后 xff0c 在本章节中开始介绍STM32芯片中各个通信接口的配置 在计算机中 xff0c 按数据传输方式可分为串行通信以及并行通信 xff1b 按数据同步方式可分为异步通信和同步通信 x
  • STM32单片机(八). ADC、DAC和DMA数据传输

    对于STM32的ADC模数转换器的介绍以及配置在文章 STM32单片机 xff08 六 xff09 传感器的使用 中已经详细介绍 xff0c 在本章节中主要介绍DAC数模转换器以及DMA的使用 1 DAC转换 1 1 数模转换器的介绍 DA
  • 虚拟机中安装Ubuntu 20.04,Liunx系统的常用命令以及工具安装

    因工作学习 需求 xff0c 在虚拟机软件VirtualBox安装了Ubuntu 20 04系统 xff0c 本章节中主要介绍一些环境的安装以及Liunx中常用的一些命令 1 软件和系统的安装 1 1 VirtualBox VirtualB
  • 51单片机(二).STC89C52单片机的引脚功能

    1 主电源引脚VCC和VSS 电源VCC接 43 5V xff0c VSS接地端 xff0c 即公共参考地 2 时钟电路引脚XTAL1和XTAL2 STC89C52芯片内部设置了一个反相放大器 xff0c XTAL1为放大器输入端 xff1
  • 51单片机(四).C51编程语言

    一 xff0e 常量与变量 1 常量 又称为标量 xff0c 在程序执行过程中不能改变 xff0c 常量数据类型有整形 xff08 int xff09 浮点型 xff08 float xff09 字符型和字符串型 应用中一般使用 defin