单片机的C语言程序设计与应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 C51程序

1.2.1 C51的程序结构

单片机C51语言继承了C语言的特点,其程序结构与一般C语言的程序结构没有差别。C51源程序文件的扩展名为“.c”,如test.c、function.c等。每个C51源程序包含一个名为main( )的主函数,C51程序的执行总是从main( )函数开始的。当主函数的所有语句执行完毕,则程序执行结束。例1-4是一个典型的C51源程序的例子。

【例1-4】 C51源程序示例

            #include<reg52.h>                   //预处理命令,reg52.h是一个库文件
            #include<stdio.h>                   //stdio.h是一个库文件
            void Function1(void);               //自定义函数Function1声明
            unsigned int ch;                    //全局变量声明
            void main(void)                     //主函数
            {   SCON=0x50;                      //SCON:模式1,8bit异步串行口通信
                TMOD=0x20;                      //TMOD:定时器1为模式2,8bit自动装载方式
                TH1=221;                        //TH1:1200bit/s的装载值,16MHz
                TR1=1;                          //TR1:timer1运行
                TI=1;                           //TI:设置为1,以发送第一个字节
                                              //以上5条语句是为串行口调试设置的
                while(ch<=5)
                {   Function1();                //调用自定义函数
                    printf("char=%d\n",ch);    //程序语句
                }
                while(1);
            }
            void Function1(void)                //自定义函数Function1
            {   unsigned char ps;               //自定义函数内部变量声明
                ps=1;
                ch=ch+ps;
            }

在串行口窗口Srial#1中,输出结果:

            char=1
            char=2
            char=3
            char=4
            char=5
            char=6

从上面的例子可以看出,一个典型的C51源程序包含预处理命令、自定义函数声明、主函数main( )和自定义函数。这几部分与C语言的程序结构完全类似,各部分的功能如下。

① 预处理命令部分常用#include命令来包含一些程序中用到的头文件。这些头文件中包含了一些库函数,以及其他函数的声明与定义。

② 自定义函数声明部分用来声明源程序中自定义的函数。

③ 主函数main( )是整个C51程序的入口。不论main( )函数位于程序代码中的哪个位置,C51程序总是从main( )函数开始执行的。

④ 自定义函数部分是C51源程序中用到的自定义函数的函数体。

除了扩展名为“.c”的源程序文件外,C51程序还支持扩展名为“.h”的头文件以及扩展名为“.lib”的库文件等。在一般的编译系统中,通常以项目(工程)结构来管理复杂的C51程序文件。例如Keil μVision2编译环境中,整个项目结构如图1-1所示。

图1-1 Keil μVision2项目结构示意图

在这里,整个项目由项目文件管理,项目文件扩展名为“.UV2”。整个工程项目中可以包含如下几类文件。

① 头文件用来包含一些库函数,系统变量声明并将不同的C文件连接起来。

② C源文件是C51程序的主要部分,用来实现特定的功能。C源文件可以有一个,也可以按照不同的功能分成多个,但所有这些C源文件中有且仅有一个可以包含一个main( )主函数。

③ 库文件是实现特定功能的函数库,供C源文件调用。

④ 编译中间文件是源程序在编译链接过程中生成的中间文件,其中包含了文件编译调试的信息。

⑤ 可烧录文件是编译系统生成的可以烧录到单片机内部供执行的文件,类似于“.exe”可执行文件。在C51语言中,一般扩展名为“.hex”或者“.bin”等。

在这些文件中,C源文件是必需的,其他文件可以根据用户实际的需要而使用。

1.2.2 C51编程规范及注意事项

在学习任何一种编程语言时,按照一定的规范培养良好的编程习惯很重要。良好的编程规范可以帮助开发人员理清思路、方便整理代码,同时也便于他人阅读、理解,以促进代码的交流。在进行C51语言程序设计时,应该注意以下几方面的编程规范。

1.注释

任何编程语言都支持注释语句。注释语句只对代码起到功能描述的作用,在实际的编译链接过程中不起作用。在C51语言中可以通过两种方式来表示注释内容。

(1)用“//”开头来注释一行

如“//变量声明”。本方法简明、方便,“//”符号可以在一行的开始,这样整行都表示注释内容;“//”也可以在某行的执行语句后面,“//”符号后面的内容是对该语句的注释内容。

(2)用“/*”符号开头,并以“*/”符号结束

如用“/*声明整型变量ch*/”。本方法灵活多变,可以注释多行,如

            /**********************************************************/
            /*      Function.c:使用C51编译器的自定义功能函数库           */
            /**********************************************************/

用户也可以在程序语句的内部进行注释,示例如下:

            printf("ch=%d\n",/*整型变量ch*/ch);

一个好的C51源程序应该添加必要的注释内容。这样,可以增加程序的可读性,方便日后修改或者与他人的代码交流。注释内容一般包括程序的功能、实现方式、自定义函数的功能描述、语句的功能等。

2.命名

在进行程序设计时,经常需要自定义一些函数或变量。一般来说,只要符合C51命名规范即可通过编译。但是,为了便于源程序的理解和交流,在进行命名时应注意以下几点。

① 自定义函数或者变量的名称最好能反映该函数或变量的功能与用途。因此,需要选用有意义的单词或者字母组合来表示。例如,MAX表示最大值、MIN表示最小值等。

② 变量名通常加上表示数据类型的前缀,例如ucSendData的前缀uc表示unsigned char。

③ 在命名时不要和系统保留的标识符及关键字产生冲突或者歧义。

3.格式

为了程序阅读方便,在进行C51程序设计时,在程序结构及语句书写格式方面应注意以下几点。

① 虽然C51语言对main( )函数放置的位置没有限定,但为了程序阅读的方便,最好把它放置在所有自定义函数的前面,即依次为头文件声明、自定义函数及全局变量声明、main( )函数、自定义函数。

② C51语句可以写在一行上,也可以写在多行上。为了程序理解的方便,最好将每条语句单独写在一行上,并加以注释。有时,共同执行某个功能的几条相连的语句可以放置在一行上。

③ 对于源程序文件不同结构部分之间要留有空行。例如,头文件声明、自定义函数声明、main( )函数,以及自定义函数之间均要空一行,来明显区分不同的结构。

④ 对于if、while等块结构语句中的“{”和“}”,要配对对齐,以便于程序阅读时能够理解该结构的起始和结束。

⑤ 源代码安排时,可以通过适当的空格和制表位来实现代码对齐。

以上是一些常用的编程规范,读者可以参考借鉴。

1.2.3 C51的标识符与关键字

标识符和关键字是一种编程语言最基本的组成部分,C51语言同样支持自定义的标识符及系统保留的关键字。在进行C51程序设计时,需要了解标识符和关键字的使用规则。

1.标识符

标识符常用来声明某个对象的名称,如变量和常量的声明、数组和结构的声明、自定义函数的声明,以及数据类型的声明等。示例如下:

            int count;
            void Function1();

在上面的例子中,count为整型变量的标识符,Function1为自定义函数的标识符。

在C51语言中,标识符可以由字母、数字(0~9)或者下画线“_”组成,最多可支持32个字符。C51标识符的第一个字符必须是字母或者下画线“_”,例如unt、ch_1等都是正确的标识符,而5count则是错误的标识符。另外,C51的标识符区分大小写,例如count和COUNT代表两个不同的标识符。使用标识符时应注意以下几点。

① 在命名C51标识符时,需要能够清楚地表达其功能含义,这样有助于阅读和理解源程序。

② C51的标识符原则上可以使用下画线开头,但有些编译系统的专用标识符或者预定义项是以下画线开头的。为了程序的兼容性和可移植性,建议一般不使用下画线开头来命名标识符。

③ 尽量不要使用过长的标识符,以便于使用和程序理解方便。

④ 自定义的C51标识符不能使用C51语言保留的关键字,也不能和用户已使用的函数名或C51库函数同名。例如char是关键字,所以不能作为标识符使用。

2.关键字

关键字是C51语言的重要组成部分,是C51编译器已定义保留的专用特殊标识符,有时也称为保留字。这些关键字通常有固定的名称和功能,如int、if、for、do、while、case等。C51语言中常用的关键字如表1-1所示。

表1-1 C51语言中常用的关键字

从表1-1中可以看出,单片机C51程序语言不仅继承了ANSI C定义的32个关键字,还根据C51语言及单片机硬件的特点扩展了相应的关键字。在C51语言程序设计中,用户自定义的标识符不能和这些关键字冲突,否则就无法正确通过编译。