单片机的C语言程序设计与应用(第2版)pdf/doc/txt格式电子书下载
本站仅展示书籍部分内容
如有任何咨询
请加微信10090337咨询
书名:单片机的C语言程序设计与应用(第2版)pdf/doc/txt格式电子书下载
推荐语:
作者:姜志海、
出版社:电子工业出版社
出版时间:2011-07-01
书籍编号:30466627
ISBN:9787121138263
正文语种:中文
字数:85287
版次:2
所属分类:教材教辅-大学
版权信息
书名:单片机的C语言程序设计与应用(第2版)
作者:姜志海 等
ISBN:9787121138263
版权所有 · 侵权必究
前言
单片机在嵌入式系统应用中占据很重要的地位。MCS-51单片机在工业测量、控制领域中得到了广泛的应用。随着国内单片机开发工具研制水平的提高,现在的单片机仿真器普遍支持C语言程序的调试,为单片机使用C语言提供了便利条件,C语言已成为举世公认的高效简洁而又贴近硬件的编程语言之一。
本书的主要特色在于,在介绍单片机的C语言设计的过程中,清晰地说明了单片机的所有功能,并对每项功能给出了实例代码,同时详细介绍了单片机的C语言开发与仿真环境的使用,透彻分析了单片机的C语言的语法和语义,以及开发过程中可能存在的问题和难点。
本书的另一个特点是突破了传统的软、硬件截然隔裂的方法,使读者对嵌入式系统的开发有一个整体的了解。相信本书的这一特点会节省读者进入嵌入式C语言领域的时间,同时能够更清楚地认识应用系统开发的过程,深入理解单片机的C语言编程机制。
本书从构思和选材上,注意了尽量符合单片机应用系统的发展要求,并在Proteus软件平台上实现本书中所述的实例,保证系统设计原理和方法上的先进性。全书共分7章,主要内容包括:单片机的C语言概述、Keil和Proteus应用基础、C51语言程序设计基础、MCS-51单片机中断系统与定时/计数器的C51编程、MCS-51单片机串行口的C51编程、MCS-51单片机键盘/显示器的C51编程、MCS-51单片机模拟量接口的C51编程。每章都通过本章小结和习题来巩固所学的知识。全书通过大量实例阐述了单片机的C语言设计原理和技巧,所有实例均可在Keil和Proteus软件平台上运行。
本书提供有配套的电子课件、程序代码、仿真电路图和习题参考答案,请读者登录华信教育资源网(http://www.hxedu.com.cn)注册下载。
本书是一本专门讲解单片机的C语言编程的书,以由浅入深、相互贯穿、重点突出、文字叙述与典型代码实例相结合为原则,向每一位单片机、嵌入式爱好者和开发者全面介绍C51语言程序的编写。本书内容系统全面,论述深入浅出,循序渐进,可作为高等学校“单片机C语言设计与应用”课程的教学用书,也可以供从事单片机应用与产品开发工作的工程技术人员学习参考。
本书第1、4、5章由姜志海编写,第6、7章由赵艳雷编写,第2、3章由陈松编写,全书由姜志海负责整理、统稿。
本书在编写过程中得到了许多专家和同行的大力支持与热情帮助,他们对本书提出了许多建设性的建议和意见,在此一并表示衷心的感谢。
鉴于编者的水平有限,加之新的编程技术不断涌现,书中难免有不完善之处,恳请广大读者批评指正。反馈信息请发送至wyj@phei.com.cn。
作者
2011年7月
第1章 单片机的C语言概述
我们都知道,在单片机应用系统开发过程中,软件编程占有非常重要的地位。尤其是随着单片机技术的发展,嵌入式系统的推广和应用,硬件的集成化程度越来越高,同时对软件编程的要求也越来越高。这就要求单片机开发人员能在短时间内编写出执行效率高、运行可靠的代码。同时,由于实际系统的日趋复杂,对使用代码的规范性、模块化的要求越来越高,要方便多个工程师以软件工程的形式进行协同开发。在这种形势下,仅靠单片机在推广应用的初期使用的汇编语言来进行软件开发,是远远不够的。C语言是近年来在国内外普遍使用的一种程序设计语言。C语言能直接对计算机硬件进行操作,既有高级语言的特点,又有汇编语言的特点,因此在单片机应用系统开发过程中得到了非常广泛的应用。
在单片机应用系统设计与开发过程中,只要简单地熟悉相应单片机的硬件结构,利用C语言作为编程语言,就可以大大缩短开发周期。本章主要对单片机的C语言的基本问题进行概括的说明。
1.1 C语言与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语言,或称为ANSI C语言。单片机的C语言和标准C语言之间有许多相同的地方,但也有其自身的一些特点。不同的嵌入式C语言编译系统之所以与ANSI C语言有不同的地方,主要是由于它们所针对的硬件系统不同,对于MCS-51系列单片机,称为C51语言。C51语言与标准C语言的不同点主要体现在以下几方面。
(1)库函数
标准C语言定义的库函数是按照通用微型计算机来定义的,而C51语言中的库函数是按MCS-51单片机的应用情况来定义的。
(2)数据类型
在C51语言中增加了几种针对MCS-51单片机的特有数据类型。例如,MCS-51系列单片机包含位操作空间和丰富的位操作指令,因此,C51语言与ANSI C语言相比多了一种位类型,从而使其能同汇编语言一样,灵活地进行位指令操作。
(3)变量的存储模式
C51语言中变量的存储模式与MCS-51单片机的存储器紧密相关。从数据存储类型上,MCS-51系列单片机有片内、片外程序存储器,片内、片外数据存储器。在片内程序存储器中,又有直接寻址区和间接寻址区之分,其分别对应code、data、xdata、idata,以及根据MCS-51系列单片机特点而设定的pdata类型。使用不同存储器将会影响程序执行的效率,不同的模式对应不同的硬件系统和不同的编译结果。但ANSI C语言对存储模式要求不高。
(4)输入/输出
C51语言中的输入/输出是通过MCS-51串行口来完成的,输入/输出指令执行前必须对串行口进行初始化。
(5)函数使用
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语言开发的代码便于开发小组计划项目、灵活管理、分工合作及后期维护,基本可以杜绝因开发人员变化而给项目进度、后期维护或升级所带来的影响,从而保证整个系统的品质、可靠性及可升级性。
下面通过一个例子对汇编语言和C语言进行比较。
【例1-1】 将外部数据存储器的000BH和000CH单元的内容相互交换。
用汇编语言编程,源程序如下:
用C语言编程,C51源程序如下(注:C51语言对地址的指示可以采用指针变量,也可以引用头文件absacc.h作为绝对地址访问。下面的程序采用绝对地址访问方法):
上面的程序经过编译,生成的反汇编程序如下:
对照C语言编写的源程序与反汇编程序,可以看出:
① 进入C语言程序后,首先将RAM地址为7FH开始的128个单元清零,然后置SP为07,因此如果要对内部RAM置初值,那么一定是在执行了一条C语言语句之后;
② 对于C语言程序设定的变量,C51编译器自行安排寄存器或存储器作为参数传递区,通常在R0~R7(一组或两组,根据参数多少而定),因此如果对具体地址置数,则应避开R0~R7这些地址;
③ 如果不特别指定变量的存储类型,那么变量通常被安排在内部RAM区。
下面再给出几个C语言和汇编语言对照的例子。
【例1-2】 二进制数转换成十进制数(BCD码)。将累加器A中给定的二进制数,转换成3个十进制数(BCD码),并存入Result开始的3个单元。
汇编语言源程序如下:
调试结果:
片内RAM 20H、21H、22H中的数值分别为01H、02H、03H。
用C语言编程,C51源程序如下:
调试结果:
片内RAM 07H中的数据为7BH,08H、09H、0AH中的数据分别为01H、02H、03H。
【例1-3】 二进制数转换成ASCII码程序。将累加器A中的内容分为两个ASCII码,并存入Result开始的两个单元。
汇编语言源程序如下:
调试结果:
片内RAM20H、21H中的数据分别为31H、41H。
用C语言编程,C51源程序如下:
调试结果:
片内RAM07H中的数据为1AH,08H、09H中的数据分别为31H、41H。
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源程序示例
在串行口窗口Srial#1中,输出结果:
从上面的例子可以看出,一个典型的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*/”。本方法灵活多变,可以注释多行,如
用户也可以在程序语句的内部进行注释,示例如下:
一个好的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.标识符
标识符常用来声明某个对象的名称,如变量和常量的声明、数组和结构的声明、自定义函数的声明,以及数据类型的声明等。示例如下:
在上面的例子中,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语言程序设计中,用户自定义的标识符不能和这些关键字冲突,否则就无法正确通过编译。
1.3 C51编程举例
下面通过MCS-51内部功能部件的简单应用的例子,加深对C51程序结构及单片机的C语言编程的理解。
【例1-5】 Proteus仿真电路如图1-2所示,8个发光二极管D1~D8经限流电阻分别接至P1口的8个引脚,阳极共同接高电平。编程实现发光二极管的流水点亮,即按照D1→D2→…→D8的顺序,每次点亮一个发光二极管,一段时间后熄灭该发光二极管,然后点亮下一个发光二极管,重复循环。
图1-2 例1-5的Proteus仿真电路图
C51源程序如下:
也可以这样编程:
【例1-6】 单片机的P1口接8个发光二极管,P0口接8个开关,编程实现当开关动作时,对应的发光二极管亮或灭。
只需把P0口的内容读出后,通过P1口输出即可。
汇编语言源程序如下:
C51语言源程序如下:
【例1-7】 单片机外接12 MHz晶振,用P1.7输出1 kHz和500 Hz的音频信号驱动扬声器,作为报警信号,要求1 kHz信号与500 Hz信号交替进行,P1.0接一个开关S进行控制,当开关合上时,响报警信号,当开关断开时,报警信号停止,Proteus仿真电路如图1-3所示。
图1-3 例1-7的Proteus仿真电路图
C51源程序如下:
注意:此例中的定时和音频信号频率不是很准确,如果实际使用中对周期或定时要求精确度较高,可以采用定时/计数器来实现。
【例1-8】 使用定时/计数器以工作方式2产生100 μs定时,在P1.0口输出周期为200 μs的连续方波,已知晶振频率为6 MHz。
机器周期频率:fcy=f/2/6=0.5 MHz,Tcy=2 μs
定时器预置值(初值)N:28-N=T/Tcy=T×fcy=50
N=206=0CEH
定时/计数器0工作于方式2,定时方式,其方式控制字:TMOD=02H。
在程序中,头文件reg51.h中定义了8051的I/O端口、特殊功能寄存器和特殊功能位等符号,这些符号可以像用户变量一样在程序中直接使用。主函数main()完成定时/计数器0的初始化,CPU开中断,然后进入一无限循环,等待P1.0引脚上的方波输出。
方波输出由中断服务函数timer0()产生。函数属性interrupt 1将timer0()声明为定时/计数器0的中断服务函数,而函数属性using 3使中断发生时切换到寄存器组3,这样可以减少中断现场保护的时间,提高中断服务的实时性。
C51源程序清单如下:
本章小结
本章主要介绍了单片机中引入C语言的重要性,对汇编语言与单片机的C语言进行了比较,讨论了单片机的C语言的特点。通过汇编语言的实例和C语言的实例的对比,使读者对单片机的C语言有了基本的了解,并给出了单片机的C语言的编程规范、注意事项、标识符、关键字。最后通过几个单片机内部功能部件的简单应用的C语言的例子,对单片机的C语言的结构、C语言对单片机的控制等问题进行了说明,为后面各章中具体的编制单片机的C语言程序打下基础。通过本章的学习,应该掌握以下几个基本内容:
(1)单片机C语言的特点。
(2)C51的程序结构。
(3)C51的编程规范及注意事项。
习题
1.简述单片机的C语言的特点。
2.单片机的C语言和标准C语言相比,有哪些不同点?
3.单片机的C语言和汇编语言相比,有哪些优势?
4.简述单片机的C语言程序的构成。
第2章 μVision2与Proteus使用基础
μVision2集成开发环境(Integration Design Environment,IDE)是一个基于Windows的软件开发平台,包含一个高效的编辑器、一个项目管理器和一个MAKE工具。μVision2支持所有的Keil C51工具,包括C语言编译器(C51)、宏汇编器(A51)、链接/定位器(BL51)、库(LIB51)、目标代码到HXE的转换(OH51)、实时操作系统(RTX51)及调试器(dScope51、tScope51和Monitor51),可以完成编辑、编译、链接、调试、仿真等整个开发流程。
Proteus是英国Labcenter electronics公司研发的EDA工具软件。Proteus不仅是模拟电路、数字电路、模/数混合电路的设计与仿真平台,更是目前世界上较先进、较完整的多种型号微控制器(单片机)系统的设计与仿真平台。它真正实现了在计算机上完成从原理图设计、电路分析与仿真、单片机代码级调试与仿真、系统测试与功能验证,到形成PCB的完整的电子设计、研发过程。Proteus从1989年问世至今,经过了20多年的使用、发展和完善,功能越来越强,性能越来越好。
本章主要介绍μVision2和Proteus的应用基础,更详细的介绍请读者参阅有关书籍。
2.1 μVision2集成开发环境
μVision2 IDE是基于Windows的开发平台,开发人员可以用μVision2编辑器或其他编辑器编辑C语言或汇编语言文件,然后分别由C51语言和A51语言编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件(.LIB),也可与库文件一起经L51链接定位生成绝对目标文件(.ABS)。绝对目标文件由OH51转换成标准的HEX文件,以供调试器进行源代码级调试,也可由仿真器直接对目标板(用户板)调试,或直接写入程序存储器如EPROM、Flash中进行验证。
在μVision2 中,可以通过键盘或鼠标选择开发工具的命令、设置和选项,也可以通过键盘输入程序文本。μVision2 集成环境中有菜单栏、可以快速选择命令按钮的工具栏、源代码文件窗口、对话框窗口和信息显示窗口。软件可同时打开和查看多个源文件,通过鼠标或键盘可移动或调整窗口的大小。μVision2的界面如图2-1所示。
图2-1 μVision2集成环境
μVision2 菜单栏提供了丰富的操作菜单,提供了文件操作、编辑器操作、项目管理、选项设置、程序调试、外部程序执行、窗口
....
本站仅展示书籍部分内容
如有任何咨询
请加微信10090337咨询