1、单片机 单片机是指一个集成在一块芯片上的完整计算机系统。尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件: CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。 单片机也被称为微控制器( Microcontroller),是因为它最早被用在工业控制领域。单片机由芯片内仅有 CPU 的专用处理器发展而来。最早的设计理念是通过将大量 外围设备和CPU 集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对提及要求严格的控
2、制设备当中。 INTEL 的 Z80 是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。 早期的单片机都是 8 位或 4 位的。其中最成功的是 INTEL 的 8031,因为简单可靠而性能不错获得了很大的好评。此后在 8031 上发展出了 MCS51 系列单片机系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了 16 位单片机,但因为性价比不理想并未得到很广泛的应用。 90 年代 后随着消费电子产品大发展,单片机技术得到了巨大的提高。随着 INTEL i960 系列特别是后来的 ARM 系列的广泛应用,32 位单片机迅速取代
3、 16 位单片机的高端地位,并且进入主流市场。而传统的 8 位单片机的性能也得到了飞速提高,处理能力比起 80 年代提高了数百倍。目前,高端的 32 位单片机主频已经超过 300MHz,性能直追 90 年代中期的专用处理器,而普通的型号出厂价格跌落至 1美元,最高端的型号也只有 10 美元。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌 上电脑和手机核心处理的高端单片机甚至可以直接使用专用的 Windows 和 Linux 操作系统。 8051 单片机由运算器、控制器、寄存器等组成。运算器以完成二进制的算术 /逻辑运算部件 AL
4、U 为核心,再加上暂存器 TMP、累加器 ACC、寄存器 B、程序状态标志寄存器 PSW 及布尔处理器。累加器 ACC 是一个八位寄存器,它是 CPU 中工作最频繁的寄存器。在进行算术、逻辑运算时,累加器 ACC 往往在运算前暂存一个操作数(如被加数),而运算后又保存其结果(如代数和)。寄存器 B 主要用于乘法和除法操作。标志寄存器 PSW 也是一个八位寄存器 ,用来存放运算结果的一些特征,如有无进位、借位等。其每位的具体含意如下所示。 PSW CY AC FO RS1 RS0 OV P 对用户来讲,最关心的是以下四点。 1. 进位标志 CY( PSW7)。它表示了运算是否有进位(或借位)。如
5、果操作结果在最高位有进位(加法)或者借位(减法),则该位为 1,否则为 0。 2. 2. 辅助进位标志 AC。又称半进位标志,它反映了两个八位数运算低四位是否有半进位,即低四位相加(或减)有否进位(或借位),如有则 AC 为 1 状态,否则为 0。 3. 溢出标志位 OV。 MCS 1 反映带符号数的运算结 果是否有溢出,有溢出时,此位为 1,否则为 0。 4. 奇偶标志 P。反映累加器 ACC 内容的奇偶性,如果 ACC 中的运算结果有偶数个 1(如11001100B,其中有 4 个 1),则 P 为 0,否则, P=1。 PSW 的其它位,将在以后再介绍。由于PSW 存放程序执行中的状态,
6、故又叫程序状态字,运算器中还有一个按位( bit)进行逻辑运算的逻辑处理机(又称布尔处理机)。其功能在介绍位指令时再说明。关于控制器,控制器是 CPU 的神经中枢,它包括定时控制逻辑电路、指令寄存器、译码器、地址指针 DPTR 及程序计数器 PC、堆栈指针 SP 等。这里程 序计数器 PC 是由 16 位寄存器构成的计数器。要单片机执行一个程序,就必须把该程序按顺序预先装入存储器 ROM 的某个区域。单片机动作时应按顺序一条条取出指令来加以执行。因此,必须有一个电路能找出指令所在的单元地址,该电路就是程序计数器 PC。当单片机开始执行程序时,给 PC 装入第一条指令所在地址,它每取出一条指令(
7、如为多字节指令,则每取出一个指令字节), PC 的内容就自动加 1,以指向下一条指令的地址,使指令能顺序执行。只有当程序遇到转移指令、子程序调用指令,或遇到中断时, PC 才转到所需要的地方去。 8051 CPU 指定的 地址,从 ROM 相应单元中取出指令字节放在指令寄存器中寄存,然后,指令寄存器中的指令代码被译码器译成各种形式的控制信号,这些信号与单片机时钟振荡器产生的时钟脉冲在定时与控制电路中相结合,形成按一定时间节拍变化的电平和时钟,即所谓控制信息,在 CPU 内部协调寄存器之间的数据传输、运算等操作。 再来介绍一下存储器,存储器是单片机的又一个重要组成部分,有一种存储容量为 256个
8、单元的存储器结构。其中每个存储单元对应一个地址, 256 个单元共有 256 个地址,用两位 16 进制数表示,即存储器的地址( 00H FFH)。存储器中每 个存储单元可存放一个八位二进制信息,通常用两位 16 进制数来表示,这就是存储器的内容。存储器的存储单元地址和存储单元的内容是不同的两个概念,不能混淆。单片机还包括程序存储器。程序是控制计算机动作的一系列命令,单片机只认识由 “0” 和 “1” 代码构成的机器指令。如前述用助记符编写的命令 MOV A, #20H,换成机器认识的代码 74H、 20H:(写成二进制就是 01110100B 和00100000B)。在单片机处理问题之前必须
9、事先将编好的程序、表格、常数汇编成机器代码后存入单片机的存储器中,该存储器称为程序存储器。程序存 储器可以放在片内或片外,亦可片内片外同时设置。由于 PC 程序计数器为 16 位,使得程序存储器可用 16 位二进制地址,因此,内外存储器的地址最大可从 0000H 到 FFFFH。 8051 内部有 4k 字节的 ROM,就占用了由 0000H 0FFFH 的最低 4k 个字节,这时片外扩充的程序存储器地址编号应由 1000H 开始,如果将 8051当做 8031使用,不想利用片内 4kROM,全用片外存储器,则地址编号仍可由 0000H开始。不过,这时应使用 EA 脚,保持低电平。当 EA 为
10、高电平时,用户在 0000H 至 0FFFH范围内使用内部 ROM,大于 0FFFH 后,单片机 CPU 自动访问外部程序存储器。单片机的数据存储器由读写存储器 RAM 组成。其最大容量可扩展到 64k,用于存储实时输入的数据。 8051内部有 256 个单元的内部数据存储器,其中 00H 7FH 为内部随机存储器 RAM, 80H FFH 为专用寄存器区。实际使用时应首先充分利用内部存储器,从使用角度讲,搞清内部数据存储器的结构和地址分配是十分重要的。因为将来在学习指令系统和程序设计时会经常用到它们。 8051 内部数据存储器地址由 00H 至 FFH 共有 256 个字节的地址空间,该空间
11、被分为两部分,其中内部数据 RAM 的地址为 00H 7FH(即 0 127)。而用做特殊功能寄存器的地址为80H FFH。在此 256 个字节中,还开辟有一个所谓 “ 位地址 ” 区,该区域内不但可按字节寻址,还可按 “ 位( bit) ” 寻址。对于那些需要进行位操作的数据,可以存放到这个区域。从 00H 到 1FH 安排了四组工作寄存器,每组占用 8 个 RAM 字节,记为 R0 R7。究竟选用那一组寄存器,由前述标志寄存器中的 RS1 和 RS0 来选用。在这两位上放入不同的二进制数,即可选用不同的寄存器组。 特殊功能寄存器( SFR)的地址范围为 80H FFH。在 MCS 51 中
12、,除程序 计数器 PC 和四个工作寄存器区外,其余 21 个特殊功能寄存器都在这 SFR 块中。其中 5 个是双字节寄存器,它们共占用了 26 个字节。各特殊功能寄存器的符号和地址。其中带 *号的可位寻址。特殊功能寄存器反映了 8051 的状态,实际上是 8051 的状态字及控制字寄存器。用于 CPU PSW便是典型一例。这些特殊功能寄存器大体上分为两类,一类与芯片的引脚有关,另一类作片内功能的控制用。与芯片引脚有关的特殊功能寄存器是 P0 P3,它们实际上是 4 个 8 位锁存器(每个 I/O 口一个),每个锁存器附加有相应的输出驱动器和输入缓冲器就构成了一个并行口。 MCS 51 共有 P
13、0 P3 四个这样的并行口,可提供 32 根 I/O 线,每根线都是双向的,并且大都有第二功能。其余用于芯片控制的寄存器中,累加器 A、标志寄存器 PSW、数据指针 DPTR 等的功能前已提及。 下面再来谈论如何让单片机如何正常工作。单片机要正常运作,事先需编制程序,再把程序放入存贮器中,然后由 CPU 执行该程序。程序是由指令组成的,指令的基本组成是操作码和操作数。单片机的品种很多,设计时怎样表示操作码和操作数,都有各自的规定,再有指令代码也各不相同,因此,必须对所选单片机的全部指令,也就是所谓 “ 指令 系统 ” ,有足够的了解。各个系列的单片机虽然有不同的指令系统,但也有其共同性。掌握一
14、种单片机的指令系统,对其它系列单片机可以起到触类旁通的作用。 MCS 51 单片机应用广泛、派生品种多、具有代表性 。 所以,这里以 MCS 51 系列的指令系统为例说明 “ 指令 ” 的组成和应用。例子 1, MOV A, #20H:这条指令表示把 20H 这个数送入累加器 A 中(一个特殊功能寄存器)。例子 2, ADD A, 70H:这条指令表示把累加器 A 中的内容(在上例中送入的 #20H)和存贮器中地址为 70H 单元中的内容(也是一个数字),通过算术逻辑单元(英 文缩写为 ALU)相加,并将结果保留在 A 中。这里 MOV、 ADD 等称为操作码,而 A、 #20H、 70H 等
15、均称为操作数。在汇编语言程序中,操作码通常由英文单词缩写而成,这样有助于记忆,所以又称助记符。如 MOV 就是英文单词 MOVE 的缩写,含有搬移的意思;而 ADD 即为英文单词,其意为相加。因此,对于略懂英语的用户,掌握单片机指令的含意是较为方便的。操作数有多种表示法,如以上的 #20H 称为立即数,即 20H 就是真正的操作数。而 70H 是存贮器中某个单元的地址,在该单元中,放着操作数(比如说是 3AH), ADDA, 70H 不是将 70H 和 A 中的内容相加,而是从存贮器 70H 单元中将 3AH 取出和 A 中的内容相加。由上可知,要找到实际操作数,有时就要转个弯,甚至转几个弯,
16、这个过程称为寻址 4:操作数放在 RAM 某个单元中,该单元的地址又放在寄存器 R0 或 R1 中。 如果 RAM 的地址大于 256,则该地址存放在 16 位寄存器DPTR(数据指针)中,此时在寄存器名前加 符号来表示这种间接寻址。如 MOV A, R0。其它还有变址寻址、相对寻址、位寻址等,待以后再详细介绍。可能有人会问,在指令中直接给出实际操作数,不是简单明了吗?为什么还要用其它几种寻址方式呢 ?这是因为在编制程序时很难一下子就给出操作数。如用单片机控制温度时,时时需要将给定的控制温度(如20 )减去环境温度,而环境温度时时有变化,显然无法在程序指令中给出,只有通过一定方式,将其送入某个
17、输入 /输出口,再存放在某个寄存器中,这就必须用到寄存器寻址。又如要进行算术运算,要计算每班学员各科成绩的平均值,如果把每个学员的各科都编一个程序,在程序中直接给出该学员各科成绩,再求平均值,显然太麻烦。这里可以编一个求平均成绩的通用程序,把每位学员的成绩送入存贮器的各个单元中,这时可采取直接寻址,一个程序可供每个学 员用,不是更方便吗?所以,寻址方式越多,编制程序就越方便、灵活,适用范围就越广,寻址有如找人,如被找的人有手机、 BP 机、座机电话等多种联系方式则就容易找到他,单片机也是如此,寻址方式越多,找操作数越方便,单片机的功能就越强。前面介绍 51 系列单片机的寻址方式时,常遇到单片机
18、内部的一些寄存器、累加器 A、通用寄存器 R0 R7、数据指针 DPTR 和存贮器等。在以后介绍指令时,数据就要在这些寄存器、存贮器之间传送,或者进行运算。因此,编制程序就需熟悉单片机的内部结构。 8051 单片机的内部总体结构其基本特性: 8 位 CPU、 片内振荡器、 4k 字节 ROM、 128 字节 RAM、 21 个特殊功能寄存器、 32 根 I/O 线可寻址的 64k 字节外部数据、程序存贮空间、 2 个 16 位定时器、计数器 ,中断结构:具有二个优先级、五个中断源、一个全双口串行口位寻址(即可寻找某位的内容)功能,适于按位进行逻辑运算的位处理器。除 128 字节 RAM、 4k
19、 字节 ROM 和中断、串行口及定时器模块外,还有 4 组 I/O 口 P0 P3,余下的就是 CPU 的全部组成。把 4kROM换为 EPROM 就是 8751 的结构,如去掉 ROM/EPROM 部分即为 8031 的框图,如果将 ROM 置换为Flash 存贮器或 EEPROM,或再省去某些 I/O,即可得到 51 系列的派生品种,如 89C51、AT89C2051 等单片机的框图。单片机各部分是通过内部的总线有机地连接起来的。 下面再谈 AT89C51 单片机性能介绍。 AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器( FPEROM Flash :Programmable and Erasable Read Only Memory)的低电压,高