1.5 结构化程序设计——建立函数概念

C51源程序由一个或多个源文件组成,源文件扩展名为“c”,命名为“*.c”。

函数是源文件的基本组成单位。每个C51程序都由一个或多个函数组成,其中有且只有一个主函数(main())。程序从主函数开始执行,在主函数中可以调用库函数和自定义的函数、中断函数。运行每一个函数都执行一个特定的任务来实现整个程序的功能。一般的C51程序基本结构如图1-23所示。

图1-23 一般的C51程序基本结构

函数以左花括号“{”开始,以右花括号“}”结束,包含在“{}”以内的部分称为函数体,函数体内的语句块也用“{}”括起来。为结构清晰,应采用缩进方式书写。

分号(;)是语句的基本组成部分。C51源程序中含有预处理命令、语句、说明等。说明和语句以“;”结尾,预处理命令后不加分号。

语句的注释:用于说明程序段的功能,增加程序的可读性。

(1)单行注释:以“//”开头,如//…注释…。

(2)多行注释:/*…注释…*/。

1.5.1 仅由main()函数构成的C语言程序

程序运行结果:

1.5.2 由main()函数和max()函数构成的C语言程序

程序运行情况(假设输入第一个数为6,第二个数为9):

1.5.3 C51程序的一般结构

1.5.4 规范书写程序语句

(1)规范意识是一个优秀的程序员的素质之一。规范的程序结构清晰、可读性强,便于调试,有问题也容易发现,也方便移植。初学者掌握以下几点:

① 使用TAB进行右缩进。

② 每个变量必须先定义后引用,变量名的大小写敏感,故前后定义、应用要一致。

③ 一行可以书写多个语句,但每个语句必须以“;”结尾,一个语句也可以多行书写。

④ 函数体或语句块用{}括起来,并“{”“}”上下对齐。

⑤ 有足够的注释:单行注释以“//”开头;多行注释可由“/*……*/”括起。

⑥ 有合适的空行。

⑦ 尽量采用短的数据类型,如unsigned,为变量分配内部存储区。

(2)为了增强程序的可读性,尽可能地对程序语句添加注释。因为编程当时可能灵光一现,过后就忘了。为了记录思想,记录工作,要对注释有足够的重视。一般注释内容有:

① 程序名称;

② 程序要实现的功能,比如要完成什么数学运算;

③ 程序的思路和特点;

④ 编程人员、时间、版本等;

1.5.5 程序设计流程

1.程序设计步骤

根据任务要求,拟订设计方案、编程序、调试,直到成功,通常分为以下6步。

(1)明确任务、分析任务、构思程序设计基本框架

根据项目任务书,明确功能要求和技术指标,构思基本框架是程序设计的第一步。一般可将程序设计划分为多个程序模块,每个模块完成特定的子任务。这种程序设计框架也称模块化设计。

(2)合理使用单片机资源

单片机资源有限,合理使用资源极为重要,它能使程序设计占用ROM少,执行速度快、处理突发事件能力强、工作稳定可靠。例如,若定时精度要求较高,宜采用定时器/计数器;若要求及时处理片内、片外发生的事件,宜采用中断;若要求多个LED数码管显示,宜采用动态扫描方式,以减少使用I/O口的数目等。

确定好存放初始数据、中间数据、结果数据的存储器单元,安排好工作寄存器、堆栈等,也属于合理使用单片机资源。

(3)选择算法、优化算法

一般单片机应用设计,都有逻辑运算、数学运算的要求。对要求逻辑运算、数学运算的部分,要合理选择算法和优化算法,力求程序占用ROM少,执行速度快。

(4)设计流程图

根据构思的程序设计框架设计好流程图。流程图包括总程序流程图、子程序流程图和中断服务程序流程图。流程图使程序设计形象、程序设计思路清晰。

(5)编写程序

编写程序是程序设计实施的关键步骤,要力求正确、简练、易读、易改。

(6)程序编译与调试

源程序都要经编译生成单片机可执行的代码。编译只能检测语法、书写错误,不能判断程序设计的逻辑错误,所以编译成功后不代表程序设计正确,还要调试测试,反复修改直到测试成功。C51程序在Keil环境下进行编写、编译和初步调试,软件、硬件联合调试用Proteus。Keil是目前单片机应用系统最方便、最快速的研发平台。

2.流程图的符号

流程图是程序设计思想的图形化直观表达,有助于初学者理清思路,按流程图的指导能较快地编写、分析和调试程序。初学者应该注意培养这种图形表达能力,提高程序设计效率。流程图由各种示意图形、符号、指向线、说明、注释等组成,用来说明程序执行各阶段的任务处理和执行走向。表1-2列出了常用的流程图符号和说明。

表1-2 常用的流程图符号和说明