新書推薦:
《
英国商业500年(见证大国崛起与企业兴衰,启迪未来商业智慧。)
》
售價:HK$
82.8
《
万千心理·儿童心理治疗中的心智化:临床实践指导
》
售價:HK$
89.7
《
自我囚禁的人:完美主义的心理成因与自我松绑(破除你对完美主义的迷思,尝试打破自我评价过低与焦虑的恶性循环)
》
售價:HK$
67.9
《
周易
》
售價:HK$
45.8
《
东南亚的传统与发展
》
售價:HK$
69.0
《
乾隆制造
》
售價:HK$
87.4
《
资治通鉴臣光曰辑存 资治通鉴目录(司马光全集)(全二册)
》
售價:HK$
296.7
《
明代社会变迁时期生活质量研究
》
售價:HK$
308.2
編輯推薦:
伴随着国民经济的高速发展,人们对高等教育本质的理解不断深入,相关课程更加注重对工程实践场景的构建;同时,近几年对机械电子工程专业学生工程技能水平的要求也在不断提升;这就需要有知识性更系统、实践性更突出的微机原理与应用类教材。针对以上情况,我们组织一线教师,总结和分析了本书第1版的优点和不足,提出了第2版教材的修订计划。本次再版,充分考虑了各使用院校教师和学生的反馈意见和建议,并结合我们课程团队在课程建设、教学实践中的新想法和新思路,对原教材内容做了更新、补充与完善。本书以专业基础知识为背景,以实践教学过程为载体,着眼于学生对理论知识的应用能力和对基本工程问题的解决能力,培养学生良好的工程素养。
內容簡介:
本书共分3篇,总计12章。第1篇共有7章的内容,主要包含51系列单片机的结构原理、汇编语言程序设计等知识;第2篇共有4章的内容,主要包含51系列单片机的扩展应用方式、常用接口芯片与单片机的连接和应用、单片机应用系统的设计等知识;第3篇尽管只有一章,却包含了C51语言程序设计的基础内容,且列举了较多的编程实例,这些以C51语言编制的实例大多数来自以往汇编语言程序的实例,这样会使读者有机会比较不同语言编制的程序,进入单片机学习的新境界。 本书可以作为各类高等学校单片机课程的基础教材,也可以作为单片机爱好者的自学教材。
目錄 :
第1章 单片机基础知识.... 3
1.1 引言... 3
1.1.1 计算机... 3
1.1.2 微型机... 6
1.1.3 单片机与嵌入式计算机... 7
1.2 常用的数制和码制... 7
1.2.1 常用的数制及其转换... 7
1.2.2 常用的码制... 11
实验一:认识补码... 17
1.3 单片机内部结构概论... 18
1.3.1 中央处理器CPU概论... 19
1.3.2 存储器概论... 23
1.3.3 输入输出接口概论... 26
1.4 单片机产品概述... 27
1.4.1 单片机产品的类型... 27
1.4.2 单片机产品的应用... 28
本章小结... 28
思考与练习... 29
第2章 MCS-51系列单片机系统的
基本组织.... 30
2.1 总体结构... 30
2.1.1 内部结构... 30
2.1.2 外部引脚... 31
2.2 CPU的特性... 32
2.3 存储器的组织... 33
2.3.1 程序存储器... 33
2.3.2 数据存储器... 35
2.3.3 特殊功能寄存器... 37
2.3.4 外部数据存储器和IO接口... 39
2.4 IO接口... 39
2.4.1 P1口... 40
2.4.2 P3口... 41
2.4.3 P2口... 42
2.4.4 P0口... 42
实验二:认识P0~P3口... 43
2.5 时钟和时钟电路... 46
2.5.1 内部方式... 46
2.5.2 外部方式... 46
2.6 启动和复位电路... 46
2.6.1 上电启动电路... 47
2.6.2 人工按钮复位电路... 47
本章小结... 48
思考与练习... 48
第3章 MCS-51系列的指令系统.... 50
3.1 指令格式和寻址方式... 50
3.1.1 立即寻址方式... 51
3.1.2 直接寻址方式... 52
3.1.3 寄存器寻址方式... 52
3.1.4 寄存器间接寻址方式... 53
3.1.5 变址寻址方式... 53
3.1.6 相对寻址方式... 54
3.1.7 位寻址方式... 55
3.1.8 学习寻址方式的意义... 55
3.2 数据传送类指令... 56
3.2.1 内部数据传送指令... 56
3.2.2 内外数据传送指令... 61
3.2.3 查表指令... 62
实验三:寻址方式和堆栈的认识... 63
3.3 数据处理类指令... 66
3.3.1 算术运算指令... 67
3.3.2 逻辑运算指令... 72
3.3.3 移位指令... 74
3.4 位操作类指令... 77
3.4.1 位变量传送指令... 77
3.4.2 位变量设置指令... 78
3.4.3 位变量逻辑运算指令... 78
3.5 程序转移类指令... 80
3.5.1 无条件转移指令... 80
3.5.2 有条件转移指令... 82
3.5.3 调用和返回子程序的指令... 85
实验四:转移类指令和位操作类
指令的认识... 88
3.6 CPU执行指令的时序... 89
本章小结... 91
思考与练习... 92
第4章 MCS-51系列汇编语言程序
设计.... 96
4.1 伪指令... 96
4.1.1 起始指令... 97
4.1.2 结束指令... 97
4.1.3 数据定义类指令... 97
4.2 汇编语言的语句格式... 101
实验五:认识汇编语言程序的
格式... 101
4.3 汇编语言程序设计的方法... 102
4.3.1 顺序结构程序的设计... 103
4.3.2 分支结构程序的设计... 103
4.3.3 循环结构程序的设计... 105
4.3.4 子程序设计... 107
4.3.5 经典程序设计举例... 113
实验六:查表程序设计... 123
实验七:排序程序设计... 124
本章小结... 125
思考与练习... 126
第5章 MCS-51单片机系列的中断
系统.... 129
5.1 中断的概念... 129
5.1.1 什么是中断... 129
5.1.2 中断源... 130
5.1.3 中断的优先级... 130
5.1.4 控制中断的特殊功能
寄存器... 131
5.2 中断处理过程... 134
5.2.1 中断申请... 134
5.2.2 中断响应条件... 134
5.2.3 中断处理过程... 135
5.2.4 中断请求信号的撤消... 136
5.3 中断程序的编制... 136
5.3.1 中断初始化程序的编制... 136
5.3.2 中断服务子程序的编写... 137
实验八:认识中断系统和中断服务
子程序编写... 138
本章小结... 140
思考与练习... 141
第6章 MCS-51单片机的
定时器计数器.... 142
6.1 定时器计数器的结构和工作原理... 142
6.1.1 定时器计数器T0和T1. 142
6.1.2 定时器计数器T2. 146
6.1.3 定时器计数器的使用极限... 150
6.2 控制定时器计数器的特殊功能
寄存器... 151
6.3 定时器计数器的应用及其编程... 153
6.3.1 初始化编程... 153
6.3.2 定时器计数器应用编程... 154
实验九:定时器计数器应用... 160
本章小结... 162
思考与练习... 163
第7章 MCS-51单片机的串行接口.... 167
7.1 串行通信的概念... 167
7.2 单片机串行接口的结构原理... 170
7.3 单片机串口的工作方式和相关的
特殊功能寄存器... 172
7.3.1 串行口控制寄存器SCON
Serial Control 172
7.3.2 串行口工作方式0. 174
7.3.3 串行口工作方式1. 176
7.3.4 串行口工作方式2、3. 177
7.3.5 串行口数据传送的波特率... 178
7.4 串行口应用举例... 179
实验十:串行口双机通信... 186
本章小结... 189
思考与练习... 190
扩展、接口和应用篇
第8章 MCS-51单片机的扩展技术.... 193
8.1 单片机扩展原理... 193
8.2 程序存储器的扩展... 194
8.2.1 EPROM存储器芯片... 195
8.2.2 程序存储器芯片与系统的
连接举例... 196
8.3 数据存储器的扩展... 200
8.3.1 常用静态随机存储器SRAM
芯片... 201
8.3.2 数据存储器扩展应用举例... 202
8.3.3 CPU如何访问外部存储器... 206
实验十一:数据存储器的扩展
和测试... 208
8.4 并行接口的扩展... 209
8.4.1 基本并行接口及其扩展... 210
实验十二:基本并行口及其扩展... 214
8.4.2 8255A并行口及其扩展... 216
实验十三:8255A并行口及其
扩展... 226
8.5 综合接口芯片8155. 228
本章小结... 232
思考与练习... 233
第9章 键盘显示器的接口技术.... 235
9.1 LED数码显示器的结构原理和接口
技术... 235
9.1.1 LED数码显示器的结构
原理... 235
9.1.2 LED数码显示器的显示码... 236
9.1.3 LED显示器的显示方式及其
显示程序... 237
9.2 键盘结构的原理与接口技术... 242
9.2.1 键盘电路的结构原理... 242
9.2.2 键抖动问题... 244
9.2.3 键盘接口电路举例... 245
9.3 8279显示器键盘接口电路的原理
和应用... 248
9.3.1 8279的内部结构... 248
9.3.2 8279的接口工作方式... 249
9.3.3 8279的控制命令字、状态字
和数据格式... 250
9.3.4 8279芯片的外部引脚... 253
9.3.5 8279的应用举例... 254
实验十四:8279显示器键盘接口
和编程... 261
本章小结... 261
思考与练习... 262
第10章 DA和AD转换器的接口
技术.... 263
10.1 DA转换器和接口技术... 264
10.1.1 DA转换器的原理... 264
10.1.2 DA转换器的性能指标... 266
10.1.3 DAC0832的结构原理和接口
技术... 267
10.1.4 DAC0832的应用和编程... 270
实验十五:DA转换器应用举例... 273
10.2 AD转换器和接口技术... 274
10.2.1 AD转换器的原理... 274
10.2.2 AD转换器的主要性能
指标... 275
10.2.3 ADC0809的结构原理和接口
技术... 276
10.2.4 AD转换器的应用举例... 278
实验十六:AD转换器的应用
和编程... 281
本章小结... 283
思考与练习... 283
第11章 单片机应用系统的研制.... 285
11.1 单片机应用系统设计概述... 285
11.2 单片机应用系统的硬件设计... 286
11.3 单片机应用系统的软件设计... 290
11.4 单片机应用系统设计举例... 291
实验十七:单片机应用系统设计
举例... 311
本章小结... 312
思考与练习... 312
C51 篇
第12章 C51程序设计初步.... 315
12.1 C51概论... 315
12.1.1 C51语言与C语言... 315
12.1.2 C51语言与51系列汇编
语言... 316
12.2 C51的数据类型... 316
12.2.1 数据类型... 316
12.2.2 存储器类型... 317
12.2.3 访问特殊功能寄存器... 319
12.2.4 位变量的定义... 320
12.2.5 C51指针... 320
12.2.6 绝对地址访问... 321
12.2.7 存储器模式... 322
12.3 C51位变量逻辑运算符... 322
12.4 C51程序设计... 323
12.4.1 基本并行接口的输入输出
程序的设计... 323
12.4.2 8255A并行接口的输入输出
程序的设计... 324
12.4.3 51串行口发送接收程序
的设计... 325
12.4.4 DA转换控制程序的设计... 328
12.4.5 AD转换控制程序的设计... 329
12.4.6 步进电机控制单片机应用
系统的设计... 331
12.4.7 直流电机控制单片机应用
系统的设计... 334
12.5 C51的函数库... 339
12.6 多模块及其C51语言与汇编语言
混合编程... 340
本章小结... 342
实验十八:C51语言程序设计逻辑
函数的运算 342
思考与练习... 343
附录 51系列单片机的指令表.... 345
参考文献.... 350
內容試閱 :
第1章 单片机基础知识
如今电脑、计算机、单片机,都已成为人们非常熟悉的词语了。然而,单片机与计算机究竟是什么关系?单片机究竟为何物?单片机与嵌入式系统又是什么关系呢?另外,电脑最为神奇的作用是处理各种各样的信息,那么,它是如何来表达这些信息的呢?这些问题是学习本书内容的基础,也正是本章要回答的问题。
本章要点:
* 单片机的由来和特点。
* 补码的特点和应用。
* 单片机的内部基本结构。
* CPU执行指令的过程。
* 存储器的作用和分类。
* 输入输出接口的作用。
学习目标:
* 了解单片机的特点。
* 掌握补码表示数据的方法及其运算。
* 掌握CPU执行指令的步骤。
* 掌握存储器存取数据的过程。
1.1 引 言
要回答"单片机究竟为何物,以及单片机与计算机究竟是什么关系"这两个问题,显然要追溯计算机的历史和发展进程。
1.1.1 计算机
计算机俗称电脑诞生于20世纪40年代,它的功能从最初的计算,不断向控制、信息处理和通信等各个领域延伸。随着电子技术的发展,计算机经历了电子管时代、晶体管时代、大规模集成电路和超大规模集成电路时代,计算机家族也从小型机、大型机,发展到巨型机和微型机。
那么,最初的计算机内部结构是什么样的呢?据文献记载,计算机内部结构的蓝图是由世界著名计算机科学家冯诺依曼绘制的,如图1-1所示。
图1-1 冯诺依曼的计算机硬件结构
在冯诺依曼的蓝图中,计算机的硬件结构由五大部件组成。这五大部件是当代计算机硬件的雏形。学习硬件可以从这里出发。以下将对这五大部件的功能进行简要说明。
1 运算器。运算器是计算机的中心,其功能就是进行数据运算,"计算机"的名称也正是因此而来。由于运算器处在计算机的中心位置,早期计算机的一些数据传送需经过运算器。
2 控制器。控制器是执行指令的部件,它向系统中的其他部件发出控制信号,协调各部件工作。计算机通过它来实现本身运行过程的自动化。
3 存储器。存储器是存放程序和数据的部件,正是因为事先将程序储存在存储器中,控制器才能自动地完成计算机交给的任务。
4 输入设备。输入设备是输入信息的部件,输入的信息有原始的程序、数据,以及计算机操作命令等,常用的输入设备有键盘、鼠标、扫描仪等。
5 输出设备。输出设备是输出信息的部件,输出的信息有计算结果、绘制的图形表格,以及计算机操作提示信息等,常用的输出设备有显示器、打印机等。
也许人们现在已经很难将手头电脑的结构与冯诺依曼的电脑结构联系起来了。在现在的电脑中,已看不到独立的运算器和控制器的身影了,那么,它们到哪里去了呢?
在回答这个问题之前,我们先看看冯诺依曼的计算机是如何工作的,这种计算机有什么特点,它与后来的计算机有什么关系。
首先仔细观察一下图1-1。图中的5个方框代表了计算机的五大部件,而其中的连接线有两类,即较粗的有向线段和较细的有向线段,它们分别代表数据线和控制线。控制线的信号均来自控制器,每一部件也均有一组数据线与相关部件相连。为了使计算机按照人们的意图进行计算早期计算机的任务就是计算,必须事先把计算方法和操作步骤用指令编制成计算机可执行的程序,通过输入设备,将一条一条的指令以二进制数的形式存放在存储器中。计算机启动后,就从存储器中依次取出指令,送控制器分析,控制器根据指令的操作要求,向系统各部件发出一系列相应的操作信号,使系统各部件完成相应的工作。例如要求运算器完成加法工作等。程序执行过程中或执行结束时,可以通过输出设备将中间结果或最终结果显示出来。
根据冯诺依曼计算机的工作原理,可以总结出以下特点。
1. 采用存储程序的工作方法
将计算机要处理的数据和计算方法、步骤,事先用计算机操作命令指令编制成程序,存放在计算机的存储器中。计算机运行时,自动地、连续地从存储器中取出指令并执行,不需要人工干预。
2. 采用二进制代码表示指令和数据
计算机内部的信息全部采用二进制编码,使用这样的设计,主要原因是二进制的0和1两种状态用电路容易实现,运算器电路比较简单。另外,二进制信息对应的数字电子信号的抗干扰能力强。
令人感到惊奇的是,目前的计算机电脑仍然具有以上两个特性,只是我们通常没有感知到罢了。比如,在计算机中执行一个程序时,只要对准这个程序的图标点击两下就行。其实,当用户点击了这个程序后,计算机操作系统就将该程序的二进制信息从硬盘装载到存储器,然后执行。再比如,我们需要向计算机输入数据时,一般都是直接输入十进制的数据而不是二进制数据,但其实这也是计算机中的系统软件在暗地里将十进制数转换成二进制数而已。
由计算机的结构原理引出了两个名词,即硬件和软件,这是计算机区别于过去其他机器的重要特征。于是,对于计算机结构,完整的描述是:计算机是由硬件和软件组成的,其硬件主要包括控制器、运算器、存储器、输入设备和输出设备;其软件可分为系统软件、程序设计语言和应用软件;系统软件包括操作系统、编辑程序、诊断程序、调试程序、数据库管理程序、装配连接程序等;程序设计语言包括机器语言、汇编语言、高级语言和应用语言;应用软件包括通用软件、实用软件、用户程序等。
计算机的系统结构如图1-2所示。
图1-2 计算机的系统结构
随着电子技术的发展,特别是大规模集成电路的发展,计算机硬件的结构发生了一个重要的变化,那就是将原来计算机中的控制器和运算器组合在一起,集成在一块半导体芯片上,并给它起了一个响亮的名字--中央处理器Central Processing Unit,CPU。这就是为什么在现在的计算机中看不到独立控制器和运算器的原因了。
控制器和运算器隐身后,使计算机系统的可靠性得到了很大的提高。以往在控制器与运算器之间存在大量的连线,这些连线是导致计算机故障常发的因素,而随着两者在CPU中的集成,这些故障也就随之消失了。
1.1.2 微型机
计算机出现后,一方面朝着巨型机的方向发展,不仅体积庞大,而且技术上也追求高精尖,以满足高端要求,另一方面,又走大众化的道路,来满足普通民众的需求,使得计算机体积微型化,也就是我们平时看到最多的一种计算机--微型机。
那么,微型机与传统的计算机在结构上有什么不同呢?答案是基本相同。先让我们来看一下早期的微型机的结构,如图1-3所示。
图1-3 早期微型机的结构
图1-3中,表示的是一种单CPU、单总线的微型机结构。这种结构的微型机中,CPU、存储器、接口各自连接在系统唯一的总线上,输入输出设备分别通过接口与系统相连。
在这种结构的电脑中,CPU通过系统总线到存储器中读取指令或数据,CPU也是通过总线与输入输出设备传送信息。但是,系统不能在同一时刻在三个部件之间传送信息,否则,不同的信息将在同一条总线上撞车。
微型机的发展是随着计算机的发展而发展的,这里的"计算机",是指小型机和大型机,微型机借鉴小型机和大型机发展的技术,从单CPU、单总线结构,朝着多CPU多核、多总线结构的方向发展。
对于初学者来说,微型机的有关术语经常容易引起混淆,这里需要先澄清一下,以利于今后的学习。
1. 微处理器
微处理器是将控制器、运算器、寄存器集成在一块芯片上的系统,称为MPUMicro Processor Unit。
2. 微型计算机
以CPU为中心,配上存储器、接口,用系统总线将三者连接起来的系统,称为MCMicro Computer。
3. 微型计算机系统
以MC为中心,配上输入输出设备、系统软件组成的系统,称为MCSMicro Computer System,俗称电脑、"计算机"或"微机"。
1.1.3 单片机与嵌入式计算机
在微型计算机系统跟着大型机、巨型机朝着通用性多功能方向奋进的同时,制造商又开辟了新的发展路径。1976年,Intel公司推出了世界上第一片单片机芯片8048。
单片机从诞生那天起,就与微型计算机系统分道扬镳。微型计算机系统走的是通用化的发展道路,也就是不断地增加自身的功能;而单片机走的是专用化的发展道路,即朝着控制器的方向发展,使计算机成为人类社会进入全面智能化时代的有力工具。
Intel公司经过不断完善单片机产品,在1980年推出了被业界公认的经典产品MCS-51系列单片机。这款产品经历了三十多年,仍然是单片机领域内的主流产品。1984年,Intel公司又研制出了高性能的MCS-96系列单片机。
20世纪80年代和90年代是单片机迅速发展和应用的年代,各种单片机围绕着应用对象,不断地在内部添加外围接口电路,如AD转换器、DA转换器、PWM、日历时钟、电源监测、程序运行监测电路等。突出地显示出单片机对其应用对象的智能化控制能力。因此,单片机的称呼也逐渐从SCM变成微控制器MCUMicro Controller Unit。
随着单片机技术的发展,嵌入式计算机的概念被提了出来。那么,单片机与嵌入式计算机又有什么区别呢?答案是没有区别。仅仅是同样的东西被冠以不同的名称而已。嵌入式计算机就是"嵌入到对象体系中的专用计算机系统"。由此可见,单片机是根据计算机的特殊结构来命名的,而嵌入式计算机是根据计算机形态来命名的。现在有一个趋势,就是将单片机统一在嵌入式计算机名下。
由于单片机或嵌入式计算机的应用领域被不断地拓展,应用系统的外围电路也不断地被集成进嵌入式计算机中,芯片最大化的趋势十分明显,由此,片上系统SoCSystem on Chip 的概念也应运而生,也就是将嵌入式应用系统中的电路元器件尽可能地集成在一块或几块芯片中。这样做的好处是,应用系统电路板非常简洁,可减少体积和功耗,提高可靠性。
1.2 常用的数制和码制
前面曾经提到过,计算机中的指令和数据均是用二进制数来表示的。本节我们就来学习二进制数的相关知识。
1.2.1 常用的数制及其转换
计算机中常用的数制有二进制、十六进制和十进制。实际上,CPU能直接识别处理的只是二进制数,而十六进制和十进制数只是在高级语言、汇编语言编程时使用。
为了区分不同的进制数,采用在数字后面跟一个字母来标识。比如二进制用BBinary、十六进制用HHexadecimal、十进制用DDecimal通常省略。
1. 二进制数
计算机中的CPU可以对指令代码、数据、地址以及各种符号代码进行处理,这些代码和数都是用二进制数来表示的。
使用二进制数有以下优点。
1 二进制数在物理上容易实现。在电路中用高低电平、正负极性、开关的开合等来表示二进制数的"1"和"0"。
2 二进制数的运算规则简单,所以运算电路的结构也很简单。
3 二进制数的"0"和"1"正好与逻辑代数的"0"和"1"吻合,使逻辑运算可以方便地进行。
4 二进制数与其他进制数的转换也比较简单。
对任意一个二进制数N2,均可用多项式表示为:
1-1
二进制数的特点是,基数R=2,数字符号Bi={0,1},运算规则是"逢二进一"。
例1-1 写出二进制数1010.1001B的多项式表达式。
解:
2. 十六进制数
由于二进制数表达一个数时其长度比较长,书写不方便,记忆也不容易,而十六进制数与二进制数有着天然的联系,即四位二进制数正好表达一位十六进制数,这样,数字的长度可以被有效地压缩,就克服了二进制数的缺点。与二进制数一样,任意一个十六进制数N16均可以表示为:
1-2
十六进制数的特点是,基数R=16,数字符号Hi={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F},运算规则是"逢十六进一"。
例1-2 试将1001111011001.0011010101101B用十六进制数来表达。
解:先将题中数的整数部分,从小数点起向左分成四位一组,即1 0011 1101 1001。如果最左面的一组数字不满四位,则在其左边添若干"0",使该组也成四位,变成0001 0011 1101 1001。接着,将其转换成十六进制数,即13D9H。
然后,将题中数的小数部分从小数点起向右分成四位一组,即0011 0101 0110 1。如果最右面一组数字不满四位,则在其右边添若干"0",使该组也成四位,变成0011 0101 0110 1000。接着,将其转换成十六进制数,即0.3568H。
3. 十进制数
十进制数是人们日常生活中使用最多的数制,我们对其表示和运算都很熟悉,其实,十进制数与二进制数类似,任意一个十进制数N10,均可以表示为:
1-3
十进制数的特点是,基数R=10,数字符号Di={0,1,2,3,4,5,6,7,8,9},运算规则是"逢十进一"。
由于初学者对二进制和十六进制数不太熟悉,往往需要找到二进制数与十进制数的对应关系,在表1-1中,列出了十进制数0~15与二进制数和十六进制数的对应关系。
表1-1 常用十进制数0~15与二进制数和十六进制数的对应关系
十进制数
二进制数
十六进制数
0
0000
0
1
0001
1
2
0010
2
3
0011
3
4
0100
4
5
0101
5
6
0110
6
7
0111
7
8
1000
8
9
1001
9
10
1010
A
11
1011
B
12
1100
C
13
1101
D
14
1110
E
15
1111
F
表1-1中的内容必须熟记于心,这样才能在以后的二进制数运算中游刃有余。除了这些数以外,对于二进制数与十进制数之间转换的方法,也是单片机学习者必备的功夫。
4. 十进制数转换为二进制数
十进制数转换为二进制数的基本思路,应该分两步走,即把整数部分和小数部分分别进行转换,然后再合并起来。
例1-3 将十进制数175.625转换为二进制数。
解:首先,将十进制整数部分转换成二进制整数。
采用"除2取余法"。所谓"除2取余法",就是将十进制数的整数反复除以2,每次取其余数。若得到的余数为1,则对应的二进制数的相应位为1;若得到的余数为0,则对应的二进制数相应位为0。第一次得到的余数是二进制整数的最低位,最后一次余数是二进制整数的最高位,直至商为0为止。具体算法如图1-4所示。
图1-4 把十进制整数转换成二进制整数
由此可得,175=10101111B。
然后,将十进制小数部分转换成二进制小数。
要把十进制小数部分转换成二进制小数,可以采用"乘2取整法"。所谓"乘2取整"法,就是将十进制小数部分反复乘2,每次取其整数,若得到的整数为1,则对应的二进制数的相应位为1;若得到的整数为0,则对应二进制数相应位为0。第一次乘2得到的整数是二进制小数的最高位,从高位到低位逐次进行,直到满足精度要求或乘2后的小数部分变0为止。具体算法如图1-5所示。
图1-5 把十进制小数转换成二进制小数
由此可得,0.625=0.101B。所以,175.625=10101111.101B。
5. 二进制数转换为十进制数
要将二进制数转换为十进制数,其方法是将二进制数"按权展开求和",便可得到相应的十进制数。
例1-4 将二进制数101101.1011B转换成十进制数。
解:101101.1011B=125 123 122 120 12-1 12-3 12-4
=32 8 4 1 0.5 0.125 0.0625=45.6875
6. 十进制数转换为十六进制数
与十进制数转换为二进制数类似,十进制数转换为十六进制数的基本思路,也应该分两步走,即把整数部分和小数部分分别进行转换,然后再合并起来。
十进制整数部分转换成十六进制整数的方法与十进制整数转换为二进制整数类似,采用"除十六取余法"。十进制小数部分转换成十六进制小数的方法与十进制小数转换为二进制小数类似,也可采用"乘十六取整法"。
十进制整数部分转换成十六进制整数也可采用间接的方法,即先把十进制数转换为二进制数,然后再把二进制数转换成十六进制数。
例1-5 将十进制数175.625转换为十六进制数。
解:整数部分的转换如图1-6所示。
图1-6 把十进制整数转换成十六进制整数
小数部分的转换如图1-7所示。
图1-7 把十进制小数转换成十六进制小数
所以,175.625=AF.AH。
如果将数AF.AH转换成二进制数,则为10101111.1010B=10101111.101B。此结果与例1-3相同。例1-3与例1-5可以相互验证。
1.2.2 常用的码制
现在的电脑不仅能处理数值领域的问题,而且也能处理大量非数值领域的问题。所有这些信息都必须编成二进制格式的代码,CPU才能进行处理。数值数据包括定点数、浮点数、无符号数等。非数值数据包括字母、数字、通用符号、控制符号、汉字等信息,还有逻辑信息、图形信息、图像信息、语音信息等。这是一个庞大的符号系统。
本小节主要涉及数值数据在计算机内的表示方法。为了说明计算机中数的表示方法,先说明一些与此有关的概念。
1. 机器数
众所周知,数有很多种类,如整数、小数、正数、负数等。表示这些数都有相应的规定符号。比如101101.1011B是带有小数点的数,-1001100是一个负数。然而,CPU只能处理用"1"或"0"这两种符号表示的数,这就需要将原来数据中的一些符号用一些适合于CPU处理的方法来表示。最简单的方法是用一位二进制数的"0"和"1"来表示,用"0"代表" ",用"1"代表"-"。并且,将这个符号放在一个二进制数的最高位,称为符号位。这样,计算机中的符号就被数值化了,用这种方法表达的数,就是所谓的机器数。
小数点的位置在机器数中隐含在一个固定位置,不占用一个数据位。如何约定小数点的位置,将在定点数中介绍。
例1-6 设X= 1100101,Y=-1000101,则它们相应的机器数可分别表示为:
01100101、11000101。
2. 真值
由于机器数将符号进行了数值化,所以机器数的形式值就不等于真正的数值,为了区别起见,将机器数代表的真正的数值称为真值。
在例1-6中,机器数X和Y的形式值和真值分别为11000101=197,-1000101=-69。
在计算机中,小数又是如何表示的呢?答案是采用定点数或浮点数的方法。
3. 定点数
小数点在数中位置固定不变的数称为定点数。小数点是隐含约定的,不占用数据位。根据小数点位置的约定,分为定点小数和定点整数。
1 定点小数。
当约定小数点位置在机器数的符号位左侧时,称定点小数。定点小数是绝对值小于1的纯小数,数据格式如下所示。
符号位
数值部分尾数
? 小数点位置
2 定点整数。
当约定小数点位置在机器数最低位右侧时,称为定点整数。小数点是隐含约定的,不占数据位。数据格式如下所示。
符号位
数值部分尾数
? 小数点位置
本书以后提到的定点数均指定点整数,希望读者注意。
4. 浮点数
小数点在数中的位置不是固定的数,称为浮点数。采用浮点数,是为了扩大数的表示范围,其表达方式如下:
B=MRE
其中M是尾数,一般为定点小数;R是底数,因是二进制数,故为2;E是指数,也称为阶码。由于尾数的小数点已固定,故整个数的小数点位置就由指数的大小来决定,而指数是根据数值的大小而变化的,因此,整个数的小数点位置也是变化的,这就是浮点数的由来。
有了以上这些概念,对于了解计算机中数的表示方法很有益处。下面具体讨论计算机中数的表示方法。
5. 无符号数的表示方法
当需要处理的数据是正整数时,采用无符号数的表示方法是效率最高的,省去符号位,使表达的数值范围更大。若计算机的字长是8位,则一个字长的二进制数可表示数的范围是0N28-1。
例1-7 用8位无符号二进制数表示167、45,然后将这两个数相加。
解:首先将十进制数167、45分别转换成8位无符号二进制数。
即167=10100111B,45=00101101B。然后将这两个数相加:
167 = 10100111
45 = 00101101
212 = 11010100B = D4H = 1316 4 = 208 4 = 212
6. 二-十进制数字编码BCD码
在计算机中,一般是采用编码的方式来表示数的。用四位二进制数编码表示一位十进制数,称为二-十进制编码,即BCD码Binary Coded Decimal。它有二进制数的形式,又有十进制数的特点。
4位二进制数有16个状态,只须用10个状态来表示BCD码,不同的组合方式可产生不同的BCD码,常用的BCD码有8421码、2421码、余3码、格雷码等,如表1-2所示。
表1-2 几种BCD码
十进制数
8421码
2421码
余3码
格 雷 码
0
0000
0000
0011
0000
1
0001
0001
0100
0001
2
0010
0010
0101
0011
3
0011
0011
0110
0010
4
0100
0100
0111
0110
5
0101
1011
1000
1110
6
0110
1100
1001
1010
7
0111
1101
1010
1000
8
1000
1110
1011
1100
9
1001
1111
1100
0100
在以上BCD码中,8421 BCD码用最为常用,因为它就是实际的二进制数,所以只要给出8421 BCD码,就能很快得出相应的十进制数。
例1-8 已知8421 BCD码为001110000101,求其代表的十进制数。
解:先将给定的BCD码分组,即0011 1000 0101,则其代表的十进制数为385。
由于一个存储器单元一般是存放8位二进制数,所以BCD码在存储器中的存放形式有两种。其一是一个存储器单元放一位BCD码,放在存储器单元的低4位,高4位充四个"0",这样的BCD码称为非压缩BCD码。比如十进制数38,需用两个非压缩BCD码表示,即0000001103H,0000100008H。其二,在一个存储器单元中放两位BCD码,这样的BCD码称为压缩BCD码,则十进制数38,用压缩BCD码表示为0011100038H。
例1-9 若有两个十进制数27、48,请将这两个数用8421 BCD码表示,并求其和。
解:先将给定的两数分别用压缩8421 BCD码表示,27=00100111,48=01001000, 然后将其相加。
00100111
01001000
01101111
从相加的结果看,低四位是1111,这并不是8421 BCD码。
出现这种情况的原因,是由于计算机在运算时是按二进制数加法规则运算的。因此,8421 BCD码在运算时,当其结果的某一位BCD码的数值大于9,或发生进位时,就必须对该位BCD码进行加6修正,即:
01101111
00000110
01110101 0111 0101 = 75
这样的结果才是8421 BCD运算需要的结果。
由此可见,计算机采用BCD码进行加法运算时,要注意对结果进行加6修正。如果进行减法运算,当BCD码的高4位或低4位发生借位时,需要对结果进行减6修正。
7. 原码
为了提高计算机对数据运算的效率和速度,人们一直在研究二进制数的编码,原码就是其中之一。原码的特点是,机器数的最高位是符号位,"0"表示正,"1"表示负,其余位给出数据的绝对值。
原码的定义:设机器数是用n位二进制数表示的整数,X表示真值,则原码的定义可用下式来表达:
例1-10 已知X = -1000100,求用8位二进制数表示的原码。
解:根据原码的定义,由于X0,且n=8,则它们的反码分别为:
[X]反 = 28 -1 - | X | = 100000000-1-0000100 = 11111011
[Y]反 = 0 Y = 00000010
它们的和为:
[X]反 [Y]反 = 11111011 00000010 = 11111101
以上运算结果转换成真值为,1111110110000010-0000010。这与真值运算X Y= -0000100 0000010 = -0000010的结果是吻合的。
反码的性质如下:
* 当n=8时,数表示的范围是:-27-1X27-1,即-127X127。
* 反码的零有两种表示法,若n=8,则00000000和11111111均表示零。
* 对于正数,[X]反=[X]原;对于负数,符号位为1,将原码的其他位按位取反,即得到反码。
反码进行加减运算时,虽然符号位能同数值位一样参加运算,但当运算发生最高位进位时,需要对结果做加1修正。
例如,若X=-0000001,Y=00000010,求[X]反 [Y]反,则:
这与实际结果相比,显然少了1。
9. 补码
为了克服反码在运算中缺点,补码就应运而生了。
补码的定义:设机器数是用n位二进制数表示的整数,X表示真值,则补码的定义可用下式表达:
或者用一个式子来表示:
[X]补 = 2n X Mod 2n
求一个数的补码,可以根据定义式来求,也可以用以下简便的方法来求。最高位是符号位,"0"代表正,"1"代表负。对于正数,补码的数值部分为其真值的数值部分不变;对于负数,补码的数值部分为其真值的绝对值取反,再加1,除了X=-2n-1以外。
例1-12 已知X=-0000100,Y=0001010,求用8位二进制数表示的补码,并求其和。
解:根据补码的定义,由于X0,且n=8,则它们的补码分别如下。
[X]补 = 28X = 100000000 - 0000100 = 11111100
[Y]补 = 0 Y = 00001010
它们的和为:
[X]补 = 11111100
[Y]补 = 00001010
00000110 最高位进位舍去
以上运算结果转换成真值为:00000110。
这与真值运算X Y = -0000100 0001010 = 0000110的结果是吻合的。
补码的性质如下:
* 当n=8时,数表示的范围是:-27X27-1,即-128X127。
* 补码的零只有一种表示法,若n=8,则为00000000。
* [X]补 [Y]补=[X Y]补,[X]补-[Y]补=[X]补 [-Y]补=[X-Y]补。这一性质表明,补码运算的结果仍然是补码,体现了补码运算的完备性。而且补码可以将减法化成加法,这对于化简CPU中运算器的设计是十分有益的。
补码的优点非常多,但缺点是补码表示的数值不太直观,这对于两数运算后是否有溢出超出数值范围的判定比较困难。这就需要另想办法来解决。
有一种直观简便的方法,可以判断补码运算后是否溢出,即采用变形补码的方法。
什么是变形补码呢?就是在原来补码的基础上增加一个符号位,形成双符号位的补码。判断溢出的规定为:运算结果中,如果两符号位相同,则表示无溢出;如果两符号位相异,则表示发生溢出。
例1-13 已知[X]补=01100010,[Y]补=00110101。给出补码的变形补码,计算[X]补 [Y]补,并判断是否溢出。
解:首先,根据变形补码规定,已知两补码的变形补码分别如下。
[X]变补= 001100010,[Y]变补= 000110101
接下来,继续计算[X]补 [Y]补。
[X]变补 = 001100010
[Y]变补 = 000110101
= 010010111
由于运算结果的两符号位不相同,则判断为运算结果发生溢出。另外,从补码表示的真值运算中也可以得出结论。即[X]补=01100010,X=01100010;[Y]补=00110101,Y=00110101;X Y=10010111=128 16 7=151127,超过了8位二进制数补码表达数的范围。
补码运算发生溢出的实质是:运算的结果超出了n位二进制补码所表达的数值范围。
判断补码溢出的方法之二,是根据补码的定义,判断补码运算结果是否有溢出。
分以下几种情况来判断补码运算结果是否溢出:
* 当作加法时,且参加运算的两数是正数,按照补码的定义,运算结果应该仍然为正数。如果运算结果为负数,则发生了溢出;同理,如果参加运算的两数是负数,运算结果为正数,则发生了溢出。
* 当作减法时,且是正数减负数,运算结果为负数,则发生了溢出;同理,如果是负数减正数,运算结果为正数,则发生了溢出。
* 当两个正数或两个负数做减法时,其运算结果是不会发生溢出的。
* 同理,当两个不同符号的数做加法时,其运算结果也是不会发生溢出的。
例1-14 已知[X]补=01100010,[Y]补=00110101。求[X]补 [Y]补,并判断是否溢出。
解:根据已知条件,对两补码进行加法运算。
[X]补 = 01100010
[Y]补 = 00110101
10010111
由于两正数的补码相加结果为负数,则判断为运算结果发生了溢出。
实验一:认识补码
一、实验目的
掌握二进制数补码的表示方法。熟悉51系列单片机软件开发工具Keil mVision2。
二、实验工具
一台电脑,采用软件工具Keil mVision2。
三、实验内容
运行以下C语言程序:
signed char Min;
signed char Data_Array[] = {100,32,64,2,1,-1,-2,-32,-64,-100};
void main
{
signed char x;
unsigned char i;
i = 0;
x = Data_Array[i];
for i=1; i