16 位单片机原理及应用idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/... · 2010. 7....

343
普通高等教育“十一五”规划教材 16 位单片机原理及应用 杜刚 主编 袁文菊 陈海明 钟伟 金志伟 弭寒光 编著

Upload: others

Post on 14-Feb-2021

8 views

Category:

Documents


0 download

TRANSCRIPT

  • 普通高等教育“十一五”规划教材

    16位单片机原理及应用

    杜刚 主编 袁文菊 陈海明 钟伟 金志伟 弭寒光 编著

  • 内容提要

    本书综合作者多年的教学实践经验,系统介绍凌阳 16 位单片机(SPCE061A)原理及实用技术,主要讲述该单片机的内部结构、指令系统、开发工具、语音控制及单片机常用接口电路的原理和系统设计的基本方法,

    每章都给出了大量的实例和习题,以加深对理论的理解和运用。 本书内容循序渐进、通俗易懂、系统完整、实用性强,适合作为高等院校电子、自动化、通信、测控等专业

    的教材或教学参考书,也可作为全国大学生电子设计竞赛的培训教程和电子科技活动的参考资料,还非常适

    合广大单片机爱好者自学使用。 图书在版编目(CIP)数据 16位单片机原理及应用/杜刚主编.—北京:中国电力出版社,2007.1 普通高等教育“十一五”规划教材 ISBN 978-7-5083-4691-5 Ⅰ. 1... Ⅱ. 杜... Ⅲ. 单片微型计算机-高等学校-教材 Ⅳ. TP368.1 中国版本图书馆 CIP数据核字(2006)第 150353号 丛 书 名:普通高等教育“十一五”规划教材 书 名:16位单片机原理及应用 出版发行:中国电力出版社

    地 址:北京市三里河路 6号 邮政编码:100044

    电 话:(010)68362602 传 真:(010)68316497,88383619

    本书如有印装质量问题,我社负责退换

    服务电话:(010)88515918(总机) 传 真:(010)88518169

    E-mail:[email protected]

    印 刷:北京市同江印刷厂 开本尺寸:185×260 印 张:21.75 字 数:536千字 书 号:ISBN 978-7-5083-4691-5 版 次:2007年 1月北京第 1版 印 次:2007年 1月第 1次印刷 印 数:0001—4000册 定 价:29.80元 版权所有,翻印必究

    mailto:[email protected]

  • SPCE061A单片机简介

    1

    第 1章 SPCE061A单片机简介

    1.1 单片机的发展

    单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集

    成到一个芯片上。它有自己的中央处理单元 CPU、寄存器、存储器(RAM 和 ROM)、定时/计数器和多种标准 I/O口等必备的硬件资源。概括地说,这块芯片就相当于一台有一定规模的、功能独特的微型计算机,只是它的集成度高、体积小、质量轻、价格便宜。 单片机的发展历史并不长,从 1975年美国 TI公司发表 TMS1000系列 4位单片机开始,

    在短短的 30年内,单片机的种类就发展到了几百种。从 8位到 16位,再到 32位,集成度越来越高,功能也越来越强。

    单片机可大致分为专用和通用两类。一种是针对专门用途的芯片,即专用单片机,如 TI公司 TMS320 系列的 DSP 专用信号处理的单片机。它们以指令执行周期短、运算速度快、精度高而被广泛用于数字信号实时处理中。另外一种是当前流行的通用单片机。主要有 8 位的MCS-51系列、16位的 MCS-96系列以及本书介绍的 16位 SPCE061A单片机和 32位的 AT91系列的 ARM 微型控制器。另外,在这些系列之上还扩展衍生了很多其他类型,比如 51 系列升级版本的单片机:AVR 系列单片机。虽然单片机的种类繁多,但是其功能设计等方面是基本一致的,只是片内资源和扩展资源不一样而已。 作为微型机发展中的一个分支,单片机以其规模不大、功能较全的优点,已经渗透到各个

    领域:导弹的导航装置、飞机上各种仪表的控制、计算机的网络通信与数据传输、工业自动化

    过程的实时控制和数据处理、手机控制、程控玩具以及电子宠物等。因此,单片机的学习、开

    发与应用能造就一批计算机应用与智能化控制的科学家和工程师。

    1.2 凌阳系列单片机简介

    1.2.1 凌阳单片机家族

    凌阳科技公司(Sunplus Technology Co., Ltd.)是全球知名的芯片设计公司,在单片微处理器上,发展了从 8位系列微控制器到µ’nSP™系列 16位微控制器和 32位微控制器的核心技术。同时,形成了完整的 IC 产品线,应用在电子词典、计算机外围设备,智能家电控制器、数码相机、VCD和 DVD播放器等产品领域,在日常生活中无所不在。另外,随着单片机功能集成化的发展,其应用领域也逐渐地由传统的控制扩展为控制处理、数据处理以及数字信号处理

    (DSP,Digital Signal Processing)等领域。凌阳 16位单片机就是为适应这种发展而设计的。其主要产品有:带语音功能的 SPCE通用单片机系列,工业级控制型的 SPMC通用单片机系列,

  • 第 1章

    2

    应用于视频游戏类产品的 SPG系列单片机,带有 LCD显示驱动的 SPL16系列单片机,专用于通信产品的 SPT系列单片机,应用于高档电子乐器、和弦发声的 SPF 系列单片机等。其家族如图 1-1所示。

    图 1-1 凌阳 16位单片机家族图

    凌阳 8位系列单片机产品的主要类别有:带 LCD驱动的 SOC芯片、多媒体应用芯片、语音芯片、通用单片机等。其中,SPMC65系列和 SPMC75F系列单片机是新推出的产品,下面分别介绍这两个系列的单片机。

    SPMC65系列是一个 8位工业级通用型单片机,广泛应用于家用电器、工业控制、仪器仪表等控制领域。它采用 8位 SPMC65 CPU内核,并围绕这个内核集成不同的片内资源,形成了从低档到高档的一系列产品。尤其为其应用领域做了具有针对性的增强设计。如,加强 I/O端口以提高 I/O端口的驱动能力和抗干扰能力,采用增强的复位系统以提高系统的可靠性,提供可靠而完整的 CCP功能的定时/计数器等。

    SPMC75F系列则以µ’nSP™为内核,它集成了能产生变频电机驱动的 PWM发生器、多功能捕获比较模块、BLDC电机驱动专用位置侦测接口、两相增量编码器接口等硬件模块,以及多功能 I/O口、同步和异步串行口、ADC、定时/计数器等功能模块。利用这些硬件模块支持,SPMC75系列可以完成诸如家电用变频驱动器、标准工业变频驱动器、多环伺服驱动系统等复杂应用。

    1.2.2 µ’nSP™家族的特点

    围绕µ’nSP™16 位微处理器芯片所形成的 16 位µ’nSP™系列单片机,采用的是模块式集成结构,它以µ’nSP™内核为中心集成不同规模的 ROM、RAM和功能丰富的各种外设接口部件,比如 AD/DA,具体如图 1-2所示。

    µ’nSP™内核是一个通用的核结构。除此之外的其他功能模块均为可选结构,也就是这种结构可大可小或可

    有可无。借助这种通用结构附加可选结构的积木式的构

    图 1-2 µ’nSP™家族的模块式结构图

  • SPCE061A单片机简介

    3

    成,便可形成各种不同系列的派生产品,以适用于不同的应用场合。这样做无疑会使每一种派

    生产品具有更强的功能和更低的成本。 µ’nSP™家族具有以下特点: (1)体积小、集成度高、可靠性好且易于扩展。 µ’nSP™家族把各功能部件模块化地集成在一个芯片里,内部采用总线结构,因而减少了

    各功能部件之间的连线,提高了其可靠性和抗干扰能力。另外,模块化的结构易于系统扩展,

    以适应不同用户的需求。 (2)具有较强的中断处理能力。 µ’nSP™家族的中断系统支持 10个中断向量及 10余个中断源,适合实时应用领域。 (3)高性能价格比。 µ’nSP™家族芯片内带有高寻址能力的 ROM、静态 RAM和多功能的 I/O口。另外,µ’nSP™

    的指令系统提供了具有较高运算速度的 16位×16位的乘法运算指令和内积运算指令,为其应用增添了 DSP功能,使得µ’nSP™家族运用在复杂的数字信号处理方面既很便利,又比用专用的 DSP芯片廉价。 (4)功能强、效率高的指令系统。 µ’nSP™指令系统的指令格式紧凑,执行迅速,并且其指令结构提供了对高级语言的支持,

    这可以大大缩短产品的开发时间。 (5)低功耗、低电压。 µ’nSP™家族采用 CMOS制造工艺,同时增加了软件激发的弱振方式、空闲方式和掉电方

    式,极大地降低了其功耗。另外,µ’nSP™家族的工作电压范围大,能在低电压供电时正常工作,且能用电池供电。这对其在野外作业等领域中的应用具有特殊的意义。

    1.3 SPCE061A简介

    1.3.1 总述

    SPCE061A是凌阳家族单片机里的一种,它是伴随着“凌阳大学”计划推出的,具备了现代单片机的大部分特点,本书中的所有例子都将以它为核心进行讲解。SPCE061A整合了多个常用的功能模块,在进行系统开发的时候不用外加过多的硬件就可方便地完成一个系统的设

    计,这也是人们常说的 SoC(System on Chip)技术。在存储器资源方面,考虑到用户较少资源的需求以及便于程序调试等功能,SPCE061A只内嵌了 32K字的闪存(Flash),而其较高的处理速度使µ’nSP™能够非常容易地、快速地处理复杂的数字信号。因此,与其他系列相比,它是适用于数字语音识别应用领域产品的一种比较经济的选择。

    另外,SPCE061A也有升级的即将上市的工业级单片机 SPCE062A。后者采用高性能 u’nSP内核,具有 4级流水线结构,内置的专用 MIC接口和双路 16位 DAC使之非常适合于开发具备语音功能的产品,可方便灵活地实现高品质语音录制、语音播放等功能。此外,它也可作为

    通用微控制器。与 SPCE061A相比,它具有更加优秀的语音处理功能,着重提高了芯片的可靠性和抗干扰能力,并把温度范围提升到工业级(-40~85℃),在运算度和芯片资源等方面也有较大幅度的增强。

  • 第 1章

    4

    1.3.2 性能

    SPCE061A性能的具体参数和部分功能如下: • 16位µ’nSP™微处理器; • 工作电压(CPU)VDD为 2.4~3.6V,(I/O)VDDH为 2.4~5.5V; • CPU时钟为 0.32~49.152MHz; • 内置 2K字 SRAM; • 内置 32K字 Flash; • 可编程音频处理; • 晶体振荡器; • 系统处于备用状态下(时钟处于停止状态),耗电仅为 2µA/3.6V; • 两个 16位可编程定时/计数器(可自动预置初始计数值); • 两个 10位 DAC(数/模转换)输出通道; • 32位通用可编程输入/输出端口; • 14个中断源可来自定时器 A / B,时基,两个外部时钟源输入,键唤醒; • 具备触键唤醒的功能; • 使用凌阳音频编码 SACM_S240方式(2.4kb/s),能容纳 210s的语音数据; • 锁相环 PLL振荡器提供系统时钟信号; • 32768Hz实时时钟; • 7通道 10位电压模/数转换器(ADC)和单通道声音模/数转换器; • 声音模/数转换器输入通道内置麦克风放大器和自动增益控制(AGC)功能; • 具备串行设备接口; • 具有低电压复位(LVR)功能和低电压监测(LVD)功能; • 内置在线仿真电路 ICE(In- Circuit Emulator)接口; • 具有保密能力; • 具有WatchDog功能。 对应的 SPCE061A系统的特性参数如表 1-1所示。

    表 1-1 系统特性参数表

    特 性 参 数 SPCE061A 工作电压 2.6~3.6V 最大工作速率 49.152MHz CPU 16位µ’nSP™ SRAM容量 2K字 ROM容量 32K字闪存 ROM 并行 I/O端口 A IOA15~IOA0 并行 I/O端口 B IOB15~IOB0 音频输出方式 DAC×2 中断源 TimerA/B、时基信号发生器、外部中断、触键唤醒 唤醒源 IOA7~IOA0、其他中断源

  • SPCE061A单片机简介

    5

    续表

    特 性 参 数 SPCE061A 定时/计数器 双 16位加计数定时/计数器、双通道 PWM输出 UART 具备 ADC 7通道 10位电压模/数转换器(ADC)和单通道声音模/数转换器(ADC) 串行 SRAM接口 具备(凌阳格式) 晶振 具备 低电压复位 具备 低电压监测 具备 内置 ICE接口 具备 上电复位 具备 麦克风放大器和自动增益控制 单通道 节电功能 具备 中断控制功能 具备 触键唤醒功能 具备

    1.3.3 结构概览

    与一般单片机相比,SPCE061A 主要也由微控制器、时钟、RAM、定时/计数器等构成,只是片内资源多了 Flash和 AD/DA,其具体结构如图 1-3所示。

    图 1-3 SPCE061A的结构图

    1.3.4 芯片的引脚排列和说明

    SPCE061A有两种封装片,一种为 84个引脚,PLCC84封装形式,它的排列如图 1-4所示;

  • 第 1章

    6

    另一种为 80个引脚,LQFP80封装,它的排列如图 1-5所示。实物如图 1-6所示。

    图 1-4 SPCE061A PLCC84封装排列图

    图 1-5 SPCE061A LQFP80封装引脚排列图

  • SPCE061A单片机简介

    7

    图 1-6 SPCE061A PLCC84实物图

    在 PLCC84封装中,有 15个空余引脚,用户使用时这 15个空余引脚时要悬浮。在 LQFP80封装中有 9个空余引脚,用户使用时这 9个空余引脚要接地。此处以 PLCC84封装引脚功能介绍各个引脚,具体如表 1-2所示。

    表 1-2 引脚描述表

    引脚名称 引脚编号 类 型 描 述

    IOA[15:8] 60~53 输入/输出 IOA[15:8]:双向 I/O口

    IOA[7:0] 48~41 输入/输出 IOA[7:0]:通过编程,可设置成唤醒引脚 IOA[6:0]:与 ADC Line_In输入共享

    IOB[15:11]

    IOB10 IOB9 IOB8 IOB7 IOB6 IOB5 IOB4 IOB3 IOB2 IOB1 IOB0

    64~68

    76 77 78 79 80 81 1 2 3 4 5

    输入/输出

    输入/输出 输入/输出 输入/输出 输入/输出 输入/输出 输入/输出 输入/输出 输入/输出 输入/输出 输入/输出

    IOB[15:11]:双向 I/O端口 IOB[10:0]:除用作普通的 I/O端口,并有其复用功能 IOB10:通用异步串行数据发送端 Tx IOB9:TimerB脉宽调制输出引脚 BPWMO IOB8:TimerA脉宽调制输出引脚 APWMO IOB7:通用异步串行数据接收引脚 Rx IOB6:双向 I/O端口 IOB5:外部中断源 EXT2的反馈引脚 IOB4:外部中断源 EXT1的反馈引脚 IOB3:外部中断源 EXT2 IOB2:外部中断源 EXT1 IOB1:串行接口的数据传送信号 SDA IOB0:串行接口的时钟信号 SCK

    DAC1 21 输 出 DAC1数据输出引脚

    DAC2 22 输 出 DAC2数据输出引脚

    OSC32O 13 输 入 32 768Hz晶振输入引脚

    OSC32I 12 输 出 32 768Hz晶振输出引脚

    VCOIN 8 输 入 PLL的 RC滤波器连接引脚

    AGC 25 输 入 AGC的控制引脚

    MICN 28 输 入 麦克风负向输入引脚

    MICP 33 输 入 麦克风正向输入引脚

  • 第 1章

    8

    续表

    引脚名称 引脚编号 类 型 描 述

    VREFZ 23 输 出 电压源 2.0V 产生 5mA 的驱动电流,可用作外部 ADC Line_In通道的最高参考输入电压,不可作为电压源使用

    MICOUT 27 输 出 麦克风 1阶放大器输出引脚,引脚外接电阻决定 AGC的增益倍数

    OPI 26 输 入 麦克风 2阶放大器输入引脚

    VEXTREF 35 输 入 ADC Line_In通道的最高参考输入电压引脚

    VMIC 37 输 出 麦克风电源

    VADREF 34 输 出 AD参考电压(由内部 ADC产生)

    VDD 7,15 输 入 逻辑电源的正向电压

    VSS 9,19,38 输 入 逻辑电源和 IO口的参考地

    VDDIO 51,52,75 输 入 IO端口的正向电压引脚

    VSSIO 49,50,62 输 入 IO端口的参考地

    AVDD 36 输 入 模拟电路(A/D、D/A和 2V稳压源)正向电压

    AVSS 24 输 入 模拟电路(A/D、D/A和 2V稳压源)参考地

    RESET 6 输 入 低电平有效的复位引脚

    XSLEEP 63 输 出 睡眠模式(高电平激活)

    XICE 16 输 入 激活 ICE(高电平激活)

    XICECLK 17 输 入 ICE串行接口时钟引脚

    XICESDA 18 输入/输出 ICE串行接口数据引脚

    XTEST 14 输 入 测试模式时接高电平,正常模式时接地 GND或悬浮

    PFUSE,PVIN[1] 29,20 输 入 程序保密设定引脚,用户应慎重使用

    [1] 可将 PFUSE接 5V,PVIN接 GND并持续 1s以上即可将内部保险丝熔化,此后就无法再读取和向闪存加载数据了。

    1.3.5 SPCE061A最小系统

    在主芯片的 OSC0、OSC1端接上晶振及谐振电容,在锁相环压控振荡器的阻容输入 VCP端接上相应的电容电阻后,即可构成 SPCE061A最小系统,其硬件电路连接如图 1-7所示。其中,将不用的电源端和地端接上 0.1µF的去耦电容以提高抗干扰能力。

    1.3.6 SPCE061A的开发

    传统的单片机学习硬件方案采用的是“编程器+开发系统+仿真器”的方式,由于这些设备相互之间各自独立,用户在学习或开发项目时,需要反复不停地拔插电缆、芯片、电源等,其

    繁琐的连线和复杂的操作,极大地降低了学习和开发的效率,如稍有不慎还可能造成器件和设

    备的损坏,给用户带来不必要的麻烦或损失。而且备齐这些设备往往需要一笔昂贵的费用,这

    也大大提高了单片机学习的门槛。

  • SPCE061A单片机简介

    9

    图 1-7 SPCE061A最小系统原理图

    SPCE061A单片机学习开发系统则将开发软件、单片机开发系统(或称“实验板”)、下载线、编程器和仿真器进行了完美的结合。SPCE061A单片机整合了在线编程控制的功能模块,在试验过程中无需拔插任何电缆和芯片,也无需切换电源,只需配合下载线,就可轻松地将编

    译好的代码下载到开发系统上进行验证或演示,整个过程操作简单。同时也可以使用配套的开

    发环境直接对实验板上的资源进行在线仿真。

    SPCE061A的开发是通过在线调试器 PROBE实现的。它既是一个编程器(即程序烧写器),又是一个实时在线调试器。用它可以替代在单片机应用项目开发过程中常用的软件工具——硬

    件在线实时仿真器和程序烧写器。它利用的是 SPCE061A 芯片内置的在线仿真电路 ICE(In- Circuit Emulator)接口和凌阳公司的在线串行编程技术。PROBE工作于凌阳 IDE集成开发环境软件包下,其 5 芯的仿真头直接连接到 SPCE061A 相应的引脚上,直接在 SPCE061A 上调

  • 第 1章

    10

    试、运行用户编制的程序。它的另一头是标准 25 针打印机接口,直接连接到计算机打印口与上位机通信,在计算机的 IDE集成开发环境软件包下,完成在线调试功能。图 1-8是计算机、PROBE、用户目标板三者之间的连接示意图,图 1-9是实物连接图。

    图 1-8 用户目标板、PROBE、计算机三者之间的连接图

    图 1-9 实物连接图

    总之,采用 SPCE061A单片机进行开发比采用传统单片机进行开发的过程要简化很多,而且开发方便,开发周期短。

    1.3.7 应用领域

    SPCE061A单片机的通用性很强,应用范围也非常广泛,主要如下: • 家用电器控制器:冰箱、空调、洗衣机等白色家电; • 仪器仪表:数字仪表(有语音提示功能); • 电表、水表、煤气表、暖气表; • 工业控制; • 智能家居控制器; • 通信产品:多功能录音电话、自动总机、语音信箱、数字录音系统产品;

  • SPCE061A单片机简介

    11

    • 医疗设备、保健器械(电子血压计、红外体温监测仪等); • 体育健身产品(跑步机等); • 电子书籍(儿童电子故事书类)、电教设备等; • 语音识别类产品(语音识别遥控器、智能语音交互式玩具等)。

    1.4 本 章 小 结

    随着单片机技术的发展,其功能越来越强大,外围功能模块也都或多或少的集成在单片机

    中。和传统单片机相比,凌阳单片机不需要扩展程序和数据存储器,也无须扩展 A/D和 D/A器件,并且在运算速度和精度上都有了很大的提高。它们不仅在硬件资源上有很大的优势,同时

    在软件开发上也都十分方便和省时省力。凌阳单片机家族以µ’nSP™内核为核心,根据需求集成不同的外围资源模块而开发出了不同系列的产品。本节将重点介绍其中的 SPCE061A 的结构、性能和芯片的引脚排列与说明,并将简要介绍 SPCE061A最小系统、开发方式及其应用领域。

    凌阳单片机的整体框图如图 1-10所示。

    图 1-10 凌阳单片机整体框图

    总之,凌阳 16位单片机 SPCE061A继承了单片机的一般特点,并集成了更多的功能模块和片内资源,其开发方便简单,功能更强,应用更广。

    习 题

    1.什么是单片机?单片机的特性有哪些?如何分类? 2.µ’nSP™系列单片机有哪些特点? 3.SPCE061A的结构的特点是什么?它与一般的单片机的区别是什么? 4.SPCE061A共有多少个并行 I/O引脚? 5.开发 SPCE061A单片机的基本过程? 6.试画出 SPCE061A最小系统的电路图。

  • 第 2章

    12

    第 2章 SPCE061A单片机硬件结构

    SPCE061A的结构比较简单,从第 1章 SPCE061A的结构图中可以看出,它的芯片内部集成了 ICE仿真电路接口、Flash程序存储器、SRAM数据存储器、通用 I/O端口、定时/计数器、中断控制、CPU时钟、模/数转换器 ADC、数/模转换器 DAC、通用异步串行输入输出接口、串行输入输出接口、低电压监测/低电压复位等若干部分。各个部分之间存在着直接或间接的联系,在本章中将着重介绍内核的结构及其基本硬件结构。

    2.1 µ’nSP™的内核结构

    µ’nSP™的内核结构如图 2-1 所示。它由总线、算术逻辑运算单元、寄存器组、中断系统及堆栈等部分组成,图右边的文字为各部分的简要说明。

    图 2-1 µ’nSP™的内核结构

    2.1.1 算术逻辑运算单元 ALU

    µ’nSP™的 ALU在运算能力上很有特色,不仅能做 16位基本的算术逻辑运算,也能做带

  • SPCE061A单片机硬件结构

    13

    移位操作的 16位算术逻辑运算,同时还能做用于数字信号处理的 16位×16位的乘法运算和内积运算。

    1.16位算术逻辑运算 µ’nSP™与大多数 CPU类似,µ’nSP™提供了基本的算术运算与逻辑操作指令,如加、减、

    比较、取补、异或、或、与、测试、写入、读出等 16位算术逻辑运算及数据传送操作。 2.带移位操作的算术逻辑运算 在图 2-1 中,µ’nSP™的 ALU 前面串接有一个移位器 SHIFTER,也就是说,操作数在经

    过 ALU的算术逻辑操作前可先进行移位处理,然后再经 ALU完成算术逻辑运算操作。移位操作包括算术右移、逻辑左移、逻辑右移、循环左移以及循环右移。因此,µ’nSP™的指令系统里专有一组复合式的“移位算术逻辑操作”指令。其一条指令可完成移位和算术逻辑操作两项

    功能。因此,利用这些复合式的指令,可编写比较精简的程序代码,进而增加程序代码密集度

    (Code Density)。在微控制器应用中,如何增加程序代码密集度是一个非常重要的议题。因为提高程序代码密集度意味着减少程序代码的大小,进而减少 ROM或 Flash的需求,以此降低系统成本与增加执行效能。特别是一些大量 DSP 处理的积方才会因此而简化,这样也就提高了积方整体的运行速度。

    3.16位×16位的乘法运算和内积运算 除了普通的 16 位的算术逻辑运算指令外,µ’nSP™的指令系统还提供处理速度较高的 16

    位×16 位的乘法运算指令 Mul 和内积运算指令 Muls。二者都可以用于两个有符号数或一个有符号数与一个无符号数的运算。在 ISA1.1指令集下,Mul指令只需花费 12个时钟周期,Muls指令花费 10n+6个时钟周期,其中 n为乘积求和的项数。例如,“MR=[R2]*[R1],4”表示求 4项乘积的和,Muls指令只需花费 46(10×4+6=46)个时钟周期。这两条指令为µ’nSP™应用于复杂的数字信号处理运算方面提供了便利的条件。

    2.1.2 寄存器组

    寄存器经过设置后,参加运算的操作数及运算的中间结果就可以存放在寄存器中,而不必

    每次都送入存储器存放,这样就可提高计算机的工作速度,简化指令和代码。另外,寄存器还

    可以寄存存储器地址。µ’nSP™内核的 CPU寄存器组里有 8个 16位寄存器,可分为通用型寄存器和专用型寄存器两大类别。通用型寄存器包括 R1~R4。专用型寄存器包括 SP、BP、SR、PC,是与 CPU特定用途相关的寄存器。

    1.通用型寄存器 R1~R4 通用型寄存器通常可分别用于数据运算或传送的源及目标寄存器。而寄存器 R4、R3配对

    使用还可组成一个 32位的乘法结果寄存器 MR,其中 R4为结果的高字组,R3为结果的低字组,用于存放乘法运算或内积运算的结果。

    2.堆栈指针寄存器 SP SP 是在 CPU 执行压栈/出栈指令(push/pop)、子程序调用/返回指令(call/retf)以及进

    入中断服务子程序(ISR,Interrupt Service Routine)或从 ISR返回指令(reti)时自动减少(压栈)或增加(弹栈),表示堆栈指针的移动。它起着管理堆栈的作用,而且堆栈指针 SP始终都是指向堆栈顶部单元,因此保证堆栈按照先进先出的原则处理数据。SPCE061A 堆栈的最大容量范围是限制在 2K字的 SRAM内的,即地址为 0x000000~0x0007FF的存储器

  • 第 2章

    14

    范围中。 3.基址指针寄存器 BP µ’nSP™提供了一种方便的寻址方式,即变址寻址方式[BP+IM6]。程序设计者可通过它直

    接存取 ROM 与 RAM 中的各种数据,包括局部变量(Local Variable)、函数参数(Function Parameter)和返回地址(Return Address)等,这在 C语言程序中是特别有用的。BP除了上述用途外,也可作为通用寄存器 R5用于数据运算或传送的源及目标寄存器。因此,在程序中,BP与 R5是共享的,均代表基址指针寄存器。

    4.段寄存器 SR 参见图 2-1,其中的段寄存器 SR有多种功能用途。其中代码段选择字段(CS)和数据段

    选择字段(DS)可分别与其他 16 位的寄存器合在一起形成 22 位地址线,用来寻址 4M字容量的存储器。注意,SPCE061A只有 32K字闪存 Flash,仅占一页存储空间,所以代码段选择字段(CS)和数据段选择字段(DS)在 SPCE061A中不用。 算术逻辑运算结果的各标志位 NZSC也存储在其中,即 SR中间的 4位(B6~B9)。CPU

    在执行条件/无条件短跳转指令(JUMP)时需测试这些标志位以控制程序的流向。这些标志位的内容如下。 (1)进位标志位 C:C=0时表示运算过程中无进位或有借位产生,而 C=1时,则表示运算

    过程中有进位或无借位产生。在无符号数运算中,16 位数可以表示的数值范围是 0x0000~0xFFFF,即 0~65535。如果运算结果大于 65535(0xFFFF),则标志位 C被置 1。注意,标志位 C一般用于无符号数运算的进、借位判断。 (2)零标志位 Z:Z=0时表示运算结果不为 0,Z=1时表运算结果为 0。 (3)负标志位 N:标志位 N用来判断运算结果的最高位(B15)为 0还是为 1。B15=0时,

    N=0;B15=1时,N=1。 (4)符号标志位 S:S=0时表示运算结果不为负,S=1时则表示运算结果(在二进制补码

    的规则下)为负。对于有符号数运算,16位数所表示的数值范围为 0x8000~x7FFF,即−32768~32767。若运算结果小于零,则标志位 S置 1。有符号数运算的运算结果可能会大于 0x7FFF或小于 0x8000。例如,0x7FFF+0x7FFF=0xFFFE(65534),运算结果为正(S=0),且无进位(C=0)发生。在这样的情况下,标志位 N被置 1(因为最高有效位为 1)。若标志位 N和 S不同,即S=0,N=1或 S=1,N=0,则说明有溢出发生。例如,当为有符号数时,可判断正负。而 JVC(N==S),JVS(N!=S)则可用来判断溢出(Overflow)。注意,N、S的组合可用于有符号数溢出的判断。在运算操作过程中,若目标寄存器是 PC,则所有标志位均不会受到影响。 小结:

    (1)由于补码可以把有符号数与无符号数的运算统一起来,因此对于同一条加法或减法指令,既可以认为是有符号数运算又可以认为是无符号数运算,只是观察的角度、判断的标准不

    同而已。 (2)标识位 C一般用于无符号数运算的进、借位判断。 (3)N、S的组合用于有符号数溢出的判断。 (4)有符号数的范围为−32768~32767,无符号数的范围为 0~65535。若为有符号数,运

    算前数的正负应通过标识位“N”判断;运算后结果的正负应通过标识位“S”判断。 下面举几个例子来分析说明标识位。

  • SPCE061A单片机硬件结构

    15

    【例 2-1】R1=32767,R2=32767,标识位为 N=0,Z=0,S=0,C=1,求二者之和。运算后R1中的内容为 0xFFFE,C=0。

    R1=32767 //赋值后 R1=0x7FFF R2=32767 //赋值后 R2=0x7FFF R1+=R2 //运算后的标识位为 N=1,Z=0,S=0,C=0; R1=0xFFFE 若作为无符号数看待,此时 C为 0,说明无进位产生,也无溢出。 若作为有符号数看待,此时 N!=S,说明计算结果超出有符号数的范围,即产生溢出,另

    外 S为 0说明运算结果不为负。 【例 2-2】R1=−12345,R2=−1,标识位为 N=1,C=1,Z=0,S=0,求二者之和。运算后

    R1中的内容为 0xCFC6。

    R1=-12345 //赋值后 R1=0xCfC7 R2=-1 //赋值后 0xFFFF R1+=R2 //运算后的标识位为 N=1,Z=0,S=1,C=1,此时 R1=0xCfC6。 若作为无符号数看待,此时 C为 1说明有进位产生。 若作为有符号数看待,此时 N=S说明无溢出产生,S为 1说明运算结果为负。 【例 2-3】R1=32767,R2=−12345,标识位为 N=1,Z=0,S=0,C=1,求二者之差。运算

    后 R1中的内容为 0xB038,C=0。

    R1=32767 //赋值后 R1=0x7FFF R2=-12345 //赋值后 R2=0xC7C7 R1-=R2 //运算后的标识位为 N=1,Z=0,S=0,C=0,R1=0xB038 若作为无符号数看待,此时 C为 0,说明有借位产生。 若作为有符号数看待,此时 N!=S,说明有溢出产生,S为 0说明运算结果为正。 5.程序计数器 PC 程序计数器 PC(Program Counter)是管理程序执行次序的特殊功能寄存器。程序的执行

    一般有两种情况:按照顺序执行和跳转。因此它需要具有 3种功能:复位功能、计数功能和直接置位功能。 (1)复位功能:计算机在上电复位或者操作复位(按钮复位)进入初始状态时,PC 的内

    容被置为 0x8000,程序由此开始执行。 (2)计数功能:CPU读取每一条指令时,都是将 PC的内容作为指令地址,并经地址总线

    送到存储器,从而从该地址单元中取回指令的机器码,送到指令寄存器。同时,每取回一个指

    令代码,PC的内容自动加 1。因此,在取回指令进入执行指令的阶段,PC中的内容已经是按顺序排列的下一条指令的地址。 (3)直接置位功能:PC 也能直接接收内部总线送来的数据,并用该数据取代其原有的内

    容,从而使程序的执行发生转移。 综上所述,µ’nSP™的程序计数器的作用与所有微控制器中的 PC 的作用均相同,是作为

    程序的地址指针来控制程序走向的专用寄存器。CPU每执行完当前指令,都会将 PC值和当前指令所要占据的字节数或字数进行累加,以指向下一条指令的地址。在µ’nSP™里,16位的 PC通常可与 SR寄存器的 CS选择字段共同组成 22位的程序代码地址。

  • 第 2章

    16

    2.1.3 数据总线和地址总线

    µ’nSP™是 16位单片机,它具有 16位数据线和 22位地址线。由此决定其基本数据类型是16位的 word型,而不是 8位的 Byte型,因而每次存储器都是按 word操作的,22位地址线最多可寻访 4M字的存储容量。地址线中的高 6位 A16~A21来自段寄存器 SR中的 6位代码段(CS,Code Segment)和 6位数据段(DS,Data Segment)选择字段,低 16位 A0~A15则来自内部寄存器。通常,地址线的高 6位称为存储器地址的页选,简称页码(Page);而低 16位则称为存储器地址的偏移量(Offset)。µ’nSP™通过对段(Segment)的编码来实现存储器页的检索,即 Segment的含义与 Page的含义是等同的。因而,通过 Segment与 Offset的配合即可产生 22位地址线,参见图 2-1中的 ADDRGEN所示。

    2.2 SPCE061A片内存储器结构

    存储器一般分为只读存储器(ROM)和读写存储器(RAM)两种,前者存放调试好的固定程序和常数,后者存放一些随时有可能变动的数据。只读存储器一旦将数据存入,就只能读

    出,不能更改(EPROM、E2PROM等类型的 ROM可通过一定的方法来更改、写入数据)。而读写存储器可随时存入或读出数据,其读取、存入的时间都很短。

    因为断电后信息就会丢失,所以适合暂存原始数据、中间结果及

    最后的运算结果。 基于单片机系统内部 ROM、RAM 存储器的编址有两种方

    式:一种是 ROM、RAM、I/O 统一编址;另一种是独立编址,称为哈佛结构。SPCE061A是存储器统一编址的存储结构。其片内存储器地址映射如图 2-2所示。

    0x0700~0x07FF地址是 2K字的 SRAM(包括堆栈区)。 0x0800~0x6FFF地址保留,未使用。 0x7000~0x7FFF 地址是 I/O 和系统端口,也是专用的控制

    设置寄存器和输入/输出口地址,与 51的特殊功能寄存器的作用类似。 0x8000~0xFFF5地址是 32K字闪存(Flash ROM),作为程序和有关数据的存储。 0xFFF6~0xFFFF地址是中断向量入口地址。 µ’nSP™单片机复位后 PC的数值被置为 0x8000,程序由此开始执行。

    2.2.1 RAM

    RAM 一般分为动态存储器(DRAM)和静态存储器(SRAM)两大类。SPCE061A 的读写存储器的类别是静态存储器 SRAM,它的地址范围从 0x0000~0x07FF。其中,前 64个字,即 0x0000~0x003F地址范围内可采用 6位地址直接地址寻址方法,寻访速度为两个 CPU时钟周期。其余的 0x0040~0x07FF地址范围内存储器的寻访速度则为 3个 CPU时钟周期。

    2.2.2 堆栈

    堆栈是一个区域,用来存放因中断或子函数调用等而需要保存的一些数据。这个区域就是

    图 2-2 SPCE061内存映射表

  • SPCE061A单片机硬件结构

    17

    SRAM的一部分,只是它有特殊的存取数据的原则,即“先进后出,后进先出”。对应的有特殊的数据传输指令:PUSH 和 POP,而且还有一个特殊的专为其服务的堆栈指针 SP,每执行一次 PUSH指令,SP就自动减 1,每执行一次 POP指令,SP就自动加 1。另外,SP中的值可以用指令设置,如在程序开始时,用指令把堆栈设置在从内存单元程序开始的某个自定义的单

    元中。设置好堆栈区后,并不意味着该区域成

    为一种专用内存,它还是可以像普通内存区域

    一样使用,只是在一般情况下编程者不会再把

    它当成普通内存用了。 同其他单片机一样,SPCE061A的堆栈是在

    内存 SRAM 区专门开辟出来的按照“先进后出”原则进行数据存取的一种工作方式,如图

    2-3所示。它主要用于子程序调用及返回和中断处理断点的保护及返回。堆栈的最大容量范围

    限制在 2K字 SRAM内,即其地址是在从 0x07FF~0x0000的存储器范围中。值得注意的是,堆栈的生长方向是自顶向下的,SPCE061A系统复位后,SP初始化为 0x07FF,每执行一次 PUSH指令,SP指针就会减 1。

    2.2.3 闪存 Flash

    SPCE061A的闪存是一个MTP(多次编程)芯片,具有 32K字(32K×16位)闪存容量。编程者可用闪存来存储用户程序。为了安全起见,它不开放整体的擦除功能。用户必须通过向

    P_Flash_Ctrl(写)($7555H)单元写入 0xAAAA 来激活闪存的存取功能,从而去访问闪存。然后,向 P_Flash_Ctrl(写)($7555H)单元写入 0x5511来擦除页的内容。最后,写入 0x5533,对闪存进行编程。这些指令不能被任何其他的操作包括中断、ICE的单步跟踪动作打断。这是因为闪存控制器必须保证闪存处于编程状态。如果其他的进程插入到当前的执行队列里,闪存

    的状态将发生改变,擦除页和编程的操作不能再继续进行。 此外,为保证程序的正确编写,用户必须在编程之前先擦除页的内容。页大小为 0x100。

    第一页的地址范围是 0x8000~0x80FF,最后一页的地址范围是 0xFF00~0xFFFF。0xFC00~0xFFFF范围内的地址由系统保留,用户最好不要用本范围内的地址。

    32K字的内嵌式闪存被划分为 128个页(每个页存储容量为 256个字),它们在 CPU正常运行状态下均可通过程序擦除或写入。全部 32K 字闪存均可在 ICE 工作方式下被编程写入或被擦除。

    1.读存储单元操作 芯片上电后,芯片就处于读存储单元状态,读存储单元的操作是与 SRAM相同的。 2.擦除操作 在对闪存进行编程操作前,必须对闪存进行擦除操作。由于闪存采用模块分区的阵列结构,

    从而使得各个存储模块(页)可以被独立地擦除。当给出的地址是在模块地址范围之内且向命

    令用户接口写入模块擦除命令时,相应的模块就被擦除。要保证擦除操作的正确完成,则必须

    考虑以下参数: (1)该闪存的内部模块分区结构。

    图 2-3 堆栈

  • 第 2章

    18

    (2)每个模块分区的擦除时间。 3.编程操作 闪存芯片的编程操作是自动字节编程,既可以顺序写入,也可指定地址写入。进行编程操

    作时要注意芯片的编程时间参数。Flash 程序空间为 0x8000~0xFFFF,Flash 命令用户接口地址为 0x7555。第一页的范围是 0x8000~0x80FF,最后一页的范围是 0xFF00~0xFFFF。 (1)擦除一页的流程:先给命令用户接口地址 0x7555里送 0xAAAA,然后再给命令用户

    接口地址 0x7555里送 0x5511,再给要擦除页的地址送任意数,约 20ms即可完成擦除操作,之后可以执行其他操作。例如,擦除第 6页(0x8500~0x85FF)的流程如下: 第一步 0x7555←0xAAAA;第二步 0x7555←0x5511;第三步 0x85XX←0xXXXX(其中 X

    为任意值)。 (2)写入一个字的流程:先给命令用户接口地址 0x7555里送 0xAAAA,然后再给命令用

    户接口地址 0x7555 里送 0x5533,再给要写入字的地址送数据,约 40µs 即可完成写入操作,之后可以执行其他操作。例如向 0x8000单元写入 0xFFFF的流程如下: 第一步 0x7555←0xAAAA;第二步 0x7555←0x5533;第三步 0x8000←0xFFFF。 (3)写多个字的流程:先给命令用户接口地址 0x7555里送 0xAAAA,然后再给命令用户

    接口地址 0x7555 里送 0x5544,然后给要写入字的首地址送数据,约 40µs 即可完成 1 个字的写入操作。再给命令用户接口地址 0x7555里送 0x5544,给要写入字的地址送数据,等待 40µs即可,循环操作,即可完成多字的写入。 上面所提到延时等待是由硬件完成的(不需要软件延时),闪存的擦写过程如图 2-4所示。

    图 2-4 闪存的擦写过程

    以上所介绍的擦除及写操作有一定的适应范围,一般情况下是用于对数据的擦除。例如,

    当把一个程序段写入程序存储器后,由于程序代码占用的空间可能比较小(假如为 5K 字),因此可以在程序代码段后面的空间(5K~32K 字)存储一些数据,这样就可以对这一段的空间(5K~32K字)进行上述的写或擦除操作。前提条件是必须计算出程序代码占用的空间。 【例 2-4】Flash读写

    //================================================================ //程序名称:FLASH.asm //描述:擦除、写 1字、写多字子程序 //================================================================

  • SPCE061A单片机硬件结构

    19

    .INCLUDE hardware.inc //头文件

    .DEFINE C_FLASH_SIZE 0x8000 //定义 Flash的空间为 32K字

    .DEFINE C_FLASH_BLOCK_SIZE 0x0100 //定义共分为 256页

    .DEFINE C_FLASH_MATCH 0xAAAA

    .DEFINE C_FLASH_PAGE_ERASE 0x5511 //擦除一页控制字

    .DEFINE C_FLASH_1WORD_PGM 0x5533 //写一个字的控制字

    .DEFINE C_FLASH_SEQUENT_PGM 0x5544 //写多个字的控制字

    .CODE //======================================================== // 汇编格式:F_FlashWrite1Word // 实现功能:写一个字到 FLASH中 // 入口参数:被写数据的存储地址; 被写数据 // 出口参数:无 //======================================================== .public _F_FlashWrite1Word .DEFINE P_Flash_Ctrl 0x7555 _F_FlashWrite1Word: .proc PUSH BP TO [SP] //将 BP 压入栈内 BP = SP + 1 //BP的值变为 SP+1 R1 = C_FLASH_MATCH //先送 AAAA [P_Flash_Ctrl] = R1 R1 = C_FLASH_1WORD_PGM //再送 5533 [P_Flash_Ctrl] = R1

    R1 = [BP+3] //取存储数据地址 R2 = [BP+4] //取数据 [R1] = R2 //把数据写入内存单元中 POP BP FROM [SP] //出栈

    RETF //子程序返回 .ENDP //======================================================== // 汇编格式:F_FlashWrite // 实现功能:顺序写多个字到 FLASH中 // 入口参数:被写数据的目的起始地址; 被写数据; 写数据的数量 // 出口参数:无 //======================================================== .public _F_FlashWrite _F_FlashWrite: .proc //子程序的开始 PUSH BP TO [SP] //将 BP压入栈内 BP = SP + 1 //BP的值变为 SP+1 R1 = [BP+3] //取被写数据的首地址 R2 = [BP+4] //取被写数据 R3 = [BP+5] //写 N个字 R4 = C_FLASH_MATCH //将 AAAA送到控制单元

    [P_Flash_Ctrl] = R4 L_FlashWriteLoop: R4 = C_FLASH_SEQUENT_PGM //把 5544送到控制单元

  • 第 2章

    20

    [P_Flash_Ctrl] = R4 R4 = [R2++] //继续下一个数的写入 [R1++] = R4 R3-= 1 //字计数减 1 JNZ L_FlashWriteLoop //不为 0时写操作继续进行

    [P_Flash_Ctrl] = R3 //写结束 POP BP FROM [SP] //出栈

    RETF //子程序返回 .ENDP //======================================================== // 汇编格式:F_FlashErase // 实现功能:擦除 256个字节 // 入口参数:擦除页的起始地址 // 出口参数:无 //======================================================== .public _F_FlashErase _F_FlashErase: .proc //擦除 1页的子程序 PUSH BP TO [SP] //将 BP压入栈内 BP = SP + 1 R1 = C_FLASH_MATCH //将 AAAA送到控制单元 [P_Flash_Ctrl] = R1 R1 = C_FLASH_PAGE_ERASE //将 5511送到控制单元

    [P_Flash_Ctrl] = R1

    R1 = [BP+3] //取擦除页内的地址 [R1] = R1 //写入任意值进行擦除 POP BP FROM [SP] //出栈

    RETF //子程序返回 .ENDP

    2.3 SPCE061A输入/输出接口

    输入/输出接口(简称 I/O口)是单片机与外设交换信息的通道。输入端口负责从外界接收检测信号、键盘信号等各种开关量信号。输出端口负责向外界输送由内部电路产生的处理结果、

    显示信息、控制命令、驱动信号等。一般来说,I/O接口电路有以下的功能。 1.锁存数据 外围设备的工作速度一般和计算机的是不一样的,在传输过程中一般需要等待,因此,在

    I/O接口电路中要设置锁存器,用以暂存数据。 2.信息转换 在进行通信时,为节省传输线,信息以串行方式发送,而在计算机内部,为加快运算速度,

    是以并行方式传送的。因此,I/O 接口电路在发送数据时,要将并行数据转化为串行数据,而在接收数据时,则要将串行数据转化为并行数据。

    3.电平转换 计算机输入输出的信息大多采用 TTL电平,高电平+5V代表“1”,低电平 0V代表“0”。

  • SPCE061A单片机硬件结构

    21

    当外设的信息不是 TTL电平时,就需要它来完成电平转换的工作。 4.缓冲 输入输出接口电路是挂在计算机总线上的,都应具备缓冲的功能。 5.地址译码 为了使计算机识别每个外设,I/O 接口电路中的地址译码器要能根据计算机送出的地址找

    到指定的外围设备。 µ’nSP™内有并行和串行两种方式的 I/O口。并行口线路成本较高,但是传输速率也很高。

    与并行口相比,串行口的传输速率较低,但可以节省大量的线路成本。SPCE061A 有两个 16位的通用并行 I/O口:A口和 B口。这两个口的每一位都可通过编程单独定义成输入或输出口。

    2.3.1 I/O端口结构

    SPCE061A的每个 I/O口都有自己对应的端口地址,而且提供了位控制结构的 I/O端口,即每一位都可以被单独定义用于输入或输出数据。通常对某一位的设定包括以下 3个基本项:数据向量 Data、属性向量 Attribution和方向控制向量 Direction。3个端口内每个对应的位组合在一起就形成了一个控制字,用来定义相应 I/O口位的输入输出状态和方式。例如,假设需要IOA0是下拉输入引脚,则相应的 Data、Attribution和 Direction的值均被置为“0”。如果需要IOA1是带唤醒功能的悬浮式输入引脚,则 Data、Attribution和 Direction的值被置为“010”。与其他的单片机相比,除了每个 I/O端口可以单独定义其状态外,每个对应状态下的 I/O端口性质电路都是内置的,在实际的电路中不需要再次外接。例如,设端口 A 为带下拉电阻的输入口,在连接硬件时无需在片外接下拉电路。SPCE061A的 I/O结构如图 2-5所示。

    图 2-5 SPCE061A的 I/O结构

    A口和 B口的 Data、Attribution和 Direction的设定值均在不同的寄存器里,用户在进行I/O口设置时要特别注意这一点。I/O端口的组合控制设置如表 2-1所示。

    表 2-1 I/O端口的组合控制设置

    Direction Attribution Data 功 能 是否带唤醒功能 功 能 描 述

    0 0 0 下拉* 是** 带下拉电阻的输入引脚

    0 0 1 上拉 是** 带上拉电阻的输入引脚

    0 1 0 悬浮 是** 悬浮式输入引脚

    0 1 1 悬浮 否 悬浮式输入引脚***

  • 第 2章

    22

    续表

    Direction Attribution Data 功 能 是否带唤醒功能 功 能 描 述

    1 0 0 高电平输出 (带数据反相器)

    否 带数据反相器的高电平输出 (当向数据位写入“0”时输出“1”)

    1 0 1 低电平输出 (带数据反相器)

    否 带数据反相器的低电平输出 (当向数据位写入“1”时输出“0”)

    1 1 0 低电平输出 否 带数据缓存器的低电平输出 (无数据反相功能)

    1 1 1 高电平输出 否 带数据缓存器的高电平输出 (无数据反相功能)

    *口位默认为带下拉电阻的输入引脚。

    **只有当 IOA[7~0]内位的控制字为 000、001和 010时,相应位才具有唤醒的功能。 ***此种悬浮输入作为 ADC IOA[6~0]的输入。

    2.3.2 I/O端口寄存器的设置

    要实现输入/输出,除了需要把外设和单片机连接起来的电路,还需要控制接口电路的程序。下面分别介绍 I/O口对应的寄存器的设置(以 IOA口为例)。

    1.P_IOA_Data(读/写)(7000H) A口的数据单元用于向 A口写入或从 A口读出数据。当 A口处于输入状态时,写入是将

    A口的数据向量写入,读出是读 A口引脚的电平状态。当 A口处于输出状态时,写入输出数据到 A口的数据寄存器。

    2.P_IOA_Buffer(读/写)(7001H) A 口的数据向量单元用于向数据向量寄存器写入或从该寄存器读出数据。当 A 口处于输

    入状态时,写入是将 A口的数据向量写入 A口的数据寄存器;读出则是从 A口数据寄存器内读取数值。当 A口处于输出状态时,写入输出数据到 A口的数据寄存器。 对输出而言,P_IOA_Data 与 P_IOA_Buffer 是一样的。但对输入而言,P_IOA_Data 读的

    是 I/O引脚的值,P_IOA_Buffer读的是 buffer内的值。假设 IOA[0]作为输出,并去接 LED阳极(LED阴极接地)。若 P_IOA_Data的 IOA[0]为 1,对于某些需要较大驱动能力的 LED而言,LED 会亮,但 IOA[0]引脚会被拉到一个很低的值。此时从 P_IOA_Data 读回为 0,但从P_IOA_Buffer读回为 1。读回的意义是方便做其他的 I/O运算。

    3.P_IOA_Dir(读/写)(7002H) A 口的方向向量单元用来设置 A 口是输入还是输出,该方向控制向量寄存器可以写入或

    从该寄存器内读出方向控制向量。Dir 位决定了口位的输入/输出方向,即“0”为输入,“1”为输出。

    4.P_IOA_Attrib(读/写)(7003H) A口的属性向量单元用于 A口属性向量的设置。 5.P_IOA_Latch(读)(7004H) 读该单元以锁存 A 口上的输入数据,用于进入睡眠状态前的触键唤醒功能的启动(参见

    睡眠/唤醒部分)。

  • SPCE061A单片机硬件结构

    23

    2.3.3 并行 I/O口的组合控制

    方向向量_Dir、属性向量_Attrib和数据向量_Data分别代表 3个控制口。这 3个口中每个对应的位组合在一起就形成一个控制字,以此来定义相应 I/O口位的输入/输出状态和方式。 表 2-1具体表示了如何通过对 I/O口位的方向向量位_Dir、属性向量位_Attrib以及数据向

    量位_Data进行编程,来设定口位的输入/输出状态和方式。 由表 2-1可以得出以下一些结论: ①_Dir位决定了口位的输入/输出方向,“0”为输入,“1”为输出。 ②_Attrib 位决定了在口位的输入状态下是悬浮式输入还是非悬浮式输入,“0”为带上拉

    或下拉电阻式输入,而“1”则为悬浮式输入。在口位的输出状态下则决定其输出是反相的还是同相的,“0”为反相输出,“1”则为同相输出。 ③_Data位在口位的输入状态下被写入时,与_Attrib位组合在一起形成输入方式的控制字

    “00”、“01”、“10”、“11”,以决定输入口是带唤醒功能的上拉电阻式、下拉电阻式、悬浮式还是不带唤醒功能的悬浮式输入。_Data位在口位的输出状态下被写入的是输出数据,不过,数据是经过反相器输出还是经过同相缓存器输出要由_Attrib位来决定。 例如,假设要把 A口的 B0定义成下拉电阻式的输入口,则 A口_Dir、_Attrib和_Data向

    量的 3个相应的 B0组合应设为“000”。如果想把 A口的 B1定义成悬浮式并具有唤醒功能的输入口,只需将_Dir、_Attrib和_Data向量中相应的 B1组合设置为“010”即可。 【例 2-5】设置端口。 设置 IOA[3~0]为带下拉电阻的输入口,IOA[7~4]为带上拉电阻的输入口,IOA[11~8]

    为带数据缓存器的高电平输出口,IOA[15~12]为带数据缓存器的低电平输出口。

    R1 = 0x0FF0; //设置 A口的数据向量,IOA0~IOA3与 IOA12~IOA15置高 [P_IOA_Data] = R1; //IOA4~IOA7与 IOA8~IOA11置低 R1 = 0xFF00; //设置 A口的属性向量,IOA0~IOA8置低,IOA12~IOA15 [P_IOA_Attrib] = R1; //置高 R1 = 0xFF00; //设置 A口的属性向量,IOA0~IOA8置低,IOA12~IOA15 [P_IOA_Dir] = R1; //置高 各对应口位的设置如表 2-2所示。

    表 2-2 I/O口位设置参考表

    地址 属性 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 7002H Dir 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 7003H Attrib 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 7000H Data 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0

    — 状态 带数据缓存器的 低电平输出

    带数据缓存器的 高电平输出

    带上拉电阻的 输入

    带下拉电阻的 输入

    从上面的分析可以看出,当作为输入口时所读的数值来自不同的地方,读 P_IOA_Data是A口的引脚上的当前状态,读 P_IOA_Buffer的值来自数据寄存器(见例 2-6)。当 A口作为输出口时,数据都是写到 A口的数据寄存器。对于某些 I/O端口的应用,这种读写方式可以节省许多用于存放端口数据的 RAM空间。

  • 第 2章

    24

    【例 2-6】在单步运行程序期间将 A口的任意引脚接 VDD,通过观察寄存器表中的 R2、R3的值可观察到二者的不同。程序如下:

    .INCLUDE hadware.inc //包含头文件

    .CODE

    .PUBLIC _main //主程序 _main: R1=0x0000 //设置 A口为带下拉电阻的输入口 [P_IOA_Data]=R1 //设置 A口的数据向量 [P_IOA_Attrib]=R1 //设置 A口的属性向量 [P_IOA_Dir]=R1 //设置 A口的方向向量 //*****************此时将 A口的任意一口接高电平*********************// R3=[P_IOA_Data] //把 P_IOA_Data中的值送到寄存器 R3 R2=[P_IOA_Buffer] //把 P_IOA_Buffer中的值送到寄存器 R2 WAIT: JMP WAIT //主程序循环 【例 2-7】 .DEFINE P_IOB_Data 0x7005 .DEFINE P_IOB_Dir 0x7007 .DEFINE P_IOB_Attrib 0x7008 .DEFINE P_IOB_Buffer 0x7006 .CODE .PUBLIC _main //主程序 _main: R1=0xFFFF //设置 B口为带反向器的低电平输出 [P_IOB_Dir]=R1 //设置 3个属性向量 [P_IOB_Data]=R1 R1=0x0000 [P_IOB_ Attrib]=R1 R1=0x0000 //向寄存器写入 0x0000 [P_IOB_Data]=R1 //***********************此时检测 B口的电平为高***********************// R3=[P_IOB_Buffer] //回读 Buffer的值为 0x0000 LOOP: JMP LOOP //主程序循环

    2.3.4 P_IOA_Data与 P_IOA_Buffer的区别

    1.读取 从端口读取数据的两种方式:从 P_IOA_Data读取数据相当于读取端口引脚的信号。然而,

    从 P_IOA_Buffer读取数据相当于从数据寄存器中读取数据。

    R1 = [P_IOA_Buffer] //从 A口数据寄存器中读取数据 R1 = [P_IOA_Data] //从 A口引脚读取数据 2.写入

    有两种写入 IOA的数据方法,向 P_IOA_Data和 P_IOA_Buffer写入数据是一样的。

    R1 = 0x0000; [P_IOA_Data] = R1; //写数据到 P_IOA_Data [P_IOA_Buffer] = R1; //写数据到 P_IOA_Buffer

  • SPCE061A单片机硬件结构

    25

    3.输入设置 (1)悬浮输入:接其他 IC的输出,如此不会影响速度。 (2)下拉输入:有效电平为高且大部分的状态为低,假设外接 key,且高电平时作用。可

    以少接一下拉电阻。 (3)上拉输入:有效电平为低且大部分的状态为高,假设外接 key,且低电平时作用。可

    以少接一上拉电阻。 详细的端口结构如图 2-6所示。注意,图中的 1和 0是逻辑 1和逻辑 0。MOS集成电路的

    基本元件是MOS管,是电压控制元件,用栅极 G来控制漏电流和源电流。

    图 2-6 端口结构图

    IOB端口的 P_IOB_Data(读/写)(7005H)、P_IOB_Buffer(读/写)(7006H)、P_IOB_Dir(读/写)(7007H)和 P_IOB_Attrib(读/写)(7008H)的基本属性与 IOA口的一样。下面通过例子来说明 I/O口的设置和使用。 【例 2-8】设置 A口低 8位为带下拉电阻的输入口,作为按键输入。B口低 8位为带数据

    缓存器的低电平输出口,外接发光二极管显示。当 Key1按下时对应的 B0口灯亮,以此类推。 程序如下: //============================================================= //文件名称:main.asm //功能描述:通过点亮不同发光二极管来显示 IOA口输入的键盘值 //============================================================= .DEFINE P_IOA_Data 0x7000 .DEFINE P_IOA_Buffer 0x7001 .DEFINE P_IOA_Dir 0x7002 .DEFINE P_IOA_Attrib 0x7003 .DEFINE P_IOB_Data 0x7005

  • 第 2章

    26

    .DEFINE P_IOB_Dir 0x7007

    .DEFINE P_IOB_Attrib 0x7008

    .DEFINE P_Watchdog_Clear 0x7012 .RAM .VAR Key //定义变量保存键值 .CODE .PUBLIC _main _main: r1 = 0x0000 //初始化 IOA口为带下拉电阻的输入口 [P_IOA_Dir] = r1 [P_IOA_Attrib] = r1 [P_IOA_Data] = r1 r1 = 0x00ff //初始化 IOB口为同相低电平输出口 [P_IOB_Dir] = r1 [P_IOB_Attrib] = r1 r1 = 0x0000 [P_IOB_Data] = r1 ?Loop: call F_KeyScan //调用键盘扫描子程序 r1 = [Key] cmp r1,0x0000 //判断是否有按键按下 je ?Loop_1 //若无, 则继续扫描键盘, 不刷新显示 [P_IOB_Data] = r1 //输出键值, 控制相应的发光二极管显示 ?Loop_1: r1 = 0x0001 [P_Watchdog_Clear] = r1 jmp ?Loop //======================================================== //键扫描子程序:进行扫键操作,返回键盘值 //======================================================== .PUBLIC F_KeyScan F_KeyScan: r1 = [P_IOA_Data] r1 = r1&0x00ff //仅取低 8位的输入值 jz ?Return //为 0, 则代表没有按键按下, 返回 call F_Delay //延时, 消抖 r2 = [P_IOA_Data] r2 = r2&0x00ff //仅取低 8位的输入值 cmp r1,r2 //比较延时前后两次输入值读取的是否相等 je ?Return //相等则返回, r1当中保存有键值 r1 = 0x0000 //返回 0 ?Return: [Key] = r1 //返回键值 retf //======================================================== //延时子程序 //======================================================== .PUBLIC F_Delay

  • SPCE061A单片机硬件结构

    27

    F_Delay: r3 = 0x2fff ?Loop: r4 = 0x0001 [P_Watchdog_Clear] = r4 //清看门狗 r3-= 1 jz ?Exit jmp ?Loop ?Exit: retf A口低 8位的属性设置及对应的口位状态如表 2-3所示(不考虑高 8位)。

    表 2-3 A口的设置

    地址 属性 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 7002H Dir - - - - - - - - 0 0 0 0 0 0 0 0 7003H Attrib - - - - - - - - 0 0 0 0 0 0 0 0 7000H Data - - - - - - - - 0 0 0 0 0 0 0 0 — 状态 — 带下拉电阻的输入

    B口低 8位的属性设置及对应的口位状态如表 2-4所示(不考虑高 8位)。

    表 2-4 B口的设置

    地址 属性 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 7007H Dir - - - - - - - - 1 1 1 1 1 1 1 1 7008H Attrib - - - - - - - - 1 1 1 1 1 1 1 1 7005H Data - - - - - - - - 0 0 0 0 0 0 0 0 — 状态 — 带数据缓存器的低电平输出

    硬件原理图如图 2-7所示。

    图 2-7 8键键盘硬件原理

  • 第 2章

    28

    2.3.5 I/O口的特殊功能

    A口的 IOA0~IOA7用作输入口时具有唤醒功能,即具有输入电平变化引起 CPU中断的功能。在那些用电池供电、追求低能耗的应用场合,可以应用 CPU 的睡眠模式(通过软件设置)以降低功耗,需要时以按键来唤醒 CPU,使其进入工作状态。例如,手持遥控器、电子字典、PDA、计算器、移动电话等。要激活 IOA0~IOA7 的唤醒功能,必须读 P_IOA_Latch单元,以此来锁存 IOA0~IOA7引脚上的键状态。随后,系统才可通过指令进入低功耗的睡眠状态。当有键按下时,IOA0~IOA7的输入状态将不同于其在进入睡眠前被锁存时的状态,从而引起系统的唤醒。

    B口除了具有常规的输入/输出端口功能外,还有一些特殊的功能,如表 2-5所示。

    表 2-5 B口的特殊功能

    口位 特殊功能 功 能 描 述 备 注

    IOB0 SCK 串行接口 SIO的时钟信号

    IOB1 SDA 串行接口 SIO的数据传送信号 参见串行设备接口 SIO 的功能设置内容

    EXT1 外部中断源(下降沿触发) IOB2设为输入状态 IOB2

    Feedback_Output1 与 IOB4组成一个 RC反馈电路,以获得振荡信号,作为外部中断源 EXT1 设置 IOB2为反相输出方式

    EXT2 外部中断源(下降沿触发) IOB3设为输入状态

    IOB3 Feedback_Output2 与 IOB5组成一个 RC反馈电路,以获

    得一个振荡信号,作为外部中断源 EXT2 设置 IOB3为反相输出方式

    IOB4 Feedback_Input1

    IOB5 Feedback_Input2

    IOB6 —

    IOB7 Rx 通用异步串行数据接收端口 参见通用异步串行接口部分

    IOB8 APWMO TimerA脉宽调制输出

    IOB9 BPWMO TimerB脉宽调制输出 参见定时/计数器部分

    IOB10 Tx 通用异步串行数据发送端口 参见通用异步串行端口部分

    ①口位默认为带下拉电阻的输入引脚。

    ②PWM:脉宽调制(Pulse Width Modulation)。

    2.4 看门狗计数器

    2.4.1 看门狗原理简介

    看门狗(WatchDog)的作用是防止程序发生死循环。看门狗技术可由硬件实现,也可由软件实现。

  • SPCE061A单片机硬件结构

    29

    硬件看门狗是利用一个硬件定时器来监控主程序的运行,也就是说,在主程序的运行过程

    中,必须在给定时间到来之前对定时器进行复位。如果出现死循环,或者说 PC指针不能回来,那么定时时间到后就会使单片机复位。在工业应用中,严重的干扰有时会破坏中断方式控制字,

    关闭中断。此时系统无法定时“喂狗”,这会使硬件看门狗电路失效,而软件看门狗可有效地

    解决这类问题。 软件看门狗技术的原理和硬件看门狗差不多,只不过是用软件的方法实现。可以用这两个

    定时器来对主程序的运行进行监控。对第一个定时器 T0设定一定的定时时间,当产生定时中断的时候对一个自定义变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,其

    设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,值发生了

    预期的变化,就说明 T0中断正常,如果没有发生变化,则使程序复位。 另外一个定时器 T1 则用来监控主程序的运行。给 T1 设定一定的定时时间,在主程序中

    对其进行复位,如果不能在一定的时间里对其进行复位,T1 的定时中断就会使单片机复位。在这里 T1 的定时时间要设的大于主程序的运行时间,给主程序留有一定的裕量。而 T1 的中断正常与否则由 T0定时中断子程序来监视。这样就构成了一个循环,T0监视 T1,T1监视主程序,主程序又来监视 T0,从而保证系统的稳定运行。

    2.4.2 SPCE061A的看门狗技术

    SPCE061A 的 WatchDog 的清除时间周期为 0.75s。因为 WatchDog 的溢出复位信号WatchDog_Reset是由 4Hz时基信号经 4分频之后产生的,即每 4个 4Hz时基信号(1s)将会产生一个WatchDog_Reset信号,如图 2-8所示。而清除WatchDog的WatchDog_Clear信号却可以发生在 4Hz信号(0.25s)之间的任意一个时刻点上。假如WatchDog_Clear信号发生在 4Hz信号尾端的 0.01s即第 0.25s时刻,此时虽然 WatchDog被清掉,但由于它发生在 4Hz 信号之后,再经 3 个 4Hz 信号即 0.75s,如果一直没有 WatchDog_Clear 信号,便会产生出一个WatchDog_Reset信号。 注意:SPCE061A的看门狗功能是上电自动使能,不能够被屏蔽。因此在使用时,在 0.75s

    内必须进行清狗操作。

    图 2-8 WatchDog的结构和信号时序

    当然,如果 WatchDog_Clear 信号发生在 4Hz 信号始端的 0.01s,则经过 0.99s 若无WatchDog_Clear 信号便会产生 WatchDog_Reset 信号。因此,清除 WatchDog 的时间周期为0.75s。

    WatchDog 的配置单元 P_WatchDog_Clear 及其内 B0 对 WatchDog 清除的控制,如表 2-6

  • 第 2章

    30

    所示。要清除WatchDog,只需写入 P_WatchDog_Clear单元“0x0001”即可。此外,若 32768Hz振荡器被打开,则在空闲方式期间WatchDog功能是被激活的。

    表 2-6 WatchDog的配置及WatchDog的清除

    配 置 单 元 读 写 属 性 存储地址 配置单元功能说明

    P_WatchDog_Clear 写 7012H 清除WatchDog单元

    B15~B1 B0

    — WatchDog_Clear 控制位功能解释

    0~0 0 不清除WatchDog

    0~0 1 清除WatchDog

    清看门狗的程序段如下: (1)汇编程序。

    …… R1 = 0x0001 [P_Watchdog_Clear] = R1 …… (2)C语言程序。

    …… *P_Watchdog_Clear=0x0001 ……

    2.5 本 章 小 结

    µ’nSP™内核结构的最大特色是有一个能执行 16位运算,且带移位操作功能的算术逻辑单元 ALU,它有 8个 16位寄存器,分为通用的寄存器和专用的寄存器两类,为凌阳单片机实现较高要求的数据处理奠定了基础。 和其他的单片机相比,凌阳 SPCE061A的 2K字的 RAM以及 32K字的 Flash空间是个很

    大的优势,这也为后述的语音章节中介绍的语音功能提供了硬件上的支持。另外,它的堆栈也

    是安排在 RAM空间,存储器采用统一编址形式。在 Flash的读写方面,为了保证安全读写,其有着严格的读写流程,程序开发者必须按此流程才能进行读写。 单片机的 I/O口是很重要的一部分,它是单片机与外设之间进行信息交换的主要通道,这

    也是本章的重点和难点内容。I/O 口负责接收来自外界的检测信号、键盘信号等各种开关量信息,还向外界输送处理结果、控制命令、驱动信号等。凌阳 SPCE061A的 I/O口可实现的功能较多,主要有 3种输入输出状态:上拉、下拉和悬浮。通过对寄存器的设置和组合向量的控制就可实现各种功能。看门狗是用来防止程序出现死循环或者“跑飞”的现象,凌阳的看门狗技

    术的实现方式和对应的设置也很简便。 另外,对于 I/O口的一些特殊功能,会在后续章节中详细介绍。 图 2-9所示为 SPCE061A的主要内部结构和相关内容。

  • SPCE061A单片机硬件结构

    31

    图 2-9 凌阳 SPCE061A基本硬件结构内容框图

    习 题

    1.µ’nSP™的内核主要由哪些部分组成? 2.SPCE061A单片机的工作寄存器有哪些?它们的特点和作用是什么? 3.SPCE061A单片机的存储空间是怎么分配的? 4.SPCE061A单片机的内存 RAM和堆栈是怎样的关系?它们的空间有多大? 5.SPCE061A单片机的闪存 Flash的读写流程是什么? 6.简述 SPCE061A单片机的输入输出端口的作用和结构。 7.SPCE061A并行 I/O有哪几种工作方式? 8.SPCE061A并行 I/O的向量控制是如何设置的? 9.简述 P_IOA_Data与 P_IOA_Buffer的区别。 10.SPCE061A并行 I/O有哪几种特殊功能? 11.利用 IOA口循环点亮 16个 LED灯,并利用软件延时的方式,让时间间隔约为 1s。 12.看门狗具有什么功能?简述 SPCE061A的看门狗的工作方式。

  • 第 3章

    32

    第 3章 指 令 系 统

    3.1 指令系统的概述及符号约定

    指令是 CPU执行某种操作的命令,由操作码字段和操作数字段组成。操作码字段指出 CPU所要执行的操作,操作数字段则指出指令执行操作过程中所需的操作数,如加法指令中的加数

    和被加数。操作数字段既可以是操作数本身,也可以是所寻找操作数的地址或是地址的一部分,

    还可以是寻找操作数地址的指针等。为了更有效地执行指令,每条指令的长短往往是不一样的,

    操作数字段可以由一个、两个或三个字节组成。 指令系统是微处理器(MPU)或微控制器(MCU)所能识别的全部指令的集合,是计算

    机机器语言的基本元素,是程序的基础。任何程序都是在转换为相应的指令后才能执行的。指

    令系统由 CPU中的指令译码器确定,不同类型 CPU的指令系统各不相同。本章将详细地介绍SPCE061A指令系统的寻址方式和各种指令。 在介绍寻址方式之前,首先统一约定要用到的一些符号,如表 3-1所示。

    表 3-1 符 号 约 定

    寄 存 器 名 说 明

    R1,R2,R3,R4,R5(BP) 通用寄存器

    PC 程序计数器

    SR 段寄存器

    CS,DS SR(BIT5~BIT0)代码段选择字段和 SR(BIT15~BIT10)数据段选择字段

    NZSC SR(BIT9~BIT6)4个标志位

    N 负标志,N=0表示运算前最高有效位为 0,N=1表示最高有效位为 1

    Z 零标志,Z=0表示运算结果不为 0,Z=1表示运算结果为 0

    S 符号标志,S=0表示结果不为负,S=1表示结果为负数(2的补数),对于有符号运算,16位数表示的范围为−32768~32768,若结果小于零,则 S=1

    C 进位标志,C=0表示运算过程中无进位或有借位产生,C=1表示有进位或无借位产生

    IM6 6位(BIT)的立即数

    IM16 16位(BIT)的立即数

    A6 6位地址码

    A16 16位地址码

    Rd 目的(Destination)寄存器或存储器指针

    Rs 源寄存器或存储器指针

  • 指令系统

    33

    续表

    寄 存 器 名 说 明

    → 数据传送符号

    MR 由 R4、R3组成的 32位结果寄存器(R4为高字节,R3为低字节)

    &,|,^ 逻辑与、逻辑或、逻辑异或符号

    {} 可选项

    [] 寄存器间接寻址标志

    ++,-- 指针单位自增量,自减量

    ss,us 两个有符号数之间的操作,无符号数与有符号数之间的操作

    Label 程序标号

    FIR Finite Impulse Response(有限冲击响应),数字信号处理中的一种具有线性相位及任意幅度特性的数字滤波器算法

    // 注释符

    3.2 寻 址 方 式

    寻址方式是指指令中说明寻找操作数所在地址的方法,µ’nSP™的 CPU支持 5种基本寻址方式,下面来分别进行介绍。

    3.2.1 立即数寻址

    立即数寻址的操作数紧跟在操作码之后。在这种寻址方式中,操作数以立即数的形式出现。

    立即数是一个 6位或 16位的常数,前者的范围是 0x00~0x3F,后者的范围是 0x0000~0xFFFF,分别用 IM6和 IM16表示。 【例 3-1】

    R1 = 0x1234 该指令表示把十六进制数 0x1234赋给寄存器 R1。 【例 3-2】

    R1 = R1+0x1010 该指令表示把十六进制数 0x1010与寄存器 R1中的内容相加,并把结果存回到寄存器 R1

    中。

    3.2.2 寄存器寻址

    寄存器寻址方式是将要处理的数据放在相应的寄存器中。在这种寻址方式中,操作数包含

    在寄存器中,由指令指定寄存器的名称。 【例 3-3】

    R1 = R2 【例 3-4】 R1 = R2+0x1010

  • 第 3章

    34

    此指令有 3个操作数,前两个存放在 R1、R2中,属于寄存器寻址,第三个为立即数 0x1010。该指令的功能是把寄存器 R2中的内容与 0x1010相加,把结果放到寄存器 R1中。

    3.2.3 直接寻址

    直接寻址方式是将要处理的数据放在直接指定地址的存储单元中。这种寻址方式在指令格

    式中直接给出了操作数的存储器地址,供寻址数据或存取数据。直接寻址地址用方括号“[]”括起来,表明是存储器操作数。直接寻址方式又分为 3种。

    1.6位地址直接寻址 这种寻址方式给出的地址为 6位有效地址(Effective Address,EA),只能用于在存储器的

    前 64个字存储单元范围内寻址,其指令执行周期短。 【例 3-5】

    R1+ = [0x10] 该指令有 3 个操作数:寄存器 R1 中的内容、存储器 0x10 单元的内容以及两者之和。操

    作是将和存回到寄存器 R1中。 2.16位地址直接寻址 这种寻址方式给出的地址为 16位有效地址[A16],它可以在 64K字存储单元范围内寻址。 【例 3-6】

    R1+ = [0x1010] [0x1010]表示 16位有效地址,该指令把 R1和存储器 0x1010单元中的内容相加,并将和

    存放到寄存器 R1中。 3.22位地址直接寻址 这种寻址方式给出的地址由高 6位地址(CS代码段)和页内 16位地址拼接而成,它可以

    在 4MB的存储器单元范围内寻址。它主要用于程序的调用和返回。 说明:µ’nSP™具有 22位地址线,可以寻址 4M字的存储器容量,4M字的存储器又分为

    64个 bank,每个 bank有 64K字的存储容量。就 SPCE061A来讲,因为其具有 32K字的 Flash,所以只有一个零页的 bank。

    3.2.4 寄存器间接寻址

    寄存器间接寻址是将要处理的数据的地址放在寄存器中,即用寄存器中的数据作为存储单

    元的地址数值。这种寻址方式的操作数的地址由寄存器给出,书写指令时,寄存器需用 [] 括起来,其格式为{D:}[R]。省略 D时,R指向零页存储单元;D不省略时,由 R和段寄存器 SR中的数据段 DS共同指向存储单元,其中 DS的值决定了存储器的页码。 【例 3-7】

    R1+ = [R2] 假设 R2中的内容是 0x1010,则该指令将零页存储器 0x1010中的内容传到寄存器 R1中。 【例 3-8】

    R1+ = [R2++] 假设指令执行前 R2中的内容是 0x1010,该指令先将 R2作为地址进行取数据并传送到 R1

    中,然后将 R2加 1,指令结束后,R2的值为 0x1011。

  • 指令系统

    35

    R1+ = [++R2] 此指令与上述类似,不同之处在于它先将 R2加 1,再把 R2作为地址进行取数据操作。

    3.2.5 变址寻址(基址加变址寄存器间接寻址)

    变址寻址是将要处理的数据的地址分开放在基地址和变地址寄存器中,即用一个寄存器

    (称为基址寄存器)中的数据作为存储单元的基本地址数值,用另一个寄存器(称为变址寄存

    器)中的数据作为存储单元的偏移地址数值,实际寻址单元的地址数值为两个寄存器内容之和。

    在这种寻址方式下,操作数的地址由基地址和偏移量共同给出。 【例 3-9】

    R1+ = [BP+0x1010] 该指令执行的操作是将基址指针 BP与 0x1010之和指出的存储单元的内容与 R1相加,结

    果再传送到寄存器 R1中。

    3.3 SPCE061A指令系统

    µ’nSP™单片机指令按其功能可划分为:数据传送指令、算术运算、逻辑运算、转移指令和控制指令。下面分别介绍各类指令的格式、功能和应用示例。

    3.3.1 数据传送指令

    数据传送指令是把源操作数传送到指令所指定的目标地址中去。数据传送操作属复制性

    质,而不是搬家性质。指令执行后,源操作数不变,目的操作数为源操作数所代替。通用格式

    是: =

    源操作数可以是立即数寻址、寄存器直接寻址、寄存器间接寻址、直接地址寻址、变址寻

    址等。目的操作数可以是寄存器寻址和直接地址寻址。 下面按寻址方式来介绍 SPCE061A的数据传送指令。各个数据传送指令的执行周期数、指

    令长度等如表 3-2所示。

    表 3-2 数据传送指令一览表

    语 法 指令长度(Word) 影响标志 周 期 数 Rd = IM16 2 4/5 Rd = IM6 2

    Rd = [BP +IM6] 6 Rd = [A6]

    1 5/6

    Rd = [A16] 2 7/8 Rd = Rs 3/5

    Rd = [Rs] Rd = [Rs++] Rd = [++Rs] Rd = [Rs--]

    1

    N,Z

    6/7

  • 第 3章

    36

    续表

    语 法 指令长度(word) 影响标志 周 期 数

    [BP + IM6] = Rs 6

    [A6] = Rs N, Z

    5

    [A16] = Rs 2 7

    [Rd] = Rs

    [++Rd] = Rs

    [Rd--] = Rs

    [Rd++] = Rs

    1

    6

    注意:在本章的所有指令列表中,若 pd=pc,则指令周期为表中所列两者的较长者,且运算后所有标志位均不受影响。 【例 3-10】将值 0xF001通过寄存器 R3保存在 0x25单元中,可用以下不同的寻址方式。 (1)将 0xF001赋值给 R3的两种方式

    ① 立即数寻址方式

    R3 = 0xF001 //把 16位立即数 0xF001赋给 R3 //设传送前 N=0,Z=1,S=0,C=1 //传送后 R3的值变为 0xF001,此时 N=1,Z=0,S=0,C=1

    ② 寄存器寻址方式

    R1= 0xF001; //设传送前 N=0,Z=1,S=0,C=1,传送后 R1的值为 0xF001 //此时 N=1,Z=0,S=0,C=1 R3=R1; //R3的值变为 0xF001,此时 N=1,Z=0,S=0,C=1 (2)将 R3的值保存到 0x25单元的 3种方式

    ① 直接地址寻址方式

    [0x25] = R3 //将 R3的值存储到 0x25存储单元中 //0x25单元的内容为 0xF001

    ② 寄存器间接寻址方式

    R2 = 0x25 //立即数 0x25送入 R2中 [R2] = R3 //将 R3的值存储到 0x25存储单元中 或者:

    R2 = 0x24 //立即数 0x24送入 R2中 [++R2] = R3 //将 R3的值存储到 R2自加后的 0x25的存储单元中

    ③ 变址寻址方式

    BP = 0x20 //立即数 0x20送入 BP中 [BP + 5] = R3 //将 R3的值存储到 0x25存储单元中 //0x25单元的内容为 0xF001 【例 3-11】用不同方式读取存储器的值。 BP = 0x20 //将立即数 0x20赋给 BP R1 = [BP + 5] //BP + 5=0x25,读取 0x25单元数据到 R1中 R1 = [0x2345] //读取 0x2345单元的数据到 R1中

  • 指令系统

    37

    R1 = [BP] //读取 0x20单元的数据到 R1中 R1 = [BP++] //读取 0x20单元的数据到 R1中,修改 BP=0x21 R1 = [BP--] //读取 0x21单元的数据到 R1中,修改 BP=0x20 R1 = [++BP] //修改 BP=0x21,读取 0x21单元的数据 除以上介绍的指令外,堆栈(Stack)操作也属于一种特殊的数据传送指令。SPCE061A 的

    堆栈指针 SP总是指向栈顶的第一个空项,压入一个字后,SP减 1,将多个寄存器同时压栈时总是序号最高的寄存器先入栈,然后依次压入序号较低的寄存器,直到序号最低的寄存器最后入

    栈。所以,执行指令“PUSH R1,R4 TO [SP]”与指令“PUSH R4,R1 TO [SP]”是等效的。在数据出栈前 SP加 1,总是先弹出入栈指令中序号最低的寄存器,而后依次弹出序号较高的寄存器。 【格式】 PUSH Rx,Ry TO [SP]

    POP Rx,Ry FROM [SP] 【说明】Rx,Ry可以是 SP、R1~R4、BP、PC中的任意两个或一个,执行后将 Rx~Ry的序

    列寄存器压栈,或者将堆栈中的数据弹入 Rx~Ry序列寄存器中,压栈操作不影响标志位,出栈操作将影响 N、Z标志。压栈、出栈操作的执行周期为 2n+4,当出栈操作的目的寄存器中含有PC时,执行周期为 2n+6。其中 n是压栈数据的个数。压栈和出栈的指令长度均为 1个字长。

    注意:由于 SR较为特殊,当 Rx、Ry中含有 SR时,所有标志位都会改变。 【例 3-12】

    PUSH R1,R5 to [SP] //将 R5、R4、R3、R2、R1压栈, 如图 3-1所示 PUSH R2,R2 to [SP] //将 R2压栈 PUSH R3 to [SP] //将 R3压栈 POP R3 from [SP] //R3出栈 POP R2,R2 from [SP] //R2出栈 POP R1,R5 from [SP] //R1、R2、R3、R4、R5出栈

    (a) (b)

    图 3-1 堆栈操作

    3.3.2 算术运算

    SPCE061A单片机的算术运算主要包括加、减、乘以及 n项内积运算。加减运算按是否带进位可分为不带进位和带进位的加减运算,带进位的加减运算在格式和寻址方式上与无进位的

    加减运算类似。另外,求补、比较指令实质上也是执行算术运算。算术运算的寻址方式和数据

    传送指令完全相同。SPCE061A的算术运算语法和 C语言的算术运算语法类似,较易掌握,下面分别介绍。

    1.不带进位的加法运算 不带进位的加法运算影响的标志位有 N、Z、S、C,其指令如表 3-3所示。

  • 第 3章

    38

    表 3-3 不带进位的加法运算指令

    影响的标志位 指 令 格 式 指令周期 寻 址 方 式

    N Z S C

    Rd + = IM6 Rd = Rd + IM6 2 立即数寻址 IM6

    Rd = Rs + IM16 4 立即数寻址 IM16

    Rd + = [BP + IM6] Rd = Rd + [BP + IM6] 6 变址寻址[BP + IM6]

    Rd + = [A6] Rd = Rd + [A6] 5 直接地址寻址[A6]

    Rd = Rs + [A16] 7 直接地址寻址[A16]

    Rd + = Rs 3 寄存器寻址 R

    Rd + = {D:}[Rs] Rd + = {D:}[++Rs] Rd + = {D:}[Rs--] Rd + = {D:}[Rs++]

    6 寄存器间接寻址[R]

    √ √ √ √

    注意:当目的寄存器 Rd为 PC时,指令周期数是列表中的后者,且运算后 SR中的所有标志位均不受影响(以下的指令集中的指令周期均与此同)。 在一般情况下,源寄存器 Rs、目的寄存器 Rd可以是 R1~R4、BP、SP、SR及 PC中的任

    何一个,只有当采用变址寻址方式时,PC才不能用于目的寄存器 Rd。下面以实例进行说明。 【例 3-13】

    R1+=0x1000 //将 R1与 16位立即数 0x1000相加后的结果存到 R1中 PC=R1+0x1000 //PC是程序指针, 用此指令可实现程序的跳转 R1+=[R2] //将 R1中的数据和零页 R2指定单元中的数据 //相加后的结果存到 R1中 R1+=D:[++R2] //由 DS段与 R2的内容自加 1后指定单元中的数据 //与 R1相加, 并将结果存到 R1中 2.不带进位的减法运算 同不带进位的加法运算一样,不带进位的减法运算同样可分为立即数寻址、直接地址寻址、

    寄存器寻址、寄存器间接寻址等方式,减法运算影响的标志位有 N、Z、S、C,如表 3-4所示。

    表 3-4 不带进位的减法运算指令

    影响的标志位 指 令 格 式 指令周期 寻 址 方 式

    N Z S C

    Rd – = IM6 Rd = Rd – IM6 2 立即数寻址 IM6

    Rd = Rs – IM16 4 立即数寻址 IM16

    Rd – = [BP + IM6] Rd = Rd –[BP + IM6] 6 变址寻址[BP+IM6]

    Rd – = [A6] Rd = Rd – [A6] 5 直接地址寻址[A6]

    √ √ √ √

  • 指令系统

    39

    续表

    影响的标志位 指 令 格 式 指令周期 寻 址 方 式

    N Z S C

    Rd = Rs – [A16] 7 直接地址寻址[A16]

    Rd – = Rs 3 寄存器寻址 R

    Rd – = {D:}[Rs] Rd – = {D:}[++Rs] Rd – = {D:}[Rs--] Rd – = {D:}[Rs++]

    6 寄存器间接寻址[R]

    √ √ √ √

    3.带进位的加减运算 带进位的加减运算与不带进位的加减运算的唯一区别就是:执行运算时进位标志位 C 参

    与运算,其余完全相同,如表 3-5和表 3-6所示。 (1)带进位的加法格式

    表 3-5 带进位的加法运算指令

    影响的标志位 指 令 格 式 指令周期 寻 址 方 式

    N Z S C

    Rd + = IM6,Carry Rd = Rd + IM6,Carry

    2 立即数寻址 IM6

    Rd = Rs + IM16,Carry 4 立即数寻址 IM16

    Rd + = [BP + IM6],Carry Rd = Rd + [BP + IM6],Carry 6 变址寻址[BP + IM6]

    Rd + = [A6],Carry Rd = Rd + [A6],Carry

    5 直接地址寻址[A6]

    Rd = Rs + [A16],Carry 7 直接地址寻址[A16]

    Rd + = Rs,Carry 3 寄存器寻址 R

    Rd + = {D:}[Rs],Carry Rd + = {D:}[++Rs],Carry Rd + = {D:}[Rs--],Carry Rd + = {D:}[Rs++],Carry

    6 寄存器间接寻址[R]

    √ √ √ √

    (2)带进位的减法格式

    表 3-6 带进位的减法运算指令

    影响的标志位 指 令 格 式 指令周期 寻 址 方 式

    N Z S C

    Rd – = IM6,Carry Rd = Rd – IM6,Carry

    2 立即数寻址 IM6

    Rd = Rs – IM16,Carry 4 立即数寻址 IM16

    Rd – = [BP + IM6],Carry Rd = Rd – [BP + IM6],Carry 6 变址[BP + IM6]

    √ √ √ √

  • 第 3章

    40

    续表

    影响的标志位 指 令 格 式 指令周期 寻 址 方 式

    N Z S C

    Rd – = [A6],Carry Rd = Rd – [A6],Carry

    5 直接地址 寻址[A6]

    Rd = Rs – [A16],Carry 7 直接地址 寻址[A16]

    Rd – = Rs,Carry 3 寄存器寻址 R

    Rd – = {D:}[Rs],Carry Rd – = {D:}[++Rs],Carry Rd – = {D:}[Rs--],Carry Rd – = {D:}[Rs++],Carry

    6 寄存器间接寻址[R]

    √ √ √ √

    4.取补运算 取补运算用于求一个数的补码,在计算机中表示为取其反码再加 1。取补运算影响的标志

    位是 N和 Z。其所有的取补指令如表 3-7所示。

    表 3-7 取补运算指令

    影响的标志位 指 令 格 式 指令周期 寻 址 方 式

    N Z S C

    Rd = – IM6 2 立即数寻址 IM6

    Rd = – IM16 4 立即数寻址 IM16

    Rd = – [BP + IM6] 6 变址[BP + IM6]

    Rd = – [A6] 5 直接地址寻址[A6]

    Rd = – [A16] 7 直接地址寻址[A16]

    Rd = – Rs 3 寄存器寻址 R

    Rd = – {D:}[Rs] Rd = – {D:}[++Rs] Rd = – {D:}[Rs--] Rd = – {D:}[Rs++]

    6 寄存器间接寻址[R]

    √ √ - -

    【例 3-14】计算数−600与 0x0040单元数据的差。

    R1=-600 R2=0x0001 [0x0040]=R2 BP = 0x0040 //取该单元地址 R2 =-[BP] //取此数的补码, -1的补码为 0xFFFF R1 += R2 //相加, 结果送 R1 5.SPCE061A的乘法指令 SPCE061A提供了 16位的乘法指令,其指令格式如表 3-8所示。

  • 指令系统

    41

    表 3-8 乘法运算指令

    影响的标志位 指 令 格 式 指令周期 寻 址 方 式

    N Z S C

    MR = Rd * Rs MR = Rd * Rs,ss 12 寄存器寻址 R

    MR = Rd * Rs,us 12 寄存器寻址 R — — — —

    乘法指令分为两种:一种是有符号数相乘(表 3-8 所示的第一条指令),一种是无符号数和有符号数相乘(表 3-8所示的第二条指令)。两者都是执行 Rd * Rs → MR,MR是 32位乘法结果存放寄存器。当无符号数和有符号数相乘时,则指令的第一个数据 Rd是无符号数,第二个数据 Rs是有符号数。

    注意:Rd、Rs