3.4 MCS-51单片机的C程序设计

尽管汇编语言在控制底层硬件方面有着良好的性能且执行效率高,但其本身是一种低级语言,编程效率低,可移植性和可读性差,维护不方便。由于C语言可以采用模块化的思想进行编程,很多软件库、函数等编写好后可以重复利用,并且能方便地移植到其他工程中,因此采用C语言开发MCS-51单片机的软件,可以加快软件开发进度。

3.4.1 C51语言与标准C语言的简单比较

针对MCS-51单片机软件开发的C51语言是标准C语言的扩展,使用专用的编译器,如Keil与Franklin等开发工具。尽管C51语言与标准C语言在语法格式上基本相同,但C51语言大多数扩展功能都是针对MCS-51单片机CPU的,主要有5类:存储类型及存储区域、存储模式、存储器类型声明、变量类型声明、位变量。

1.存储类型及存储区域

MCS-51单片机的程序存储器最大外扩64KB,外部数据存储器最多可扩展64KB,外部存储器地址范围均为0000H~0FFFFH。内部数据存储器可用以下关键字说明。

data:直接寻址区,为内部数据存储器的低128字节00H~7FH。

idata:间接寻址区,包括整个内部数据存储器的256字节00H~0FFH。

bdata:可位寻址区,20H~2FH。

需要注意的是,MCS-51单片机的程序存储器总共不超过64KB,而数据存储器外部最多可以扩展64K,同时内部的数据存储器也可以使用,只是访问指令不同(访问外部用MOVX指令,访问内部使用MOV指令),因此MCS-51单片机的数据存储器最多可以使用的空间为内部数据存储器+64KB。

2.存储模式

MCS-51单片机采用C51语言进行软件开发时,需要确定其存储模式。存储模式决定了没有明确指定存储类型的变量、参数等的默认存储区域,共有三种模式。

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

② Compact模式:所有默认变量均位于外部数据存储器的一页(256B),具体哪一页可由P2端口指定,在STARTUP.A51文件中说明,也可用pData指定,优点是空间比Small模式宽裕,速度比Small模式慢,比Large模式快,是一种中间状态。

③ Large模式:所有默认变量可放在多达64KB的外部数据存储器中,优点是空间大,可存变量多,缺点是速度较慢。

3.存储类型声明

变量或参数的存储类型可由存储模式指定默认类型,也可由关键字直接指定。各类型分别用code、Data、iData、xData、pData说明,例:

4.变量类型声明

C51语言提供以下几种扩展数据类型。

① bit:位变量值,为0或1;

② sbit:从字节中定义的位变量,值为0或1;

③ sfr sfr:字节地址,0~255;

④ sfr16 sfr:字地址,0~65535。

其余数据类型(如char、short、int、long、float等)与标准C语言相同。

5.位变量与声明

bit型变量可用于变量类型、函数声明、函数返回值等,存储于内部数据存储器的20H~2FH。位变量必须在MCS-51单片机内部可位寻址单元(20H~2FH和SFR)中,否则程序会出错。针对特殊功能寄存器,可做如下定义:

3.4.2 MCS-51单片机的软件开发工具与程序设计

1.开发工具

Keil软件是单片机编程工具。Keil集成开发环境可以对MCS-51单片机进行编程,如创建源程序、输出执行文件、代码测试、仿真等。

Keil软件结构如图3-1所示,提供对MCS-51单片机的汇编程序、C语言程序的编译、连接、重定位、HEX文件创建、调试等功能,所有这些功能集成到Windows应用程序μVision3集成开发环境中,主要功能说明如下。

图3-1 Keil软件结构

1)μVision3 IDE

μVision3 IDE集成了项目管理器、文件及代码编辑器、基本的设置选项、生成工具、在线帮助等。利用μVision3创建源代码(汇编文件或者C文件),并把这些文件添加到一个项目文件中,此时μVision3 IDE通过项目文件可以对源代码执行编译、汇编、连接等命令,实现对应用程序的设计与开发。

2)C51编译器和A51汇编器

程序源代码由μVision3 IDE创建,通过C51编译器进行编译(C文件),或者A51汇编器进行汇编(汇编文件)。编译器和汇编器从源代码生成可重定位的目标文件。Keil C51编译器完全遵照标准C语言,支持C语言的所有特性。另外,Keil A51汇编器支持51系列单片机的全部指令集。

3)LIB51库管理器

LIB51库管理器允许从由编译器或汇编器生成的目标文件创建目标库,库是一种被特别地组织过并在以后可以被重复使用的对象模块。当连接器处理一个库时,只有那些被使用的目标模块才能被真正使用。

4)BL51连接器

BL51连接器利用从库中提取的目标模块和由编译器或汇编器生成的目标模块,创建一个绝对地址的目标模块,一个绝对地址目标模块或文件包含不可重定位的代码和数据,将编译生成的OBJ文件与库文件连接定位生成绝对目标文件(ABS文件),所有的代码和数据被安置在固定的存储器单元中。此绝对地址目标文件可以用来写入EPROM或其他存储器件、由μVision3调试器用来模拟和调试、由仿真器用来测试程序。

经编译后,工程中的源程序包含的.c、.asm、.h的多个模块分别生成各自的OBJ文件。连接时,这些文件全列于目标文件列表中,作为最后输入存储器的文件,如果还使用了库文件内容,则也要与库文件(LIB文件)相连接,库文件也必须列在其后。Outputfile为输出文件名,默认为第一模块名,后缀为.ABS。连接控制指令提供了连接定位时的所有控制功能。Commandfile为连接控制文件,包括了目标文件列表、库文件列表及输出文件、连接控制命令。

5)OH51目标文件转换器

OH51目标文件转换器能够把编译、连接好的目标文件转换成能写入EPROM中的HEX文件,也就是最后生成的机器码文件。

6)μVision3调试器

μVision3调试器包含一个高速模拟器,能够模拟整个51系列单片机系统程序,包括片上外围器件和外部硬件。从选择器件开始,这个器件的特性将自动配置。μVision3调试器为在实际目标板上测试程序提供了以下方法:

● 安装+Monitor-51到目标系统,并且通过接口下载程序代码;

● 利用高级的GDIAGDI接口,把μVision3调试器绑定到目标系统。

7)Monitor-51

μVision3调试器支持用Monitor-51进行目标板调试,此监控程序驻留在目标板的存储器里,它利用串口和μVision3调试器进行通信,利用Monitor-51、μVision3调试器可以对目标硬件实行源代码级的调试。Monitor-51对硬件有如下要求:硬件系统只能为51系列单片机的CPU。

带5KB外部程序存储器(从0地址开始),存放Monitor-51程序、256B的外部数据存储器以及5KB的跟踪缓冲区。此外,外部数据存储器必须足够容纳所有应用程序代码及数据,并且所有外部数据存储器能一致访问XDATA与Code空间。要使用一个定时器作为波特率发生器供串口使用,6B的空余堆栈空间提供给用户作为测试用。

8)RTX51实时操作系统

RTX51是一个用于8051系列处理器的多任务实时操作系统,RTX51可以简化那些复杂且时间要求严格的软件设计工作,有两个RTX51版本:RTX51 Full和RTX51 Tiny。

RTX51 Full使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换,RTX51工作在与中断功能相似的状态下,信号和信息可以通过邮箱系统在任务之间互相传递,可以从存储池中分配和释放内存,也可以强迫一个任务等待中断超时或者从另一个任务或中断发出信号或信息。

RTX51 Tiny是RTX51的子集,它可以很容易地在没有任何外部存储器的单片8051系统上运行,RTX51 Tiny仅支持时间片轮转任务切换和使用信号进行任务切换,不支持抢先式的任务切换,不包括消息历程,没有存储器池分配程序。

2.程序设计

采用Keil软件进行程序开发的流程如下:首先,创建一个工程,从器件库中选择目标器件,进行工具设置;其次,用C语言或汇编语言编写源程序;然后,用工程管理器生成应用,修改源程序中的错误;最后,对代码进行测试、连接和应用。

本小节通过一个实例来说明C51程序的开发过程。使用Keil软件的步骤如下。

① 创建一个新工程,选择Project→New Project菜单命令,出现对话框,将工程的描述内容存放到myproj.uv2文件中,如图3-2所示。

图3-2 创建新工程

② 工程建立后,会出现一个器件选择对话框,如图3-3所示,大多数MCS-51单片机的内核和编程基本一致,都采用Intel公司的51单片机内核,因此这里选择Atmel公司的51单片机系列中的AT89C51就可以了。

图3-3 器件选择对话框

③ 用C语言或汇编语言创建源程序。

选择File→New菜单命令来新建一个源文件,打开一个空的编辑窗口,输入源代码,把此文件保存为main.c。

【例3.8】 创建一个源代码文件。

创建了源文件后,就可以把它加入新建的工程。例如,可以右击文件组来弹出快捷菜单,选择菜单中的Add Files命令,打开相应对话框,从对话框中选择生成的文件main.c。程序加入后,工程框架建立完成,但是还要进行相应的配置才能完成后续工作,如设置文件的编译方式等,如图3-4所示。选择ProjectOptions for Target‘Target 1’菜单命令,就会弹出一个对话框,设置文件和工程的编译属性,设置完成后可以对工程的程序进行编译。

④ 用项目管理器对源代码进行编译。

单击工具栏上的Build图标,可以编译所有的源文件并生成应用。当源代码中有语法错误时,μVision3将在Output Window的Build页显示这些错误和告警信息,双击一个信息将打开此信息对应的文件并定位到语法错误处,如图3-5所示,左图为源代码中的错误信息,修改源代码,编译成功后生成右图,包含代码长度、HEX文件名等信息。

图3-4 新工程配置

图3-5 编译结果

⑤ 调试和应用。

编译成功后,就可以开始调试和应用了。调试有两种方式,一种是软件模拟,这样不需要把程序下载到目标板上,通过μVision3的内部模拟器即可模拟;另一种是硬件模拟,须创建一个HEX文件并下载到内部程序存储器。HEX文件是ASCII文本文件,全部由可打印的ASCII字符组成(可以用“记事本”程序打开)。在HEX文件中,每一行是一条记录,由十六进制数组成的机器码或者静态数据组成。HEX文件常用来保存单片机或其他处理器的目标程序代码。如图3-6所示为HEX文件设置。

单片机程序编写好后,编译通过,则可下载到实际的目标板上进行测试。目前,很多编程工具支持单片机程序下载,如Keil仿真器、南京伟福公司的伟福仿真器。之后,使单片机重新复位,下载的程序即可正常运行。

图3-6 HEX文件设置