目录
前言
对51单片机有关的一些重要知识的补充学习和说明
注:本篇笔记主要参考了江科大自化协C51单片机视频文档
c51基础知识
C51 扩充数据类型
单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址。当我们需 要在程序中操作这些特殊功能寄存器时,必须要在程序的最前面将名称加以声明,声明的过程实际就是将这个寄存器在内存中的地址编号赋给这个名称,这样编译器在以后的程序中才可认识这些名称所对应的寄存器。
例如: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 中,函数原型一般形式如下:
[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 位变量名=位地址;
当用户要使用时,包含命令“#include <reg51.h>” 或“#include <reg52.h>”把这个头文件包含到程序最开始位置即可使用。
位运算符
![](https://img-blog.csdnimg.cn/a7d56b2637b54e6ea3e9cad1d33e17f4.png)
逗号运算符
逗号表达式的一般格式为:
按从左至右的顺序依次计算出各个表达式的值,而整个逗号表达式的值是最右边的表达式(表达式 n)的值。x=(a=3,6*3)结果 x 的值为 18。
总结
对c51单片机的预备知识进行了补充和说明