您好,欢迎访问三七文档
·1·第1章单片机的C语言概述......................................................................................................21.1C语言与MCS-51单片机编程....................................................................................21.1.1单片机的C语言的特点.................................................................................21.1.2单片机的C语言和标准C语言的比较........................................................21.1.3单片机的C语言与汇编语言的优势对比.....................................................31.2C51的程序结构...........................................................................................................71.2.1C51的程序结构....................................................................................................71.2.2C51编程规范及注意事项..............................................................................81.2.3C51的标识符与关键字..................................................................................91.3C51编程举例.............................................................................................................11本章小结.........................................................................................................................14习题.................................................................................................................................14·2·第1章单片机的C语言概述我们都知道,在单片机应用系统开发过程中,软件编程占有非常重要的地位。尤其是随着单片机技术的发展,嵌入式系统的推广和应用,硬件的集成化程度越来越高,同时对软件编程的要求也越来越高。这就要求单片机开发人员能在短时间内编写出执行效率高、运行可靠的代码。同时,由于实际系统的日趋复杂,对使用代码的规范性、模块化的要求越来越高,要方便多个工程师以软件工程的形式进行协同开发。在这种形势下,仅靠单片机在推广应用的初期使用的汇编语言来进行软件开发,是远远不够的。C语言是近年来在国内外普遍使用的一种程序设计语言。C语言能直接对计算机硬件进行操作,既有高级语言的特点,又有汇编语言的特点,因此在单片机应用系统开发过程中得到了非常广泛的应用。在单片机应用系统设计与开发过程中,只要简单地熟悉相应单片机的硬件结构,利用C语言作为编程语言可以大大缩短开发周期。本章主要对单片机的C语言的基本问题进行概括的说明。1.1C语言与MCS-51单片机编程嵌入式单片机在开发过程中的编程语言主要有汇编语言和C语言。汇编语言作为传统的嵌入式系统的编程语言,已经不能满足实际需要了,而C语言的结构化和高效性满足了这样的需要,成为电子工程师在进行嵌入式系统编程时的首选语言,并得以广泛应用。尤其是C语言编译系统的发展,更加促进了C语言的应用。1985年出现了针对8051单片机的C51编译器,进而又出现了其他流行的嵌入式处理器系统如196系列、PIC系列、MOTORAL系列、MSP430系列、AD公司和TI公司的DSP系列的C语言编译系统,以及丰富的C语言库函数。本书主要讨论8位嵌入式单片机—MCS-51单片机及其派生产品的C语言编程问题,简称C51的程序设计。1.1.1单片机的C语言的特点单片机的C语言的特点主要体现在以下几个方面:无须了解机器硬件及其指令系统,只需初步了解MCS-51的存储器结构;C51语言能方便地管理内部寄存器的分配、不同存储器的寻址和数据类型等细节问题,但对硬件控制有限,而汇编语言可以完全控制硬件资源;C51语言在小应用程序中产生的代码量大,执行速度慢,但在较大的程序中代码效率高;C51语言程序由若干函数组成,具有良好的模块化结构,便于改进和扩充;C51语言程序具有良好的可读性和可维护性,而汇编语言在大应用程序开发中,开发难度增加,可读性差;C51语言有丰富的库函数,可以大大减少用户的编程量,显著缩短编程与调试时间,大大提高软件开发效率;使用汇编语言编制的程序,当机型改变时,无法直接移植使用,而C语言程序是面向用户的程序设计语言,能在不同机型的机器上运行,可移植性好。1.1.2单片机的C语言和标准C语言的比较标准C语言,或称为ANSIC语言。单片机的C语言和标准C语言之间有许多相同的地方,但也有其自身的一些特点。不同的嵌入式C语言编译系统之所以与ANSIC语言有不同的地方,主要是由于它们所针对的硬件系统不同,对于MCS-51系列单片机,我们称为C51语言,其不同点主要体现在以下几方面。(1)C51语言中定义的库函数和标准C语言定义的库函数不同标准C语言定义的库函数是按照通用微型计算机来定义的,而C51语言中的库函数是按·3·MCS-51单片机的应用情况来定义的。(2)C51语言中的数据类型和标准C语言的数据类型也有一定的区别在C51语言中增加了几种针对MCS-51单片机特有的数据类型。例如,MCS-51系列单片机包含位操作空间和丰富的位操作指令,因此C51语言与ANSIC语言相比要多一种位类型,使得它能同汇编语言一样,灵活地进行位指令操作。(3)C51变量的存储模式与标准C语言中变量的存储模式不一样C51语言中变量的存储模式与MCS-51单片机的存储器紧密相关。从数据存储类型上,8051系列有片内、片外程序存储器,片内、片外数据存储器。在片内程序存储器还分为直接寻址区和间接寻址区,分别对应code、data、xdata、idata,以及根据MCS-51系列单片机特点而设定的pdata类型,使用不同存储器将会影响程序执行的效率,不同的模式对应不同的硬件系统和不同的编译结果。ANSIC语言对存储模式要求不高。(4)C51语言与标准C语言的输入/输出处理不一样C51语言中的输入/输出是通过MCS-51串行口来完成的,输入/输出指令执行前必须对串行口进行初始化。(5)C51语言与标准C语言在函数使用方面有一定的区别C51语言中有专门的中断函数。1.1.3单片机的C语言与汇编语言的优势对比在国内,汇编语言在单片机开发过程中是比较流行的开发工具。长期以来对编译效率的偏见,以及不少程序员对使用汇编语言开发硬件环境的习惯性,使C语言在很多地方遭到冷落。优秀的程序员写出的汇编语言程序的确有执行效率高的优点,但汇编语言其可移植性和可读性差的特点,使其开发出来的产品在维护和功能升级时的确有极大的困难,从而导致整个系统的可靠性和可维护性比较差。而使用C语言进行嵌入式系统的开发,有着汇编语言所不可比拟的优势。(1)编程调试灵活方便C语言编程灵活,当前几乎所有的嵌入式系统都有相应的C语言级别的仿真调试系统,调试十分方便。(2)生成的代码编译效率高当前较好的C编译系统编译出来的代码效率只比直接使用汇编语言低20%,如果使用优化编译选项甚至可以更低。(3)模块化开发目前的软硬件开发都向模块化、可复用性的目标集中。不管是硬件还是软件,都希望其有比较通用的接口,在以后的开发中如果需要实现相同或者相近的功能,就可以直接使用以前开发过的模块,尽量不做或少做改动,以减少重复劳动。如果使用C语言开发,数据交换可以方便地通过约定实现,有利于多人协同进行大项目的合作开发。同时C语言的模块化开发方式使开发出来的程序模块可以不经修改而直接被其他项目使用,这样就可以很好地利用已有的大量C语言程序资源与丰富的库函数,从而最大程度地实现资源共享。(4)可移植性好由于不同系列的嵌入式系统的C语言编译工具都是以标准C语言作为基础进行开发的,因此一种C语言环境下所编写的C语言程序,只需要将部分与硬件相关的地方和编译链接的参数进行适当修改,就可以方便地移植到另一种系列上。例如,在C51下编写的程序通过改写头文件及少量的程序行,就可以方便地移植到196或PIC系列上。也就是说,基于C语言环境下的嵌入式系统能基本达到平台的无关性。(5)便于项目的维护用C语言开发的代码便于开发小组计划项目、灵活管理、分工合作及后期维护,基本可·4·以杜绝因开发人员变化而给项目进度、后期维护或升级所带来的影响,从而保证整个系统的品质、可靠性及可升级性。下面通过一个例子对汇编语言和C语言进行比较。【例1-1】将外部数据存储器的000BH和000CH单元的内容相互交换。用汇编语言编程,源程序如下:ORG0000HMOVDPTR,#000BHMOVXA,@DPTR;将000BH内容读入AMOVR7,A;暂存000BH内容INCDPTRMOVXA,@DPTR;将000CH内容读入AMOVDPTR,#000BHMOVX@DPTR,AINCDPTRMOVA,R7MOVX@DPTR,ASJMP$END用C语言编程,C51源程序如下:(注:C51语言对地址的指示可以采用指针变量,也可以引用头文件absacc.h作为绝对地址访问。下面的程序采用绝对地址访问方法。)#includeabsacc.hvoidmain(void){charc;c=XBYTE[11];XBYTE[11]=XBYTE[12];XBYTE[12]=c;while(1);}上面的程序经过编译,生成的反汇编程序如下:0x0000020013LJMPSTARTUP1(C:0013);跳转0x000390000BMOVDPTR,#0x000B0x0006E0MOVXA,@DPTR0x0007FFMOVR7,A0x0008A3INCDPTR0x0009E0MOVXA,@DPTR0x000A90000BMOVDPTR,#0x000B0x000DF0MOVX@DPTR,A0x000EA3INCDPTR0x000FEFMOVA,R70x0010F0MOVX@DPTR,A0x001180FESJMPC:00110x0013787FMOVR0,#0x7F;以下是清零部分0x0015E4CLRA0x0016F6MOV@R0,A·5·0x0017D8FDDJNZR0,IDATALOOP(C:0016)0x0019758107MOVSP(0x81),#0x070x001C020003LJMPmain(C:0003)对照C语言编写的源程序与反汇编程序,可以看出:进入C语言程序后,首先将RAM地址为7FH开始的128个单元清零,然后置SP为07,因此如果要对内部RAM置初值,一定是在执行了一条C语言语句之后;对于C语言程序设定的变量,C51编译器自行安排寄存器或存储器作为参数传递区,通常在R0~R7(一组或两组,根据参数多少而定),因此如果对具
本文标题:第1章单片机C概述
链接地址:https://www.777doc.com/doc-2154033 .html