单片机C语言的知识汇总(2)

2022-12-14  

C51常量

1、常量数据类型说明:
(1)整型常量能表示为十进制如 123,0,-89 等。十六进制则以 0x 开头如 0x34,-0x3B 等。长整型就在数字后面加字母 L,如 104L,034L,0xF340 等。
(2)浮点型常量可分为 十进 制和指数表示形式。指数表 示形式为[±]数字[.数字]e[±]数字,[]中的内容为可选项,其中内容根据具体情 况可有可无,但其余部分必须有,如125e3,7e9,-3.0e-3。
(3)字符型常量是单引号内的字符,如‘a’,‘d’等,不能显示的控制字符,能 在该字符前面加一个反斜杠“”组成专用转义字符。常用转义字符表请看表:

(4)字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内的没有字 符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在 C 中字符 串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上o 转义字符以作为该字符串的结束符。字符串常量“A”和字符常量‘A’是不一样的, 前者在存储时多占用一个字节的字间。
(5)位标量,它的值是一个二进制。


2、应用
常量可用在不必改变值的场合,如固定的数据表,字库等。常量的定义方式有几种,下面来加以说明。
#difine False 0x0;//用预定义语句能定义常量
#difine True 0x1;//这里定义 False 为 0,True 为 1
//在程序中用到 False 编译时自动用 0 替换,同理 True 替换为 1
unsigned int code a=100;//这一句用 code 把 a 定义在程序存储器中并赋值
const unsigned int c=100;//用 const 定义 c 为无符号 int 常量并赋值 以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似 a=110,a++这样的赋值语句,编译时将会出错。

三、C51变量

1、变量格式
[存储种类] 数据类型 [存储器类型] 变量名表
  在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。


2、存储种类
存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。
(1)static(静态局部)变量
在程序整个运行期间都不会释放内存。如果定义局部变量的时候不赋值,则编译的时候自动赋值为0。而对于自动变量而言,定义的时候不赋值,则是一个不确定的值。其他函数不能引用。
(2)用extern声明外部变量
一个程序能由多个源程序文件组成。如果一个程序中需要引用另外一个文件中已经定义的外部变量,就需要使用extern来声明。
例: 一个文件中: int abc;
另外一个文件中: extern abc;


3、数据类型
(1)数据类型

字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数, 负数用补码表示。

(2)特殊

bit 位标量是 c51 编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义 位指针,也不能定义位数组。它的值是一个二进制位,不是 0 就是 1,类似一些高级语 言中的 Boolean 类型中的 True 和 False。

sfr 也是一种扩充数据类型,点用一个内存单元,值域为 0~255。利用它能访问 51 单片机内部的所有特殊功能寄存器。

sfr16 占用两个内存单元,值域为 0~65535。sfr16 和 sfr 一样用于操作特殊功能寄存 器,所不一样的是它用于操作占两个字节的寄存器,如定时器 T0 和 T1。sfr16 T2 = 0xCC; //这里定义8052定时器2,地址为T2L=CCH,T2H=CDH。用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1的定义。

sbit 同样是 单片机c语言 中的一种扩充数据类型,利用它能访问芯片内部的 RAM 中的可寻址位或特殊功能寄存器中的可寻址位。如先前定义了sfr P1=0x90;//因 P1 端口的寄存器是可位寻址的,所以能定义sbit P1_1=P1^1;//P1_1 为 P1 中的 P1.1 引脚。同样我们能用 P1.1 的地址去写,如 sbit P1_1=0x91;这样在以后的程序语句中就能用 P1_1 来对 P1.1 引脚进行读写操作了。

(3)重新定义数据类型的的语句typedef

typedef 的语法:typedef 已有的数据类型 新的数据类型名

样写:typedef int integer; integer a,b;

typedef 不能直接用来定义变量,它只是对已有的数据类型作一个名字上的置换,并不是产生一个新的数据类型。

4、存储器类型

指定该变量在单片机c语言硬件系统中所使用的存储区域,并在编译时准确的定位。

注意的是在AT89c51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都能声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区能显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。

(1)特殊寄存器(SFR)的地址

AT89C51特殊功能寄存器列表(适用于同一架构的芯片)

带*号的特殊功能寄存器都是可以位寻址的寄存器

(2)数据存储模式

①Small模式:所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。

②Compact模式:所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。

③large模式:所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。


5、Keil c51指针变量

单片机c语言支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer)。

(1)一般指针

一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如:char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区。一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。

(2)存储器指针

基于存储器的指针说明时即指定了存贮类型,例如:char data * str;str指向data区中char型数据;这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。

(3)指针转换

当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。


6、单片机c语言中变量的空间分配几个方法

(1)data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。

data区内最好放局部变量。局部变量空间在退出该函数是就释放,当然静态局部变量除外,其内存使用方式与全局变量相同;

(2)确保你的程序中没有未调用的函数。在Keil

C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。

(3)程序中遇到的逻辑标志变量能定义到bdata中,能大大降低内存占用空间。

(4)其他不频繁用到和对运算速度要求不高的变量都放到xdata区。如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。

(5)当使用到指针时,要指定指针指向的内存类型。未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为:char

data *p;。还可指定指针本身的存放内存类型,如:char data *xdata p;


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。