1、STC单片机绪论主 讲:何宾Email: 2016.03作为 国产半导体芯片的典型代表 STC单片机,具有其独特的优点。在整个嵌入式系统领域中,占有一席之地。本章将以 STC单片机为背景,介绍单片机基础、 STC单片机简介、 STC单片机开发流程、 STC单片机结构及功能和 STC单片机引脚信号。通过 对 STC单片机整体的分析,帮助读者掌握学习 STC单片机的方法,从而达到举一反三、触类旁通的效果。STC单片机绪论单片机 是单片微型计算机( Single chip microcomputer)的简称,又称为微控制器( Micro Control Unit, MCU)。目前,众多厂商将单片机称
2、为微控制器,虽然这样看上去比单片机的名字显得更高级些,但是单片机这个词更能反映其本质特点。单片机 是 20世纪 70年代中期发展起来的一种超大规模集成电路芯片。典型的,大家通常所说的 8051单片机,属于 MCS-51单芯片系统的一种,它是由英特尔( Intel)公司于 1981年开发出来的。然后,英特尔公司将 MCS-51的核心技术授权给了很多公司,所以有很多公司在设计以 8051为核心的单片机系统。典型地, Atmel、飞利浦和 STC公司等。单片机基础-单片机发展历史随着半导体技术的不断发展,相继出现了 16位和 32位的单片机系统。特别是近几年来, ARM公司相继推出了更高性能的单片系
3、统,成为单片系统应用的一个热点领域。但是,作为传统领域的 8051单片机性能也得到了很大的提高,和 20世纪 80年代相比,其处理能力提高了几十倍。因此,仍有非常广阔的市场。如表 1.1所示,给出了单片机发展史上的一些重大事件。单片机基础-单片机发展历史年代 事件1971年 Intel公司研制出世界上第一个 4位的微处理器 Intel 4004,标志着微处理器芯片的诞生1971年 Intel公司推出 MCS-4微型计算机系统 ( 包括 4004微处理器 )1972年 Intel公司研制出第一个 8位微处理器 Intel 80081973年 Intel公司研制出 8位微处理器 8080, 标志第
4、二代微处理器的诞生1975年 MITS公司发布第一个通用型 Altair 8800, 标志世界上第一台微型计算机的诞生1976年 Intel公司研制出 MCS-48系列 8位单片机 , 标志着单片机的诞生1976年 Zilog公司开发出 Z80微处理器 , 用于微型计算机和工业自动控制设备1981年 在 MCS-48单片机的基础上 , Intel推出了 MCS-51系列的单片机1985年 Acorn公司的 Roger Wilson和 Steve Furber设计了 32位的 RISC指令集计算机 , 简称 ARM1990年 Acorn公司改组为现在的 ARM计算机公司单片机基础-单片机发展历史
5、从 字面上来说,单片机一词中的 “单片 ”是指一个芯片, “机 ”是指小型计算机系统。这个小型计算机系统的功能部件主要包括:中央处理单元、程序存储器、随机访问存储器、中断系统、计数器 /定时器、外设接口模块,以及连接各个功能部件的总线 ,下面 对单片机的各个功能部件进行说明,帮助读者从整体上把握单片机的结构单片机基础-单片机概念 中央 处理单元单片机基础-单片机概念 CPU( Central Processing Unit)是单片机系统的大脑和中枢,它可以完成下面最基本的功能: 与 不同地址空间的不同类型存储器交换信息 。 通过对存储器的读和写操作 , 完成 CPU和存储器的信息交换过程 。
6、执行 逻辑和算术指令 , 基本和常用的指令包括:加 /减运算 、 逻辑按位或运算 、 逻辑按位与运算 、 逻辑按位异或运算 、 移位运算等 。单片机基础-单片机概念更具体的说, CPU是由一些更小的子系统构成。这些重要的子系统包括: 程序计数器PC( Program Counter) 指向保存将要执行程序指令的存储器地址 。 然后 , 通过读操作 , 从 PC所指向的储存器的地址 , 获取具体的指令内容 。 指令中包含着操作码和操作数 。如果 在执行指令的过程中 , 并不是顺序的执行指令 , 比如遇到调转指令 , 那么 PC将加载新的所要运行指令的地址 , 并且从指向Flash新的地址位置的地
7、方执行程序 。单片机基础-单片机概念 指令 译码 单元从 实现的本质来说 , 指令译码单元就是一个复杂的有限自动状态机 ( Finite State Machine, FSM) , 它用于对来自程序存储器的指令内容进行翻译 。 从而 , 用于确定将要执行的指令 , 这些指令表示 CPU下一步所要执行的逻辑操作行为 。 这些逻辑操作行为 , 实际上就是一系列的控制序列 。 算术 逻辑单元ALU( Arithmetic Logic Unit) 是 CPU中最为重要的核心单元 。 通过指令译码单元发出的控制序列 , 从寄存器 、 存储器中取出需要运算的数据 , 并将其送到 ALU, 执行所要求的算术
8、运算或者逻辑运算 。单片机基础-单片机概念 控制 寄存器和状态寄存器组对于 CPU来说 , 其内部的控制寄存器组用于设置 CPU的工作模式 , 比如:设置 CPU的工作模式;而状态寄存器组用于反映 CPU当前的工作状态 , 比如: CPU执行加法运算的过程中 , 是否出现溢出 、 进位等 。单片机基础-单片机概念程序 存储器 程序存储器用于保存将要执行的程序代码 。 通常地 , 程序存储器是非易失性的 , 即一旦将程序固化到存储器中 , 除非重新固化程序到存储器 , 否则程序一直保存在存储器中 。 即使给单片机断电 ,在下次上电时 , 原来固化在程序存储器中的程序仍然存在 。 从工艺来说 ,
9、大多数单片机的程序存储器采用 Flash工艺 , 极少数的单片机采用一次可编程 ( One-Time-Programmable, OTP)工艺 。 当采用 Flash工艺时 , 设计者可以多次修改和固化程序;当采用 OTP工艺时 , 一旦程序固化 , 设计者就再也没有机会修改程序 。单片机基础-单片机概念随机访问 存储器 RAM( Random Access Memory) 存储器保存着在程序中所需要用到的数据 。 典型的 , 在 STC 8051单片机中 , 提供了用于不同目的 RAM。 通过不同的指令 , 实现对这些 RAM资源的访问 。中断系统 中断系统 用于 CPU对外部紧急事件的处理
10、 。 当 CPU正在执行当前的程序时 , 如果外部设备发出了紧急事件的请求 , 也就是通常所说的中断请求信号时 , 如果 CPU允许立即处理当前紧急事件时 ,则打断当前正在执行的程序 , 从而对紧急事件进行处理 , 也就是通常所说的用于处理紧急事件的程序 , 即:中断服务程序 。单片机基础-单片机概念 当 CPU开始对外部紧急事件进行处理时 , 会通过中断系统通知外部设备 CPU已经开始处理紧急事件 。 这样 , 外部设备会做出相应的判断 。定时器 /计数器 在单片机中 , 定时器 /计数器单元作为一个最基本的功能单元 。通过这个单元 , 可以对不同事件进行同步 。 典型地 , 当定时器中的计
11、数值到达预先设置的初值时 , 就会产生定时器中断信号 。 通过这个信号 , 外部设备可以做出相应的判断 。单片机基础-单片机概念 不同单片机厂商所提供的外部接口模块也不尽相同 。 但是 , 基本上都提供了通用 IO( General Purpose Input & Output, GPIO)和 RS-232接口等 。 根据产品的应用范围 , 不同单片机厂商还提供了一些个性化的外设 。 典型的 , STC公司在其单片机中就集成了模拟 数字转换器( Analog to Digital Converter, ADC) 模块 。总线 总线是一组相关逻辑信号的集合 。 目前大多数计算机系统都是基于总线的
12、结构 , 总线包括:控制总线 、 地址总线和数据总线 。单片机基础-单片机概念对于单片机系统来说,总线分为内部总线和外部总线。其中: 内部 总线用于连接芯片内各个模块单元 ; 外部 总线用于将外设连接到单片机上 。 与复杂计算机系统相比 , 单片机内的总线相对要简单些 。单片机基础-单片机概念嵌入式 系统这个词,目前是整个信息技术词汇中,出现频率最高的一个词。嵌入式系统伴随着我们的日常生活,典型地,智能手机、平板电脑、电子书等等。美国 电气和电子工程师协会( Institute of Electrical and Electronics Engineers)对 嵌入式系统 定义为用于控制、监视
13、或者辅助操作机器和设备的装置。更具体的说,嵌入式系统是以具体应用为导向的,以计算机技术为核心的,根据具体应用对硬件和软件系统量身订做的便于携带的微型计算机系统。图 1.2给出了嵌入式系统的软件和硬件体系结构。与普通计算机系统相比,嵌入式系统对功耗的要求非常苛刻。但是,在性能方面,对嵌入式系统的要求相对来说又非常高。单片机基础-单片机与嵌入式系统单片机基础-单片机与嵌入式系统单片机 是“物理”层面的概念,是指的某个芯片,只不过芯片内部集成了一个很小型的计算机系统而已;而嵌入式系统是一个“系统”层面的概念,包含了软件和硬件。从 应用的角度来说,我们经常说的“单片机”是指没有操作系统的软硬件系统,即
14、在硬件系统上,直接开发外设驱动程序和应用程序。我们通常所说的在单片机上“裸奔”,即表示在单片机硬件系统上直接运行应用程序;而我们经常所说的“嵌入式”是指带有操作系统的软硬件系统,即应用程序是构建在操作系统之上的。因此,对于嵌入式系统软件和硬件开发人员来说,他们所关注的重点并不相同。单片机基础-单片机与嵌入式系统相比 较之下,对于纯粹的软件开发人员开说,在操作系统之上开发应用,就不需要特别清楚的知道硬件系统构成情况的各个细节,而只需要大概了解一下即可;而在硬件上直接开发应用,就需要对底层的硬件系统非常清楚,比如:寄存器的地址、类型和其中每一位的含义等等。在 本书中,从嵌入式系统的角度说明基于 S
15、TC 8051单片机构成嵌入式系统的方法,其中就包含了在 8051单片机上实现并运行RTX51操作系统的方法。单片机基础-单片机与嵌入式系统世界上不论是哪个厂商开发出来的单片机,它们都具有下面共同的特点: 采用 存储程序的体系结构 , 即将程序保存在程序存储器中 。 本质 上都是串行执行程序的 , 都是靠程序计数器 ( ProgramCounter, PC) 来控制程序的运行 。 工作 在二进制状态 , 也就是通常所说的在 PC的控制下 , 通过取出指令 、 翻译指令和运行指令 , 运行二进制组成的机器代码 。 通过运行机器代码 , 来控制 CPU内各个功能部件的协调运行 。单片机基础-单片机
16、编程语言从 系统结构来说,单片机语言分为四个不同的层次,包括:控制CPU执行程序的微指令序列、机器语言、汇编语言和高级语言。单片机基础-单片机编程语言微指令控制序列 微指令控制序列存在于 CPU内部 , 对于单片机应用开发人员开说看不到 。 本质上 , CPU 就是通过由有限自动状态机所构成的微指令控制器对其内部的寄存器 、 存储器和 ALU等参与具体数据处理的功能单元 “ 发号施令 ” 。 比如:对于 CPU要实现对两个寄存器的数据进行相加的操作 , 则微指令控制器会发出一系列的控制序列 , 这些控制序列是按照 CPU的时钟周期 , 按顺序先后给出 。 微指令控制序列实际上是数字逻辑中 ,
17、组合逻辑和时序逻辑层面的概念 。 只有设计 CPU的工程师 , 才会接触到微指令控制序列 。单片机基础-单片机编程语言下面给出微指令控制序列控制两个数据相加过程的形式化描述 : 选择 某个寄存器 , 将加数读取出来; 选择 另一个寄存器 , 将被加数读取出来; 将 这两个操作数 , 送到 ALU; 根据 功能选择 , ALU执行加法运算; 同时 , ALU产生运算的结果和标志 , 比如:零标志 、 符号标志 、进位标志和溢出标志等 。 根据 指令的要求 , 将运算的结果 , 送到寄存器或者存储器中进行保存 。 可以看出 , 一个简单的加法运算 , 要产生一系列的控制序列 。 这也是通常所说的译
18、码和执行指令 。单片机基础-单片机编程语言机器语言 从上面可以知道 , 对于单片机的应用工程师来说 , 根本不需要微指令控制序 , 它只要 告诉 CPU, 执行加法运算即可 。 也就是不需要掌握 CPU内部结构的具体实现方式 。 输入给 CPU, 通知其执行加法运算的称为机器语言 。 如图 1.4所示 , 给出了 8051单片机中 , ACC累加器和一个常数( 立即数 ) 相加的机器语言的格式 。 从图中可以看出 , 机器语言是由 0和 1构成的序列 。 这个序列中包含操作码和操作数两部分 。其中:单片机基础-单片机编程语言操作码 操作码告诉 CPU所需要执行的操作 。 该指令的操作码用二进制
19、表示为: ( 00100100) 2, 用十六进制表示为: ( 24) 16。 操作码部分包含了操作的类型编码 , 同时也包含了一部分的操作数内容 , 指明了参与加法运算的一个数来自 ACC累加寄存器器中 。单片机基础-单片机编程语言操作数 操作数是执行操作所针对的对象 。 这些对象包括:立即数 ( 常数 ) , 寄存器和存储器等 。 图中:标记 immediate data表示立即数 ( 常数 ) , 占用了一个字节 ( 8个比特位 ) , 表示参与加法运算的另一个数 , 由立即数具体的取值指定 。 但是 , 纯粹意义上的机器语言对程序员太难理解了 , 为什么 ? 这是因为程序员是 CPU的
20、操作者 , 而不是 CPU的设计者 , 程序员根本不可能从二进制代码的排列中看出机器语言所描述的逻辑操作行为 。 而且 , 程序员很难记忆这些 0和 1的机器语言序列 。单片机基础-单片机编程语言汇编语言 为了帮助程序员从行为级上理解 CPU所执行的操作 , 计算机软件设计人员开发了一套基于助记符的 CPU指令系统的描述方法 。 通过汇编语言助记符指令 , 程序员可以将这些助记符所表示的 CPU指令组合在一起 , 构成一个复杂的称为 “ 程序 ” 的软件来控制CPU的运行 。 汇编语言助记符指令通过汇编器被翻译成机器语言指令 。 用汇编助记符描述机器指令完整的形式为:标号: 助记符 操作数 ;
21、注释 单片机基础-单片机编程语言标号 用来表示一行指令,助记符表示所要执行的逻辑操作行为,操作数为逻辑操作行为所操作的具体对象,现在用汇编语言来 描述机器指令 :ADD A, #25ADD表示数据相加操作, A表示目的操作数,即: ACC累加器;而 #25表示源操作数。因此,这个助记符汇编指令所表示的是,将立即数(常数) 25和 ACC累加器内所保存的数相加,得到的结果保存在 ACC累加器中。因此,在汇编语言级上理解 CPU的指令操作,更加直观,而且不用知道指令二进制的具体表示方式。因此,大大地降低了软件程序设计人员基于单片机开发程序的难度。单片机基础-单片机编程语言但是 ,由于汇编语言下面是
22、机器语言,所以对于使用汇编语言编程的程序员来说,他必须很清楚 CPU的指令集,寄存器单元和存储器映射等繁琐的硬件规则。虽然其执行效率基本上和机器语言一样,但是使用汇编语言编程效率很低。因为很多程序员根本不了解CPU的具体内部结构,所以对它们来说,使用汇编语言编程并不比使用机器指令编程好到哪里去,这也是一件令他们非常痛苦的事情。但是 ,汇编语言仍然非常重要。重要性体现在:一方面,对理解 CPU内部的结构和运行的原理非常重要;另一方面,很多与 CPU打交道的软件驱动程序,尤其是程序的引导代码必须用汇编语言开发。此外,在一些对程序执行时间比较苛刻的场合也需要使用汇编语言进行开发。单片机基础-单片机编程语言