从单片机基础到程序框架(全集 2019pdf版).pdf - 第250页
unsigned c har a; / /用来接收函 数返回的结果 。 unsigned c har b; unsigned c har c; unsigned c har d; //函数 的定义。 unsigned c har HanS hu_switch (unsigned c har u8Month) / /用 switch 分支来 实现。 { switch(u 8Month) { case 1 : //1 月份的天数 retur…

但是如果一旦在普通的变量前面加了 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};

unsigned char a; //用来接收函数返回的结果。
unsigned char b;
unsigned char c;
unsigned char d;
//函数的定义。
unsigned char HanShu_switch(unsigned char u8Month) //用 switch 分支来实现。
{
switch(u8Month)
{
case 1: //1 月份的天数
return 31;
case 2: //2 月份的天数
return 28;
case 3: //3 月份的天数
return 31;
case 4: //4 月份的天数
return 30;
case 5: //5 月份的天数
return 31;
case 6: //6 月份的天数
return 30;
case 7: //7 月份的天数
return 31;
case 8: //8 月份的天数
return 31;
case 9: //9 月份的天数
return 30;
case 10: //10 月份的天数
return 31;
case 11: //11 月份的天数
return 30;
case 12: //12 月份的天数
return 31;
default: //万一输错了其它范围的月份,就默认返回 30 天。
return 30;
}
}
unsigned char HanShu_const(unsigned char u8Month) //用 const 常量数组的“查表”来实现。
{
unsigned char u8GetDays;
u8Month=u8Month-1; //因为数组下标是从 0 开始,0 代表 1 月份,1 代表 2 月份。所以减去 1。

u8GetDays=Cu8MonthBuffer[u8Month]; //这就是查表,马上获取常量数组表格里固定对应的天数。
return u8GetDays;
}
void main() //主函数
{
//第(1)个例子
if(89>=Cu8Level) //大于或者等于阀值,就输出 1。
{
a=1;
}
else //否则输出 0。
{
a=0;
}
if(95>=Cu8Level) //大于或者等于阀值,就输出 1。
{
b=1;
}
else //否则输出 0。
{
b=0;
}
//第(2)个例子
c=HanShu_switch(2); //用 switch 分支的函数获取 2 月份的总天数。
d=HanShu_const(2); //用 const 常量数组“查表”的函数获取 2 月份的总天数。
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
View(b); //把第 2 个数 b 发送到电脑端的串口助手软件上观察。
View(c); //把第 3 个数 c 发送到电脑端的串口助手软件上观察。
View(d); //把第 4 个数 d 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...