单片微型计算机(Single Chip Microcomputer, SCM)简称单片机,利用大规模集成电路技术把中央处理单元(Center Processing Unit, CPU)、数据存储器(RAM)、程序存储器(ROM)及其他I/O接口部件集成在一块芯片上,构成一个最小的计算机系统。根据单片机在不同应用场合所承担的主要功能,有微控制器(Micro Controller Unit, MCU)和微处理器(Micro Processor Unit, MPU)之分,二者主要是计算能力有差异。MCU通常运行较为单一的任务,执行对硬件设备的管理/控制功能,对运算处理能力要求不高;MPU通常有一个计算功能强大的CPU,能够运行比较复杂的、运算量大的程序和任务,通常需要大容量的存储器。随着单片机技术的发展,其应用领域越来越广泛,单片机通常分为专用型和通用型。
专用型:指用途比较专一,出厂时程序已经一次性烧写好、不能再修改的单片机。专用型单片机通常采用大批量生产,成本很低,如果达不到足够的批量,成本反而会高。
通用型:指可由开发人员设定其功能的单片机。这种单片机应用于不同的接口电路,编写不同的应用程序就可实现不同的功能,其应用十分广泛。一般所说的单片机都是指通用型单片机。
1946年第一台电子计算机诞生至今,微电子技术和半导体技术已有长足发展,芯片从电子管、晶体管发展到集成电路、大规模集成电路,现在一块芯片上可以集成几千万甚至上亿只晶体管,功能和性能显著增强。特别是近20年,随着通信技术、网络和图形图像处理技术的飞速发展,单片机在工业、科研、教育、国防和航空航天等领域获得了广泛的应用,单片机技术已经是一个国家现代科技水平的重要标志。
1.国外单片机发展
1976年Intel公司推出了8位的MCS-48单片机,具有体积小、功能较全、价格低的特点,为单片机的发展奠定了基础,成为了单片机发展史上重要的里程碑。在MCS-48的带领下,国外多家半导体公司相继研制和发展了自己的单片机,如Intel公司的MCS-51系列,Motorola公司的6801和6802系列,Rockwell公司的6501及6502系列等。随着技术的提升,后续各大国外公司研发的单片机大多集成了CPU、RAM、ROM、数目不等的I/O接口、多个中断源,甚至还有一些带有A/D转换器,功能越来越强大,RAM和ROM的容量也越来越大,寻址空间也越来越大,促使单片机在多个领域得到了广泛应用。
1982年以后,16位单片机问世,代表产品是Intel公司的MCS-96系列,16位单片机比起8位机,数据宽度增加了一倍,实时处理能力更强,主频更高,集成度达到了12万只晶体管,RAM增加到了232B,ROM则达到了8KB,并且有8个中断源,同时配置了多路A/D转换通道、高速I/O处理单元,适用于更复杂的控制系统。
1985年,Roger Wilson和Steve Furber设计了第一代32位的处理器,用它设计了一台RISC(Reduced Instruction Set Computing,精简指令集计算)计算机,简称ARM(Acorn RISC Machine),这也是ARM这个名字的由来。ARM内核主要有ARM7、ARM9、ARM10、ARM11。
2004年,ARM公司的经典处理器ARM11以后的产品改用Cortex命名,并分成A、R和M三类,旨在为各种不同的市场提供服务。
2.国内单片机发展
国内微电子技术和半导体技术起步较晚,整体发展与国外还有一定差距。20世纪80年代初,北京工业大学电子厂开始了TP801单板机(将微处理器、一定容量的程序/数据存储器、输入/输出接口、辅助电路通过总线全部安装在一块印制电路板上的单板式微型计算机)开发热潮,利用国外的微处理器Z80实现了信息输入和显示。同期,上海和江苏等地开发了MCS-51的单片机开发系统。1986年10月,复旦大学举行了第一次全国单片机学术交流会,这标志了我国单片机事业的开始,也推动了我国在CPU核心技术上的研究工作。随着国际形势的重大变化,我国的科技工作者认识到了微电子产业在国民经济建设和国家安全中的重要性,进而加速进行微处理器核心技术的研发。2002年8月10日诞生的“龙芯一号”是我国首枚拥有自主知识产权的通用高性能微处理芯片。“龙芯一号”是一颗32位的处理器,主频达到266MHz,采用了0.18μm CMOS工艺制造,具有良好的低功耗性,平均功耗为0.5W,在片内提供了一种特别设计的硬件机制,可以抵抗缓冲区溢出类攻击。近20年来,我国出现了较多知名的MCU制造商,如中颖电子、北京君正、东软载波、兆易创新等,分别研发了具有自主知识产权的8位、16位、32位和64位的通用和专用处理器,其产品在家电、电网、交通、工业、通信及网络等领域得到了广泛应用,这也进一步促进了我国在单片机核心技术领域的快速发展。
单片机的硬件主要由中央处理单元(Central Processing Unit, CPU)、存储器(RAM和ROM)、I/O接口及总线组成,如图1-1所示。
图1-1 单片机的硬件组成
图1-2 通用计算机的硬件组成
单片机是单芯片式微型计算机,与通用计算机(图1-2)相比,自身不带软件,没有输入/输出(I/O)设备。简单来讲,单片机是将多种功能部件集成到一块芯片上,而通用计算机是一台机器,是一套硬件系统的集合。单片机的组成部分介绍如下。
1.中央处理器
中央处理器具有算术运算、逻辑运算和控制操作的功能,是单片机或通用计算机的核心部分。它主要由3部分组成:算术逻辑单元、寄存器组、控制器。
① 算术逻辑单元(Arithmetic Logic Unit, ALU)。用来执行基本的算术运算和逻辑运算。
② 寄存器(Register)组。CPU中有多个寄存器,用来存放操作数、中间结果以及反映运算结果的状态标志位等。
③ 控制器(Control Unit)。控制器具有指挥整个系统操作的功能。它按一定的顺序从存储器中读取指令,进行译码,在时钟信号的控制下,发出一系列的操作命令,控制CPU以及整个系统有条不紊地工作。
2.存储器
存储器(程序/数据存储器)的主要功能是存放程序和数据,程序是单片机或通用计算机操作的依据,数据是单片机或通用计算机操作的对象。不管是程序还是数据,在存储器中都用二进制的“0”或“1”表示,统称信息。为实现自动计算,这些信息必须预先放在存储器中。存储器由寄存器组成,可以看成一个寄存器堆。存储器被划分成许多小单元,称为存储单元。每个存储单元相当于一个缓冲寄存器。为了便于存入和取出,每个存储单元必须有一个固定的地址,称为单元地址,单元地址用二进制编码表示。每个存储单元的地址只有一个,固定不变,而存储在其中的信息可以是二进制的“0”或“1”组合的任何编码。为了减少存储器向外引出的地址线,存储器内部自带地址译码器。向存储单元存放或取出信息,都称为访问存储器。访问存储器时,先由地址译码器将送来的单元地址进行译码,找到相应的存储单元,再由读/写控制电路根据送来的读/写命令确定访问存储器的方式,完成读出或写入操作。
3.总线
总线是单片机把各部分有机地连接起来的一组导线,是各部分之间进行信息交换的公共通道。在单片机中,连接CPU、存储器和各种I/O设备并使它们之间能够相互传送信息的信号线和控制线统称总线。总线包括地址总线(Address Bus, AB)、数据总线(Data Bus, DB)和控制总线(Control Bus, CB)。
地址总线:负责传输数据的存储位置或I/O接口中寄存器的地址编号的一组信号线称为地址总线。它传送CPU发出的地址,以便选中CPU所寻址的存储单元或I/O接口(一个I/O接口有1个或几个端口地址),地址总线是单向的,如图1-1所示。如果单片机的地址总线有20位,用A 0 ~A 19 表示,所以可寻址的存储单元个数为2 20 =1M(1M=1024×1024);MCS-51单片机对外部扩展的地址总线为16位,用A 0 ~A 15 表示,可寻址的存储单元或I/O端口个数为2 16 =64K(1K为1024)。
数据总线:负责传输数据的一组信号线称为数据总线。数据可以由CPU向存储器或I/O接口发送,也可以由存储器或I/O接口向CPU传送,因此数据总线是双向的。MCS-51单片机对外部扩展的数据总线是8位的,用D 0 ~D 7 表示,即字长为8位。通常所说的多少位CPU,是指该CPU内部数据总线的位数。
控制总线:在传输与交换数据时起控制作用的一组信号线称为控制总线。它传送各种信息,有的是CPU到存储器或I/O接口的控制信号,如读信号、写信号、地址锁存允许信号(Address Latch Enable, ALE)、中断响应信号(Interrupt Acknowledge, INTA)等;有的是I/O接口到CPU的信号,如可屏蔽中断请求信号(INTR)等。控制信号线有的是高电平有效,如ALE、INTR等;有的是低电平有效,如INTA等。由于控制总线既可以由CPU向存储器或I/O接口发送控制命令,也可以侦听存储器或I/O设备的状态信息,因此控制总线也是双向的。
总线是连接CPU各功能部件的公共数据通道,其性能直接关系到单片机的整体性能。总线的性能主要表现为它所支持的数据总线位数和总线工作时钟频率。数据总线位数越多,总线工作时钟频率越高,总线的信息吞吐率就越高,单片机的性能就越强。
4.I/O接口
在微型计算机或单片机系统中,输入/输出(Input/Output, I/O)接口是CPU与外部设备交换信息不可缺少的组成部分。I/O接口是CPU和外设进行衔接的部件,它的一端通过总线和CPU相连,另一端通过控制器和外设相连。通过接口可以传送外设向CPU输入的信息,或者传送CPU输出到外设的信息。I/O外设是输入设备和输出设备的统称,向CPU输入信息的设备称为输入设备,接收CPU信息的设备称为输出设备。
I/O接口主要有三大功能。一是外部设备大多数都是机电设备,传送数据的速度远远低于单片机,因而需要I/O接口做数据缓存。二是外部设备表示信息的格式与单片机不同,例如,USB、模拟信号等首先须用I/O接口进行信息格式的转换。三是I/O接口还可以向CPU报告设备运行的状态,传达CPU的命令等。CPU与外设间的数据交互是由I/O接口完成的。I/O接口中通常包含三类信息:数据信息、状态信息和控制信息。
1)数据信息
CPU与外设交换的基本信息就是数据信息。在输入过程中,数据信息由外设经过与接口之间的数据线进入接口,再到达系统的数据总线,送给CPU;在输出过程中,数据信息从CPU经过数据总线进入接口,再通过接口和外设间的数据线送到外设。从信息表示的物理特性上,数据信息大致可以分为两类:数字量和模拟量。
(1)数字量。
数字量通常是二进制形式的数据或以ASCII码表示的数据及字符,还有可能是一位二进制数(“0”或者“1”)表示的开关量。
(2)模拟量。
在使用单片机进行测控的场合中,多数情况下,输入信息就是现场的连续变化的物理量,如温度、湿度、位移、压力等,这些物理量一般通过传感器转换成电压或电流,再经过放大器放大。这样的电流和电压仍然是连续变化的模拟量,而单片机无法直接接收和处理模拟量,因此,需要经过模拟量向数字量的转换(A/D),变成数字量才能送入计算机。反过来,单片机输出的数字量要经过数字量向模拟量的转换(D/A),变成模拟量后才能进行相关控制。
在单片机运算与处理过程中,数据全部以二进制方式表示,这里所提到的数字量和模拟量仅是从物理信息本身特性进行分类的,并不是CPU能直接识别和处理的信息。
2)状态信息
状态信息是一种反映外设当前工作状态的信息,通常是外设经接口送往CPU的信息。CPU根据这种状态信息,随时了解外设当前的工作情况。对于输入设备,常用“准备就绪”(READY)信号来表明待输入的数据是否已经准备就绪。如果准备就绪,CPU就可以读这个数据;对于输出设备,常用“忙”(BUSY)信号来表示输出设备是否处于空闲状态,如为空闲状态,则可接收CPU送来的信息,否则CPU要等待。
3)控制信息
控制信息是CPU通过接口传送给外设的,CPU通过发送控制信息控制外设的工作。如外设的启动信号和停止信号就是常见的控制信息。实际上,控制信息往往随着外设的具体工作原理不同而有不同的含义。
5.内部集成功能部件
在单片机应用的诸多领域中,会用到通用功能部件,因此各个单片机厂商在芯片内部已经集成了多种功能部件,主要包括定时器、中断控制器和通信控制器等部件。x86系列的通用微型计算机的CPU需要通过I/O接口进行这些功能部件的外部扩展。目前,大量32位单片机的CPU内部集成了更多的功能部件,如A/D、D/A和多种外部通信接口。
单片机的硬件组成中,根据程序存储器和数据存储器的差异,其体系结构可分为冯·诺伊曼结构(Von Neumann Architecture)和哈佛结构(Harvard Architecture)。
冯·诺伊曼结构也称普林斯顿结构(Princeton Architecture),是一种将程序指令存储器和数据存储器合并在一起的概念结构,程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的位数相同,如Intel公司的8086处理器的程序指令和数据都是16位的。冯·诺伊曼结构的处理器必须具备一个存储器、一个控制器、一个运算器和输入/输出设备。由于冯·诺伊曼结构的程序指令和数据存储在同一个存储器中,形成系统对存储器的过分依赖,导致其运行效率相对较低,典型的x86、ARM7处理器采用该结构。
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,数据和程序指令的存储可以同时进行,可以使程序指令和数据有不同的位数,如Microchip公司的PIC16芯片的程序指令是14位的,而数据是8位的;MCS-51、ARM9、ARM10和ARM11等采用哈佛结构。
由于数据存储器与程序指令存储器采用不同的总线,因而较大地提高了存储器的带宽,使其数字信号处理性能更加优越,CPU运行效率相对更高。
1.位(bit)
位是计算机所能表示的最基本、最小的数据单元。计算机采用二进制数,所以位就是一个二进制位,它有两种状态——“0”和“1”。不同的二进制位组合就可以表示不同的数据、字符等信息。
2.字(Word)和字长
字是计算机内部进行数据处理的基本单位,通常它与计算机内部的寄存器、算术逻辑单元、数据总线位数一致。计算机的每一个字所包含的二进制位数称为字长。
3.字节(Byte)
相邻的8位二进制数称为字节。字节长度是固定的,但不同计算机的字长是不同的。8位计算机的字长等于1字节,而16位计算机的字长等于2字节,32位计算机的字长等于4字节。目前为了表示方便,常把1字节定为8位,把1个字定为16位,把1个双字定为32位。
4.存储容量
存储容量是衡量内部存储器能存储二进制信息量多少的一个技术指标。通常把8位二进制代码称为一字节(Byte),16位二进制代码称为一个字(Word),把32位二进制代码称为一个双字(DWORD)。存储器容量一般以字节为最基本的计量单位。一字节记为1B,1024字节记为1KB,1024KB记为1MB,1024MB记为1GB,而1024GB记为1TB。在表示存储容量时,大写字母“B”表示字节(Byte),小写字母“b”表示位(bit),比如16B实际表示16×8bit=128bit。
5.指令(Instruction)
指令是规定计算机进行某种操作的命令。它是计算机自动控制的依据。计算机只能直接识别0和1组合的编码,这就是指令的机器码。计算机的机器码指令长度可以是1字节、2字节,也可以是多字节,如4字节、6字节等。
6.程序(Program)
程序是指令的有序集合,是一组为完成某种任务而编制的指令序列。
7.指令系统(Instruction Set)
指令系统是一台计算机所能执行的全部指令。
8.指令流水线
指令流水线是为提高处理器执行指令的效率,把一条指令的操作分成多个细小的步骤,每个步骤由专门的电路完成的方式。
指令顺序执行时通常需要经过3个阶段:取指、译码、执行,每个阶段都要花费一个机器周期,如果没有采用流水线技术,那么执行这条指令需要3个机器周期;如果采用了指令流水线技术,那么当这条指令完成“取指”后进入“译码”时,下一条指令就可以进行“取指”了,这样就提高了指令的执行效率。
9.CISC和RISC
CISC(Complex Instruction Set Computer,复杂指令集计算机)指令能力强,但多数指令使用率低,进而增加了CPU的复杂度。它不仅带来了计算机结构上的复杂性,同时使程序设计更为复杂,致使出错的概率增加。此外,大量使用复杂的存储器操作指令,很难大幅提高计算机的效率。
RISC(Reduced Instruction Set Computer,精简指令集计算机)的最大特点是指令系统简单,使计算机的结构更加简单、更加合理,使系统达到最高的效率。为此,首先简化硬件设计,排除那些实现复杂功能的复杂指令,而保留能提高机器性能并且使用频率最高的指令。精简指令集计算机开始于20世纪80年代中后期。这是计算机体系结构发展的又一次重大变革,是计算机发展的必然趋势。RISC技术的主要特点如下。
● 采用高效的流水线操作,使指令在流水线中并行地操作,从而提高处理数据和指令的速度。
● 指令格式的规格化和简单化:为与流水线结构相适应且提高流水线的效率,指令的格式必须趋于简单和固定的格式。此外,尽量减少寻址方式,从而使硬件逻辑部件简化且缩短译码时间,同时也提高了机器执行效率和可靠性。
● 采用面向寄存器堆的指令:RISC结构采用大量的寄存器操作指令,使指令系统更为精简,控制部件更为简化,指令执行速度大大提高。
● 采用装入/存储指令结构:RISC结构的指令系统中,只有装入/存储指令可以访问内存,而其他指令均在寄存器之间对数据进行处理。用装入指令从内存中将数据取出,送到寄存器;在寄存器之间对数据进行快速处理,并将数据暂存在那里,以便再有需要时,不必再次访问内存,提高了指令执行的速度。
10.分时复用和多功能复用
单片机某些引脚具有分时复用功能,这些引脚在不同时段传输不同类型的信号,达到多路传输的目的。如MCS-51单片机P0端口的8个引脚具备地址/数据(AD0~AD7)分时复用功能,即这些引脚前一个时间段传输的是地址信号,后一个时间段传输的是数据信号。分时复用以时间作为信号分割传输的参量,故必须使各路信号在时间轴上互不重叠,从而使不同的信号在不同的时间内传送。
单片机某些引脚具有多功能复用功能,是指这些引脚具备多个功能,但在一个具体应用中,这些引脚只能选择其中一个功能,其他功能被禁止。
11.统一编址和独立编址
统一编址是指把I/O接口中有关的I/O端口(寄存器)与存储单元同等看待,将它们与存储单元一起统一编排地址,即对I/O端口的访问就如同对存储单元的访问一样。访问端口时,没有专用的I/O指令,所使用的是CPU对存储器的读/写操作指令,如MCS-51单片机外部扩展的I/O接口和RAM存储器统一编址,均采用MOVX指令进行访问。通常在整个地址空间中划分出一小块连续的地址分配给I/O端口;被分配给I/O端口的地址,存储器不能使用,存储器只能使用其他地址段。
独立编址是指I/O端口的地址和存储器的地址各自独立,分别编排,二者的地址空间是相互独立的。因此,必须有专门的I/O指令对端口进行操作。如8086系统中,对于I/O端口,CPU有专门的I/O指令去访问,如8086系统的I/O读写专用指令为IN/OUT指令。