单片机原理及应用——C语言程序设计与实现(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-07 11:00:20

点击下载

作者:王长涛韩忠华夏兴华编著

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

单片机原理及应用——C语言程序设计与实现(第2版)

单片机原理及应用——C语言程序设计与实现(第2版)试读:

第2版前言

随着计算机应用技术的不断发展,单片机在工业测量控制领域内的应用越来越广泛。同时,随着超大规模集成电路工艺和集成制造技术的不断完善,单片机的硬件集成度也在不断提高,出现了能满足各种不同需求的具有各种特殊功能的单片机。就8051系列单片机而言,由于 Intel 公司将 8051 CPU 内核向全世界各大半导体公司的扩散,目前已有Philips、Siemens、Dallas、OKI、Advance Micro Device、Atmel 等多家公司生产了 100 多种型号的51系列单片机。这类单片机具有集成度高、性能价格比优良的特点,在工业测量控制领域内获得了极为广泛的应用,预计在今后的相当一个时期内,51单片机仍将是主流机种。

在开发一个单片机应用系统时,系统程序的编写效率在很大程度上决定了目标系统的研制成效。早期在研制单片机应用系统时,大多以汇编语言作为软件工具。汇编语言程序能够直接操作机器硬件,指令的执行速度快。但由于汇编语言不是一种结构化的程序设计语言,相对较难编写和调试,程序本身的编写效率较低。随着单片机硬件性能的提高,其工作速度越来越快,目前 51单片机的时钟频率可达 40MHz以上。因此在编写单片机应用系统程序时,更着重于程序本身的编写效率。为了适应这种要求,现在的单片机系统在开发过程中,除了采用汇编语言之外,经常采用高级语言,如 C51、PLM51来编程实现。

在全国高等工科院校中,已普遍开设单片机及相关课程。51系列单片机奠定了8位单片机的基础,形成了单片机的经典体系结构。随着51单片机的发展,应用C语言开发51单片机成为一种流行的趋势,这是因为它具有使用方便、编程效率高及仿真调试容易等突出特点。

本书在介绍51系列单片机的硬件结构、汇编语言及单片机扩展技术的同时,着重介绍C51编程技术及其应用。C51语言是专门用于51系列单片机编程的C语言,除了一些基于描述单片机硬件的特殊部分外,可以说与标准C语言完全相同。所以以C51语言实现单片机系统更有利于系统的修改及扩展。为了体现汇编语言实现与C51编程实现的不同,本书在相关章节提供了上述两种实现方法的源程序,并进行了相关的讲解。根据各学校对本书使用意见的反馈,改版后增加一章单片机应用实例,提供了大量实际程序与应用。希望通过改版能够对提高学生实践能力有进一步帮助,使本书更加完善。

本书由王长涛、韩忠华、夏兴华共同编写,由马斌教授主审。参与本书编写工作与提供帮助的还有阚凤龙、李界家、李孟歆、栾方军、张颖、张锐、黄宽、毛永明、陈楠、王鑫、华海荣、左传文、郭会、张黎明、杨显利。此外,程娟对相关外文资料进行了翻译与整理工作,在此一并表示诚挚的谢意。

读者如果需要本书中的源程序,可通过电子邮件与编者联系:542736170@qq.com。编者2013年10月于沈阳第1章51单片机结构及工作原理

1975 年,美国Texas Instruments 公司成功研制了世界上第一台单片机,它的出现是计算机技术发展史上的一个里程碑,从此,计算机技术不仅在数值处理方面得到了进一步的发展,而且在智能化控制领域里也得到了迅猛的发展,并占有越来越重要的地位。51系列单片机是目前应用最广泛的单片机,该系列单片机简单易学,具有丰富的指令系统和高级语言编译系统。本章重点介绍单片机的基本概念、特点、结构、工作方式等。1.1 微型计算机基础1.1.1 单片机及其发展概况

1.单片机的发展

单片机的全称为单片微型计算机(Single Chip Microcomputer),它是将组成微型计算机的各个功能部件,如中央处理器(CPU)、随机存储器(RAM)、只读存储器(ROM)、基本输入/输出接口(I/O 接口)、定时器/计数器以及串行通信接口等部件有机地结合在一块集成芯片中,构成一台完整的微型计算机,因此单片机又可以称为微处理器(Microcontroller Unit)。一个完整的单片机组成框图如图1-1所示。图1-1 单片机组成框图

随着技术的发展,单片机的功能不断完善。目前,单片机产品已达50多个系列、300多种型号,其综合性能、成本、体系结构、开发环境等都取得了显著的进步。单片机就其字长而言,可以分为4位机、8位机、16位机和32位机,其中,8位机长期以来都是主流机型。

单片机的发展史大体上可以分为以下4个阶段。

第一阶段:单片机初级阶段。单片机的发展始于1974年,由于工艺限制,此阶段的单片机采用双片形式,而且功能较为简单。到了1976年,Intel公司推出了MCS-48系列单片机,将CPU、存储器、I/O接口、定时器/计数器集成在一块芯片上,使计算机完成了单芯片化。但此系列单片机无串行接口,存储器数量较少,中断处理功能也较为简单。同时期的产品还有Motorola公司的MC680/6800+/6875系列,Rokwell公司的6502/RG500系列,GI公司的PIC1650系列等。

第二阶段:单片机完善阶段。此阶段单片机的功能及体系结构得到了不断的完善。1980年,Intel公司在MCS-48系列单片机的基础上增加了I/O串行口,增大了存储器容量,完善了终端系统(设置了5个中断源和2个优先级),定时器/计数器为16位,在内部存储器上设置了位地址空间,提供位操作指令,推出了高性能的MCS-51系列单片机,并且成为了事实上的单片机结构标准。除了MCS-51单片机外,Motorola公司推出的M6800系列单片机、Zilog公司推出的Z8系列单片机都是这一时期的产品。

第三阶段:微控制器形成阶段。为了满足更高的测控应用要求,需要对单片机的外围接口电路进行增强与完善,如数/模(D/A)转换器、模/数(A/D)转换器、高速I/O接口、程序监视定时器(W)等,尽量将外围功能集成在芯片内部。集成了外围电路的单片机又称为微控制器,实际上,国际上已经将微控制器作为单片机的标准名称。这一时期以51系列单片机为代表。

第四阶段:微控制器技术成熟阶段。随着技术的不断成熟,国内外对单片机的开发和研制竞争异常激烈,极大地丰富了微控制器的类型,功能不断完善,成本不断降低,外围电路不断减少,可靠性不断提高。

2.单片机的特点

单片机是在一块芯片上集成了中央处理器(CPU)、随机存储器(RAM)、只读存储器(ROM)、基本输入/输出接口(I/O接口)、定时器/计数器等部件,使其具备了一台微型计算机的特征。但是由于单片机的应用领域主要集中在控制领域,因此与通用计算机相比,单片机有如下一些特点。(1)采用哈佛结构体系

一般通用计算机采用冯·诺依曼体系结构,其特点是计算机中的程序和数据使用共同的存储空间,而单片机一般是面向工业控制领域,要求较大的运算量和较高的运算速度。为了提高数据吞吐量,单片机采用哈佛体系结构,其特点是:①使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;②使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径。(2)采用面向控制的指令系统

单片机指令系统中有丰富的位操作指令,逻辑功能强大,大量使用单字节指令,处理速度快,效率高。(3)引脚功能复用

受制造工艺水平的限制,单片机的引脚数量有限,存在所需要的信号线数多而实际引脚数量少的矛盾,而单片机采用引脚功能复用就可以很好地解决这个矛盾。(4)片内随机存储器做寄存器

单片机所使用的寄存器(除了程序计数器PC以外)都是片内RAM的某一对应单元。这样可以使寄存器的数量多,并且容易设计和集成。另外,CPU直接存取这些寄存器,可以大大提高单片机的响应速度。(5)类型齐全

单片机发展至今,由于各公司不断地研制、改进,使得单片机产品品种繁多,系列齐全。用户可以根据不同的应用,选择功能好、性价比高的产品。(6)功能通用

虽说单片机主要应用于控制领域,面向测控对象,但它的功能仍然是通用的,配上适当的外围设备/电路就可以作为一般的微处理器来使用。

3.单片机的发展趋势

单片机的发展趋势正在向高性能、大容量、微型化、集成化等方面发展。(1)CPU的改进

采用双CPU或者多CPU结构,以提高数据的处理能力和速度;增加数据总线线宽,以提高数据处理速度和能力;采用流水线结构,CPU中的指令以队列形式排列,以提高运算速度;采用串行总线结构,从而可以减少单片机的引线,降低单片机的成本。(2)存储器的改进

增大存储器容量,以简化外围电路,提高系统稳定性,降低产品2成本;片内采用EPROM,以简化系统结构,提高系统稳定性;采用KEPROM(KeedAccessEPROM),以提高程序的保密性。(3)片内I/O的改进

提高并行口的驱动能力,以减少外围驱动电路;增加I/O接口的逻辑控制功能;增加特殊的串行接口功能。(4)外围电路的集成

随着集成电路的技术不断提高,一些外围电路可以集成到单片机芯片内,如A/D转换器、D/A转换器、DMA控制器、中断控制器、锁相环、频率合成器、字符发生器、声音发生器、CRT控制器、译码驱动器等。(5)低功耗

随着世界性的能源危机已经越来越受到人们的重视,单片机系统中也应考虑功耗问题,由于CMOS电路具有功耗小的优点,目前8位单片机的产品中已有半数CMOS化,为了充分发挥低功耗特点,这类单片机普遍设置了空闲和掉电两种工作模式,如 89C51 单片机在正常工作状态时(即5V,12MHz),其工作电流为16mA;而在同样条件下,空闲模式下其工作电流仅为3.7mA;在掉电模式下,其工作电流只有50nA。1.1.2 计算机中的数制及相互转换

1.数制

所谓的数制,是指数的制式,是人们利用符号计数的一种科学方法。数制有很多种,微型计算机中常用的数制有十进制、二进制、八进制和十六进制4种。

进位计数的特征可以概括如下。

① 有一个固定的基数r,数的每一位只能取大于等于0、小于r 的数字,即符号集为{0, 1,2,…,r −1}。ii

② 逢r 进位,它的第i 个数位对应于一个固定的值r ,r 称为该位的“权”。小数点左边各位的权是基数 r 的正次幂,依次为 0,1,2,…,m 次幂,小数点右边各位的权是基数 r的负次幂,依次为−1,−2,…,−n次幂。r进制数在技术过程中,当它的某位计满r时就向它邻近的高位进1。

一般用括号和基数(即( ) )的形式来表示r 进制数,也可以在数r的后面加后缀表示,二进制数以后缀B表示,八进制数以后缀O表示,十进制数以后缀D表示,十六进制数以后缀H表示。将r进制数按权展开,其表达式为(1)十进制

十进制(Decimal)是人类最常用的数的制式,其基数r = 10,逢十进位,符号集为{0, 1,2,3,4,5,6,7,8,9,0},其权为:210−1−2…,10,10,10,10,10,…

对于十进制,因为人们已经习惯,一般不用括号和基数来表示。例如,十进制数(123.456)一般写成123.456或123.456D。若按权10展开为(2)二进制

二进制(Binar)数的基数r = 2,符号集为{0,1},其权为:…,210−1−22 ,2 ,2 ,2 ,2 ,…

例如,二进制数(1101.011)按权展开为2(3)八进制

八进制(Octal)数的基数r = 8,符号集为{0,1,2,3,4,5,210−1−26,7},其权为:…,8 , 8,8,8,8,…

例如,八进制数(654.123)按权展开为8(4)十六进制

十六进制(Hexadecimal)数的基数r = 16,符号集为{0,1,2,23,4,5,6,7,8,9, A,B,C,D,E,F},其权为:…,16,10−1−216,16,16,16,…

例如,十六进制数(89EF.1D)按权展开为16

2.数制间的相互转换

计算机是采用二进制数操作的,但是人们已经习惯使用十进制数,因此需要这几种常用的数制之间能够互相转换。图1-2所示为不同数制之间相互转换的法则。图1-2 不同数制之间的相互转换(1)二进制数和十进制数间的转换

① 二进制数转换成十进制数。

要将二进制数转换成十进制数,只要把要转换的数按权展开后相加即可。例如:43210−1

11010.01B = 1 × 2 + 1 × 2 + 0 × 2 + 1 × 2 + 0 × 2 + 0 × 2 −2+ 1 × 2 = 26.25D

② 十进制数转换成二进制数。

十进制整数和十进制小数转换成二进制数的方法有所不同。

十进制整数转换成二进制数

十进制整数转换成二进制整数的方法有很多,最常用的是“除2取余法”,其法则为:用要转换的十进制数连续除以2,直到商小于2为止,然后将各次余数按最后得到的为最高位和最早得到的为最低位的顺序依次排列,所得到的数便是所求的二进制数。【例1-1】 试求出十进制数215 的二进制数。

解:按照“除2取余法”,将215连续除以2,直到商数小于2为止,即

把所得的余数由高位到低位排列起来,得到十进制数215的二进制,即

215D = 11010111B

十进制小数转换成二进制数

十进制小数转换成二进制数通常采用“乘2取整法”,法则为用2连续乘以要转换的十进制小数,直到所得积的小数部分为0或满足所需要的精度为止,然后将各次整数按先得到的为最高位和最后得到的为最低位的顺序依次排列,所对应的数便是所求的二进制数。【例1-2】 试求出十进制小数0.6879 的二进制数。

解:将0.6879不断地乘以2,取每次所得到乘积的整数部分,直到乘积的小数部分满足所需要的精度,即

把所有得到的整数按照由高到低位排列得到

0.6879D = 0.1011B

对同时有整数和小数两部分的十进制数转换成二进制数的时候,可以分别用上述方法对整数部分和小数部分进行转换,然后再进行合并。例如,求215.6879D的二进制数,则

215.6879D = 11010111.1011B

注意

任何十进制整数都可以精确地转换成一个二进制整数,但十进制小数却不一定可以精确地转换成一个二进制数。(2)十六进制数和十进制数间的转换

① 十六进制数转换成十进制数。

十六进制数转换成十进制数的方法和二进制数转换成十进制数的方法类似,将十六进制数按权展开后相加即可以得到十进制数,只不过这里的“权”为16。例如:3210

5ECAH = 5 × 16 + 14 × 16 + 12 × 16 + 10 × 16 = 24266

② 十进制数转换成十六进制数。

十进制整数转换成十六进制整数

与十进制整数转换成二进制整数方法类似,采用“除16取余法”,其法则为:用要转换的十进制整数连续除以16,直到商数小于16为止,然后将各次余数由高位到低位排列,所得到的数即为十六进制数。【例1-3】 求十进制整数3901 所对应的十六进制整数。

解:按照“除16取余法”,即

将所得的余数按照由高位到低位的顺序排列,得到

3901D = F3DH

十进制小数转换成十六进制小数

十进制小数转换成十六进制小数的方法与十进制小数转换成十六进制小数的方法类似,采用“乘16取整法”,法则同上。【例1-4】 求十进制小数0.76171875 所对应的十六进制小数。

解:将十进制小数0.76171875连续乘以16,直到所得乘积的小数部分为0或满足一定的精度为止,即

将所得到的整数按照由高位到低位的顺序排列,得到

0.76171875D = 0.C3H(3)二进制数和十六进制数间的转换

十六进制是计算机中经常采用的一种数制,如指令机器码都是采用十六进制表示的,所以必须对二进制数和十六进制数进行相互转换。

① 二进制数转换成十六进制数。

二进制数转换成十六进制数可以采用“4位合1位法”,其法则为:从二进制数的小数点开始,或左位或右位每4位一组,不足4位以0补足,然后分别把每组用十六进制数码进行表示,并按序相连即可。【例1-5】 将二进制数1101111100011.10010100 转换成十六进制数。

解:按照“4位合1位”法则,得到

所以,1101111100011.10010100B = 1BE3.94H。

② 十六进制数转换成二进制数。

十六进制数转换成二进制数采用“1位分4位法”,其法则为:将十六进制数中的每一位分别用4位二进制数来表示,然后将其按顺序排列起来即可。【例1-6】 将十六进制数3AB.7A5 转换为二进制数。

解:按照“1位分4位”法则,得到

所以,3AB.7A5H = 001110101011.011110100101B。

二进制数、八进制数、十进制数和十六进制数之间的对应关系如表1-1所示。表1-1 二进制数、八进制数、十进制数和十六进制数之间的对应关系续表1.1.3 二进制数的运算

1.算术运算(1)加法运算

二进制数的加法运算法则为

0 + 0 = 0

1 + 0 = 0 + 1 = 1

1 + 1 = 10(向近邻高位有进位)

1 + 1 + 1 = 11(向近邻高位有进位)【例1-7】 设有两个二进制数X =10110110,Y = 11011001,试求X + Y 的结果。

解:按照二进制数的加法运算法则,得到

注意

在进行二进制数的相加时,应注意低位向高位的进位。(2)减法运算

二进制数的减法运算法则为

0 − 0 = 0

1 − 0 = 1

1 − 1 = 0

0 − 1 = 1(向近邻高位借位1)【例1-8】 设有两个二进制数X = 11011001,Y = 10010111,试求X−Y 的结果。

解:按照二进制数的减法运算法则,得到(3)乘法运算

二进制数的乘法运算法则为

1 × 0 = 0 × 1 = 0

1 × 1 = 1【例1-9】 设有两个二进制数X =1101,Y = 1011,试求X × Y 的结果。

解:按照二进制的乘法运算法则,得到(4)除法运算

除法运算是乘法运算的逆运算。与十进制数的除法运算类似,二进制除法也是从被除数的最高位开始,查找出够减余数的位数,并在其最低位上商 1,然后减去除数,如果得到的余数,能够减去余数,则继续商1,然后减去除数;若余数不够减除数,则商0,并将被除数向下移位,直到能够减去除数,然后继续上面的操作,直到被除数的最后一位。【例1-10】 设有两个二进制数X =10101011,Y = 110,试求X÷Y 的结果。

解:按照二进制数的除法运算法则,得到

所以,X÷Y = 11100B…………余11B。

2.逻辑运算

计算机处理数据时,通常用到逻辑运算,常有的逻辑运算有逻辑乘、逻辑加、逻辑非和逻辑异或运算。(1)逻辑乘运算

逻辑乘运算又称逻辑与运算,常用“∧”运算符表示,其运算法则为

0∧0 = 0

1∧0 = 0∧1 = 0

1∧1 = 1【例1-11】 设有两个二进制数X =10110110,Y = 11011001,试求X∧Y 的结果。

解:按照逻辑与运算法则,得到(2)逻辑加运算

逻辑加运算又称为逻辑或运算,常用“∨”运算符表示,其运算法则为

0∨0 = 0

1∨0 = 0∨1 = 1

1∨1 = 1【例1-12】 设有两个二进制数X =10110110,Y = 11011000,试求X∨Y 的结果。

解:按照逻辑或运算法则,得到(3)逻辑非运算

逻辑非运算又称为逻辑取反运算,常用“-”运算符表示,其运算法则为=1=0【例1-13】设有一个二进制数X=10101011,试求的结果。

解:按照逻辑非运算法则,得到(4)逻辑异或运算

逻辑异或运算又称为逻辑半加运算,是不考虑进位的加运算,常采用“⊕”运算符号表示,其运算法则为

0⊕0=1⊕1=0

1⊕0=0⊕1=1【例1-14】 设有两个二进制数X =10110110,Y =11011000,试求X⊕Y 的结果。

解:按照逻辑异或运算法则,得到1.1.4 计算机中数的表示方法

1.计算机中数的表示方式

计算机中的数值都是以二进制形式进行存储和运算的,每类数据占据固定长度的二进制数位,而不论其实际长度为多少。例如,在8位计算机中,整数216存储为11011000B,而整数56存储为00111000B。计算机中不仅要处理无符号数,还要处理带符号数和带小数点的数据。(1)机器数与真值

一个数是由符号和数值两部分组成的,规定数的最高位为符号位,通常用“0”表示正数,“1”表示负数。例如,8 位计算机中,+65D = 01000001B,−65D = 11000001B。这些连同符号位一起作为能被计算机识别的数称为机器数,而把这个数本身代表的真实值称为机器数的真值。(2)机器数的字长

在计算机中,作为数据传送、存储和运基本单位的一组二进制字符称为一个字(word),一个字中的二进制字符的数目称为字长。计算机的字长确定后,机器数所表示的数值范围大小也就确定了。例如,对于8位字长的计算机,机器数的范围00000000~11111111所对应的十进制数的范围为0~255。

为了扩大机器数表示的范围,有时可以用两个或多个字表示一个数。例如,对于8位机,若用两个字来表示一个正数,则其所处理数的范围为0~65535,但应注意的是,这种多字表示方法是计算机应用的一种处理方法。(3)数的定点和浮点表示

用机器数来表示带小数点的数通常有两种表示方法,即定点表示法和浮点表示法。在定点表示法中,小数点在数中的位置是固定不变的。对于任意一个二进制数N,都可以表示成纯正数或纯小数和一个P2 的整数次幂的乘积,即N = 2 × S,其中,S 称为N的尾数,表示N的实际有效值,P称为N的阶码,可以决定小数点的具体位置,2称为阶码的底。

通常定点表示法中P的值是固定不变的,也即二进制数中小数点位置固定不变。小数点固定在数值位之前,称为定点小数表示法;小数点固定在数值位后面,称为定点整数表示法。图1-3所示为定点整数表示法。图1-3 定点整数表示法

其中,S 为数符,若S = 0,则N 为正数;若S = 1,则N 为负数。fff

定点表示法的优点是运算规则简单,但它能表示数的范围没有相同位数的浮点表示法大。为了加大它所能表示数的范围,常常可以增加数的位数,如16位,32位,64位,…

浮点表示法中P的值是可以在一定范围内变化的。任何一个浮点数N都由阶码和尾数两部分组成,其中,阶码部分包括阶符和阶码,尾数部分包括数符和尾数,其形式如图1-4所示。图1-4 数的浮点表示法

其中,P 为阶符,P = 0 表示阶码为正,P = 1 表示阶码为负;fffS 为数符,若 S = 0,则 N 为正数;S = 1,则N 为负数。fff

浮点表示法的优点是数的表示范围大,缺点是运算规则复杂,通常要将阶码和尾数分别进行运算。

2.原码、反码和补码

机器数是计算机中数的基本形式,为了运算方便,机器数通常有原码、补码和反码3种形式。(1)原码

微型计算机数的原码形式实际上就是机器数的形式,规定在二进制数的原码表示法中,正、负数的符号位放在数值部分的前面,正数的符号为“0”,表示其后的数值为正数;负数的符号为“1”,表示其后的数值为负数,数值部分仍用原二进制数码表示。原码记作[±N]原。【例1-15】 N =+ 10101B,N =−10101B,试写出N 和N 在8位1212字长的计算机中的原码。

解:【例1-16】 求+13、−13、+127、−127、+0 和−0 的原码(8 位计算机中)。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载