C51单片机之预备知识补充

目录

前言

c51基础知识

C51 扩充数据类型

typedef 

存储种类

auto

extern

static

register

存储器类型

特殊功能寄存器变量

位变量

位运算符

逗号运算符

总结


前言

对51单片机有关的一些重要知识的补充学习和说明

注:本篇笔记主要参考了江科大自化协C51单片机视频文档

c51基础知识

C51 扩充数据类型

在单片机的 C 语言中默认规则如下:short int 即为 intlong int 即为 long,前面若 unsigned 符号则一律认为是 signed 型

单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址当我们需 要在程序中操作这些特殊功能寄存器时,必须要在程序的最前面将名称加以声明,声明的过程实际就是将这个寄存器在内存中的地址编号赋给这个名称,这样编译器在以后的程序中才可认识这些名称所对应的寄存器。

 

例如:sfr SCON=0x98;

SCON 是单片机的串行口控制寄存器,这个寄存器在单片机内存中的地址是0X98,声明后可以直接操作该寄存器。

例如:sbit TI=SCON^1;

SCON 是一个 8 位寄存器,SCON^1 表示这个 8 位寄存器的次低位,最低位是SCON^0;SCON^7 表示这个寄存器的最高位。

隐式转换优先级:bit→char→int→long→float→signed→unsigned

除了隐式类型转换外,还可以通过强制类型转换符()对数据类型进行强制转换

typedef 

在 C51 中,为了增加程序的可读性,允许用户为系统固有的数据类型说明符 用 typedef 起别名,格式如下:

typedef c51 固有的数据类型说明符 别名;

定义别名后,就可以用别名代替数据类型说明符对变量进行定义。别名可以用大写,也可以用小写,为了区别一般用大写字母表示

例如: 

typedef unsigned int u8;

typedef unsigned char u16;

u8 a1=0x12;

u16 a2=0x1234;

存储种类

存储种类是指变量在程序执行过程中的作用范围。有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register)。

auto

自动变量,其作用范围在定义它的函数体或复合语句内部,当定义它的函数体或复合语句执行时,C51 才为该变量分配内存空间,结束时占用的内存空间释放。自动变量一般分配在内存的堆栈空间中。定义变量时,如果省略存储种类,则该变量默认为自动(auto)变量。

extern

外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用 extern 说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放

static

静态变量。它又分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。外部静态变量上在函数外部定义的静态变量。它在程序中一直存在,但在定义的范围之外是不可见的。如在多文件或多模块处理中,外部静态变量只在文件内部或模块内部有效。

register

寄存器变量。它定义的变量存放在 CPU 内部的寄存器中,处理速度快,但数目少。C51 编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。

存储器类型

存储器类型是用于指明变量所处的单片机的存储器区域情况。存储器类型与存储种类完全不同。C51 编译器能识别的存储器类型有以下几种

 

 

定义变量时也可以省“存储器类型”,省时 C51 编译器将按编译模式默认存储器类型。

在 C51 中,函数原型一般形式如下:

[extern] 函数类型 函数名(形式参数表);

如果声明的函数在文件内部,则声明时不用 extern,如果声明的函数不在文件内部,而在另一个文件中,声明时须带 extern,指明使用的函数在另一个文件中。

特殊功能寄存器变量

访问时须通过 sfr 或 sfr16 类型说明符进行定义,定义时须指明它们所对应的片内 RAM 单元的地址。 格式如下:

sfr 或 sfr16  特殊功能寄存器名=地址;

例如:

sfr PSW=0xd0;

sfr SCON=0x98;

sfr TMOD=0x89;

sfr P1=0x90;

sfr16 DPTR=0x82;

sfr16 T1=0X8A;

sfr 用于对 51 单片机中单字节的特殊功能寄存器进行定义,sfr16 用于对双字节特殊功能寄存器进行定义。特殊功能寄存器名一般用大写字母表示。地址一 般用直接地址形式。

位变量

在 C51 中,允许用户通过位类型符定义位变量。位类型符有两个:bit 和 sbit。 可以定义两种位变量

bit 位类型符用于定义一般的可位处理位变量。在格式中可以加上各种修饰,但注意存储器类型只能是 bdata、data、idata。只能是片内 RAM 的可位寻址区,严格来说只能是 bdata。格式如下:

bit 位变量名;

sbit 位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。格式如下:

sbit 位变量名=位地址;

如位地址为位直接地址,其取值范围为 0x00~0xff;如位地址是可位寻址变 量带位号或特殊功能寄存器名带位号,则在它前面须对可位寻址变量或特殊功能寄存器进行定义。字节地址与位号之间、特殊功能寄存器与位号之间一般用“^” 作间隔
在 C51 中,常用的特殊功能寄存器和特殊位定义放在一个“reg51.h”或“reg52.h”的头文件中

当用户要使用时,包含命令“#include <reg51.h>” 或“#include <reg52.h>”把这个头文件包含到程序最开始位置即可使用。

位运算符

位运算是按位对变量进行运算,但并不改变参与运算的变量的值。如果要求按位改变变55
量的值,则要利用相应的赋值运算。只能对整数进行操作。

 

逗号运算符

逗号表达式的一般格式为:

表达式 1,表达式 2,……,表达式 n

按从左至右的顺序依次计算出各个表达式的值,而整个逗号表达式的值是最右边的表达式(表达式 n)的值。x=(a=3,6*3)结果 x 的值为 18。

总结

对c51单片机的预备知识进行了补充和说明

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值