从单片机基础到程序框架(全集 2019pdf版).pdf - 第248页

第五十八节: const(或 co de)在定义数据时的作用。 【58.1 const 与 c ode 的关系。 】 const 与 c ode 都是语法的修饰关 键词, 放在 所定义的数据 前面时有 “不可 更改” 之 意。 在 C 语言语法中, const 像普通话全 国通用 ,是标准的 语言;而 co de 像地方的方言, 仅仅适合针 对 51 单片 机的 C51 编译器环 境。 而其 它大多 数单 片机 的 C 编译 器并 不支…

100%1 / 836
4 个数
十进制:1
十六进制:1
二进制:1
5 个数
十进制:2
十六进制:2
二进制:10
6 个数
十进制:3
十六进制:3
二进制:11
分析:
变量 a 1。
变量 b 1。
变量 c 1。
变量 d 1。
变量 e 2。
变量 f 为 3。
【57.7 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改C 语言学习区域”代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口 51 习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。
第五十八节: const(或 code)在定义数据时的作用。
【58.1 const code 的关系。
const code 都是语法的修饰关键词,放在所定义的数据前面时有“不可更改”意。 C 语言语法中,
const 像普通话全国通用,是标准的语言;而 code 像地方的方言,仅仅适合针 51 单片机的 C51 编译器环
境。而其它大多数单片机 C 编译器并不支持 code,只支持 const。比如 PIC,stm32 单片机的 C 编译器
都是只认 const 而不认 code 的。通常情况下,const 定义的数据都是放在 ROM 的,但是 51 单片机的 C51
译器是例外,它并不 const 义的数据放 ROM 区,只有 code 关键词时它才会把数据放 ROM ,这
一点相对其它大多数的单片机来说是不一样的。因为本教程是用 51 单片机的 C51 译器,所以用 code 来替
const。本节教程所提到 const,在实际编程时都 code 来替代。
【58.2 const(或 code)在定义数据时的终极目的。
在数据定义分配的应用中,const 的终极目的是为了节省 RAM 的开销。从“读”和“写”的角度分析,
数据有两种:“能读能写”和“只能读”这两种。 “能读能写”的数据占用 RAM 内存,叫变量,C 语言语法
上定义此类数据时“无”const 前缀。 只能读”的数据占用 ROM 存,叫常量, C 语言语法上定义此
数据时“有”const 前缀。单片机的 ROM 量比 RAM 容量往往大几十倍甚至上百倍,相比之下,RAM 的资
显得比较稀缺。因此,把某些只需“读”而不需“写”的数据定义成 const 放在 ROM,就可以节省 RAM 的开
销。
【58.3 const(或 code)的应用场合。
const 可以定义单个常量,也可以定义常量数组。定义单个常量时,通常应用在某个出现在程序多处并
且需要经常调整的“阀值”参数,方便“一键更改”的操作。所谓“一键更改”就是只要改一次 const
定义初始化的某个常量,整个程序多次出现的此常量就自动更改了。定义常量数组时,通常应用在某个数据
转换表,把某些固定的常量预先放到常量数组,通过数组的下标来“查表”
【58.4 const(或 code)的语法格式。
定义单个常量和常量数组时的语法是以下这个样子的:
const unsigned char x=10; //定义单个常量。加了 const
const unsigned char y[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //定义常量数组。加 const。
【58.5 const(或 code)的“能读”和“不可写”概念】
所谓“读”和“写”的能力,其实就是看某数能在赋值符号“=”的“右边”还是“左边”的能力。普
通的变量,既可以在赋值符号“=”的“右边”(能读),也可以在赋值符号“=”的“左边(能写)。比如,
下面的写法是合法的:
unsigned char k=1; //这是普通的变量,无 const 前缀。
unsigned char n=2; //这是普通的变量,无 const 前缀。
n=k; //k 出现在赋值符号“=”的右边,表示能读。合法
k=n; //k 出现在赋值符号“=”的左边,表示能写,可更改之意。合法
但是如果一旦在普通的变量前面加了 const(或 code)关键词,就会发“化学变化,原来的“变量”
就变成了“常量,常量只能“读”,不能“写”。比如:
const unsigned char c=1; //这是常量,有 const 前缀。
unsigned char n=2; //这是普通的变量,无 const 前缀。
n=c; //c 是常量,能读,这是合法的。这行代码是语法正确的
c=n; //c 是常量,不能写,这是非法的,C 译器不通过。这行代码是语法错误的
【58.6 const(或 code)能在函数内部定义吗?】
const(或 code)能在函数内部定义吗?能。语法是允许的。当在函数内部定义数据 const(或者 code),
在数据的存储结构上,数据也是放在 ROM 区的(实际上在 51 单片机里想把数据放在 ROM 只能用 code 而不
const),把数据定义在函数内部,就只能在这个函数里面用,不能被其它函数调用。在作用域的问题上,
const(或者 code)的常量数据跟其它变量的数据是一样的。比如:
void HanShu(void)
{
const unsigned char c=1; //在函数内部定义的 const 常量也是放 ROM 区存储。
unsigned char n=2;
n=c; //c 是常量,在函数内部定义,只能在当前这个 HanShu 函数里调用。
}
【58.7 例程练习和分析。
本教程使用的是 51 单片机的 C51 编译器,编写程序时为了让常量数据真正存储 ROM ,因此,本
程的程序例子都是用 code 替代 const。
本例程讲两个例子,一个是单个常量,一个是常量数组。
(1)单个常量。举的例子是“阀值”的“一键更改”应用。根据考试的分数,分两个等级。凡是大于或
者等于 90 分的就是“优”,串口助手输出显示“1”。凡是小于 90 分的就是“良”,串口助手输出显示“0”
这里的“90 分”就是我所说的“阀值”概念,只要用一 const 定义一个常量数据来替代“90”,当需要调
整“阀值”时,只要更改一次此定义的常量数值就可以达到“一键更改”之目的。
(2)常量数组。举的例子是,查询 2017 12 个月的某个月的总天数,用两种思路实现,一种是 switch
分支语句来实现,另一种 const 常量数组的“查表”思路来实现。通过对比这两种思路,你会发现 const
常量数组在做“转换表”这类“查表”项目时的强大优越性。
/*---C 语言学习区域的开始。-----------------------------------------------*/
//函数的声明。
unsigned char HanShu_switch(unsigned char u8Month);
unsigned char HanShu_const(unsigned char u8Month);
//数据的定义。
code unsigned char Cu8Level=90; //需要调整“阀值”时,只需更改一次这里的“90”这个数值。
code unsigned char Cu8MonthBuffer[12]= //每个月对应的天数。从数组下标 0 开始,0 代表 1 月...
{31,28,31,30,31,30,31,31,30,31,30,31};