<4D F736F F D20BBF9D3DAB5A5C6ACBBFAB5C4B5E7C2B7C9E8BCC62E646F63>

Size: px
Start display at page:

Download "<4D F736F F D20BBF9D3DAB5A5C6ACBBFAB5C4B5E7C2B7C9E8BCC62E646F63>"

Transcription

1 第 1 章 MCS51 单片机介绍 1.1 数字集成电路的发展历程 从 20 世纪 60 年代开始, 数字集成电路在集成度方面的发展经历了以下 4 个阶段 : 包含几十到几百个逻辑门的小规模集成电路 (Small Scale Integration,SSI); 包含几百到几千个逻辑门的中规模集成电路 (Medium Scale Integration,MSI); 包含几千到几万个逻辑门的大规模集成电路 (Large Scale Integration,LSI); 包含几万个以上逻辑门的超大规模集成电路 (Very Large Scale Integration,VLSI) 在工作原理方面, 数字集成电路可以划分为标准逻辑器件 微处理器和专用集成电路 标准逻辑器件 标准逻辑器件在集成度方面属于中小规模集成电路, 它包括基于 TTL 工艺的 54 / 74 系列和基于 CMOS 工艺的 4000 系列的各种逻辑门 触发器 译码器 多路选择器和计数器等器件 这些器件的工作原理和应用在 数字电路逻辑设计 课程中有详细的介绍 作为传统数字系统设计中使用的主要器件, 标准逻辑器件的产量很大, 因此它们的生产成本低廉, 价格便宜 由于这些器件的功能确定, 芯片设计主要考虑如何提高器件的性能 标准逻辑器件的工作速度快, 但是采用它们设计的数字系统需要较多的器件, 这就使得电路连线复杂, 系统的可靠性降低 由于用户无法修改这类器件的功能, 修改系统设计必须通过对电路重新设计和组装来实现 微处理器 微处理器, 包括在本书中将要学习的单片机, 在集成度方面属于大规模集成电路 它们被应用于数字系统的设计起始于 20 世纪 70 年代 这类器件可以通过编写程序来实现系统功能 基于微处理器所设计电路的逻辑功能可由软件配置, 这个特点使得设计灵活性得到提高, 当修改系统设计时, 设计者不需要, 或者较少需要修改电路连线 相对于由标准逻辑器件构成的数字系统, 基于微处理器设计的系统工作速度较低 ; 其次, 微处理器的工作仍需要一些标准逻辑器件或者相关逻辑器件构成的外围电路的支持 专用集成电路 专用集成电路 (Application Specific Integrated Circuit,ASIC) 的出现在一定程度上克服了上述两种逻辑器件的缺点 专用集成电路是为满足一种或几种特定功能而专门设计和制作的集成电路芯片, 它的集成度很高, 一片专用集成电路芯片甚至可以构成一个完整的数字系统, 因此这使得系统的硬件规模进一步降低, 可靠性进一步提高 1

2 专用集成电路可以分为全定制 (Full Custom) 产品 半定制 (Semi-custom) 产品和可编程逻辑器件 (Programmable Logic Device,PLD) (1) 全定制产品全定制产品是指专为特定目的设计 制造的集成电路芯片, 例如电视机 电话等设备中大量使用的专用集成电路芯片 这类产品的设计是从晶体管的版图尺寸 位置和相互连线开始进行, 其目的是达到半导体芯片面积利用率高 工作速度快 功耗低的优良性能 专用集成电路芯片的制作过程包括电路设计 逻辑模拟 版图设计和集成电路的全部生产工序 全定制产品的性能优越, 但是它的设计制造成本高 周期长 同时还具有较大的风险, 因此该产品仅适用于需要进行特大批量生产的情况 (2) 半定制产品半定制产品内部包含基本逻辑门 触发器和具有特定功能的逻辑块所构成的标准单元 这些标准单元是由器件生产厂家预先做好, 但是标准单元之间的连线有待按用户要求进行连接 应用半定制产品时, 用户需要根据设计要求选择合适的产品, 再由产品的结构设计出连线版图, 最后交给生产厂家完成各个标准单元之间的连线 (3) 可编程逻辑器件全定制产品和半定制产品的使用都离不开器件生产厂家的支持, 这给用户带来很多麻烦 用户希望自己能设计专用集成电路芯片, 并且能立即投入实际应用之中, 而且在使用中也能比较方便地对设计进行修改 可编程逻辑器件 (PLD) 就是为满足这一需求而产生的 可编程逻辑器件内的电路和连线都是事先由器件生产厂家做好, 但是其逻辑功能并没有确定 逻辑功能的确定可以由设计者借助于开发工具, 通过编写程序的方法来实现 可编程逻辑器件的工作速度与标准逻辑器件工作速度相当, 但目前使用它们实现信号处理比使用微处理器要复杂, 而且使用成本高 1.2 MCS51 单片机介绍 概述 单片机的全称是单片微型计算机 (Single Chip Microcomputer) 为了使用方便, 它把组成计算机的主要功能部件 : 中央处理器 (CPU) 数据存储器(RAM) 程序存储器(ROM EPROM E 2 PROM 或者 FLASH) 定时/ 计数器以及各种输入 / 输出接口电路等都集成在一块半导体芯片上, 构成了一个完整的计算机系统 与通用的计算机不同, 单片机的指令功能是按照工业控制的要求设计, 因此它又被称为微控制器 (Microcontroller) MCS51 系列单片机是美国 Intel 公司于 1980 年推出的一种 8 位单片机系列 该系列的基本型产品是 和 8751 这三种产品之间的区别只是在片内程序存储器方面 8051 的片内程序存储器 (ROM) 是掩膜型的, 即在制造芯片时已将应用程序固化进去 ;8031 片内没有程序存储器 ;8751 内部包含用作程序存储器的 4K 字节的 EPROM 由于 8051 的 2

3 编程需要制造商的支持,8751 的价格昂贵, 因此 8031 获得更为广泛的使用 MCS51 系列单片机优异的性能 / 价格比使得它从面世以来就获得用户的认可 Intel 公司把这种单片机的内核, 即 8051 内核, 以出售或互换专利的方式授权给一些公司, 如 Atmel Philips ADI 等 这些公司的产品也被称作为 8051 兼容芯片, 这些 8051 兼容芯片在原来的基础上增加了许多特性 本书应用电路中采用了 Atmel 公司的 AT89S51 芯片, 它与 MCS51 单片机指令集兼容, 同时它的内部包含用作程序存储器的 4K 字节的基于 FLASH 技术的只读存储器 采用这款芯片既克服了采用 8031 需要添加外部程序存储器导致电路复杂的缺点, 又克服了采用 8751 导致电路制作成本高的缺点 AT89S51 单片机特性 Atmel 公司的 AT89S51 芯片具有以下特性 : 指令集和芯片管脚与 Intel 公司的 8051 兼容 ; 4K 字节片内在系统可编程 FLASH 程序存储器 ; 时钟频率 :0Hz~33MHz; 128 字节片内随机读写存储器 (RAM); 32 个可编程输入 / 输出管脚 ; 2 个 16 位定时 / 计数器 ; 6 个中断源,2 级优先级 ; 全双工串行通信接口 ; 监视定时器 ; 2 个数据指针 AT89S51 单片机的封装 AT89S51 单片机具有多种封装形式, 包括 PDIP40 PDIP42 PLCC44 和 TQFP44 最适合学校实验室使用的是 PDIP40 封装形式, 它的外形如图 1.1 所示 PDIP40 封装形式的单片机芯片可以很方便地使用面包板来组成应用电路 P1.0 P1.1 P1.2 P1.3 P1.4 (MOSI) P1.5 (MISO) P1.6 (SCK) P1.7 RST (RXD) P3.0 (TXD) P3.1 (INT0) P3.2 (INT1) P3.3 (T0) P3.4 (T1) P3.5 (WR) P3.6 (RD) P3.7 XTAL2 XTAL1 GND VCC P0.0 (AD0) P0.1 (AD1) P0.2 (AD2) P0.3 (AD3) P0.4 (AD4) P0.5 (AD5) P0.6 (AD6) P0.7 (AD7) EA/VPP ALE/PROG PSEN P2.7 (A15) P2.6 (A14) P2.5 (A13) P2.4 (A12) P2.3 (A11) P2.2 (A10) P2.2 (A9) P2.0 (A8) 图 1.1 AT89S51 单片机 PDIP40 封装外形图 3

4 1.3 AT89S51 单片机的存储器 AT89S51 单片机的程序存储空间和数据存储空间是分离的, 每种存储空间的寻址范围都是 64K 上述存储空间在物理上可以被映射到 4 个区域 : 片内程序存储器和片外程序存储器 ; 片内数据存储器和片外数据存储器 存储空间的映射图如图 1.2 所示 当存储空间映射为外部存储器时, 包括程序空间和数据空间,AT89S51 单片机的 P0 口的 8 个管脚, 从 P0.0(AD0) 到 P0.7(AD7)( 管脚从 39 到 32), 以时分方式被用作数据总线和地址总线的低 8 位 ;P2 口的 8 个管脚, 从 P2.0(A8) 到 P2.7(A15)( 管脚从 21 到 28), 被用作地址总线的高 8 位 由于对外部程序存储器和外部数据存储器的访问都是通过 P0 口和 P2 口实现, 为了区分它们, 外部程序存储器由管脚 PSEN ( 管脚 29) 的输出信号控制 ; 外部数据存储器的写或读操作分别由管脚 P3.6( WR )( 管脚 16) 和管脚 P3.7( RD )( 管脚 17) 输出信号控制 程序存储空间数据存储空间 FFFFH FFFFH 外部程序存储空间 1000H EA=1 内部程序存储空间 FFFH 000H EA=0 外部程序存储空间 FFH 80H 7FH 00H 特殊功能寄存器 内部数据存储空间 0000 H 外部数据存储空间 程序存储空间 图 1.2 AT89S51 单片机的存储器映射图 程序存储空间可以被映射为内部程序存储器或者外部程序存储器 AT89S51 单片机内部具有的 4K 字节程序存储器, 它被映射到程序存储空间的 0000H~0FFFH 区间, 如图 1.2 所示 这部分程序存储空间也可以被映射为外部程序存储器 它具体被映射为那一种程序存储器取决于管脚 EA ( 管脚 31) 所接的电平 当管脚 EA 为高电平, 内部程序存储器被映射到这部分程序存储空间 ; 当管脚 EA 为低电平, 外部程序存储器被映射到这部分程序存储空间 高于 0000H~0FFFH 区间的程序存储空间只能被映射为外部程序存储器 目前 Atmel 公司生产的 8051 兼容芯片具有多种容量的内部程序存储器的型号, 例如 AT89S52 单片机具有 8K 字节内部程序存储器 ;T89C51RD2 单片机具有 64K 字节内部程序存储器 鉴于通常可以采用具有足够内部程序存储器容量的单片机芯片, 因此用户在使用中不需要再扩展外部程序存储器, 这样在单片机应用电路中管脚 EA ( 管脚 31) 可以总是接高电平 4

5 1.3.2 数据存储空间 如图 1.2 所示, 数据存储空间也可以被映射为内部数据存储器和外部数据存储器 进入不同的数据存储器是通过不同的指令来实现, 这点与程序存储器不一样 AT89S51 的内部数据存储器有 256 字节, 它们被分为 2 部分 : 高 128 字节和低 128 字节 低 128 字节的内部数据存储器是真正的 RAM 区, 可以被用来写入或读出数据 这一部分存储容量不是很大, 但有很大的作用 它可以进一步被分为 3 部分, 如图 1.3 所示 通过程序状态字 (PSW) 中的位 RS1 和 RS0 进行选择 } } } } 30H 20H 18H 10H 08H 00H 7FH 2FH 1FH 17H 0FH 07H 通用数据存储器 位寻址空间 4 组工作寄存器 图 1.3 内部数据存储器低 128 字节 在内部数据存储器低 128 字节中, 地址从 00H~1FH 的最低 32 个字节组成 4 组工作寄 存器, 每组有 8 个工作寄存器 每组中的 8 个工作寄存器都被命名为从 R0 到 R7 在一个 具体时刻,CPU 只能使用其中的一组工作寄存器 当前正在使用的工作寄存器组由位于高 128 字节的程序状态字寄存器 (PSW) 中第 3 位 (RS0) 和第 4 位 (RS1) 的数据决定 程 序状态字寄存器中的数据可以通过编程来改变, 这种功能为保护工作寄存器的内容提供了 很大的方便 如果用户程序中不需要全部使用 4 组工作寄存器, 那么剩下的工作寄存器所 对应的内部数据存储器也可以作为通用数据存储器使用 工作寄存器在内部数据存储器中 的地址映射如表 1.1 所示 表 1.1 工作寄存器地址映射表 0 组 (RS1=0,RS0=0) 1 组 (RS1=0,RS0=1) 2 组 (RS1=1,RS0=0) 3 组 (RS1=1,RS0=1) 地址 寄存器 地址 寄存器 地址 寄存器 地址 寄存器 00H R0 08H R0 10H R0 18H R0 01H R1 09H R1 11H R1 19H R1 02H R2 0AH R2 12H R2 1AH R2 03H R3 0BH R3 13H R3 1BH R3 04H R4 0CH R4 14H R4 1CH R4 05H R5 0DH R5 15H R5 1DH R5 06H R6 0EH R6 16H R6 1EH R6 07H R7 0FH R7 17H R7 1FH R7 5

6 在工作寄存器区上面, 内部数据存储器的地址从 20H~2FH 的 16 个字节范围即可以通 过字节寻址的方式进入, 也可以通过位寻址的方式进入, 位地址范围从 00H 到 7FH 字节 地址与位地址的对应关系如表 1.2 所示 表 1.2 字节地址与位地址的关系 位地址 字节地址 D7 D6 D5 D4 D3 D2 D1 D0 2FH 7F 7E 7D 7C 7B 7A EF DH 6F 6E 6D 6C 6B 6A CH BH 5F 5E 5D 5C 5B 5A AH H 4F 4E 4D 4C 4B 4A H H 3F 3E 3D 3C 3B 3A H H 2F 2E 2D 2C 2B 2A H H 1F 1E 1D 1C 1B 1A H H 0F 0E 0D 0C 0B 0A H 内部数据存储器地址从 30H~7FH 部分仅可以被用作为通用数据存储器 内部数据存储器的高 128 字节被称为特殊功能寄存器 (SFR) 区 特殊功能寄存器被用作 CPU 和在片外围器件之间的接口, 它们之间的联系方框图如图 1.4 所示 程序存储器 并行和串行接口 MCS51 核 特殊功能寄存器 定时 / 计数器 中断管理监视定时器等别的外围 图 1.4 特殊功能寄存器 (SFR) 工作框图 6

7 CPU 通过向相应的特殊功能存储器写入数据实现控制对应的在片外围器件的工作, 从 相应的特殊功能存储器读出数据实现读取对应的在片外围器件的工作结果 在 AT89S51 单片机中, 包括前面提到的程序状态字寄存器 (PSW) 的特殊功能存储器 共有 26 个, 它们离散地分布在 80H~FFH 的内部数据存储器地址空间范围, 如表 1.3 所示 表 1.3 AT89S51 单片机特殊功能存储器地址映射表 F8H FFH F0H B F7H E8H EFH E0H ACC E7H D8H DFH D0H PSW D7H C8H CFH C0H C7H B8H IP BFH B0H P3 B7H A8H IE AFH A0H P2 AUXR1 WDERST A7H 98H SCON SBUF 9FH 90H P1 97H 88H TCON TMOD TL0 TL1 TH0 TH1 AUXR 8FH 80H P0 SP DP0L DP0H DP1L DP1H PCON 87H 在表 1.3 中, 对于没有定义的存储单元用户不能使用 如果用户向这些存储单元写入数据将产生不确定的效果, 从它们读取数据将得到一个随机数 对于字节地址低位为 8H 或者 FH 的特殊功能存储器既可以进行字节操作, 也可以进行位操作 例如前面提到的用来确定当前工作寄存器组的程序状态字寄存器 (PSW), 它的地址为 D0H, 因此对它可以进行字节操作, 也可以进行位操作 采用位操作可以直接控制程序状态字寄存器 (PSW) 中的第 3 位 (RS0) 或者第 4 位 (RS1) 数据而不影响其它位的数据 低位地址不为 8H 或者 FH 的特殊功能存储器只可以进行字节操作, 当需要修改这些特殊功能存储器中的某些位时, 对其它的位应注意保护 片外数据存储空间可以被映射为数据存储器 扩展的输入 / 输出接口 模拟 / 数字转换器和数字 / 模拟转换器等 这些外围器件统一编址 所有外围器件的地址都占用数据存储空间的地址, 因此 CPU 与片外外围器件进行数据交换时可以使用与访问外部数据存储器相同的指令 CPU 通过向相应的外部数据存储器地址单元写入数据实现控制对应的片外外围器件的工作, 从相应的外部数据存储器地址单元读出数据实现读取对应的片外外围器件的工作结果 7

8 1.4 单片机最小应用系统电路 +5V C4 + 10uF C5 0.1uF VCC P0.0(AD0) P0.1(AD1) P0.2(AD2) P0.3(AD3) P0.4(AD4) P0.5(AD5) P0.6(AD6) P0.7(AD7) EA/VPP 31 ALE/PROG 30 PSEN P2.7(A15) P2.6(A14) P2.5(A13) P2.4(A12) P2.3(A11) P2.2(A10) P2.1(A9) P2.0(A8) C1 10uF + P1.0 P1.1 P1.2 P1.3 P1.4 P1.5(MOSI) P1.6(MISO) P1.7(SCK) RST P3.0(RXD) P3.1(TXD) P3.2(INT0) P3.3(INT1) P3.4(T0) P3.5(T1) P3.6(WR) P3.7(RD) XTAL2 XTAL1 GND R1 10k C2 30pF CRY 12MHz C3 30pF 图 1.5 最小 AT89S51 单片机最小应用系统电路单片机的最小应用系统电路指的是它可以正常工作的最简单电路组成 AT89S51 单片机的最小应用系统电路图如图 1.5 所示 该系统中包含 4 个电路部分 (1) 供电电路 管脚 VCC( 管脚 40) 接 +5V 电源, 管脚 GND( 管脚 20) 接地线 为提高电路的抗干扰能力, 一个 0.1uF( 器件标注为 104) 的瓷片电容和一个 10uF 的电解电容通常被接在管脚 VCC 和接地线之间 (2) 程序存储器选择电路 如前所述,Atmel 公司生产的 8051 兼容芯片具有多种容量的内部程序存储器的型号, 因此用户在使用中不需要再扩展外部程序存储器, 这样在单片机应用电路中管脚 EA ( 管脚 31) 可以总是接高电平 (3) 时钟电路 AT89S51 芯片的时钟频率可以在 0Hz~33MHz 范围 单片机内部有一个可以构成振荡器的放大电路 在这个放大电路的对外管脚 XTAL2( 管脚 18) 和 XTAL1( 管脚 19) 接上晶体和电容就可以构成单片机的时钟电路 图 1.5 所示的时钟电路由晶体 CRY 和电容 C2 与 C3 组成 单片机的时钟频率取决于晶体 CRY 的频率, 如果采用面包板来组装单片机应用电路, 晶体 CRY 的推荐值为 12MHz 以下 电容 C2 与 C3 的取值范围为 30pF~50pF 时钟电路采用晶体的目的是提高时钟频率的稳定性 (4) 复位电路对于 AT89S51 芯片, 如果管脚 RST( 管脚 9) 保持 24 个时钟周期的高电平, 单片机就可以完成复位 通常为了保证应用系统可靠地复位, 复位电路应使管脚 RST 保持 10ms 以上的高电平 只要管脚 RST 保持高电平, 单片机就循环复位 当管脚 RST 从高电平变为低电平, 单片机退出复位状态, 从程序空间的 0000H 地址开始执行用户程序 8

9 图 1.5 所示复位电路由 C1 和 R1 组成 当系统加电时, 由于 C1 两端的电压不能突变, 因此管脚 RST 为高电平, 单片机进入复位状态 随着 C1 充电, 它两端的电压上升, 使得 管脚 RST 上电压下降, 最终使单片机退出复位状态 合理地选择 C1 和 R1 的取值, 系统 就能可靠地复位 C1 的推荐值是 10uF,R1 的推荐值是 10kΩ 完成复位后, 单片机不仅从程序空间的 0000H 地址开始执行用户程序, 而且还影响一 些特殊功能存储器的初始状态 相应的特殊功能存储器的复位值如表 1.4 所示 表 1.4 特殊功能存储器的复位值 特殊功能寄存器 复位值 特殊功能寄存器 复位值 PC 0000H TMOD 00H ACC 00H TCON 00H B 00H TH0 00H PSW 00H TL0 00H SP 07H TH1 00H DPTR 0000H TL1 00H P0~P3 FFH SCON 00H IP XXX0 0000B SBUF XXXX XXXXB IE 0XX0 0000B PCON 0XXX 0000B 注 : PC 被称作为程序指针, 它被用来存储下一条要执行的指令地址,PC 的位置并不在特殊功能存储器区域 DPTR 被称作为数据指针, 它由 2 个特殊功能寄存器 DP0H 和 DP0L 组成 1.5 单片机模拟调试软件 单片机本身不具备自主开发能力, 即使在单片机应用系统的设计完成以后用户也不能直接对程序进行修改 单片机应用系统的开发必须借助一套开发工具和软件环境才能进行 本节介绍一种单片机模拟调试软件的使用 模拟调试软件不仅可以在程序下载到单片机芯片之前验证它的正确性, 而且模拟调试软件也可以被用来学习单片机的基本知识 Keil 单片机模拟仿真调试软件的安装和启动 Keil 单片机模拟调试软件是目前获得广泛应用的一种开发 MCS51 系列兼容单片机的软件 该软件可以从 Keil 公司中国代理处购买, 也可以从 Keil 公司的网站 (http: // 上下载它的免费评估 (Eval) 版本 下载获得的 Keil 单片机模拟调试软件是一个压缩包 压缩包解压后执行其中的 Setup.exe 程序就可以安装这个软件 软件的安装过程与一般的 Windows 应用软件类似, 只要按照安装提示就可以完成软件的安装, 因此这里对它不作详细的介绍, 仅需要注意的是安装方式要选择 Eval Vision 安装 Keil 单片机模拟调试软件安装完成以后, 计算机桌面上将产生一个标注有 Keil 9

10 uvision2 的图标, 双击这个图标就可以进入 Keil 单片机模拟调试软件的集成开发环境 集成开发环境的界面如图 1.6 所示, 初次进入的集成开发环境界面中只包括空的工程管理窗口和输出窗口 图 1.6 Keil 单片机模拟调试软件的集成开发环境 工程 (Project) 的建立 Keil 单片机模拟调试软件对 MCS51 单片机应用系统的软件开发过程采用工程 (Project) 管理 工程 (Project) 保存着程序编辑的信息和程序调试的环境 在开始编写程序之前首先应该建立一个工程 新建一个工程之前通常还需要建立一个文件夹, 后面产生的工程文件以及源程序文件等都将存储在这个文件夹之中 在如图 1.6 所示的集成开发环境的窗口中选择菜单 Project New Project... 将打开建立新工程的对话框 建立新工程的对话框如图 1.7 所示 10 图 1.7 建立新工程的对话框

11 在下拉列表框 保存在 (I) 中选择新建工程将要存储的文件夹名, 在文本框 文件名 (N) 输入工程的名称, 注意对于工程不要添加扩展名, 单击 保存 (S) 按钮即可完成一个工程的创建 单击 保存 (S) 按钮在完成一个工程创建的同时也打开单片机芯片型号选择对话框 图 1.8 所示的对话框已经完成芯片型号的选择 图 1.8 单片机芯片型号选择对话框 Keil 单片机模拟调试软件支持许多公司的 MCS51 单片机兼容产品 如前所述, 本书应用电路中采用 Atmel 公司的 AT89S51 芯片, 下面以这款芯片为例介绍如何实现选择 在图 1.8 所示的对话框中的 Data base 列表框内首先选择生产芯片的公司名称 Atmel, 双击这个公司名称即可打开 Atmel 公司目前生产的所有芯片型号 接着在列出的产品清单中选择将使用的 AT89S51 芯片, 如图 1.8 所示 最后单击 确定 按钮即可完成芯片的选择 完成芯片的选择后又回到如图 1.6 所示的集成开发环境的窗口, 但是这时该窗口中的工程管理窗口不再是空白, 在它的文件选项卡中出现目录列表 Target 1 和它的子目录 Source Group 1 集成开发环境中的菜单 Project 内还包含 Open Project 和 Close Project 等选项 Open Project 选项用来以后再次进入已经建立的工程 选择菜单 Project Open Project... 将打开选择工程的对话框, 该对话框与图 1.7 类似 在下拉列表框 查找范围 (I) 中选择将要打开的工程被存储的文件夹名, 列表框中将出现该文件夹中的所有工程, 选择将要打开的工程, 单击 打开 (O) 按钮即可打开一个工程 选择菜单 Project Close Project... 将关闭当前的工程 11

12 1.5.3 源文件的输入 Keil 单片机模拟调试软件内集成了一个文本编辑器, 用该文本编辑器可以编辑源程序 在如图 1.6 所示的集成开发环境中选择菜单 File New... 单击对应的工具按钮或者快捷键 Ctrl +N 将打开一个新的文本编辑窗口如图 1.9 所示 在图 1.9 中已经完成汇编语言源文件的输入, 并且完成源程序向当前工程的添加 图 1.9 Keil 单片机模拟调试软件的集成开发环境完成汇编语言源文件的输入后, 在集成开发环境中选择菜单 File Save As... 可以完成文件的第一次存储 注意, 汇编语言源文件的扩展名应该是 ASM, 它应该与工程文件存储在同一文件夹之内 在完成文件的第一次存储以后, 当对汇编语言源文件又进行了修改, 再次存储文件则应该选择菜单 File Save 单击对应的工具按钮或者快捷键 Ctrl +S 实现文件的保存 接着的工作需要把汇编语言源文件加入工程之中 选择图 1.9 中的工程管理器窗口的子目录 Source Group 1, 再单击鼠标右键打开快捷菜单 在快捷菜单中选择 Add File to Group Source Group 1, 加入文件对话框被打开 在这个对话框的 查找范围 (I) 下拉列表框中选择存储汇编语言源文件的文件夹, 在 文件类型 (T) 下拉列表框选择 Asm Source file(*.a*;*.src), 这时存储的汇编语言源文件将显示出来 双击要加入的文件名或者选择要加入的文件名再单击 Add 按钮即可完成把汇编语言源文件加入工程 文件加入以后, 加入文件对话框并不消失, 更多的文件也可以利用它加入工程 如果不需要加入其它文件, 单击 Close 按钮可以关闭加入文件对话框 这时工程管理窗口的文件选项卡中子目录 Source Group 1 下出现一个汇编语言源文件, 如图 1.9 所示 需要注意, 当把汇编语言源文件加入工程但还没有关闭加入文件对话框, 这时有可能被误认为文件没有成功地加入工程而再次进行加入操作, 系统将显示所需的文件已经加入的提示 在这种情况下, 单击提示框中的 确定 按钮, 再单击 Close 按钮可以关闭加入文件对话框 12

13 1.6 学习编写第一个程序 最好的学习编写程序的方法就是从编写真实的 可以运行的程序开始 在图 1.9 显示 的集成开发环境的编辑工作区中已经输入一段汇编语言源程序 这段程序是一段小程序, 但它却充分说明汇编语言源程序由什么构成 下面列出这段汇编语言源程序 程序示例 1.1: ORG 0000H ; 定位源程序在程序存储空间的存储起始地址 BEGIN: MOV R0, #01H ; 向工作寄存器 R0 送入数据 01H MOV 00H, #02H ; 向内部数据存储器的 00H 地址单元送入数据 02H MOV 02H, #03H ; 向内部数据存储器的 02H 地址单元送入数据 03H MOV A, R0 ; 把工作寄存器 R0 内的数据复制到累加器 A MOV ; 把以工作寄存器 R0 内的数据为地址的内部数据存储器 ; 对应的地址单元内的数据复制到累加器 A AJMP BEGIN ; 转到语句标号 BEGIN 所对应的指令处执行 END ; 源程序结束 ORG 指令 程序示例 1.1 的第一条语句是 : ORG 0000H 这一条语句是一条伪指令, 即程序被汇编后不会产生可执行的指令代码 伪指令可以参考本书后面附录 2 列出的 MCS51 单片机汇编器伪指令 伪指令 ORG 用来定位指令代码在程序存储空间的位置 由于单片机复位后程序指针 PC=0000H, 即指令从程序存储空间的 0000H 地址开始执行, 因此汇编语言源程序的第一句必须是 : ORG 0000H 指令代码没有必要在程序存储空间连续放置, 所以除第一句外, 可以使用 ORG 指令把其余的指令代码放置于程序存储空间的任意地方 紧跟着 ORG 指令后面的汇编语言语句产生的指令代码将位于 ORG 指令后面带的程序存储空间地址, 再后面的汇编语言语句产生的指令代码将紧跟在它的后面连续地在程序存储空间中放置 语句标号 第二条语句的开头是 :BEGIN: 它被称作为语句标号 语句标号可以由字母 数字和下划线组成, 但是必须以字母开始 语句标号以冒号结束 应该注意, 语句标号不能使用一些保留字, 这些保留字包括寄存器名和下面将要提到的汇编指令名称等 语句标号用来为跳转等语句指出相对地址, 绝对地址由汇编语言源程序被汇编成指令代码时产生 使用语句标号简化了涉及跳转等语句的程序编写 语句标号的使用使得当源程序被调整后也不需要通过手工对相应的地址进行对应的改变 13

14 1.6.3 MOV 指令 程序示例 1.1 中出现了 2 种汇编语言指令, 它们的符号是 MOV 和 AJMP MCS51 单片机的汇编语言指令系统参见附录 1 MOV 指令的功能是数据传送, 它的指令格式为 : MOV 目标地址, 源地址 MOV 指令的作用空间为内部数据存储器的 256 字节, 该指令不能用来访问外部数据存储器 进入数据存储空间的方法称作为寻址方式, 换句话说就是如何寻找参与操作的数据 MCS51 单片机的汇编语言指令系统具有 7 种寻址方式 : 立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 相对寻址 变址寻址和位寻址 下面仅对程序示例 1.1 中出现的寻址方式进行介绍 程序示例 1.1 中显示的第二条语句为 : MOV R0, #01H 这句的功能是向工作寄存器 R0 赋值为 01H 的数据 语句中包含 2 种寻址方式 语句在源地址的位置是一个具体的操作数据 当汇编语言指令中有具体的操作数据则被称作为立即寻址, 这个数据也被称作为立即数 立即数由 # 符号开始, 它可以采用 16 进制数 ( 后缀 H) 10 进制数 ( 无后缀 ) 和 2 进制数 ( 后缀 B) 来表示 该语句的目标地址为工作寄存器 R0, 访问工作寄存器的寻址方式被称为寄存器寻址 寄存器寻址可以使用当前工作寄存器组中 R0~R7 的任意一个工作寄存器 MCS51 单片机的数据宽度为 8 位, 用 16 进制格式进行描述, 数据则具有 2 位 语句中出现的 16 进制数的高位不能是字母 如果高位是字母, 则字母前应加一个 0, 例如要把立即数 F6H 送入工作寄存器 R0, 则应写为 : MOV R0, #0F6H 程序示例 1.1 中的第三条语句是 : MOV 00H, #02H 注意这一句的目标地址 这里的 00H 表示地址, 直接给出数据存储器地址的寻址方式称作为直接寻址 注意 00H 和 #02H 的区别, 前者表示一个地址, 后者表示一个立即数 如果地址的最高位是字母, 则字母前也应加一个 0 程序示例 1.1 中的第六句语句是 : MOV 这一句源地址的寻址方式采用了寄存器间接寻址, 它的功能为把以工作寄存器 R0 的内容为地址的存储单元内的内容复制到累加器 A 注意只有工作寄存器 R0 和 R1 可以用于寄存器间接寻址 注释 在程序示例 1.1 中, 汇编语言源程序语句后面存在被称作为注释的程序说明 注释由分号 ; 开始, 直到本行结束 注释可以与某条语句同行, 也可以独立成行 使用注释的目的是为了方便程序阅读 切忌有这样的想法 : 我是程序的唯一阅读者, 14

15 我不会忘记自己编写的程序中语句的含义 一个好的注释记载了设计思想, 同时它也可以方便别人阅读, 方便互相交流 AJMP 指令 程序示例 1.1 中的第七条语句是 : AJMP BEGIN 这条指令的功能是无条件跳转 在这条以前的语句执行时, 程序指针 PC 将自动按顺序指向下一条语句 AJMP 指令影响程序指针 PC, 它把语句中包含的语句标号所指向的语句的地址装入程序指针 PC, 从而影响程序的流向 程序示例 1.1 中的语句必须包含这一条无条件跳转语句 如果没有它, 程序指针 PC 将指出程序设计者所编写程序存在程序存储空间的地址范围, 导致工作失去控制 END 指令 最后一条语句是 :END 它和第一条语句(ORG) 一样, 这也是一条伪指令 该语句不产生可执行的指令代码, 仅用来告诉汇编程序我们编写的汇编语言源程序到此结束 1.7 程序调试 模拟软件的功用之一就是可以在程序下载到单片机芯片之前验证其正确性 当在集成开发环境的文本编辑窗口中完成汇编语言源程序的编辑, 下一步的工作就是对它进行调试 下面介绍实现汇编语言源程序调试所需要的步骤 汇编语言源程序的汇编 计算机的 CPU 只理解机器语言指令, 上面基于符号表述的汇编语言源程序是不能在 CPU 中运行的, 我们需要一种专门的软件把汇编语言源程序转变成机器语言指令 这种专门的软件被称作为汇编程序, 把汇编语言源程序转变成机器语言指令的过程被称作为汇编 Keil 单片机模拟调试软件对汇编语言源程序进行汇编可以在集成开发环境中选择菜单 Project Build target 对应的工具按钮或者快捷键 F7 来实现当前汇编语言源程序的汇编 汇编过程中的信息将出现在输出窗口的 Build 选项卡中 如果被汇编的汇编语言源程序中不存在语法错误, 汇编结果报告将出现在输出窗口的 Build 选项卡中, 如图 1.10 所示 如果被汇编的汇编语言源程序中存在语法错误, 错误报告也将出现在输出窗口的 Build 选项卡中 在对汇编语言源程序中存在的语法错误进行修改后可以再次选择菜单 Project Build target 对应的工具按钮或者快捷键 F7 对当前汇编语言源程序再次进行汇编, 也可以选择菜单 Project Rebuild all target files 或者对应的工具按钮对当前汇编语言源程序再次进行汇编 使用 Project Rebuild all target files 可以对工程中的所有文件进行重新汇编, 这样可以防止由于一些意外情况而导致汇编语言源程序与目标代码的不一致, 建议汇编语言源程序的再次汇编尽量采用这种方法 15

16 图 1.10 Keil 单片机模拟调试软件的集成开发环境 汇编语言源程序的调试 成功地完成汇编语言源程序的汇编仅表明汇编语言源程序没有语法错误, 下一步的工作将通过模拟调试验证它的逻辑是否满足设计要求 Keil 单片机模拟调试软件的调试状态可以通过选择菜单 Debug Start/Stop Debug Session 对应的工具按钮或者快捷键 Ctrl+F5 进入或者退出 进入调试状态以后, 这时的 Keil 单片机模拟软件的集成开发环境如图 1.11 所示 比较图 1.10 和图 1.11, 这时集成开发环境发生了一些变化 : 工程管理器窗口从文件选项卡自动地切换到寄存器选项卡, 输出窗口从 Build 选项卡自动地切换到 Command 选项卡 在输出窗口的 Command 选项卡中显示信息 Running in eval Mode (2K), 这条信息在进入调试状态时也出现过, 这是因为 Keil 单片机模拟调试软件的评估 (Eval) 版本只支持 2K 字节的程序空间寻址操作 在图 1.11 中还通过选择菜单 View Memory Window 或者对应的工具按钮打开了存储器观察窗口 刚打开存储器观察窗口时它的内部是空白的 通过向文本框 \ddress 输入 字母 : 数字 来打开想要观察的存储空间和它的起始地址 字母可以是 C D I 和 X, 它们分别代表程序存储空间 直接寻址的片内数据存储空间 间接寻址的片内数据存储空间和外部数据存储空间 数字表示想要观察的存储空间的起始地址 在图 1.11 中, 向文本框 \ddress 输入 D:0000H 打开从地址 0000H 开始的直接寻址的片内数据存储空间 16

17 在工程管理器窗口的寄存器选项卡中现在显示当前的工作寄存器 R0~R7 和部分特殊功能寄存器的内容 在进入调试状态的同时也完成了单片机的复位, 所以这时特殊功能寄存器的内容就是它们的复位值 程序指针 PC 的复位值为 0000H, 表示单片机在复位后从程序空间的地址 0000H 处开始执行指令代码 在文本编辑器窗口这时也发生变化, 在汇编语言源程序的第二条的左侧出现一个黄色的箭头, 它表示这句指令将被执行 汇编语言源程序的第一条是伪指令, 源程序被汇编后它不会产生可执行的指令代码 图 1.11 Keil 单片机模拟仿真调试软件的集成开发环境通过选择菜单 Debug Step 对应的工具按钮或者快捷键 F11 可以实现汇编语言源程序的单步模拟执行 在图 1.11 所示的集成开发环境, 第一次单步模拟执行, 第二条语句被执行, 第三条语句的左侧出现一个黄色的箭头, 它表示这条语句将被执行, 同时程序指针 PC 的值变为 0002H 程序指针 PC 的数值从 0000H 直接变为 0002H 是因为第二条语句在存储时占据 2 个存储器字节 在附录 1 中列出的汇编指令系统中包括每条指令的功能 存储时占用的存储空间和执行时需要的具体时间 第二条语句的执行使得工作寄存器 R0 的内容变为 01H, 同时也使得内部数据存储器的地址 00H 的内容为 01H 这可以从打开的存储器观察窗口看到 上述结果表明工作寄存器 R0 和直接地址 00H 对应同一物理存储空间, 而且它将在执行第三条语句时同样被验证 第三条语句的执行使得内部数据存储器的地址 00H 的内容为 02H, 同时也使得工作寄存器 R0 的内容变为 02H 第五条语句的执行把工作寄存器 R0 当前的内容复制到累加器 A, 工作寄存器 R0 的内容保持不变 语句执行后, 工作寄存器 R0 的内容和累加器 A 的内容都是 02H 第六条语句的执行把以工作寄存器 R0 当前的内容,02H, 为地址的数据存储器的内容 17

18 复制到累加器 A 地址为 02H 的数据存储器的内容是 03H, 因此这条语句执行后, 累加器 A 的内容变为 03H 第七条语句的执行使得第二条语句的左侧出现一个黄色的箭头, 同时程序指针 PC 的值变为 0000H 完成汇编语言源程序模拟调试, 证实它的逻辑满足设计要求, 这时可以再次通过选择菜单 Debug Start/Stop Debug Session 对应的工具按钮或者快捷键 Ctrl+F5 退出 Keil 单片机模拟调试软件的调试状态 1.8 小结 单片机通过编写程序来实现系统功能, 这些程序被存储在程序存储器之中 单片机通过向相应的数据存储地址单元写入数据控制对应的外围器件的工作, 从相应的数据存储地址单元读出数据获得对应的外围器件的工作结果 本章首先介绍了 AT89S51 单片机的特性和它的存储空间 模拟调试软件不仅可以在程序下载到单片机芯片之前验证它的正确, 而且模拟调试软件也可以被用来形象地学习单片机的基本知识 Keil 单片机模拟调试软件在这里被介绍 在学习中应该重点掌握模拟调试软件的使用, 其它内容随着学习的进行可以更深入地理解 单片机通过编写程序来实现系统功能, 程序由一条一条的指令组成 本章重点介绍了访问内部数据存储器的数据传送指令 MOV; 介绍了访问内部数据存储器的寻址方式 ; 立即寻址 直接寻址 寄存器寻址 寄存器间接寻址方式的具体使用被举例讨论 本章还介绍了最小应用系统电路, 这个电路是构成后面各种应用电路的基础 实验 1. 采用内部数据存储器的数据传送指令 MOV, 源地址采用立即寻址, 目标地址采用直接寻址编写一段汇编语言源程序完成分别向内部数据存储器的 30H~3FH 存储单元送入数据 00H~0FH, 并应用 Keil 单片机模拟调试软件对所编写程序进行调试, 对程序运行结果进行观察 2. 采用内部数据存储器的数据传送指令 MOV, 目标地址采用寄存器寻址, 源地址采用直接寻址编写一段汇编语言源程序完成分别把内部数据存储器的 30H~37H 存储单元的内容复制到当前工作寄存器 R0~R7, 并应用 Keil 单片机模拟调试软件对所编写程序进行调试, 对程序运行结果进行观察 3. 采用内部数据存储器的数据传送指令 MOV, 目标地址采用累加器 A, 源地址采用寄存器间接寻址编写一段汇编语言源程序逐个把内部数据存储器的 38H~3FH 存储单元的内容逐个复制到累加器 A, 并应用 Keil 单片机模拟调试软件对所编写程序进行调试, 对程序运行结果进行观察 18

19 第 2 章并行输入 / 输出口的应用 2.1 并行输入 / 输出口概述 AT89S51 单片机具有 4 个分别被命名为 P0 P1 P2 和 P3 的 8 位并行输入 / 输出接口, 它们对应的具体管脚如图 1.1 所示 这 4 个 8 位并行口即可以作为输入口使用, 也可以作为输出口使用 它们具体被用作输入口或者输出口取决于单片机当前所执行的指令 单片机并行传输数据的位数是 8 位, 所以数据传输需要 8 条数据线 存储空间的寻址范围为 64K, 因此寻址需要 16 条地址线 P0 口的 8 个管脚通过时分方式被用作数据总线和地址总线的低 8 位,P2 口的 8 个管脚被单独用作地址总线的高 8 位 由于一个实际的单片机应用系统不可避免地需要扩展一些外围器件, 这些外围器件的地址都占用外部数据存储空间的地址, 因此 P0 口和 P2 口通常不能被用作通用并行输入 / 输出接口 P3 口除了可以被用作通用并行输入 / 输出接口之外, 它还具有第二功能 P3 口各个管脚的第二功能定义如表 2.1 所示 管脚 表 2.1 P3 口各个管脚的第二功能定义 P3.0 串行输入口 (RXD) P3.1 串行输出口 (TXD) P3.2 外部中断 0( INT 0 ) P3.3 外部中断 1( INT 1 ) P3.4 定时 / 计数器 0(T0) 外部输入 P3.5 定时 / 计数器 1(T1) 外部输入 第二功能 P3.6 外部数据存储器写控制 ( WR ) P3.7 外部数据存储器读控制 ( RD ) 表 2.1 列出的这些功能也是一个实际的单片机应用系统经常需要使用的, 因此 P3 口通常也不能被用作通用并行输入 / 输出接口 如果不对单片机的并行输入 / 输出接口进行扩展, 通常能用作通用并行输入 / 输出接口的端口仅剩下 P1 口 在实际使用中, 使用者需要注意它的负载能力, 即端口输出或者输入电流的能力 尤其在用 P1 口驱动一些线性器件, 例如开关 按键 发光二极管和数码管, 它的驱动电流能力需要被仔细考虑 如果单片机不能向负载提供足够的驱动电流, 则还应该添加相应的电路 19

20 2.2 基于 P1 口的交通信号灯控制电路设计 本节应用 AT89S51 单片机的 P1 口设计一个交通信号灯控制电路 设计工作从最简单的电路出发, 逐步添加功能使其完善 本节只考虑向东西和南北 2 个方向各提供包括红 黄和绿的 3 个信号灯 实验电路中的信号灯使用发光二极管来代替 直接使用 P1 口驱动发光二极管则发光二极管的亮度很微弱, 这是因为 P1 口的驱动电流太小 为了向发光二极管提供足够的电流, 在 P1 口和发光二极管之间必须插入一个电流放大装置 这里采用八双向总线发送 / 接收器 74LS245 实现电流放大 交通信号灯控制电路具体电路图如图 2.1 所示 +5V C4 + 10uF C5 0.1uF VCC P0.0(AD0) 38 P0.1(AD1) 37 P0.2(AD2) 36 P0.3(AD3) 35 P0.4(AD4) 34 P0.5(AD5) 33 P0.6(AD6) 32 P0.7(AD7) EA/VPP 31 ALE/PROG 30 PSEN P2.7(A15) P2.6(A14) P2.5(A13) P2.4(A12) P2.3(A11) P2.2(A10) P2.1(A9) P2.0(A8) C1 10uF + P1.0 P1.1 P1.2 P1.3 P1.4 P1.5(MOSI) P1.6(MISO) P1.7(SCK) RST P3.0(RXD) P3.1(TXD) P3.2(INT0) P3.3(INT1) P3.4(T0) P3.5(T1) P3.6(WR) P3.7(RD) XTAL2 XTAL1 GND V VCC 20 E 19 R1 10k C2 30pF CRY 12MHz C3 30pF DIR A0 A1 A2 A3 A4 A5 A6 A7 GND B0 18 B1 17 B2 16 B3 15 B4 14 B5 13 B6 12 B7 11 D1 D2 D3 D4 D5 D6 R2 图 2.1 基于 P1 口的交通信号灯控制电路与图 1.5 所示的单片机最小应用系统电路相比较, 图 2.1 中所示的交通信号灯控制电路仅添加了 6 个发光二极管和 1 个用于电流放大的八双向总线发送 / 接收器 74LS245 74LS245 的功能表如表 2.2 所示 20

21 表 LS245 功能表 输 入 功 能 E DIR 0 0 B 口为输入,A 口为输出 0 1 A 口为输入,B 口为输出 1 A 口与 B 口隔离 图 2.1 所示的电路中,74LS245 的管脚 DIR 和 E 都接地,74LS245 的信号传输方向为 从 B 口到 A 口, 因此 P1 口的输出信号送入 74LS245 的 B 口, 进行电流放大后再从 A 口输 出 在信号的控制方面,P1 口的管脚与发光二极管连接关系的定义如表 2.3 所示 表 2.3 P1 口的管脚与发光二极管的连接关系 东西方向 南北方向 红 黄 绿 红 黄 绿 D6 D5 D4 D3 D2 D1 P1.6 P1.5 P1.4 P1.2 P1.1 P1.0 图 2.1 所示电路中,6 个发光二极管的连接方式被称为共阴极连接方式, 即所有二极管的 N 极被连接在一起再与地线相连 对于这种连接方式, 如果 P1 口的某个管脚输出逻辑 1, 即高电平, 则对应的发光二极管被点亮 ; 如果 P1 口的某个管脚输出逻辑 0, 即低电平, 则对应的发光二极管熄灭 在所有发光二极管的公共连接点与接地线之间还存在一个电阻 R2, 它被称作为限流电阻 限流电阻被用来防止电流过大损坏电路器件 由于不同型号的发光二极管的技术参数不同, 应根据具体情况来确定限流电阻的阻值, 限流电阻的取值范围是 100Ω~1kΩ 为保证电路的安全, 限流电阻开始可以选取大一些, 如果发光二极管的亮度不够, 再逐渐减小限流电阻的值, 直到发光二极管的亮度满足要求 2.3 基于 P1 口的交通信号灯控制程序 本节是学习应用 MCS51 单片机汇编语言指令编写实用程序的起点, 首先你得迈出第一步, 试着编写第一个汇编语言源程序 交通信号灯控制状态表 在编写应用系统汇编语言源程序之前, 首先需要确定交通灯的状态和变化顺序 表 2.4 列出一种交通灯的显示状态 变化顺序和实现这些状态时 P1 口相关管脚的输出逻辑 表 2.4 也可以绘制成程序框图 21

22 表 2.4 交通灯的状态和变化顺序 东西方向 南北方向 状态红黄绿红黄绿 P1 口输出 ( 二进制 ) P1 口输出 ( 十六进制 ) 1 亮 灭 灭 灭 灭 亮 B 41H 2 亮 灭 灭 灭 亮 灭 B 42H 3 灭 灭 亮 亮 灭 灭 B 14H 4 灭 亮 灭 亮 灭 灭 B 24H 表 2.4 列出一个十字路口交通指示灯所需的 4 种状态 这 4 个状态应该顺序 循环地变化 在图 2.1 中所示的电路中, 单片机的管脚 P1.7 和 P1.4 是悬空的, 因此向它们赋值对所设计的电路不会产生任何影响 使这 2 个管脚的输出一直为 0, 这样对 P1 口的访问就可以采用字节寻址 交通信号灯控制汇编语言源程序 应用表 2.4 可以非常方便地编写出用于控制交通信号灯的汇编语言源程序 具体的汇编语言源程序如下面程序示例 2.1: 程序示例 2.1: ORG 0000H BEGIN: MOV P1, #41H ; 东西方向红灯亮, 南北方向绿灯亮, 其余灯灭 MOV P1, #42H ; 东西方向红灯亮, 南北方向黄灯亮, 其余灯灭 MOV P1, #14H ; 东西方向绿灯亮, 南北方向红灯亮, 其余灯灭 MOV P1, #24H ; 东西方向黄灯亮, 南北方向绿灯亮, 其余灯灭 AJMP BEGIN ; 完成 4 种状态的显示, 返回第一种状态 END 在程序示例 2.1 中, 对目标地址 P1 的寻址属于直接寻址 由表 1.3 列出的 AT89S51 单片机特殊功能存储器地址映射表可知,P1 的具体地址为 90H 在程序中使用 P1 或者 90H 的作用是相同的 采用在第一章介绍的方法, 应用 Keil 单片机模拟调试软件, 控制交通信号灯的汇编语言源程序的模拟调试就可以进行 在调试状态下, 为了观察方便, 使用者可以选择菜单 Peripherals I/O Ports Port 1 打开了 P1 口的观察窗口, 如图 2.2 所示 在图 2.2 中, 汇编语言指令 MOV P1, #41H 已经被执行 对照表 2.4 列出的交通灯的显示状态, 这时 P1 口观察窗口的显示状态和表 2.4 中列出的 P1 口输出 ( 二进制 ) 状态完全一样 在 P1 口的观察窗口中, 具有 标志表示该管脚输出高电平, 否则输出低电平 随着程序示例 2.1 中语句的逐步 顺序地执行, 在 P1 口的观察窗口中显示的 P1 口的 22

23 状态相应地发生变化 当执行到 AJMP 指令, 一个十字路口交通指示灯所需的 4 种状态已经全部完成显示, 下一句将要执行的语句将返回到输出起始状态的语句 需要注意的是, 上述程序仅能进行模拟调试, 它不能被下载到单片机芯片中实际执行 不能下载到单片机芯片中实际执行的原因是编程时没有考虑每条语句的执行时间 图 2.2 Keil 单片机模拟调试软件的集成开发环境 MOV 指令的执行时间 单片机的工作是在它的时钟电路的同步下进行的 当时钟频率一定, 每条指令的执行时间就是一个确定值 参考本书后面附录 1 列出的 MCS51 单片机的汇编语言指令系统, 程序示例 2.1 用到的向 P1 口赋值的语句属于数据传送类指令, 它把一个立即数送到一个直接地址表示的存储单元 这种指令的详细描述如表 2.5 所示 表 2.5 指令详细描述助记符指令功能说明存储占用字节执行需要时钟周期 MOV direct,#data 立即数送入直接地址单元 3 24 MOV 指令的作用空间为内部数据存储器的 256 字节 表 2.5 中的 direct 表示直接寻址, #data 表示立即寻址 这样的指令存储在程序存储器中将占用 3 个字节, 单片机执行它需要 24 个时钟周期 对于 AT89S51 芯片, 每 12 个时钟电路的振荡周期形成 1 个单片机的机器周期, 因此向一个由直接地址表示的存储单元传送一个立即数单片机需要 24 个时钟周期或者 2 个机器周期的时间 对于图 2.1 中所示的电路, 它的时钟频率选 12MHz, 因此它的时钟周期为 1/12us, 机 23

24 器周期为 1us, 每向 P1 口赋一次值仅需要 2us 这点也可以从图 2.2 的工程管理器窗口从文件的寄存器选项卡看出 刚进入 Keil 单片机模拟调试软件的调试状态时, 显示状态为 ; PC $ C:0x0000 states 0 sec 当汇编语言指令 MOV P1, #41H 被执行, 这时显示状态为 ; PC $ C:0x0003 states 2 sec 它表示这一句汇编语言指令占用 3 个字节程序存储器空间, 执行它需要 2 个机器周期, 当采用 12MHz 时钟频率时将花费 2 us 程序示例 2.1 中即使在计入 AJMP 指令的执行时间, 完成一次交通灯的 4 个状态循环也仅需 10us 在一个实际的电路中, 如果模拟交通指示灯的发光二极管以这样高的频率闪烁, 人们的眼睛是不能识别它们的变化, 为了克服这一点, 在每条向 P1 口赋值的语句之间需要插入一段延时程序 2.4 采用 DJNZ 指令实现延时 DJNZ 指令属于控制转移类指令, 它有 2 种形式, 它的详细描述如表 2.5 所示 表 2.5 DJNZ 指令详细描述 助记符指令 功能说明 存储占用字节 执行需要时钟周期 DJNZ Rn,rel 工作寄存器内容减 1, 非 0 转移 3 24 DJNZ direct,rel 直接地址单元内容减 1, 非 0 转移 3 24 表 2.5 中的 Rn 为工作寄存器,n 可以选 0~7, 即 Rn 可以是 R0~R7 中的任意一个 rel 是一个相对地址, 由一个语句标号来表示, 它对应的绝对地址在源程序被汇编时确定 DJNZ 指令的跳转范围是受限制的, 这个范围是以紧跟着 DJNZ 指令的下一条指令的开始地址为基准的 -128~127 字节, 即向前 128 字节, 向后 127 字节 执行一次 DJNZ 指令需要 2 个机器周期 在执行的过程中, 该指令完成语句内工作寄存器或者直接地址单元的内容减 1, 然后再判断被减后的内容, 如果为 0 将执行该语句下面一条语句 ; 如果不为 0 将跳到由相对地址表示的语句处执行 适当地选择相对地址, 重复执行该指令就可以实现所需要的延时 下面通过一个例子说明如何使用 DJNZ 指令实现延时的工作过程 程序示例 2.2: ORG 0000H BEGIN: MOV R6, #03H ; 向工作寄存器 R6 赋初值 24

25 MOV R7, #03H ; 向工作寄存器 R7 赋初值 AA: DJNZ R7, AA ; 工作寄存器 R7 的内容减 1, 如果为 0, 执行下一条 ; 语句, 否则继续执行本条语句 DJNZ R6, AA ; 工作寄存器 R6 的内容减 1, 如果为 0, 执行下一条 ; 语句, 否则返回执行上一条语句 AJMP BEGIN ; 再一次执行延时程序 END 该段程序首先向工作寄存器 R6 和 R7 赋初值, 然后开始执行 DJNZ 指令 第一次执行 DJNZ 指令后,R7 的内容变为 2, 由于 R7 的内容不为 0, 因此程序跳到语句标号 AA 所指的语句执行, 在这里即本条语句再次被执行 这个过程循环 3 次 进入第 3 次循环时 R7 的内容为 1, 这一次执行以后 R7 的内容为 0, 因此不发生跳转, 将按顺序执行第二条 DJNZ 指令 当第二条 DJNZ 指令被执行,R6 减 1 以后, 由于它的内容不为 0, 再次跳回第一条 DJNZ 指令 这时 R7 的内容为 00H, 再次执行指令后 R7 的内容变为 FFH, 因此接着第一条 DJNZ 指令被继续执行多次 程序示例 2.2 可以被看作为一个 16 进制减法计数器,R7 为计数器 个位,R6 为计数器 十位 应用模拟调试软件可以非常直观地观察到计数器的工作过程 单步模拟执行包含 R7 的 DJNZ 汇编语言源程序, 即通过选择菜单 Debug Step 对应的工具按钮或者快捷键 F11,R7 的内容减 1; 当 R7 的内容减到 00H 时, 包含 R6 的 DJNZ 语句被执行 ; 当 R6 的内容减 1 以后不为 00H 时, 再返回包含 R7 的 DJNZ 语句继续执行 ; 当 R6 的内容减 1 以后为 00H 时, 延时程序执行完毕, 执行包含 R6 的 DJNZ 语句以后的语句 要实现确定时间的延时, 如果已知 1 个机器周期对应的时间, 需要做的工作就是确定向要用到的工作寄存器或者直接地址单元赋初值 下面利用实现 1s 延时为例分析赋初值要考虑的事情 如果运行程序示例 2.2 的硬件电路是如图 2.1 所示的电路, 它的时钟频率为 12MHz, 机器周期为 1us 执行一次 DJNZ 指令需要 2 个机器周期, 即需要 2us 当需要实现 1s 的延时,DJNZ 指令将需要被执行 次 由于单片机内部的计算是按二进制进行的, 因此在向要用到的工作寄存器或者直接地址单元赋初值之前,DJNZ 指令的执行次数需要被变换成二进制或者十六进制数 ( ) 十进制 = ( ) 二进制 = (7A122) 十六进制数单片机所处理数据的每个字节包含 8 位, 对于上述要求需要 3 个存储单元 考虑到基于 DJNZ 指令实现延时的程序的执行过程, 在赋值之前上面数据还需要进行调整 为更好地了解对赋值数据的调整, 我们回到上述的程序示例 2.2 需要数据调整的第一种误差是当第二条 DJNZ 指令中 R6 的内容为 1 时, 这句指令的执行将不会再执行第一条 DJNZ 指令, 而是将按顺序向下执行 这种情况相当减法计数器的 十位 一旦为 0, 减法计数器将不再进行 个位 的计数 为解决这个问题, 十位 在赋值时应该加 1 25

26 需要数据调整的第二种误差是低位向高位借位时产生的延时误差 我们仍回到上述的程序示例 2.2 当第一条 DJNZ 指令中 R7 的内容为 1 时, 这一条指令被执行将使得 R7 的内容为 0; 接着执行第二条 DJNZ 指令, 使得 R6 的内容减 1, 在这个期间,R7 的内容保持为 0; 第三步再返回执行第一条 DJNZ 指令, 使得 R7 的内容为 FFH 综上所述, 每当发生低位向高位借位时, 将多花费执行一次 DJNZ 指令的时间 考虑上述 2 点延时误差以后的实现 1s 延时程序如下 : MOV R5, #08H MOV R6, #9AH MOV R7, #7FH AA: DJNZ R7, AA DJNZ R6, AA DJNZ R5, AA 在上面程序中,R5 被赋予 最高位, 它的实际赋值为计算值加 1 以克服第一种误差 R6 被赋予 中间位, 它的实际赋值减 7 克服向 最高位 的借位误差 R7 被赋予 最低位, 它的实际赋值为计算值减去向 中间位 的借位误差 在上面程序中没有考虑向工作寄存器 R5~R7 赋初值的时间开销, 还需要注意的是它不能进行模拟调试, 因为它不完整 在一个交通灯的控制电路这样的应用中, 采用实现 1s 延时程序那样的精确计算在实际工作中是不必要的, 而且时钟电路的频率也并不是精确地等于晶体标注的频率 上面进行详细讨论的目的是描述如何比较准确地分析指令的执行时间, 这点在对一些高速外围器件的控制时是很重要的 延时程序实现的延时也可以通过实验测量的方法获得, 方法包括采用应用 Keil 单片机模拟调试软件和采用硬件实验设备, 具体的方法将在后面的章节中结合实际的例子进行详细的介绍 如果希望图 2.1 所示的电路产生的每一个交通灯的工作状态能维持 1s 时间, 把上面实现 1s 的延时程序分别插入程序示例 2.1 的所有向 P1 传送数据的语句之后即可实现 在这里需要提醒注意地是插入的 4 段实现 1s 延时程序不能具有相同的语句标号 在整个程序中, 汇编语言语句前的语句标号必须是唯一的 2.5 子程序及其调用 在程序示例 2.1 中插入 4 段结构一样的程序, 无论程序阅读还是程序调试都不是很简便 本节采用子程序对这样的程序结构进行化简 这一部分内容包括子程序的编写和子程序的调用 2 部分, 下面分别进行讨论 26

27 2.5.1 子程序调用指令 子程序调用指令属于控制转移类指令, 它有 2 种形式, 详细描述如表 2.6 所示 表 2.6 子程序调用指令详细描述助记符指令功能说明存储占用字节执行需要时钟周期 ACALL addr11 绝对 ( 短 ) 调用子程序 2 24 LCALL addr16 绝对 ( 长 ) 调用子程序 3 24 ACALL 指令和 LCALL 指令仅有的区别是指令的作用空间 表 2.6 中,addr11 表示指令中包含被调用目标地址的低 11 位, 目标地址的高 5 位与本条 ACALL 指令在程序空间中的高 5 位地址相同, 因此 ACALL 作用的空间处于本语句的同一 2k 字节的程序存储空间块之中 addr16 表示指令中包含 16 位的调用目标地址, 因此 LCALL 的作用空间为整个程序空间的 64k 字节 在这两条指令中, 地址也是由语句标号给出, 它对应的绝对地址在源程序被汇编时确定 子程序编写格式 采用子程序即可以方便程序的阅读和调试, 同时也可以在不同的设计中方便地实现资源共享 为了使用方便, 子程序应该给出说明 下面以实现 1s 的延时程序为例给出一个推荐的说明格式 ; 子程序名 :TIMER1S ; 程序功能 : 实现 1s 延时 ( 时钟频率 :12MHz) ; 程序入口 : 无 ; 程序出口 : 无 ; 占用资源 : 工作寄存器区 0 的 R5 R6 和 R7 ; 程序清单 : TIMER1S: MOV R5, #08H ; 子程序开始, 赋延时初值 MOV R6, #9BH MOV R7, #7FH TIMER1S1: DJNZ R7, TIMER1S1 DJNZ R6, TIMER1S1 DJNZ R5, TIMER1S1 RET ; 子程序返回指令在上面推荐的说明格式中, ; 表示本行是一个注释行 第一句给出了子程序名字, TIMER1S 这也是子程序中第一条语句的语句标号, 它可以被子程序调用语句用来作为调用的目标地址 程序入口包含需要向子程序传递的数据 程序出口提供子程序的处理结果 在 1s 的延时程序中既不需要向子程序传递的数据, 也不需要向调用者返回处理结果 既不需要向子程序传递数据, 也不需要向调用者返回处理结果的子程序理解起来觉得挺奇怪 实际上, 很多子程序都是这样的, 它们没有显式的程序入口和程序出口, 它们利用外部或 27

28 者内部的数据完成某项任务, 并以某种方式对外显示结果 1s 的延时程序利用程序内部赋值实现确定时间的延时 当在程序示例 2.1 的所有向 P1 传送数据的语句之后分别调用该程序就可以减缓发光二极管的闪烁频率 所有的程序都是有用的, 否则谁会去编写它 占用资源表示子程序运行时需要的单片机资源 专门提到这些是防止子程序的执行破坏主程序的运行环境 如果主程序运行需要的单片机资源与子程序运行时需要的资源冲突, 则应该在调用子程序前对主程序的运行环境进行保护 程序清单中的最后一句是 : RET 这一句是子程序返回指令, 它也属于控制转移类指令 它的具体应用在下一节将详细介绍 2.6 交通信号灯控制程序及其模拟调试 程序清单 程序示例 2.3: ORG 0000H BEGIN: MOV P1, #41H ; 东西方向红灯亮, 南北方向绿灯亮, 其余灯灭 ACALL TIMER1S ; 调用 1s 延时子程序, 实现 1s 延时 MOV P1, #42H ; 东西方向红灯亮, 南北方向黄灯亮, 其余灯灭 ACALL TIMER1S ; 调用 1s 延时子程序, 实现 1s 延时 MOV P1, #14H ; 东西方向绿灯亮, 南北方向红灯亮, 其余灯灭 ACALL TIMER1S ; 调用 1s 延时子程序, 实现 1s 延时 MOV P1, #24H ; 东西方向黄灯亮, 南北方向绿灯亮, 其余灯灭 ACALL TIMER1S ; 调用 1s 延时子程序, 实现 1s 延时 AJMP BEGIN ; 完成 4 种状态的显示, 返回第一种状态 ORG 0100H TIMER1S: MOV R5, #08H ;1s 延时子程序开始, 赋延时初值 MOV R6, #9AH MOV R7, #7AH TIMER1: DJNZ R7, TIMER1 DJNZ R6, TIMER1 DJNZ R5, TIMER1 NOP ; 补充 1 个机器周期 RET ; 从子程序返回调用它的主程序 END ; 全部程序结束 28

29 在子程序的开头出现了伪指令 ORG, 它使得子程序从程序空间的 0100H 地址开始连续存放 在程序示例 2.3 中也可以不使用伪指令 ORG 指定子程序的存储位置 如果在上面汇编语言源程序中删去存储定位伪指令 : ORG 0100H 那么也不会影响程序的正常执行, 这样使得子程序在程序存储器中存储时紧跟着前面的主程序后面连续地存储 模拟调试软件运行参数的设置 程序示例 2.3 中除去子程序和子程序调用之外, 另一个新内容就是实现 1s 的延时 这里将要介绍应用 Keil 单片机模拟调试软件通过实验的方法对延时的时间进行检验 图 2.3 Target 设置对话框进行检验之前, 首先需要设置模拟调试软件的时钟频率 模拟调试软件以这个频率为基准计算汇编语言源程序的执行时间 模拟调试软件的时钟频率可以由图 2.3 显示的运行参数设置对话框进行设置 在集成开发环境中工程管理窗口的文件选项卡中选择目录 Target 1, 然后再选择菜单 Project Option for target target 1 就可以打开图 2.3 显示的 Target 设置对话框 在 Target 设置对话框内的文本框 Xtal(MHz) 中输入电路采用的时钟频率 :12.0, 单击 确定 按钮即可完成模拟调试软件的时钟频率的设置 29

30 2.6.3 程序的模拟调试 子程序的调用和返回 如图 2.4 所示, 当执行子程序调用指令 : ACALL TIMER1S 下一句将要执行的指令跳到语句标号 TIMER1S 所指的指令处执行 由工程管理器窗口的寄存器选项卡也可以看出, 下一句将要执行的指令地址为 100H, 即子程序 TIMER1S 的首地址 图 2.4 Keil 单片机模拟调试软件的集成开发环境 在工程管理器窗口的寄存器选项卡还可以看出这时 SP 从复位时的 07H 变为 09H SP 被称作堆栈指针, 它是一个位于特殊存储器区的寄存器 SP 中的内容用来指示堆栈的顶部对应内部数据存储器中的地址,SP 的复位值为 07H 如果不改变它的复位值, 堆栈由 08H 开始向上增加 在调用子程序时, 堆栈可以被用来保存子程序执行结束后将要返回到主程序的地址 当调用子程序语句被执行以后,SP 的值变为 09H 如果执行第一句调用子程序语句, 从存储器观察窗口可以看出在内部数据存储器 09H 地址存储子程序返回主程序的地址高 8 位 (00H), 在内部数据存储器 08H 地址存储子程序返回主程序的地址低 8 位 (05H) 在保存子程序返回主程序的地址的同时, 程序指针 (PC) 的内容变为子程序的开始地址 (0100H), 子程序中的第一句旁边的黄箭头表示它将被执行 在子程序的模拟调试中, 在完成向工作寄存器 R5~R7 赋初值以后, 调试将进入 DJNZ 指令的许多次循环 为减少调试时间, 在文本编辑窗口移动光标到子程序返回指令 : RET 30

31 再选择菜单 Debug Run to Cursor line 对应的工具按钮或者快捷键 Ctrl+F10 可以快速地执行到这条指令 子程序中最后一条指令 RET 的执行引起以下变化 : 堆栈中保存的返回地址被送进程序指针 PC; 堆栈指针 SP 的内容变回为 07H; 主程序中调用子程序语句后面的语句将被执行 从上述的调试过程可以看出, 堆栈占用了第 1 组工作寄存器的物理存储空间 如果需要使用这部分工作寄存器,SP 可以重新被赋值 例如可以由下面指令改变 SP 的值 MOV SP, #70H 这句语句使得 SP 变为 70H, 如果执行调用指令或者响应中断, 则返回地址进入堆栈,SP 的值增加 由于 AT89S51 单片机的内部通用数据存储器的最高地址为 7FH, 因此这时仍具有足够的空间供堆栈操作使用 应用 Keil 单片机模拟调试软件检验延时时间为了方便地观察延时程序获得的延时时间, 应用菜单 Peripherals Reset CPU 或者对应的工具按钮进行复位 复位使得模拟调试可以重新从开始进行 首先执行一次单步模拟调试 这一步使得具有语句标号 BEGIN 的第一句向 P1 口传送数据的指令被执行, 工程管理器窗口的寄存器选项卡显示状态为 ; PC $ C:0x0003 states 2 sec 如果模拟调试时不希望进入子程序, 这时可以选择菜单 Debug Step Over 对应的工具按钮或者快捷键 F10 可以完成一次过程单步模拟调试 这一步完成子程序的执行, 使得工程管理器窗口的寄存器选项卡显示状态变为 ; PC $ C:0x0005 states sec 对比过程单步模拟调试执行的前后, 寄存器选项卡显示的已经花费的机器周期数或者对应的时间, 调用延时子程序获得了 1s 的延时 程序示例 2.3 中, 延时子程序的延时初值已经进行调整, 减去了子程序调用 延时初值的赋值和子程序返回花费的时间, 并且还添加一句空操作指令 : NOP 补充 1 个机器周期的时间以获得整 1s 的延迟 使用过程单步模拟调试只提供主程序的模拟调试, 不能进入子程序进行模拟调试 使用单步模拟调试提供和程序真实执行一致的工作过程, 即可以进入子程序进行模拟调试 合理地使用这两种方法, 可以使得模拟调试更方便 程序向单片机芯片的下载 当通过模拟调试验证了所编写的汇编语言源程序逻辑的正确性, 下一步的工作是准备向单片机芯片下载, 然后在图 2.1 中所示的电路实际运行 31

32 要实现向单片机芯片下载程序, 汇编语言源程序 (.ASM) 必须转换成 Intel HEX 格式文件 Keil 单片机模拟调试软件也可以完成这项工作 完成这项工作的具体步骤是首先退出 Keil 单片机模拟调试软件的调试状态 ; 接着在集成开发环境的选择工程管理窗口的文件选项卡中选择目录 Target 1; 然后再选择菜单 Project Option for target target 1 可以打开图 2.5 显示的 Output 设置对话框 图 2.5 Output 设置对话框在 Output 设置对话框中选中 Create HEX Fi: 复选框, 如图 2.4 所示, 单击 确定 按钮即可完成设置 再次对汇编语言源程序进行汇编即可产生文件扩展名为 HEX 的 Intel HEX 格式文件 该文件的名称与汇编语言源程序的文件名相同, 它和汇编语言源程序放置在同一文件夹之中 由于不同的编程器使用时具体操作步骤存在差异, 这里无法描述具体的操作过程, 读者可以参考具体使用的编程器的使用说明完成向 AT89S51 芯片下载程序这项工作 2.7 小结 本章在第 1 章介绍的单片机最小应用系统电路的基础上, 由在 P1 口添加电流放大电路和发光二极管形成一个交通灯信号电路 在交通灯信号电路的汇编语言源程序中使用内部数据存储器的数据传送指令 MOV 产生交通灯信号 通过向 AT89S51 单片机的并行输入 / 输出口, 地址为 90H, 传送数据, 交通灯的控制信号被输出, 这形象地说明了单片机如何通过向相应的数据存储地址单元写入数 32

33 据控制对应外围器件的工作 时间是描述信号的一个主要参量, 本章采用控制转移类指令 DJNZ 实现延时以满足信号的时间要求 本章还介绍了子程序, 利用它不仅可以简化所编写程序的结构, 还可以在不同的设计中实现资源共享 在程序的调试过程中, 本章进一步讨论了 Keil 单片机模拟调试软件的使用 实验 1. 在图 2.1 中所示的电路中, 分别把 AT89S51 的 P1.3 和 P1.7 管脚与 74LS245 的 B3 和 B7 管脚相连接, 分别在 74LS245 的 A3 和 A7 管脚再接入 2 个发光二极管 编写可以使 8 个发光二极管依次点亮 依次熄灭并且循环工作的汇编语言源程序 2. 参见附录 1 汇编语言指令系统, 学习逻辑操作类指令 RR, 编写可以使 8 个发光二极管依次点亮 依次熄灭并且循环工作的汇编语言源程序 表 2.7 累加器循环右移指令详细描述助记符指令功能说明存储占用字节执行需要时钟周期 RR A 累加器内容循环右移 1 12 指令描述 : 设累加器内容为 B, 指令执行一次后累加器内容变为 B, 指令再执行一次后累加器内容变为 B 本条指令使得累加器的内容向右移动 1 位, 累加器最右边的一位移入最左边的一位 3. 将 8 个发光二极管连接成共阳极连接方式, 即所有二极管的 P 极被连接在一起, 再通过限流电阻与 Vcc 相连 ; 所有二极管的 N 极分别与 74LS245 的 A0~A7 相连 编写可以使 8 个发光二极管依次点亮 依次熄灭并且循环工作的汇编语言源程序 33

34 第 3 章串行输入 / 输出口的应用 本章对在第 2 章中设计的基于并行输入 / 输出口 P1 的交通信号灯控制电路进行功能扩展, 在电路中加入道路通行 / 等待的时间显示电路 如果希望保留单片机对外部存储器的扩展能力, 应用单片机的串行输入 / 输出口实现数据的显示是一个方便的选择 3.1 串行输入 / 输出口概述 串行输入 / 输出口概述 计算机与它的外围设备之间的基本通信模式有两种 : 并行通信模式和串行通信模式 采用并行通信模式时, 例如通过并行输入 / 输出口 P1 控制交通灯, 所有数据位同时通过并行输入 / 输出口进行传送 并行通信模式的优点是数据传送速度快, 所有的数据位同时传输 ; 缺点是电路复杂, 一个并行的数据有多少位, 就需要多少条传输线 采用串行通信模式时, 所有的数据位按一定的顺序 通过一条传输线逐个地进行传送 串行通信模式的优点是电路简单, 仅需要一条传输线 ; 缺点是数据传送速度慢 串行通信模式又可以再分为两种模式 : 同步通信模式和异步通信模式 AT89S51 单片机提供同步通信模式和异步通信模式两种串行通信模式 异步通信模式工作在 UART(Universal Asynchronous Receiver and Transmitter), 可以同时进行数据的发送和接收 AT89S51 单片机串行通信的接收部分具有缓冲能力, 即已经接收到的第一个字节在被读取之前就可以开始接收第二个字节 但是应当注意, 如果第二个字节完成接收, 而第一个字节仍没有被读取, 一个字节的数据将被丢失 串行输入 / 输出具有独立的发送和接收缓冲寄存器, 它们共同被称作为串行数据缓冲寄存器 (SBUF), 并占用特殊功能寄存器的同一个地址 (99H) 发送缓冲寄存器只能写入不能读出, 接收缓冲寄存器只能读出不能写入, 因此它们的区分可以通过指令来实现 串行输入 / 输出的数据使用管脚 RXD( 管脚 10) 和管脚 TXD( 管脚 11) 可以同时接收和发送数据 管脚 RXD 和管脚 TXD 也就是管脚 P3.0 和管脚 P3.1, 这里它们被按 P3 口的第二功能来使用 串行输入 / 输出口的工作方式 AT89S51 串行口的工作可以被分为 4 种工作方式 这 4 种工作方式的简述如下 : 工作方式 0 串行口工作方式 0 为同步移位寄存器方式 在这种方式下, 串行数据的发送和接收都是通过管脚 RXD 进行, 管脚 TXD 用来传送同步移位脉冲 串行数据一帧的数据位数为 8 34

35 位, 传输时低位在前, 高位在后 数据传输的波特率是固定的, 为单片机时钟频率的 1/12 如果单片机的时钟频率为 12MHz, 则数据传输的波特率是 1MB 串行口工作方式 0 的数据传输波特率不受电源控制寄存器 (PCON) 中 SMOD 位的影响 本章将介绍利用串行口工作方式 0 实现数码管的显示 工作方式 1 串行口工作方式 1 为异步通信 (UART) 方式 串行数据一帧的数据位数为 10 位 :1 位起始位 ( 它的值为 0) 8 位数据位和 1 位停止位 ( 它的值为 1) 数据位传输时低位在前, 高位在后 串行数据的发送通过管脚 TXD 进行 ; 串行数据的接收通过管脚 RXD 进行 数据传输的波特率是可变的 在接收时, 数据帧中的停止位进入串行口控制寄存器 (SCON) 的位 RB8 工作方式 2 串行口工作方式 2 为异步通信 (UART) 方式 串行数据一帧的数据位数为 11 位,1 位起始位 ( 它的值为 0),8 位数据位,1 位可编程位和 1 位停止位 ( 它的值为 1) 数据位传输时低位在前, 高位在后, 紧接着是可编程位 串行数据的发送通过管脚 TXD 进行 ; 串行数据的接收通过管脚 RXD 进行 数据传输的波特率是固定的, 是单片机的时钟频率的 1/32 或者 1/64 具体工作在那一种波特率由电源控制寄存器(PCON) 中 SMOD 位的内容决定, 当 SMOD 位被置 1, 波特率是单片机时钟频率的 1/32; 当 SMOD 位被清 0, 波特率是单片机时钟频率的 1/64 在发送时, 数据帧中可编程位的值取决于串行口控制寄存器 (SCON) 的位 TB8 例如把程序状态字 (PSW) 的位 P 的值送入 TB8 可以实现数据传输的奇偶校验 在接收时, 数据帧中的可编程位送入串行口控制寄存器 (SCON) 的位 RB8, 停止位这时被丢弃 工作方式 3 串行口工作方式 3 除数据传输的波特率是可变的以外, 其它与工作方式 2 相同 串行输入 / 输出口工作控制寄存器 控制串行输入 / 输出口工作的控制寄存器有 2 个 : 串行口控制寄存器 (SCON) 和电源 控制寄存器 (PCON) 串行口控制寄存器 (SCON) 串行口控制寄存器 (SCON) 在特殊功能寄存器中的字节地址为 98H, 它即可以进行字 节寻址, 也可以进行位寻址 这个寄存器的格式如表 3.1 所示 表 3.1 串行口控制寄存器 (PCON) 的格式表 D7 D6 D5 D4 D3 D2 D1 D0 PCON SM0 SM1 SM2 REN TB8 RB8 TI RI 位地址 9F 9E 9D 9C 9B 9A 复位值 在表 3.1 中, 每一位的具体功能如下 35

36 SM0 和 SM1: 串行口工作方式控制位, 工作方式的功能说明如表 3.2 所示 表 3.2 串行口的工作方式 SM0 SM1 工作方式 功能说明 同步移位寄存器方式 位异步通信 (UART) 方式, 波特率可变 位异步通信 (UART) 方式, 波特率为 focs/64 或者 focs/ 位异步通信 (UART) 方式, 波特率可变 表中 focs 为单片机的时钟频率 SM2: 串行口工作方式 2 和 3 的多机通信控制位 REN: 串行接收使能控制位 TB8: 串行口工作方式 2 和 3 时被发送的第 9 位数据 RB8: 串行口工作方式 2 和 3 时被接收的第 9 位数据 TI: 发送中断标志位 RI: 接收中断标志位 电源控制寄存器 (PCON) 电源控制寄存器 (PCON) 在特殊功能寄存器中的字节地址为 87H, 它没有位寻址功能, 只能进行字节寻址 这个寄存器的格式如表 3.3 所示 表 3.3 电源控制寄存器 PCON 的格式表 D7 D6 D5 D4 D3 D2 D1 D0 PCON SMOD GF1 GF0 PD IDL 复位值 0 X X X 电源控制寄存器 PCON 中仅有 D7 位,SMOD, 在串行输入 / 输出口的控制中被应用, 它被用来控制串行通信的波特率 SMOD 为 1 时的波特率是它为 0 时的 2 倍 3.2 数码管及其显示电路 数码管是单片机应用电路中常用的显示器件 每个数码管由 8 个发光二极管组成, 它的原理图 外形图和电路符号图如图 3.1 所示 数码管原理图如图 3.1 的 (a) 和 (b) 所示 数码管有共阴极和共阳极两种类型 共阴极数码管内部 8 个二极管的 N 极被连接在一起和管脚 COM 相接 在使用时管脚 COM 应接低电平, 当数码管其余的某个管脚接高电平, 则该管脚对应的发光二极管被点亮, 也就是数码管对应的发光段被点亮 共阳极数码管内部 8 个二极管的 P 极被连接在一起和管脚 COM 相接 在使用时管脚 COM 应接高电平, 当数码管其余的某个管脚接入低电平, 则 36

37 该管脚对应的发光二极管被点亮, 也就是数码管对应的发光段被点亮 数码管外形图如图 3.1 的 (c) 所示 数码管有 2 个 COM 管脚, 它们在数码管内部被连接在一起, 在使用时, 应用电路中只需要连接一个 COM 管脚即可 数码管的电路符号图如图 3.1 的 (d) 所示 a b c d e f g dp 10 g 9 8 f com 7 a b 6 a f b g e d c dp e d com c dp com (a) (c) a b c d e f g dp a b c d e f g dp f e a g d b c dp com com (b) (d) 图 3.1 数码管的原理图 外形图和电路符号图采用数码管的显示电路可以由图 2.1 所示的交通灯的控制电路进行改装来实现, 具体电路如图 3.2 所示 从交通灯的控制电路中去掉发光二极管, 换上一个共阴极数码管, 单片机 P1 口的输出数据仍然通过 74LS245 进行电流放大以后再驱动数码管 由于数码管有 8 个输入管脚, 因此这里需要使用单片机的管脚 P1.7 和 P1.4 在图 3.2 中, 数码管即可以采用共阴极数码管, 也可以采用共阳极数码管 对于共阴极数码管, 它的管脚 COM 应该通过一个限流电阻和接地线相接 ; 对于共阳极数码管, 它的管脚 COM 应该通过一个限流电阻和电源线相接 数码管的限流电阻还有第二种接入方法 第二种方法是在数码管的 8 个输入管脚与 74LS245 的 8 个输出管脚之间分别接一个电阻, 共需 8 个电阻 这时管脚 COM 可以直接与地或者电源连接 限流电阻的第一种接入方法的优点是接线简单, 第二种方法的优点是在显示不同的字符时数码管亮度一致 数码管的各个管脚与单片机 P1 口的各个管脚的连接关系如表 3.4 所示 表 3.4 数码管的管脚与单片机 P1 口的管脚的连接关系 P1 口 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 数码管 dp g f e d c b a 37

38 +5V C4 + 10uF C5 0.1uF VCC P0.0(AD0) 38 P0.1(AD1) 37 P0.2(AD2) 36 P0.3(AD3) 35 P0.4(AD4) 34 P0.5(AD5) 33 P0.6(AD6) 32 P0.7(AD7) EA/VPP 31 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5(MOSI) P1.6(MISO) P1.7(SCK) RST P3.0(RXD) P3.1(TXD) P3.2(INT0) P3.3(INT1) P3.4(T0) P3.5(T1) P3.6(WR) P3.7(RD) XTAL2 XTAL1 GND ALE/PROG 30 PSEN P2.7(A15) P2.6(A14) P2.5(A13) P2.4(A12) P2.3(A11) P2.2(A10) P2.1(A9) P2.0(A8) C1 10uF + +5V R1 10k C2 30pF CRY 12MHz C3 30pF DIR A0 A1 A2 A3 A4 A5 A6 A7 GND VCC 20 E 19 B0 18 B1 17 B2 16 B3 15 B4 14 B5 13 B6 12 B a b c d e f g dp a f b com 3 g e c dh d R2 图 3.2 基于 P1 口的数码管电路 在图 3.2 中, 如果不使用数码管的小数点时, 控制共阴极数码管的单片机管脚 P1.7 可 以一直输出低电平 在不使用数码管小数点的情况下, 数码管的显示字符与输入代码, 即 单片机 P1 口的输出数据, 之间的关系如表 3.5 所示 在表 3.5 中, 共阳极数码管的显示字 符与输入代码的关系也被同时列出 对于共阳极数码管, 如果不使用数码管的小数点, 这 时单片机管脚 P1.7 应该一直输出高电平 表 3.6 数码管的显示代码 显示字符 共阴极数码管 共阳极数码管 显示字符 共阴极数码管 共阳极数码管 0 3FH C0H 9 6FH 90H 1 06F F9H A 77H 88H 2 5BH A4H b 7CH 83H 3 4FH B0H C 39H C6H 4 66H 99H d 5EH A1H 5 6DH 92H E 79H 86H 6 7DH 82H F 71H 8EH 7 07H F8H 灭 00H FFH 8 7FH 80H 全亮 FFH 00H 38

39 利用图 3.2 所示电路, 应用数据传送指令 MOV 向 P1 口传送显示代码对应的立即数, 数码管就可以显示对应的字符 仿照程序示例 2.3, 读者试着编写一个实现字符从 0~F 连续 循环显示的程序 3.3 基于串行输入 / 输出口的数码管电路 在并行输入 / 输出口的应用中分别介绍了使用 P1 口实现交通灯的控制和数码管的显示 如果希望同时实现交通灯的控制和数码管的显示, 那么仅使用 P1 口则是不够的, 这时需要使用更多的输出端口 如前所述,AT89S51 芯片向用户提供的并行输入 / 输出口是有限的, 因此必须想办法进行扩展 应用串行口工作方式 0 的同步移位寄存器方式是扩展输入 / 输出能力的一种方法 串行口工作方式 0 的输出时序图如图 3.3 所示 RXD (DATA OUT) D0 D2 D2 D1 D2 D2 D3 D4 D2 D5 D2 D2 D6 D2D7 TXD (SHIFT CLOCK) 图 3.3 串行口工作方式 0 的输出时序图 当向串行数据缓冲寄存器 SBUF 写入一个数据, 在管脚 RXD 和管脚 TXD 将自动产生 如图 3.3 所示的信号 管脚 RXD 输出数据, 管脚 TXD 输出同步移位时钟 同步移位时钟 的周期等于单片机的工作周期, 因此输出一个字节的数据需要 8 个单片机的工作周期 串行口输出一个字节的数据需要 8 个单片机的工作周期这点在编程时应该注意, 不能 连续地编写 2 条向串行数据缓冲寄存器 (SBUF) 写入数据的指令 因为如果第一个数据还 没有被全部发送出去, 这时向串行数据缓冲寄存器 (SBUF) 再写入一个数据, 新写入的数 据将覆盖没有完成发送的第一个数据的剩余内容, 导致数据传输错误 管脚 RXD 的输出数据不能直接送入数码管, 这是因为串行数据通过一条线输出, 而 数码管的工作则同时需要 8 个输入信号 使用 8 位移位寄存器 ( 串行输入, 并行输出 ) 74LS164 可以把图 3.1 所示的串行信号转换成数码管所需要的并行信号以满足数码管的需 要 74LS164 的功能表如表 3.7 所示 表 LS164 的功能表 输 入 输 出 MR CLK D SA D SB Q 0 Q 1 Q 2 Q 3 Q 4 Q 5 Q 6 Q Q 00 Q 10 Q 20 Q 30 Q 40 Q 50 Q 60 Q Q 00 Q 10 Q 20 Q 30 Q 40 Q 50 Q Q 00 Q 10 Q 20 Q 30 Q 40 Q 50 Q Q 00 Q 10 Q 20 Q 30 Q 40 Q 50 Q 60 39

40 应用串行口工作方式 0 和 74LS164 的数码管的显示电路如图 3.4 所示 对比图 3.4 所示的基于串行输出口的数码管电路和图 3.2 所示的基于并行输出口的数码管电路, 这里电路的硬件开销并没有增加,74LS164 在这里完成了串 / 并转换和电流放大双重任务 +5V C4 + 10uF C5 0.1uF VCC P0.0(AD0) 38 P0.1(AD1) 37 P0.2(AD2) 36 P0.3(AD3) 35 P0.4(AD4) 34 P0.5(AD5) 33 P0.6(AD6) 32 P0.7(AD7) EA/VPP 31 ALE/PROG 30 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5(MOSI) P1.6(MISO) P1.7(SCK) RST P3.0(RXD) P3.1(TXD) P3.2(INT0) P3.3(INT1) P3.4(T0) P3.5(T1) P3.6(WR) P3.7(RD) XTAL2 XTAL1 GND PSEN P2.7(A15) P2.6(A14) P2.5(A13) P2.4(A12) P2.3(A11) P2.2(A10) P2.1(A9) P2.0(A8) C1 10uF + R1 10k C2 30pF CRY 12MHz C3 30pF A B MR Q7 13 Q6 12 Q5 11 Q Q3 5 Q2 4 Q1 3 Q a b c d e f g dp a f b g com 3 e c dh d R2 +5V 图 3.4 基于串行输出口的数码管的显示电路执行指令 : MOV SBUF, #3FH 可以输出共阴极数码管字符 0 的显示代码 显示代码以图 3.3 所示的时序从单片机输出 首先显示代码的最低位数据从 AT89S51 的管脚 RXD 送到 74LS164 的管脚 D SA 和 D SB, 接着同步移位脉冲从 AT89S51 的管脚 TXD 送到 74LS164 的管脚 CLK, 在同步移位脉冲上升沿的作用下, 显示代码的最低位数据被移入 的管脚 Q 0 第 2 个同步移位脉冲的上升沿接着把代码的最低位数据移入 的管脚 Q 1, 把跟着最低位的数据移入 74LS164 的管脚 Q 0 依次类推,8 个同步移位脉冲完成把整个显示代码移入 74LS164 的输出管脚, 其中最低位在管脚 Q 7, 最高位在管脚 Q 0 串/ 并转换的整个过程需要 8 个单片机机器周期 如果单片机的时钟频率为 12MHz, 该过程需要 8us 在转换过程的 8us 中, 数码管的显示是不断变化的错误显示, 但是这个时间很短, 我们的眼睛分辨不出这个变化 实际上图 3.4 所示的基于串行输出口的数码管电路和图 3.2 所示的基于并行输出口的数码管电路的工作区别是分辨不出来的 在数据传送指令 MOV 向 P1 口传送显示代码编写的字符显示程序的基础上, 把程序中的直接地址 P1 换成直接地址 SBUF 就可以用于图 3.4 所示电路的字符显示 读者可以仿照程序示例 2.3, 试着编写一个实现字符从 0~F 连续循环显示的程序 40

41 3.4 译码程序 译码子程序 应用图 3.4 所示电路, 向串行数据缓冲寄存器 (SBUF) 送入显示代码可以完成数据的 显示 把一个通过测量获得的数据直接利用上述方法进行显示则还是不行, 因为要显示的 数据与显示代码不一样 例如对于共阴极数码管数据 0 的显示代码为 3FH, 直接把 数据 0 送到串行数据缓冲寄存器 (SBUF) 将使得共阴极数码管处于全灭状态 如果希 望能够显示测量数据, 在送往串行数据缓冲寄存器 (SBUF) 之前, 数据必须被转换成它的 显示代码 实现这种功能的子程序如下 ; 子程序名 :LED1 ; 程序功能 : 显示 1 位数据 ( 共阴极数码管 ) ; 程序入口 :60H ; 保存需要显示的数据 ; 程序出口 :SBUF ; 应用串行输出口输出显示代码 ; 占用资源 : 累加器 A, 数据指针 DPTR, 串行数据缓冲寄存器 SBUF, 内部数据存储单元 60H ; 程序清单 ; LED1: MOV A, 60H ; 子程序开始 把要显示的数据复制到累加器 A MOV DPTR, #TAB ; 显示代码表的开始地址送到数据指针 DPTR MOVC ; 把要显示的数据转换成相应的显示代码 MOV SBUF, A ; 显示代码送往串行数据缓冲寄存器 SBUF RET ; 子程序返回指令 TAB: DB 3FH,06H,5BH,4FH,66H ; 显示代码表 DB 6DH,7DH,07H,7FH,6FH DB 77H,7CH,39H,5EH,79H,71H MOVC 指令 上面子程序中的 MOVC 指令属于数据传送类指令, 它的作用空间为程序存储器, 它有 2 种形式, 详细描述如表 3.8 所示 表 3.8 MOVC 指令详细描述指令助记符功能说明存储占用字节执行需要时钟周期 MOVC A,@A+DPTR MOVC A,@A+PC 以数据指针的内容为基地址加累加器的内容为偏移地址对应的程序存储单元中的数据复制到累加器以程序指针的内容为基地址加累加器的内容为偏移地址对应的程序存储单元中的数据复制到累加器

42 MOVC 指令常用于查表 在子程序 LED1 中, 利用 MOVC 指令通过查表的方法实现需要显示的数据到对应的显示代码之间的转换 在调用子程序 LED1 之前, 需要显示的数据必须被送入程序入口的存储单元, 即内部数据存储器的 60H 地址单元 进入子程序 LED1 后, 需要显示的数据从内部数据存储器的 60H 地址单元复制到累加器 A 显示代码表的首地址, 以语句标号 TAB 表示, 被送入数据指针 DPTR 接着的一条语句: MOVC 完成从数据到显示代码的转换 这个转换过程是以数据指针 DPTR 的内容为基地址, 基地址单元存储数据 0 的显示代码 3F, 加上累加器 A 的内容为偏移地址, 然后把基地址加偏移地址所对应地址中的内容送往累加器 A 来完成译码 例如需要显示的数据为 0, 这时基地址指向显示代码 3F 对应的地址, 累加器 A 的偏移地址为 0, 结果把数据 0 的显示代码 3F 送往累加器 A 来完成译码 再例如需要显示的数据为 3, 这时基地址指向显示代码 3F 对应的地址, 累加器 A 的偏移地址为 3, 则从显示代码 3F 开始向后移动 3 个地址, 结果把数据 3 的显示代码 4F 送往累加器 A 来完成译码 DB 伪指令 DB 是一个伪指令, 它被用来在程序存储空间中定义一个常数表 它的指令格式为 : DB X 1,X 2,X 3,,Xn Xi 是单字节的 10 进制数或 16 进制数, 也可以是由两个单引号包括起来的字符串, 还可以是用户定义的其它数据符号 基于译码子程序的显示演示程序 通过向译码子程序的入口, 即单片机内部数据存储器地址为 60H 的存储单元, 送入要显示的数据, 再分别调用译码子程序 延时子程序就可以完成数据的显示 逐个顺序 循环地把数据 0~F 送入译码子程序的入口, 每送一次数据, 分别调用一次译码子程序 延时子程序就可以完成这些数据逐个顺序 循环的显示 这样的顺序结构程序也可以通过判断语句进行简化 程序示例 3.1: ORG 0000H BEGIN: MOV R3, #00H ; 工作寄存器 R3 保存需要显示数据的初值 BEGIN1: MOV 60H, R3 ; 向译码子程序的入口送将要显示的数据 ACALL LED1 ; 调用译码子程序 ACALL TIMER1S ; 调用延时 1s 子程序 INC R3 ; 调整显示数据 CJNE R3, #10H, BEGIN1 ; 判断是否显示到数据 F AJMP BEGIN ; 显示数据从 0 再次开始 42

43 LED1: ; 显示 1 位数据 ( 共阴极数码管 ) 子程序 TIMER1S: ; 延时 1s 子程序 END 程序示例 3.1 可以实现数据从 0 到 F 的顺序循环显示 在上面的程序示例中省略了被调用的子程序的具体内容, 实验时一定要完整地把子程序输入 在以后的程序示例中也像这样省略一些已经叙述过的子程序的具体内容 程序示例 3.1 中主程序内存储显示数据的工作寄存器不能使用 R5 R6 或 R7, 因为它们在延时子程序中被使用 如果主程序内存储显示数据的工作寄存器使用它们, 延时子程序的执行将破坏主程序的工作环境 例如储存显示数据的工作寄存器使用 R7, 延时子程序的执行使得它的内容为 0;INC 指令使它加 1, 它的内容变为 1;CJNE 指令使得程序跳回语句标号 BEGIN1 处执行, 子程序实现显示字符 1 ; 然后再次调用延时子程序, 再次使 R7 的内容为 0 上述过程不断循环, 数码管将一直显示字符 1 程序中还出现 2 种新指令 :INC 和 CJNE 下面分别对它们进行介绍 调整显示数据的 INC 指令属于算术操作类指令, 该指令的详细描述如表 3.9 所示 表 3.9 INC 指令详细描述指令助记符功能说明存储占用字节执行需要时钟周期 INC A 累加器中的数据加 INC Rn Rn 中的数据加 INC direct 直接地址单元中的数据加 Ri 的内容为地址的存储单元中的数据加 程序中判断是否显示到数据 F 的指令 CJNE 属于控制转移类指令, 该指令的详细描述如表 3.9 所示 表 3.9 CJNE 指令详细描述指令助记符功能说明存储占用字节执行需要时钟周期 CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel 累加器中的数据与直接地址单元中的数据相比较, 不相等则转移累加器中的数据与立即数相比较, 不相等则转移 Rn 中的数据与立即数相比较, 不相等则转移 Ri 的内容为地址的存储单元中的数据与立即数相比较, 不相等则转移

44 程序示例 3.1 中包含 CJNE 指令的语句被用来判断数据 F 是否已经完成显示 由于要显示数据的调整, 即数据加 1, 发生在数据完成显示之后和进行判断之前, 例如当数据 F 已经完成显示, 这时加 1, 数据变为 10H 判断语句的工作过程是首先比较工作寄存器 R3 的内容是否等于立即数 10H, 如果不相等则跳转到标号 BEGIN1 指示的语句处执行, 如果相等则按顺序执行 CJNE 指令后面的语句, 实现显示数据的清 0 在调试状态下, 为了观察方便, 使用者可以像在第 2 章中打开了 P1 口的观察窗口一样, 在这里也可以打开串行口的观察窗口 选择菜单 Peripherals Serial 可以打开了串行口的观察窗口, 如图 3.5 所示 图 3.5 Keil 单片机模拟仿真调试软件的集成开发环境在图 3.5 所示的调试窗口中, 一条向串行缓冲寄存器 (SBUF) 传送数据的指令刚被执行 传送的数据是 0 的显示代码 3F 从打开的串行口观察窗口 Serial Channel 可以看出这时串行缓冲寄存器 (SBUF) 中的内容为 3F 串行口观察窗口 Serial Channel 还给出工作方式 (Mode) 和串行口控制寄存器 (SCON) 的内容等信息 3.5 具有时间显示的交通灯的控制电路 在交通灯的控制电路中添加时间显示功能可以更加方便行人 交通灯的控制仍然由 P1 口实现, 数据的传送仍然采用并行方式 ; 通行 / 等待的时间信息通过串行口传送, 采用串行口工作方式 0 具有时间显示的交通灯的控制电路可以由图 2.1 所示的电路和图 3.4 所示的电路组合而成 表 3.10 列出一种交通灯的显示状态 变化顺序 实现这些状态时 P1 口相关管脚的输出逻辑以及对应的时间显示 你也可以设计出另一种交通灯的显示状态 变化顺序 实现这些状态时 P1 口相关管脚的输出逻辑以及对应的时间显示 44

45 表 3.10 交通灯的状态和变化顺序 东西方向 南北方向 状态红黄绿红黄绿 P1 口输出 ( 十六进制 ) 时间输出 ( 十进制 ) 1 亮 灭 灭 灭 灭 亮 41H 5 2 亮 灭 灭 灭 灭 亮 41H 4 3 亮 灭 灭 灭 灭 亮 41H 3 4 亮 灭 灭 灭 灭 亮 41H 2 5 亮 灭 灭 灭 灭 亮 41H 1 6 亮 灭 灭 灭 亮 灭 42H 0 7 灭 灭 灭 亮 灭 灭 14H 5 8 灭 灭 灭 亮 灭 灭 14H 4 9 灭 灭 灭 亮 灭 灭 14H 3 10 灭 灭 灭 亮 灭 灭 14H 2 11 灭 灭 灭 亮 灭 灭 14H 1 12 灭 亮 灭 亮 灭 灭 24H 0 应用表 3.10 中的信息, 控制交通信号灯的汇编语言源程序可以非常方便地被编写出 具体的汇编语言源程序如下面程序示例 3.2 程序示例 3.2: ORG 0000H BEGIN: MOV R3, #05H ; 工作寄存器 R3 保存需要显示数据的初值 MOV P1, #41H ; 东西方向红灯亮, 南北方向绿灯亮, 其余灯灭 BEGIN1: MOV 60H, R3 ; 向译码子程序的入口送将要显示的数据 ACALL LED1 ; 调用译码子程序 ACALL TIMER1S ; 调用延时 1s 子程序 DJNZ R3, BEGIN1 ; 调整时间显示值 MOV P1, #42H ; 东西方向红灯亮, 南北方向黄灯亮, 其余灯灭 MOV 60H, R3 ; 向译码子程序的入口送将要显示的数据 ACALL LED1 ; 调用译码子程序 ACALL TIMER1S ; 调用延时 1s 子程序 MOV R3, #05H ; 工作寄存器 R3 保存需要显示数据的初值 MOV P1, #14H ; 东西方向绿灯亮, 南北方向红灯亮, 其余灯灭 BEGIN2: MOV 60H, R3 ; 向译码子程序的入口送将要显示的数据 ACALL LED1 ; 调用译码子程序 ACALL TIMER1S ; 调用延时 1s 子程序 DJNZ R3, BEGIN2 ; 调整时间显示值 MOV P1, #24H ; 东西方向黄灯亮, 南北方向绿灯亮, 其余灯灭 45

46 MOV 60H, R3 ; 向译码子程序的入口送将要显示的数据 ACALL LED1 ; 调用译码子程序 ACALL TIMER1S ; 调用延时 1s 子程序 AJMP BEGIN ; 完成所有状态和时间的显示, 返回第一种状态 LED1: ; 显示 1 位数据 ( 共阴极数码管 ) 子程序 TIMER1S: ; 延时 1s 子程序 END 3.6 数码管应用的进一步讨论 多位数据的显示 图 3.2 所示的基于并行输出口 P1 的数码管电路和图 3.4 所示的基于串行输出口的数码管电路都只能支持一个数码管的显示, 即一次只能显示一位数据 如果需要显示多位数据, 例如希望数据能从 00H~FFH 顺序循环地显示, 图 3.2 和图 3.4 所示的电路必须进行改进 以图 3.4 所示的电路为基础进行改进实现起来更为方便, 改进后的数码管的显示电路如图 3.6 所示 在图 3.6 所示的电路中, 使用了 2 个 74LS164 来驱动 2 个数码管 从单片机 TXD 管脚来的同步移位信号同时加到 2 个 74LS164 的管脚 CLK, 从单片机 RXD 管脚来的串行数据信号加到第一个 74LS164 的串行数据输入口, 从第一个 74LS164 的管脚 Q 7 移出的串行数据再加到第二个 74LS164 的串行数据输入口 在采用同步移位方式的串行输出时, 每传送一个字节的数据需要 8 个机器周期, 因此 2 个显示代码的输出语句间隔必须大于 8 个机器周期 a b c d e f g dp a f b g com 3 e c dh d R a b c d e f g dp a f b g com 3 e c dh d R2 U1 74LS164 Q7 13 A Q6 12 Q5 11 Q4 10 B Q3 Q2 Q1 Q U2 74LS164 Q7 13 MR Q6 12 A B Q5 11 MR Q4 10 Q3 Q2 Q1 Q from RXD from TXD +5V +5V 图 3.6 基于串行输出口的 2 位数码管显示电路 46

47 AT89S51 的程序空间和数据空间中的每一个字节包含 8 位二进制数, 它也可以表示为具有 2 位 16 进制数的数 利用图 3.5 所示的电路可以实现一个字节数据的显示 显示之前, 具有 2 位 16 进制数的数必须被分解成 2 个 1 位的 16 进制数, 它们然后分别被进行译码和串行发送 实现一个字节中的 2 位 16 进制数显示的子程序如下 ; 子程序名 :LED2 ; 程序功能 : 显示一个字节的 2 位 16 进制数据 ( 共阴极数码管 ) ; 程序入口 :61H ; 送入将要显示的数据 ; 程序出口 :SBUF ; 应用串行输出口输出显示代码 ; 占用资源 : 累加器 A, 内部数据存储单元 61H ; 本子程序需要调用译码子程序 LED1, 占用资源同时包括译码子程序的占用资源 : ; 累加器 A, 数据指针 DPTR, 串行数据缓冲寄存器 SBUF, 内部数据存储单元 60H ; 程序清单 : LED2: MOV A, 61H ; 将要显示的数据复制到累加器 A ANL A, #0FH ; 屏蔽 16 进制数据的高位 MOV 60H, A ; 向译码子程序的入口送将要显示的数据 ACALL LED1 ; 调用译码子程序 MOV A, 61H ; 将要显示的数据复制到累加器 A ANL A, #0F0H ; 屏蔽 16 进制数据的低位 SWAP A ; 累加器中高 4 位和低 4 位互换 MOV 60H, A ; 向译码子程序的入口送将要显示的数据 ACALL LED1 ; 调用译码子程序 RET ; 子程序返回指令 应用子程序 LED2 可以编写出逐个顺序 循环地显示数据 00H~FFH 的汇编语言源程序, 具体的程序如下面程序示例 3.3 程序示例 3.3: ORG 0000H BEGIN: MOV R3, #00H ; 工作寄存器 R3 保存需要显示数据的初值 BEGIN1: MOV 61H, R3 ; 向子程序的入口送将要显示的数据 ACALL LED2 ; 调用显示 2 位 16 进制数据的子程序 ACALL TIMER1S ; 调用延时 1s 子程序 INC R3 ; 调整显示数据 AJMP BEGIN1 ; 显示下一个数据 LED2: ; 显示一个字节的 2 位 16 进制数据子程序 47

48 LED1: ; 显示 1 位数据 ( 共阴极数码管 ) 子程序 TIMER1S: ; 延时 1s 子程序 END 进制数到 10 进制数的转换 应用子程序 LED2 可以实现 2 位 16 进制数的显示, 但是人类更习惯使用 10 进制数 如果在数据的显示之前, 首先把 16 进制数据转换为 10 进制数据, 然后再把数据转换为显示代码送去显示则可以获得更好的效果 子程序 HEXBCD 可以完成范围为 0000H~270FH 的 16 进制数到范围为 0000~9999 的 10 进制数据的转换, 具体子程序如下 ; 子程序名 :HEXBCD ; 程序功能 : 完成范围为 0000H~270FH 的 16 进制数到范围为 0000~9999 的 10 进制数的转换 ; 程序入口 :35H( 高位字节 ),36H( 低位字节 ); 被送入待转换的 2 字节 4 位 16 进制数据 ; 程序出口 :61H( 千位 ),62H( 百位 ),63H( 十位 ),64H( 个位 ) ; 占用资源 : 累加器 A, 进位位 C, 工作寄存器区 1 的工作寄存器 R2~R7, 内部数据存储单元 35H, 36H,61H~64H ; 程序清单 : HEXBCD: SETB RS0 ; 设置工作寄存器区 1 为当前工作寄存器 CLR A MOV R4, A MOV R5, A MOV R6, A MOV R7, #10H MOV R2, 35H ; 待转换的高位字节 MOV R3, 36H ; 待转换的低位字节 BP1: CLR C MOV A, R3 RLC A MOV R3, A MOV A, R2 RLC A MOV R2, A MOV A, R6 48

49 ADDC A, R6 DA A MOV R6, A MOV A, R5 ADDC A, R5 DA A MOV R5, A MOV A, R4 ADDC A, R4 SWAP A MOV R4, A DJNZ R7, BP1 MOV A, R6 ANL A, #0FH MOV 64H, A ; 显示的十进制数的个位 MOV A, R6 SWAP A ANL A, #0FH MOV 63H, A ; 显示的十进制数的十位 MOV A, R5 ANL A, #0FH MOV 62H, A ; 显示的十进制数的百位 MOV A, R5 SWAP A ANL A, #0FH MOV 61H, A ; 显示的十进制数的千位 CLR RS0 ; 设置工作寄存器区 0 为当前工作寄存器 RET 执行该子程序的硬件电路需要 4 个数码管, 具体电路可以用图 3.5 所示的电路为基础进行扩展 这个电路中的 4 个数码管将分别由 4 个 74LS164 来驱动, 从单片机 TXD 管脚来的同步移位信号同时加到 4 个 74LS164 的管脚 CLK, 从单片机 RXD 管脚来的串行数据信号加到第一个 74LS164 的串行数据输入口, 从第一个 74LS164 的管脚 Q 7 移出的串行数据再加到第二个 74LS164 的串行数据输入口, 从第二个 74LS164 的管脚 Q 7 移出的串行数据再加到第三个 74LS164 的串行数据输入口, 从第三个 74LS164 的管脚 Q 7 移出的串行数据再加到第四个 74LS164 的串行数据输入口 子程序 HEXBCD 实现从 16 进制到 10 进制的具体算法读者目前可以不必进行探讨, 49

50 只要能正确使用就达到要求 这个子程序在完成数制转换的同时也完成数位的分离, 输出的 4 位 10 进制数被分别放置在内部数据存储器的 61H~64H 存储单元 把这 4 位 10 进制数被分别复制到译码子程序 LED1 的入口, 每复制一位数据, 调用一次译码子程序 LED1 就可以实现一位数据的显示 上述过程重复 4 次就可以完成 4 位 10 进制数的显示 如果要显示的数据不足 4 位, 高位将显示为 0 实现子程序 HEXBCD 输出数据显示的具体子程序如下 ; 子程序名 :LED4 ; 程序功能 : 实现子程序 HEXBCD 输出数据显示 ; 程序入口 :61H( 千位 ),62H( 百位 ),63H( 十位 ),64H( 个位 ) ; 程序出口 :SBUF ; 占用资源 : 内部数据存储单元 61H~64H ; 本子程序需要调用译码子程序 LED1, 占用资源同时包括译码子程序的占用资源 : ; 累加器 A, 数据指针 DPTR, 串行数据缓冲寄存器 SBUF, 内部数据存储单元 60H ; 程序清单 : LED4: MOV 60H, 64H ; 向译码子程序入口赋个位数据 ACALL LED1 ; 调用译码子程序 MOV 60H, 63H ; 向译码子程序入口赋十位数据 ACALL LED1 ; 调用译码子程序 MOV 60H, 62H ; 向译码子程序入口赋百位数据 ACALL LED1 ; 调用译码子程序 MOV 60H, 61H ; 向译码子程序入口赋千位数据 ACALL LED1 ; 调用译码子程序 RET ; 子程序返回 3.7 小结 本章介绍了基于串行方式 0 的数码管电路, 这种电路可以很方便地扩展为多位显示电路而且同时不增加单片机的硬件开销 这种显示电路被广泛地用来显示用户系统的工作状态 由于显示的数据与数码管的显示代码不同, 因此数据被送去显示之前必须首先进行译码 单片机的一个字节包含 2 位 16 进制数, 如果需要显示一个字节的数据则必须对这 2 位 16 进制数进行分离, 然后再通过调用 2 次译码子程序实现一个字节数据的显示 最后介绍了 16 进制数到 10 进制数的转换子程序, 利用这个子程序, 应用系统的工作结果就可以用我们更熟悉的 10 进制数来显示 50

51 实验 4. 按图 3.2 所示电路图组装硬件电路 仿照程序示例 2.3, 应用数据传送指令 MOV 实现向 P1 口传送显示代码, 读者试着编写一个能够实现字符从 0~F 连续循环显示的应用程序 5. 按图 3.4 所示电路图组装硬件电路 仿照上一个实验, 应用数据传送指令 MOV 实现向串行数据缓冲寄存器 (SBUF) 传送显示代码, 读者试着编写一个实现字符从 0~F 连续循环显示的应用程序 6. 按图 3.6 所示电路图组装硬件电路 应用程序示例 3.3 实现逐个顺序 循环地显示数据 00~FF 7. 把实验 3 的硬件电路扩展到具有 4 个数码管 读者试着编写一个汇编语言次序来实现数据从 0000~0255 顺序 循环地显示 8. 观察一个实际的交通灯系统的工作 用发光二极管代替交通灯, 用数码管代替时间显示设备, 设计一个基于单片机的交通灯的控制系统 51

52 第 4 章定时 / 计数器的应用 4.1 定时 / 计数器介绍 定时 / 计数器概述 AT89S51 单片机内部包含 2 个 16 位的定时 / 计数器, 它们分别被称作为定时 / 计数器 0 (Timer0) 和定时 / 计数器 1(Timer1) 两个定时/ 计数器的工作是相互独立的, 每个定时 / 计数器可以被分别地配置成定时器模式或者计数器模式 由定时 / 计数器工作方式寄存器 (TMOD) 中的位 C/ Tx 内容, 定时 / 计数器可以被选择工作在定时器模式或者计数器模式 这里 x 可以是 0 或者 1, 前者用来控制定时 / 计数器 0, 后者用来控制定时 / 计数器 1 如果位 C/ Tx=0, 定时 / 计数器将工作在定时器模式 ; 如果位 C/ Tx=1, 定时 / 计数器将工作在计数器模式 定时器模式和计数器模式的工作区别是它们的计数信号来源不同 当工作在定时器模式时, 经过 12 分频以后的单片机时钟信号被用作定时 / 计数器的计数信号 这时计数信号的频率等于单片机的工作频率 每过一个单片机的工作周期, 计数寄存器的内容加 1 在定时器模式下, 可以用单片机的工作周期为基准来测量外部信号的周期 脉冲的占空比和相位差等参数 当工作在计数器模式时, 定时 / 计数器的计数信号来自 AT89S51 的管脚 T0( 管脚 P3.4) 或者管脚 T1( 管脚 P3.5), 前者用来驱动定时 / 计数器 0, 后者用来驱动定时 / 计数器 1 当在一个单片机工作周期对管脚 Tx 的信号采样获得高电平, 在接着的一个单片机工作周期对管脚 Tx 的信号采样获得低电平, 则计数寄存器的内容加 1 计数器模式可以由单片机的延时程序为基准来测量外部信号的频率 由于每识别一个外部脉冲至少需要 2 个单片机的工作周期, 因此它对外部信号的最高测量频率为 f OCS /24, 这里 f OCS 为单片机的时钟频率 另外, 待测的外部信号的高电平和低电平时间也至少得维持一个单片机的工作周期 定时 / 计数器的工作方式 无论工作在哪一种模式, 也就是无论计数信号来自于何处, 定时 / 计数器的工作又可以再被分为 4 种工作方式 这 4 种工作方式的简述如下 : 工作方式 0 在工作方式 0 时, 定时 / 计数器 0 和定时 / 计数器 1 的工作是相同的 图 4.1 是定时 / 计数器 0, 工作方式 0 的工作原理框图 定时 / 计数器的计数寄存器具有 13 位, 它由 5 位寄存器 TL0 和 8 位寄存器 TH0 这 2 个寄存器级联构成 当定时 / 计数器工作方式寄存器 (TMOD) 中的门控位 GATE 清 0 或者 52

53 时钟 12 分频 C/T=0 TL0 TH0 (5 BITS) (8 BITS) TF0 中断 P3.4/T0 C/T=1 控制 GATE P3.2/INT0 & 1 TR0 & 图 4.1 定时 / 计数器 0 工作方式 0 的原理框图 管脚 INT0(P3.2) 为高电平, 这时定时 / 计数器的计数工作受定时 / 计数器控制寄存器 (TCON) 中的运行控制位 TR0 控制 当 TR0 置 1, 被选择的计数信号可以进入计数寄存器 每来一个计数信号, 计数寄存器 TL0 加 1 计数寄存器 TL0 这时只有低 5 位可以参与计数, 它的高 3 位被忽略 当计数寄存器 TL0 产生计数进位, 计数寄存器 TH0 加 1 当计数寄存器 TH0 产生计数溢出, 定时 / 计数器控制寄存器 (TCON) 中的溢出标志位 TF0 置 1, 这时也可以申请中断 当定时 / 计数器工作方式寄存器 (TMOD) 中的门控位 GATE 置 1, 定时 / 计数器控制寄存器 (TCON) 运行控制位 TR0 置 1, 这时定时 / 计数器的计数工作受单片机的管脚信号控制 管脚 INT0(P3.2) 上的信号可以控制定时器 0 的计数工作, 应用这个功能可以很方便地测量被加到管脚上信号的脉冲宽度 工作方式 1 在工作方式 1 时, 定时 / 计数器 0 和定时 / 计数器 1 的工作是相同的 图 4.2 是定时 / 计数器 0, 工作方式 1 的工作原理框图 12 分时钟频 TL0 TH0 (8 BITS) (8 BITS) TF0 中断 P3.4/T0 C/T=1 控制 GATE P3.2/INT0 & 1 TR0 & 图 4.2 定时 / 计数器 0 工作方式 1 的原理框图定时 / 计数器的计数寄存器这时具有 16 位, 它由 8 位寄存器 TL0 和 8 位寄存器 TH0 这 2 个寄存器级联构成 定时 / 计数器的工作方式 1 除过这时计数寄存器具是 16 位这点以 53

54 外, 其余在组成和工作等方面与工作方式 0 相同 工作方式 2 在工作方式 2 时, 定时 / 计数器 0 和定时 / 计数器 1 的工作是相同的 图 4.3 是定时 / 计数器 0, 工作方式 2 的工作原理框图 时钟 12 分频 C/T=0 TL0 (8 BITS) TF0 中断 P3.4/T0 C/T=1 控制 GATE P3.2/INT0 & 1 TR0 & 重新装载 TH0 (8 BITS) 图 4.3 定时 / 计数器 0 工作方式 2 的原理框图 定时 / 计数器这时为 8 位自动重装计数器, 寄存器 TL0 用于计数, 寄存器 TH0 用来存储用于重装的计数初值 当寄存器 TL0 产生计数溢出, 溢出标志位 TF0 置 1, 同时寄存器 TH0 中的计数初值被复制到寄存器 TL0 寄存器 TH0 中的计数初值可以通过指令来写入 工作方式 3 在工作方式 3 时, 定时 / 计数器 0 和定时 / 计数器 1 的工作是不同的, 这点与前面描述的 3 种工作方式不同 定时 / 计数器 0 这时被分成 2 个独立的 8 位定时 / 计数器 寄存器 TL0 使用定时 / 计数器 0 所有的控制位和标志位 寄存器 TH0 只能工作在定时器模式, 即它的计数信号只能来自单片机的时钟, 它使用定时 / 计数器 1 的运行控制位 TR1 和溢出标志位 TF1 定时 / 计数器 1 这时停止工作, 它的内容被保持 图 4.4 是定时 / 计数器 0, 工作方式 3 的工作原理框图 时钟 12 分频 C/T=0 时钟 12 分频输出 TL0 (8 BITS) TF0 中断 P3.4/T0 C/T=1 控制 GATE P3.2/INT0 & 1 TR0 & 时钟 12 分频输出 TH0 (8 BITS) TF1 中断 TR1 控制 图 4.4 定时 / 计数器 0 工作方式 2 的原理框图 54

55 4.1.3 定时 / 计数器的工作控制寄存器 定时 / 计数器工作涉及到的特殊寄存器有 6 个, 它们是 : 定时 / 计数器 0 的计数寄存器 TL0 和 TH0 定时/ 计数器 1 的计数寄存器 TL1 和 TH1 定时/ 计数器控制寄存器 (TCON) 以及定时 / 计数器工作方式寄存器 (TMOD) 定时 / 计数器控制寄存器 (TCON) 定时 / 计数器控制寄存器 (TCON) 在特殊功能寄存器中的字节地址为 88H, 它即可以 进行字节寻址, 也可以进行位寻址 这个寄存器的格式如表 4.1 所示 表 4.1 定时 / 计数器控制寄存器 (TCON) 的格式表 D7 D6 D5 D4 D3 D2 D1 D0 TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 位地址 8F 8E 8D 8C 8B 8A 复位值 在表 4.1 中, 低 4 位被用来控制单片机的中断, 本章不讨论这部分内容 高 4 位与定时 / 计数器的工作相关, 每一位的具体功能如下 TF1: 定时 / 计数器 1 的溢出标志位 当计数寄存器的最高位产生进位时,TF1 被置 1, 同时申请中断 当 CPU 响应中断时,TF1 被清 0,TF1 也可以由软件进行查询和清 0 TR1: 定时 / 计数器 1 的运行控制位 如果定时 / 计数器工作方式寄存器 (TMOD) 中的门控位 GATE 清 0 或者管脚 INT0(P3.2) 为高电平, 当 TR1 被置 1, 允许计数 ; 当 TR1 被清 0, 禁止计数 TF0: 定时 / 计数器 0 的溢出标志位 功能与 TF1 相同 TR0: 定时 / 计数器 0 的运行控制位 功能与 TR1 相同 定时 / 计数器工作方式寄存器 (TMOD) 定时 / 计数器工作方式寄存器 (TMOD) 在特殊功能寄存器中的字节地址为 89H, 它没有位寻址功能, 只能进行字节寻址 这个寄存器的格式如表 4.2 所示 表 4.2 定时 / 计数器工作方式寄存器 (TMOD) 的格式表 D7 D6 D5 D4 D3 D2 D1 D0 定时 / 计数器 1 定时 / 计数器 0 TMOD GATE C/ T M1 M0 GATE C/ T M1 M0 复位值 定时 / 计数器工作方式寄存器 (TMOD) 的高 4 位被用来控制定时 / 计数器 1 的工作, 定时 / 计数器工作方式寄存器 (TMOD) 的低 4 位被用来控制定时 / 计数器 0 的工作 两部分的功用相同, 每一位的具体功能如下 GATE: 门控位 该位清 0 时, 定时 / 计数器的计数工作不受单片机管脚信号的控制 ; 55

56 该位置 1 时, 定时 / 计数器的计数工作可以受单片机管脚信号的控制 C/ T : 定时器模式或者计数器模式选择位 当 C/ T=0, 工作在定时器模式 这时的计数信号由单片机的时钟通过 12 分频来获得, 即计数寄存器对单片机的工作周期进行计数 该模式以单片机的工作周期为基准, 可以获 得信号的时间信息, 因此这个模式被称作定时器模式 当 C/ T=1, 工作在计数器模式 这时的计数信号来自于单片机外部 当输入信号发生 从高到低的跳变时计数寄存器加 1, 因此这个模式被称作计数器模式 M1 和 M0: 工作方式选择位 工作方式的功能说明如表 4.3 所示 表 4.3 定时 / 计数器的工作方式 M1 M0 工作方式 功能说明 位的定时 / 计数器 位的定时 / 计数器 自动重装的 8 位的定时 / 计数器 仅适用于定时 / 计数器 0, 它被分为 2 个 8 位的定时 / 计数器 定时 / 计数器 1 停止计数 在使用定时 / 计数器还需要注意以下事项 : 运行控制位 TRx 置 1 时, 即启动定时 / 计数器的计数, 计数寄存器 THx 和 TLx 的内容并不被清 0 读计数寄存器 THx 和 TLx 可以获得计数值, 读计数寄存器 THx 和 TLx 的操作可以在任意时间进行 向计数寄存器 THx 或 TLx 写入数据可以产生计数初值, 但是写计数寄存器 THx 或 TLx 操作之前必须清除运行控制位 TRx, 即停止定时 / 计数器的计数, 否则将产生不可预见的情况 改变定时 / 计数器的工作模式和方式也必须先清除运行控制位 TRx, 即停止定时 / 计数器的计数工作 4.2 基于定时 / 计数器的信号频率测量 频率测量的程序框图 频率的定义是 1s 时间内出现的信号波形的波峰数值或者波谷数值, 它的单位是 Hz 利用定时 / 计数器的计数功能, 通过对待测的信号进行计数,AT89S51 单片机可以直接测量满足 TTL 电平规范的脉冲信号的频率 实现频率测量的硬件电路可以继续使用第 3 章中介绍的基于串行方式 0 具有 4 个数码管的显示电路 频率测量结果可以用电路中的 4 个数码管进行显示 待测信号从管脚 T0(P3.4) 或者管脚 T1(P3.5) 加入, 前者用来驱动定时 / 计数器 0, 后者用来驱动定时 / 计数器 1 56

57 使用 4 个数码管, 电路能实现 1~9999Hz 的信号频率范围的显示 大于或者小于这个范围都将获得错误的测量结果 对于最大计数值为 9999 时, 采用定时 / 计数器工作方式 0 将发生计数溢出, 因为 13 位的计数寄存器的最大计数值为 8191 定时/ 计数器工作方式 1 具有 16 位计数寄存器, 它的最大计数值为 65535, 可以满足当前的计数要求 实现外部信号频率测量的程序框图如图 4.5 所示, 这里使用定时 / 计数器 0(Timer0) 实现计数 选择定时器 0 工作于计数器模式, 工作方式 1 计数寄存器 TH0 和 TL0 清 0 TR0 置 1, 启动定时器 0 计数 调用 1s 延时子程序, 产生计数闸门 延时时间到,TR0 清 0, 定时器 0 停止计数 将计数寄存器 TH0 和 TL0 中的数值送入子程序 HEXBCD 完成数制转换 调用子程序 LED4 显示频率测量结果 图 4.5 频率测量的程序框图图 4.5 显示了实现外部信号频率测量的单片机汇编语言源程序的流程, 它的功用与第 2 章中表 2.4 列出的交通灯的显示状态 变化顺序和实现这些状态时 P1 口相关管脚的输出逻辑表格一样 它们的目的都是建立程序结构 方便程序编写 第一个方框表示需要对定时 / 计数器进行初始化 因为定时 / 计数器工作方式的复位状态为定时器模式和工作方式 0, 现在需要它工作在计数器模式和工作方式 1, 因此定时 / 计数器的工作需要重新设定 启动定时 / 计数器的计数时, 即在运行控制位 TR0 被置 1 时, 计数寄存器 TH0 和 TL0 的内容并不被清 0 为了获得正确的计数值, 在每一次开始计数之前, 计数寄存器 TH0 和 TL0 都必须清 0 定时 / 计数器的计数工作在启动之后, 它的计数工作能够自主地进行, 不再需要 CPU 的支持 这时 CPU 可以执行 1s 钟的延时程序, 同时定时 / 计数器对外部信号进行计数 CPU 执行完 1s 钟的延时程序之后, 定时 / 计数器被关闭, 这时计数寄存器中的内容就是外部信号在 1s 时间进入定时 / 计数器的脉冲个数, 也就是外部待测信号的频率 这里应用 1s 钟的延时程序产生频率测量的计数闸门 计数寄存器中的数是以 2 进制数值形式保存的 为方便观察, 在显示频率测量结果之前, 它需要被转换成 10 进制数值 子程序 HEXBCD 可以完成这个工作 接着再调用子程 57

58 序 LED4 可以完成频率测量结果的显示 结果显示完成之后, 程序跳转到第二个方框处, 即计数寄存器 TH0 和 TL0 被清 0 处, 继续进行下一次的频率测量 这样的程序结构可以对待测信号进行连续测量, 实现对信号频率变化的监测 频率测量的程序示例 应用图 4.5 可以非常方便地编写出用于测量信号频率的汇编语言源程序 具体的汇编 语言源程序如下面程序示例 4.1 程序示例 4.1: ORG 0000H MOV SP, #70H ; 把堆栈的顶部上调以避开工作寄存器区 MOV TMOD, #05H ; 设置定时 / 计数器 0 为计数器模式 工作方式 1 BEGIN: MOV TH0, #00H ; 计数寄存器 TH0 的内容清 0 MOV TL0, #00H ; 计数寄存器 TL0 的内容清 0 SETB TR0 ; 启动定时 / 计数器 0 计数 ACALL TIMER1S ; 调用延时 1s 子程序形成频率测量的计数闸门 CLR TR0 ; 停止定时 / 计数器 0 计数 MOV 35H, TH0 ; 向 HEXBCD 子程序入口传送待转换的数据 MOV 36H, TL0 ACALL HEXBCD ; 完成信号频率的数制转换 ACALL LED4 ; 显示频率测量结果 AJMP BEGIN ; 进行下一次信号频率测量 HEXBCD: ;16 进制数到 10 进制数转换子程序 LED4: ; 显示 4 位数据 ( 共阴极数码管 ) 子程序 LED1: ; 显示 1 位数据 ( 共阴极数码管 ) 子程序 TIMER1S: ; 延时 1s 子程序 END 在程序示例 4.1 中, 由于子程序 HEXBCD 需要使用工作寄存器区 1, 因此堆栈指针需要从复位时的数值 07H 调整到 70H 以避免相互冲突 程序示例 4.1 中的 SETB 和 CLR 指令属于位操作类指令, 它的作用空间为片内数据存储器中可以进行位寻址的区域, 包括低 128 字节的通用数据存储器的字节地址 20H~2FH 范围, 对应的位地址为 00H~7FH; 高 128 字节的特殊存储器中字节低位地址是 0H 和 8H 的存储单元 指令的详细描述如表 4.4 所示 58

59 表 4.4 SETB 和 CLR 指令详细描述 指令助记符 功能描述 存储占用字节 执行需要时钟周期 CLR C 进位位清 CLR bit 直接地址位清 SETB C 进位位置 SETB bit 直接地址位置 附录 1 列出的 MCS51 单片机的汇编语言指令系统被分为 5 种类型 : 数据传送类 算术操作类 逻辑操作类 控制转移类和位操作类 前 4 种类型的指令采用字节寻址方式, 最后一种采用位寻址方式 位寻址方式可以对某一指定的位进行处理 这种功能为一些操作, 例如启动和停止定时 / 计数器的工作, 提供方便 它可以直接控制具有 8 位的存储单元中指定位, 而对其它位不产生影响 在表 4.4 中, 指令中的位地址 bit 表示片内数据存储器中可以进行位寻址的区域中的任意一位 位地址 C 属于特殊存储器中的程序状态字寄存器 (PSW) 中的一位, 这个寄存器的字节地址为 D0H, 它的格式如表 4.5 所示 表 4.5 程序状态字寄存器 (PSW) 的格式表 D7 D6 D5 D4 D3 D2 D1 D0 PSW C AC F0 RS1 RS0 OV P 位地址 D7 D6 D5 D4 D3 D2 D1 D0 复位值 程序状态字寄存器 (PSW) 用来保存指令执行的特征信息 一些指令的执行将会对它产生影响, 涉及的指令和具体的影响见本书的附录 3 例如在第 3 章中使用过的 CJNE 指令 : CJNE R3, #10H, BEGIN1 这句语句被执行时, 工作寄存器 R3 中的内容与立即数 #10H 进行比较, 如果相等则执行紧跟着本语句后面的语句, 如果不相等则转移到语句标号指定的语句处执行 如果工作寄存器 R3 中的内容与立即数 #10H 不相等, 这时进位位 C 中还保存进一步的信息 当工作寄存器 R3 中的数据小于立即数 #10H, 这时进位位 C 被置 1; 当工作寄存器 R3 中的数据大于立即数 #10H, 这时进位位 C 被清 0 在表 4.5 中, 每一位的具体功能如下 C: 进位位 AC: 辅助进位位 F0: 用户可以使用的标志位 RS1 和 RS0: 工作寄存器区选择位 它们在第一章的单片机存储空间介绍中已经进行过讨论 OV: 计算溢出标志位 59

60 : 保留位 P: 奇偶标志位 它反映了累加器 A 中包含的二进制数 1 的个数为奇数或者偶数 程序示例 4.1 在 Keil 单片机模拟调试软件的集成开发环境中可以进行模拟调试 在调试状态下, 为了观察方便, 使用者可以选择菜单 Peripherals Timer Timer 0 可以打开定时 / 计数器 0 的观察窗口, 如图 4.6 所示 为了模拟被测试的信号,P3 口观察窗口也被打开 通过点击定时 / 计数器 0 的计数信号输入管脚 T0( 管脚 P3.4) 可以改变它的电平状态, 从而模拟输入信号的变化 图 4.6 Keil 单片机模拟调试软件的集成开发环境在图 4.6 所示的定时 / 计数器 0 的观察窗口中, 计数寄存器 TL0 和 TH0 的内容也可以被修改 通过修改计数寄存器 TL0 和 TH0 的内容也可以模拟在执行 1s 延时子程序 TIMER1S 时定时 / 计数器 0 的计数值, 使得程序的模拟调试得以更方便地进行 把程序示例 4.1 下载到 AT89S51 芯片内, 频率测量电路就可以用来进行实际测量 通常用这个电路测量信号产生器的输出, 频率测量电路显示的频率值与信号产生器输出的信号频率将有明显的差别, 但是显示的数值很稳定 导致测量误差的原因是单片机的实际时钟频率并不等于晶体的标注频率, 时钟电路中的电容将使得时钟频率产生偏移 这个频率偏移可以采用实验的方法, 通过调整子程序 TIMER1S, 即频率测量的计数闸门来克服 当频率测量电路的显示数据大于信号产生器输出的信号频率, 子程序 TIMER1S 产生的延迟时间应该向小调节 ; 当频率测量电路的显示数据小于信号产生器输出的信号频率, 子程序 TIMER1S 产生的延迟时间应该向大调节 60

61 4.3 频率测量量程的自动切换 扩展频率测量范围 采用 4 个数码管和程序示例 4.1 可以实现工作频率在 1Hz~9999Hz 范围的信号测量 当待测信号的工作频率高于 9999Hz, 频率测量电路的显示数据将是错误的 当待测信号的工作频率低于 1000Hz, 频率测量电路的显示数据的精度将下降 本节只讨论如何提高测量信号的频率范围 在不增加电路中包含数码管的前提下, 如果希望提高频率的显示范围, 数据的显示格式可以采取科学计数法, 即测量数据由有效值乘以 10 为底的幂来表示 频率测量电路的数码管的显示可以采取如图 4.7 所示的格式 图 4.7 频率测量电路的数码管显示格式在图 4.7 所示的显示格式中, 前 3 位为信号频率的有效值, 第 4 位为以 10 为底的幂的次数 采用这种方法可以在不增加电路中数码管的前提下提高频率的显示范围 为实现频率测量范围的提高, 汇编语言源程序也需要进行改进 这个改进工作包括以下两个方面 第一个方面可以通过压缩定时 / 计数器的计数闸门时间来实现频率测量范围的提高 例如在计数寄存器中的计数值为 567 的情况下, 如果计数闸门的时间为 1s, 这时对应的待测信号的频率是 567Hz, 应显示为 567 0; 如果计数闸门的时间为 100ms, 这时对应的待测信号的频率是 5.67KHz, 应显示为 567 1; 如果计数闸门的时间为 10ms, 这时对应的待测信号的频率是 56.7KHz, 应显示为 上面的显示格式仅为一种推荐格式, 读者也可以自己设计其它显示格式 第二个方面是实现如图 4.6 所示频率测量结果的显示格式 这时仍然可以使用子程序 LED4 实现数据显示, 但是应该向子程序 LED4 的入口地址 64H 送入幂的值, 向入口地址 61H~63H 送入计数寄存器的计数值 由于 4 个数码管中的 1 个数码管用来显示幂的值, 这样虽然扩展了测量信号的频率范围, 但是降低了测量数据的精度, 这时的频率测量精度为 3 位有效数字 频率测量量程的自动切换 采用不同的定时 / 计数器计数闸门时间可以改变频率测量的量程, 实现频率测量量程的变换可以采用手动和自动两种方法 采用手动方法, 测量者可以根据待测信号的频率范围设定定时 / 计数器的计数闸门时间 采用自动方法, 定时 / 计数器计数闸门的时间由频率测量 61

62 设置定时器 0 工作于计数器模式 计数寄存器 TH0 和 TL0 清 0 TR0 置 1, 启动定时器 0 计数 调用 10ms 延时子程序, 产生计数闸门 延时时间到,TR0 清 0, 定时器 0 停止计数 计数寄存器 TH0 和 TL0 中的计数值送入子程序 HEXBCD 完成数制转换 判断十进制数的百位是否为 0 N 向 LED4 入口 64H 赋 2 Y 计数寄存器 TH0 和 TL0 清 0 TR0 置 1, 启动定时器 0 计数 调用 100ms 延时子程序, 产生计数闸门 延时时间到,TR0 清 0, 定时器 0 停止计数 计数寄存器 TH0 和 TL0 中的计数值送入子程序 HEXBCD 完成数制转换 判断十进制数的百位是否为 0 N 向 LED4 入口 64H 赋 1 调用子程序 LED4 显示频率测量结果 图 4.8 量程自动切换的频率测量程序框图 Y 计数寄存器 TH0 和 TL0 清 0 TR0 置 1, 启动定时器 0 计数 调用 1s 延时子程序, 产生计数闸门 延时时间到,TR0 清 0, 定时器 0 停止计数 计数寄存器 TH0 和 TL0 中的计数值送入子程序 HEXBCD 完成数制转换 向 LED4 入口 64H 赋 0 62

63 电路根据待测信号的频率范围自动设定 实现量程自动切换的频率测量程序框图如图 4.8 所示 在实现量程自动切换的频率测量程序框图中, 定时 / 计数器的计数闸门首先被设置为 10ms 来进行计数 在计数结果完成数制转换以后, 对数值的百位进行判断 如果该位不为 0, 则向子程序 LED4 的入口地址 64H 赋幂值 2, 入口地址 61H~63H 赋计数值 如果数值的百位为 0, 定时 / 计数器的计数闸门接着被设置 100ms 来进行计数, 同样在计数结果完成数制转换以后, 对数值的百位进行判断 如果该位不为 0, 则向子程序 LED4 的入口地址 64H 赋幂值 1, 入口地址 61H~63H 赋计数值 如果该位为 0, 定时 / 计数器的计数闸门再被置 1s 进行计数, 在计数结果完成数制转换以后, 向子程序 LED4 的入口地址 64H 赋幂值 0, 入口地址 61H~63H 赋计数值 当输入信号的频率为 100Hz~99.9KHz 范围之内, 这时频率测量电路可以获得 3 位有效数字的测量结果, 并且具有测量量程自动切换能力 应用图 4.8 可以非常方便地编写出具有量程自动切换的频率测量汇编语言源程序 具体的汇编语言源程序如下面程序示例 4.2 程序示例 4.2: ORG 0000H MOV SP, #70H ; 把堆栈的顶部上调以避开工作寄存器区 1 MOV TMOD, #05H ; 设置定时 / 计数器 0 为计数器模式 工作方式 1 BEGIN: MOV TH0, #00H ; 计数寄存器 TH0 的内容清 0 MOV TL0, #00H ; 计数寄存器 TL0 的内容清 0 SETB TR0 ; 启动定时 / 计数器 0 计数 ACALL T10MS ; 调用延时 10ms 子程序形成频率测量的计数闸门 CLR TR0 ; 停止定时 / 计数器 0 计数 ACALL HEXBCD ; 完成信号频率的数制转换 MOV A, 61H ; 计数值的百位数据被复制到累加器 A JZ G100MS ; 百位数据为 0 则进入 100ms 计数闸门的计数过程 MOV 64H, #02H ; 百位数据不为 0, 赋幂值 2 AJMP LED ; 进入显示过程 G100MS: MOV TH0, #00H ; 计数寄存器 TH0 的内容清 0 MOV TL0, #00H ; 计数寄存器 TL0 的内容清 0 SETB TR0 ; 启动定时 / 计数器 0 计数 ACALL T100MS ; 调用延时 100ms 子程序形成频率测量的计数闸门 CLR TR0 ; 停止定时 / 计数器 0 计数 ACALL HEXBCD ; 完成信号频率的数制转换 MOV A, 61H ; 计数值的百位数据被复制到累加器 A JZ G1S ; 百位数据为 0 则进入 1s 计数闸门的计数过程 63

64 MOV 64H, #01H ; 百位数据不为 0, 赋幂值 1 AJMP LED ; 进入显示过程 G1S: MOV TH0, #00H ; 计数寄存器 TH0 的内容清 0 MOV TL0, #00H ; 计数寄存器 TL0 的内容清 0 SETB TR0 ; 启动定时 / 计数器 0 计数 ACALL TIMER1S ; 调用延时 1s 子程序形成频率测量的计数闸门 CLR TR0 ; 停止定时 / 计数器 0 计数 ACALL HEXBCD ; 完成信号频率的数制转换 MOV 64H, #00H ; 赋幂值 0 LED: ACALL LED4 ; 显示频率测量结果 AJMP BEGIN ; 进行下一次频率测量 LED4: ; 显示 4 位数据 ( 共阴极数码管 ) 子程序 LED1: ; 显示 1 位数据 ( 共阴极数码管 ) 子程序 TIMER1S: ; 延时 1s 子程序 T100MS: ; 延时 100ms 子程序 T10MS: ; 延时 10ms 子程序 END 如果测量结果保证 3 位有效数字, 基于程序示例 4.2 的频率测量电路的测量范围是 100Hz~99.9KHz 为简化程序的书写, 子程序 HEXBCD 的入口地址可以改为定时 / 计数器 0 的计数寄存器 TH0 和 TL0, 这样在调用子程序 HEXBCD 时就不须向它的入口地址赋值 子程序 HEXBCD 的出口地址也做了调整, 输出十进制数的个位数据在单片机内部数据存储器的 63H 地址单元, 十位数据在单片机内部数据存储器的 62H 地址单元, 百位数据在单片机内部数据存储器的 61H 地址单元, 千位数据被丢弃 在向单片机内部数据存储器的 64H 地址单元送入需要显示的幂的数值以后, 子程序 LED4 就可以直接被调用 对于产生 100ms 和 10ms 延时的子程序 T100MS 和 T10MS, 读者可以参考产生 1s 延时的子程序的编写方法自己编写 程序示例 4.2 中利用 JZ 指令来判断当前完成计数的百位数值是否为 0 如果为 0, 程序改变计数闸门, 再次进行计数 ; 如果不为 0, 当前计数闸门对应的幂值送往子程序 LED4 的入口地址 64H, 然后频率测量结果被送去显示 JZ 指令属于控制转移类指令, 用来对累加器的内容进行判断 指令的详细描述如表 4.5 所示 64

65 表 4.5 JZ 和 JNZ 指令详细描述 指令助记符 功能描述 存储占用字节 执行需要时钟周期 JZ rel 累加器中的数据为 0 则转移 2 24 JNZ rel 累加器中的数据不为 0 则转移 正弦波到 TTL 方波的转换电路 AT89S51 单片机属于数字集成电路, 它仅可以被输入时间离散和幅度离散的数字信号 对应于数字信号, 时间连续和幅度连续的信号被称作为模拟信号 最常见的模拟信号为正弦波, 它是一种正负交替变化的周期信号 如果希望使用 AT89S51 单片机测量正弦波信号的频率, 待测的正弦波信号首先必须被转换成符合 TTL 电压规范的数字信号 图 4.9 给出了一种实现从正弦波到 TTL 方波的转换电路 +5V R C 10K 7414 U o U i 图 4.9 正弦波到 TTL 方波的转换电路在正弦波到 TTL 方波的转换电路中, 三极管电路被用来把正负交替变化的正弦波转换成单向的脉冲波 三极管电路的电源与单片机电路采用同样的供电电源 三极管电路的输入端采用零偏置, 当输入信号为正弦波的负半周时, 三极管截止, 电路输出电压等于电源电压 ; 当输入信号为正弦波的正半周时, 三极管导通, 电路输出电压随着输入信号电压的增加而下降 当输入信号电压的幅度足够大的情况下, 三极管进入饱和状态, 电路输出电压将接近 0 三极管电路输出的单向的脉冲波的最高电压为电源电压, 最低电压接近 0 这样的单向的脉冲波接着再由具有施密特触发的反相器 74LS14 进行整形, 获得前 后沿陡直, 顶部平缓的方整方波 这样的输出方波具有与输入正弦波同样的频率, 而且也可以使用单片机完成频率测量 65

66 4.5 小结 本章介绍了 AT89S51 单片机的片内定时 / 计数器 ; 并应用定时 / 计数器实现了数字信号的频率测量, 也可以实现测量量程的自动转换 ; 为实现正弦波信号的频率测量, 本章还介绍了一种实现正弦波到方波的转换电路 为使得程序编写方便, 本章介绍了程序框图 程序框图与前面章节中使用的状态表的功能是一致的 为实现对一个字节中某一特定数位的访问, 位寻址指令被介绍 基于上述的硬件电路和编程方法, 实现信号频率测量的汇编语言源程序示例被给出, 相关的汇编语言指令被介绍 实验 9. 完成程序示例 4.1 和程序示例 4.2 的仿真调试 10. 向单片机芯片下载调试验证过的程序示例 4.1 或程序示例 4.2 进行实际调试 以信号产生器的输出频率为基准, 分别记录实际调试前后单片机电路频率测量的绝对误差和相对误差, 并对误差进行分析 调整频率测量的闸门时间以消除测量误差 11. 按图 4.9 组装一个正弦波到 TTL 方波的转换电路, 测量该电路能够正常工作所需要的最小输入正弦波电压幅度 12. 测量基于 AT89S51 单片机的频率测量电路的最高测量频率 当需要测量信号的频率高于这个最高测量频率时, 如何解决这个问题? 设计出相应的硬件电路和汇编语言源程序 66

67 第 5 章外部数据空间的访问 MCS51 系列单片机的片外数据存储空间可以被用来放置外部数据存储器 输入 / 输出接口扩展器件 模拟 / 数字转换器和数字 / 模拟转换器等外围器件, 这些外围器件都将占用外部数据存储空间的地址 单片机通过向相应的外部数据存储空间地址单元写入数据实现控制对应的片外外围器件工作 ; 从相应的外部数据存储空间地址单元读出数据获得对应的片外外围器件的工作结果 单片机的数据总线宽度为 8 位, 因此数据传输需要 8 条数据线 ; 外部数据空间的寻址范围为 64K, 因此实现寻址需要 16 条地址线 对外部数据空间的访问使用 P0 口的 8 个管脚, 它们被用作数据总线和地址总线的低 8 位 ; 使用 P2 口的 8 个管脚, 它们被用作地址总线的高 8 位 除此之外, 访问外部数据空间还要使用管脚 P3.6( WR ) 提供写控制信号, 使用管脚 P3.7( RD ) 提供读控制信号, 使用管脚 ALE 提供低 8 位地址总线的锁存信号 5.1 访问外部数据空间的指令和执行时序 MCS51 系列单片机的基本时序周期 MCS51 系列单片机属于程序控制式计算机 它的运行过程是在程序控制器的控制下逐条执行程序指令的过程 这个过程的具体步骤为 : 首先从程序存储器中取出指令送到指令寄存器 ; 然后指令译码器对指令进行译码 ; 译码产生一系列具有时间要求的操作信号被用来控制单片机各部分的工作 一条指令经译码产生的一系列操作信号在时间上有严格的先后次序, 这种次序被称作为单片机的工作时序 在讨论单片机的工作时序时, 一些时间单位经常被涉及, 这些时间单位被称作单片机的基本时序周期 单片机的基本时序周期包括以下 4 种 时钟周期 : 单片机的时钟电路的振荡周期 S 周期 : 一个 S 周期包含 2 个时钟周期 S 周期 = 时钟周期 P1 + 时钟周期 P2 机器周期 : 一个机器周期包含 6 个 S 周期, 或者 12 个时钟周期 指令周期 : 完成一条指令所需要的时间 根据执行不同的指令, 完成一条指令所需要的时间为 1 个 2 个或者 4 个指令周期 当单片机时钟电路的晶体频率采用 12MHz, 上述 4 种基本时序周期对应的时间分别为 : 1 个时钟周期 = 1 / 12 us; 1 个 S 周期 = 1 / 6 us; 1 个机器周期 = 1 us; 1 个指令周期 = 1 2 或者 4 us 67

68 5.1.2 MOVX 指令及执行时序 第一章介绍了访问单片机内部数据存储器的 MOV 指令, 第二章介绍了访问程序存储空间的 MOVC 指令 访问外部数据存储空间的指令为 MOVX MOVX 指令也属于数据传送类指令, 它有 4 种形式, 详细描述如表 5.1 所示 表 5.1 MOVX 指令详细描述助记符指令功能说明存储占用字节执行需要时钟周期 MOVX A,@Ri MOVX A,@DPTR DPTR A Ri 的内容为地址 (8 位地址 ) 的外部数据存储单元中的数据复制到累加器数据指针的内容为地址 (16 位地址 ) 的外部数据存储单元中的数据复制到累加器累加器中的数据复制到 Ri 的内容为地址 (8 位地址 ) 的外部数据存储单元累加器中的数据复制到 DPTR 的内容为地址 (16 位地址 ) 的外部数据存储单元 表 5.1 中的前 2 条指令为数据读指令, 指令执行时, 数据的传输方向是从外部数据存储空间到单片机, 在指令的执行过程中单片机将产生读控制信号 RD 表中的后 2 条指令为写数据指令, 指令执行时, 数据的传输方向是从单片机到外部数据存储空间, 在指令的执行过程中单片机将产生写控制信号 WR 被访问的映射到外部数据存储空间的器件地址可以由 2 种方法给出, 即通过工作寄存器 Ri 或者数据指针 DPTR 前者只能提供 8 位地址, 后者可以提供 16 位地址, 因此由数据指针 DPTR 来提供地址的方法获得更广泛的使用 在本章之前, 所讨论的单片机应用中只涉及到了它的在片外围器件, 例如片内数据存储器 并行输入 / 输出接口 串行输入 / 输出接口和定时 / 计数器等 这些在片外围器件在和 CPU 进行数据交换时我们没有必要考虑它们之间工作时间的匹配, 这是因为在单片机的设计时已经保证了这些 但是在完成 CPU 与片外外围器件进行数据交换时, 我们必须考虑它们之间工作时间上的匹配 图 5.1 给出从映射到外部数据空间中的器件读取数据或向映射到外部数据空间中的器件写数据时单片机的工作时序图, 即单片机执行指令 : MOVX 或单片机执行指令 : 的工作时序图 这两种情况的区别是前者产生读控制信号 RD ; 后者产生写控制信号 WR 执行 MOVX 指令需要 2 个机器周期, 其中第一个机器周期被用来从程序存储器取指令, 第二个机器周期被用来对映射到外部数据空间的外围器件进行访问 图 5.1 中的所有信号波形是以单片机的时钟信号为参考标准 68

69 周期 1 周期 2 S1 S2 S3 S4 S5 S6 S1 S2 S3 S4 S5 S6 ALE PSEN RD/WR P2 PCH 输出 DPH 输出或 P2 输出 PCH 输入 P0 指令输入 PCL 输出 指令输入 地址输出 数据输入 PCL 输出 指令输入 PCL 输出 PCL 输出有效 地址输出有效 PCL 输出有效 图 5.1 MOVX 指令的执行时序为讨论问题的方便, 这里假设单片机使用外部程序存储器 在机器周期 1 的 S1P2 到 S2P1 时钟期间, 管脚 ALE 输出高电平, 这时 P2 口输出指令地址的高字节 (PCH),P0 口输出指令地址的低字节 (PCL) 管脚 ALE 输出信号的下跳边沿可以被用来对指令地址的低字节 (PCL) 进行锁存 在机器周期 1 的 S3P1 到 S4P1 时钟期间, 管脚 PSEN 输出变为低电平, 这时 P0 口从地址总线切换成数据总线, 从程序存储器中取出指令 在机器周期 1 的 S4P2 到 S5P1 时钟期间, 管脚 ALE 再次输出高电平, 这时 P2 口输出将要访问的片外外围器件地址的高字节 (DPH),P0 口输出这个地址的低字节 (DPL) 管脚 ALE 输出信号的下跳边沿可以被用来对将要访问的片外外围器件地址的低字节 (DPL) 进行锁存 在机器周期 2 的 S1P1 到 S3P2 时钟期间, 根据执行的指令, 管脚 RD 或管脚 WR 输出变为低电平, 这时 P0 口再次从地址总线切换成数据总线, 完成单片机和需要访问的片外外围器件之间的数据交换 在机器周期 2 的 S4 到 S6 时钟期间还将发生一次从程序存储器中取出指令的操作, 但是这次取出的指令不被执行, 它被丢弃, 同时这次进行的取指令操作也不会影响程序指针 (PC) 的计数 从图 5.1 可以看出, 在机器周期 1 中,ALE 信号出现了 2 次, 在机器周期 2 中,ALE 信号只出现 1 次 这种情况只有在执行 MOVX 指令时会出现 由于执行 MOVX 指令将影响到 ALE 信号的正常输出, 因此 ALE 信号的频率是不确定的 准备与单片机连接的外围器件, 例如数据存储器 输入 / 输出接口扩展器件 模拟 / 数字转换器和数字 / 模拟转换器等, 的工作时序必须和图 5.1 显示的单片机访问外部数据空间的工作时序相一致 除此之外, 外围器件的工作时间, 例如外围器件的数据读写时间, 还必须小于单片机对应的工作时间 这个对应的工作时间就是从机器周期 2 的 S1P1 到 S3P2 的间区间, 如果单片机的时钟频率为 12MHz, 这个时间为 6us 69

70 5.1.3 外部总线的扩展 单片机与映射到外部数据存储空间的外围器件实现数据交换的总线示意图如图 5.2 所示 总线包括地址总线 (AB) 数据总线(DB) 和控制总线 (CB) P2 A8 ~ A15 ALE 地址锁存 A0 ~ A7 (AB) AT89 S51 P0 WR RD PSEN EA INT0 INT1 T0 T1 RST D0 ~ D7(DB) (CB) 图 5.2 外部总线扩展图 在图 5.2 中, 从 P2 口输出的高 8 位地址 (A8~A15) 信号线和控制信号线 ALE PSEN WR RD 可以直接与外围器件相连接 由于 P0 口通过时分的方式被用作低 8 位地址 (A0~ A7) 信号线和数据总线 (D0~D7), 因此 P0 口不能直接与外围器件相连接, 一个如图所示的用于地址锁存的器件必须被使用以分离从 P0 口输出的低 8 位地址信号和数据信号 参考如图 5.1 所示的 MOVX 指令的执行时序, 在 ALE 信号的高电平期间,P0 口输出的低 8 位地址信号, 这时地址锁存器件的输出应该等于它的输入 ALE 信号的下跳边沿完成地址锁存器件输出低 8 位地址信号的锁存 在 ALE 信号的低电平期间, 地址锁存器件保持输出低 8 位地址信号不变,P0 口则被用作数据总线以实现与片外外围器件的数据交换 图 5.2 中的地址锁存器通常使用八 D 锁存器 (3S)74LS373 或者 74LS573, 它们的管脚图如图 5.3 所示 这 2 种芯片的功能相同, 只是管脚排列顺序不同 在组装电路时, 芯片可以根据电路的布局来选择, 使得电路连线简洁 OC 1Q V CC 8Q OC 1D V CC 1Q 1D D 2D Q 2D D 3D Q 2Q Q 4D Q 3Q Q 5D Q 3D D 6D Q 4D D 7D Q 4Q Q 8D Q GND CP GND CP 74LS373 74LS573 图 5.3 八 D 锁存器 (3S) 的管脚图 70

71 八 D 锁存器 (3S)74LS373 和 74LS573 的功能表如表 5.2 所示 表 LS373 和 74LS573 功能表 输 入 输出 OC CP D Q Q 0 1 Z 注 : Z 表示高阻状态 Q 0 表示 CP 高电平到来之前输出 Q 的状态 在实际电路中, 八 D 锁存器 (3S)74LS373 或 74LS573 的管脚 OC 通常直接接地, 管 脚 CP 与 AT89S51 的管脚 ALE 相接, 管脚 1D~8D 分别与 AT89S51 的管脚 P0.0~P0.7 相 接, 管脚 1Q~8Q 与要访问的外围器件的地址管脚 A0~A7 相接 5.2 外部数据存储器的扩展 AT89S51 的内部数据存储器仅有 128 字节, 当单片机系统用于实时数据采集和处理时, 这些内部数据存储容量是远远不够的 为了提供足够的数据存储容量, 外部数据存储器必须被扩展 常用的外部数据存储器包括 : 具有 4k 存储字节的 6232 具有 8k 存储字节的 6264 具有 16k 存储字节的 具有 32k 存储字节的 和具有 64k 存储字节的 由于模拟 / 数字转换器和数字 / 模拟转换器等外围器件也要占用外部数据存储空间的地址资源, 如果所设计的系统还需要扩展模拟 / 数字转换器和数字 / 模拟转换器等器件, 被扩展的外部数据存储器的容量是受限制的 本节介绍外部数据存储器芯片 HM6264A 的使用, 其它外部数据存储器芯片的使用与它相似 HM6264A 的介绍 HM6264A 是一种 8K 8 位静态 RAM 芯片 图 5.4 为它的 PDIP28 封装外形图, 与 AT89S51 芯片一样, 这种封装形式也很容易使用面包板来组成应用电路 NC A12 A7 A6 A5 A4 A3 A2 A1 A0 I/O0 I/O1 I/O2 VSS VCC WE CS2 A8 A9 A11 OE A10 CS1 I/O7 I/O6 I/O5 I/O4 I/O3 图 5.4 HM6264A 的 DIP28 封装外形图 71

72 在图 5.4 中, 管脚 I/O0~I/O7 是 8 位双向数据线 ; 管脚 A0~A12 是 13 位地址线 ; 管 脚 CS1 CS2 OE 和 WE 为控制线 ; 管脚 NC( 管脚 1) 没有使用 HM6264A 的功能表如 表 5.3 所示 表 5.3 HM6264A 功能表 CS1 CS2 OE WE 工作方式 IO0~IO7 1 未选中 高阻 0 未选中 高阻 输出禁止 高阻 单片机读 输出 单片机写 输入 单片机写 输入 访问 HM6264A 不但要满足表 5.1 所示的各个管脚之间的电压关系, 这些电压还必须满足一定的时间关系 图 5.5 给出了从 HM6264A 读取数据时它的管脚之间所需要满足的电压和时间的关系 T RC Address CS1 CS2 OE Dout Vaild Data 图 5.5 从 HM6264A 读取数据的时序图 HM6264A 的双向数据管脚 I/O0~I/O7 分别与 AT89S51 的数据总线相连接 ; 地址管脚 A0~A12 分别与 AT89S51 的地址总线相连接 ; 片选管脚 CS1 也与 AT89S51 的一条地址线相连接 ( 例如 P2.7); 片选管脚 CS2 直接与电源相连接 ; 读数允许管脚 OE 与 AT89S51 的读数控制管脚 P3.7( RD ) 相连接 参考图 5.1 给出的单片机访问映射到外部数据空间中器件的工作时序图, 当单片机执行指令 : MOVX 的工作时序将满足图 5.5 所示的从 HM6264A 读取数据所需要的时序 72

73 图 5.5 中的时间 T RC 为从 HM6264A 完成一次数据读取所需要的最小时间,HM6264A 具有 3 种 T RC 时间的芯片,T RC 分别为 100ns 120ns 和 150ns 对应于这段时间的 MOVX 指令执行时间为从周期 1 的 S5P2 到周期 2 的 S3P2, 即 T RC 对应的时间为 9 个时钟周期 当单片机采用 12MHz 时钟,T RC 对应的时间为 750ns, 因此满足 HM6264A 所有型号的工作时间要求 向 HM6264A 写数据需要满足的时间关系与图 5.5 给出的时序类似, 这里不再讨论, 感兴趣的读者可以参考 HM6264A 的数据手册 扩展 HM6264A 的电路 AT89S51 单片机扩展一片 HM6264A 数据存储器的原理电路图如图 5.6 所示 图 5.6 仅画出 AT89S51 单片机与 HM6264A 数据存储器需要连接的部分管脚, 单片机的其它部分, 包括供电电路 时钟电路 复位电路和片内程序存储器选择电路等都没有画出, 这些部分在组装电路时必须连接 +5V 1k AT89 S51 RD WR P2.7 P2.4 P2.3 P2.2 P2.1 P2.0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P D 7D 6D 5D 4D 3D 2D 1D CP 74LS Q 16 7Q 15 6Q 12 5Q 9 4Q 6 3Q 5 2Q 2 1Q OC V CC CS2 V SS OE WE CS1 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 HM 6264 ALE I/O7 I/O6 I/O5 I/O4 I/O3 I/O2 I/O1 I/O0 图 5.6 扩展 HM6264A 数据存储器的原理电路 73

74 单片机的 P0 口被用来输出要访问的外部数据存储器的低 8 位地址和实现传输 8 位数据 地址信号的传输方向是从单片机送往外部数据存储器 数据信号既可以从单片机送往外部数据存储器, 也可以从外部数据存储器送往单片机, 即数据传输的方向是双向的 数据传输的具体信号流向取决于单片机当前所执行的指令 P2 口被用来输出要访问的外部数据存储器的高 8 位地址 P2 口的 8 个管脚可能全部被使用, 也可能只使用一部分, 这取决外部数据存储器容量的大小 例如当外部数据存储器的容量为 64K, 则需要全部高 8 位的地址线 ; 当外部数据存储器的容量为 8K, 则只需要 5 位地址线 当单片机访问外部数据空间中的器件时,P2 口只被用来输出要访问器件的高 8 位地址, 因此它直接与被访问器件的对应地址管脚相连接 P0 口既要被用来输出要访问器件的低 8 位地址和又要传输 8 位数据 在一个访问周期中,P0 口首先送出要访问器件的地址信息 接着单片机的管脚 ALE 向锁存器发送锁存信号, 这个信号对加到锁存器的地址信号进行锁存, 保证在后面的数据读写状态期间地址信号的稳定 地址信息由锁存器锁存后,P0 口然后被切换成数据线 最后单片机根据当前执行的指令产生对应的读控制信号 RD 或者写控制信号 WR, 该信号打开被访问器件的数据端口 如果当前执行读数据指令, 被访问器件对应存储地址单元中的数据被送往单片机 ; 如果当前执行写数据指令, 单片机中的数据被送往被访问器件对应存储地址单元 在图 5.4 中,HM6264A 数据存储器片选管脚 CS2 直接与电源相连接, 因此它一直有效 片选管脚 CS1 与 AT89S51 的管脚 P2.7 相连接, 要使它有效,P2.7 必须输出低电平信号, 即输出 0 AT89S51 的管脚 P2.5 和 P2.6 这时没有使用, 它们的输出状态对 HM6264A 数据存储器的访问没有影响 设管脚 P2.5 和 P2.6 的输出都是 1,HM6264A 数据存储器的地址范围为 6000H~7FFFH, 对应 8K 字节 HM6264A 工作验证 为了验证 HM6264A 数据存储器芯片和组装的相关电路能否正常工作, 读者可以设计一段程序, 并把它下载到单片机中去实际执行 这里只给出编程提示, 读者可以学着首先绘出程序框图, 然后编写具体的汇编语言源程序 验证程序首先向 HM6264A 数据存储器的一块连续的存储单元, 例如地址 6000H~ 60FFH, 分别写入数据 00H~0FFH 然后逐个 循环地从这些存储单元中读出写入的数据, 并且把它们用数码管进行显示 如果数码管的显示数据与写入 HM6264A 数据存储器的数据相同, 这将证明 HM6264A 数据存储器芯片和组装的相关电路能正常工作 上述验证程序不仅能被用来验证电路能否正常工作, 而且也能被用来练习编写访问映射到外部数据空间中的外围器件的应用程序 在上述验证程序中, 由于需要使用数码管进行数据显示, 图 5.6 所示的电路还需要再添加相应的硬件电路 在所编写的验证程序中也需要添加相应的译码和延时等相关程序 74

75 5.3 DAC0832 数字 / 模拟转换器的应用 按照所处理的信号, 电路可以被分为模拟电路和数字电路 在模拟电路中, 信号的特征为幅度连续和时间连续, 这样的信号如话筒输出的语音信号或者温度传感器输出的反映温度变化的信号 在数字电路中, 信号的特征为幅度离散和时间离散, 这样的信号如在第 2 章中讨论的交通灯的控制电路中 P1 口的输出信号 对于 P1 口的任意一个管脚, 它的输出信号的幅度只有 2 种电平 :0V 或 5V 自然界中大多数物理量的变化都是连续的, 但是单片机属于数字电路, 因此当语音信号和反映温度变化这样的连续信号在应用单片机处理之前必须被转换成离散的数字信号, 完成这种功能的器件被称作为模拟 / 数字转换器 同样单片机完成信号处理后, 很多情况下还需要把离散的数字信号转换成为连续的模拟信号, 完成这种功能的器件被称作为数字 / 模拟转换器 本节以 DAC0832 数字 / 模拟转换器为例介绍数字 / 模拟转换器的使用 DAC0832 数字 / 模拟转换器的介绍 DAC0832 数字 / 模拟转换器是一种接口与 MCS51 系列单片机完全兼容, 具有 8 位分辨率的数字 / 模拟转换器芯片 它的 PDIP20 封装形式如图 5.7 所示 CS WR1 GND DI3 DI2 DI 1 DI 0 (LSB) V REF R fb GND V CC I LE WR2 XFER DI4 DI 5 DI 6 DI 7 (NSB) I OUT2 I OUT1 图 5.7 DAC0832 数字 / 模拟转换器 PDIP20 封装外形图 在图 5.7 中, 管脚 DI 0 ~DI 7 是 8 位数据输入线 ; 管脚 V REF 用来接入基准电源 ; 管脚 I OUT1 和 I OUT2 用来输出模拟电流 ;R fb 用来从输出端向 DAC0832 数字 / 模拟转换器引入反馈信号 为了更好地了解 DAC0832 数字 / 模拟转换器的工作时序, 图 5.8 给出了芯片内部的控制逻辑 管脚 I LE CS WR 1 WR 2 和 XFER 为控制线 由图 5.8 可以看出,DAC0832 数字 / 模拟转换器对输入数字信号采用双缓冲, 其中管脚 I LE CS 和 WR 1 的输入信号用来控制输入锁存器的工作, 管脚 WR 2 和 XFER 的输入信号用来控制 DAC 寄存器的工作 对于输入锁存器, 当管脚 I LE 为高电平 管脚 CS 和 WR 1 为低电平, 图 5.8 中的片内端点 LE 1 为高电平, 75

76 (MSB) DI 7 DI 6 DI 5 DI 4 DI 3 DI 2 DI1 (LSB) DI D D D D D D D D 8- BIT INPUT REGISTER Q Q Q Q Q Q Q Q D D D D D D D D 8- BIT DAC REGISTER Q Q Q Q Q Q Q Q 8- BIT MULTILPYING D/A CONVERTER Rfb V REF I OUT2 I OUT1 Rfb ILE 19 LE 1 LE 2 3 GND CS WR 1 WR 2 XFER NOTE: WHEN LE= 1",Q OUTPUTS FOLLOW D INPUTS; WHEN LE= 0", DATA AT D IS LATCHED V CC GND 图 5.8 DAC0832 数字 / 模拟转换器的逻辑结构图这时输入锁存器的输出随着输入的状态变化 片内端点 LE 1 的下跳边沿将输入信息锁入输入锁存器 对于 DAC 寄存器, 当管脚 WR 2 和 XFER 为低电平, 图 5.8 中的片内端点 LE 2 为高电平, 这时 DAC 寄存器的输出随着输入的状态变化 片内端点 LE 2 的下跳边沿将输入信息锁入 DAC 寄存器 DAC0832 数字 / 模拟转换器有 2 种与单片机的接口方式 : 单缓冲方式和双缓冲方式 当系统中只需要一路数字 / 模拟转换, 或者虽然需要多路数字 / 模拟转换, 但是多路数字 / 模拟转换之间不需要同步输出时, 采用单缓冲方式可以简化电路连接和程序编写 当系统中需要多路数字 / 模拟转换, 同时多路数字 / 模拟转换之间还需要同步输出时, 采用双缓冲方式是必须的选择 DAC0832 数字 / 模拟转换器的单缓冲方式接口 DAC0832 数字 / 模拟转换器的单缓冲方式接口的原理电路如图 5.9 所示 +5V P2.7 CS I LE V CC P0.0 ~ P0.7 WR XFER DI 0 ~ DI7 WR 1 VREF R fb IOUT1 - I OUT2 + V OUT AT89S51 WR 2 GND DAC0832 图 5.9 DAC0832 数字 / 模拟转换器的单缓冲方式接口的原理电路 76

77 由于 DAC0832 数字 / 模拟转换器是电流输出型, 即它的输出电流与输入数字信号成正比, 图 5.9 中的运算放大器被用来把电流输出信号转换成电压输出信号 运算放大器的输出在送往负载的同时也送到 DAC0832 数字 / 模拟转换器的管脚 R fb 用作反馈信号 管脚 V REF 的基准电源由 DAC0832 数字 / 模拟转换器的供电电源提供, 这样简化了电路结构 对于 DAC0832 数字 / 模拟转换器的控制线, 管脚 I LE 直接与供电电源相连接, 管脚 CS 和 XFER 与单片机的地址输出线 P2.6 相连接, 管脚 WR 1 和 WR 2 与单片机的写数控制管脚 P3.6( WR ) 相连接 在这样的连线情况下, 当单片机执行指令 : 单片机的输出信号时序完全满足 DAC0832 数字 / 模拟转换器的工作要求 参考图 5.1 给出的向映射到外部数据空间中的器件写数据时单片机的工作时序图, 由于管脚 I LE 直接与供电电源相连, 已经满足对它的要求 ; 首先当单片机给出 DAC0832 数字 / 模拟转换器的地址信号, 即单片机的管脚 P2.7 输出低电平信号, 则数字 / 模拟转换器的管脚 CS 和 XFER 的电平将满足要求 ; 接着单片机给出低电平的写控制信号 WR, 则数字 / 模拟转换器的管脚 WR 1 和 WR 2 的电平满足要求 在这种情况下, 输入锁存器和 DAC 寄存器的输出都随着输入的状态变化 ; 最后单片机给出的写控制信号 WR 的上跳边沿同时完成输入锁存器和 DAC 寄存器输出的锁存来完成数字 / 模拟转换 只要单片机的地址输出管脚 P2.7 输出低电平即可满足 DAC0832 数字 / 模拟转换器所需要的地址要求 如果使其它地址输出管脚为高电平, 则这时 DAC0832 数字 / 模拟转换器的地址为 7FFFH DAC0832 数字 / 模拟转换器的电源电压为 5V 时, 完成一次转换的时间约 1us, 当单片机采用 12MHz 时钟则基本满足这个要求 实验证明, 采用 12MHz 时钟,AT89S51 单片机可以控制 DAC0832 数字 / 模拟转换器正常工作 采用如图 5.9 所示的 DAC0832 数字 / 模拟转换器的单缓冲方式接口电路, 实现输出三角波的程序示例如下 程序示例 5.1: ORG 0000H MOV DPTR, #7FFFH ; 数据指针保存数字 / 模拟转换器的地址 MOV R0, #00H ; 工作寄存器 R0 保存转换数据的初值 DAC: MOV A, R0 ; 转换数据复制到累加器 A A ; 实现数字 / 模拟转换 INC R0 ; 调整转换数据 AJMP DAC ; 准备再次数字 / 模拟转换 END 如果希望输出一种任意波形, 这种波形首先可以通过采样和量化产生它一个周期的数字波形表, 然后把数字波形表存入程序存储器, 单片机工作经过查表和控制数字 / 模拟转换 77

78 器的工作就可以实现输出这种波形 采用如图 5.9 所示的 DAC0832 数字 / 模拟转换器的单缓冲方式接口电路, 实现输出正弦波的程序示例如下 程序示例 5.2: ORG 0000H DAC0: MOV R0, #00H ; 工作寄存器 R0 保存数字波形表的相对地址初值 DAC1: MOV DPTR, #DATATAB ; 数据指针保存数字波形表的绝对地址初值 MOV A, R0 ; 数字波形表的相对地址复制到累加器 A MOVC ; 输出波形的函数值送到累加器 A MOV DPTR, #0BFFFH ; 数据指针保存数字 / 模拟转换器的地址 A ; 实现数字 / 模拟转换 INC R0 ; 调整数字波形表的相对地址 CJNE R0, #35, DAC1; 判断数字波形表是否读完 AJMP DAC 0 ; 准备再次数字 / 模拟转换 END DATATAB:DB DB DB DB DB DB DB DB DB 80H,96H,0ABH,0C0H ; 正弦波数字波形表 0D2H,0E2H,0EEH,0F8H 0FEH,0FFH,0FEH,0F8H 0EEH,0E2H,0D2H,0C0H 0ABH,96H,80H,6AH 55H,40H,2EH,1EH 12H,08H,02H,01H 02H,08H,12H,1EH 2EH,40H,55H,6AH 程序示例 5.2 中正弦波数字波形表用 36 个点来描述一个完整的正弦波, 即每隔 10 对正弦波进行一次采样 由于 DAC0832 数字 / 模拟转换器的输入数字量的范围为 00H~0FFH, 正弦波的取值的范围为 -1~1, 因此对于 SIN0 的正弦波数字波形表取值为 80H,SIN90 的正弦波数字波形表取值为 0FFH,SIN270 的正弦波数字波形表取值为 01H DAC0832 数字 / 模拟转换器的双缓冲方式接口 DAC0832 数字 / 模拟转换器的双缓冲方式接口的原理电路如图 5.10 所示 单片机扩展了 2 片 DAC0832 数字 / 模拟转换器 图 5.10 中仅画出了单片机与 DAC0832 数字 / 模拟转换器之间的连线, 单片机正常工作所需要的其它电路以及 DAC0832 数字 / 模拟转换器的输出电路都没有画出 当读者连接实验电路时, 这些相关电路必须被连接 78

79 WR 2 ILE V CC P2.5 CS GND P2.7 XFER V REF AT89S51 P0.0 ~ P0.7 DI 0 ~ DI 7 DAC 0832 (1) R fb I OUT1 I OUT2 WR WR1 +5V P2.6 CS ILE VCC XFER V REF DI 0 ~ DI 7 WR 1 DAC 0832 (2) R fb I OUT1 I OUT2 WR2 GND 图 5.10 DAC0832 数字 / 模拟转换器的双缓冲方式接口的原理电路在上面电路中,2 个 DAC0832 数字 / 模拟转换器的管脚 I LE 直接与供电电源相连接 ; 管脚 WR 1 和 WR 2 与单片机的管脚 WR 相连接 ; 管脚 XFER 与单片机的地址输出线 P2.7 相连接 第一个 DAC0832 数字 / 模拟转换器的管脚 CS 与单片机的地址输出线 P2.5 相连接, 第二个 DAC0832 数字 / 模拟转换器的管脚 CS 与单片机的地址输出线 P2.6 相连接 执行下面的程序示例就可以实现 2 个 DAC0832 数字 / 模拟转换器的同步输出 程序示例 5.3: ORG 0000H MOV R0, #00H ; 工作寄存器 R0 保存第一路转换数据的初值 MOV R1, #0FFH ; 工作寄存器 R1 保存第二路转换数据的初值 DAC: MOV A, R0 ; 第一路转换数据复制到累加器 A MOV DPTR, #0DFFFH ; 第一路数据输入锁存器地址 A ; 实现第一路数据输入锁存 INC R0 ; 调整第一路转换数据 MOV A, R1 ; 第二路转换数据复制到累加器 A MOV DPTR, #0BFFFH ; 第二路数据输入锁存器地址 79

80 A ; 实现第二路数据输入锁存 DEC R1 ; 调整第二路转换数据 MOV DPTR, #7FFFH ; 两路 DAC 寄存器地址 A ; 实现两路数字 / 模拟的同时转换 AJMP DAC ; 准备再次数字 / 模拟转换 END 程序示例 5.3 可以输出两路同步的三角波 在执行第一句 MOVX 指令时, 第一路 DAC0832 数字 / 模拟转换器的输入锁存器完成输入数据的锁存 在执行第二句 MOVX 指令时, 第二路 DAC0832 数字 / 模拟转换器的输入锁存器完成输入数据的锁存 单片机执行第一句和第二句 MOVX 指令这个期间, 两路 DAC0832 数字 / 模拟转换器的 DAC 寄存器由于管脚 XFER 一直为高电平, 因此它们的输入与输出之间是隔离的, 两路数字 / 模拟转换的工作并没有启动 在执行第三句 MOVX 指令时, 两路 DAC0832 数字 / 模拟转换器的 DAC 寄存器同时完成数字 / 模拟转换 在这个期间, 由于两路 DAC0832 数字 / 模拟转换器的管脚 CS 一直为高电平, 因此在它们与单片机输出数据之间是隔离的, 数据总线上的信号不能进入两路 DAC0832 数字 / 模拟转换器 5.4 ADC0809 模拟 / 数字转换器的应用 ADC0809 模拟 / 数字转换器的介绍 ADC0809 模拟 / 数字转换器是一种逐次逼近式模拟 / 数字转换器 它具有 8 路模拟信号输入通道, 可对 8 路 0~5V 的模拟信号电压分时进行转换 它的输出数字信号的数据宽度为 8 位 它的数据接口和控制接口与 MCS51 系列单片机完全兼容 ADC0809 模拟 / 数字转换器的常用封装形式是 DIP28, 管脚如图 5.11 所示 IN IN2 IN IN1 IN IN0 IN ADD A IN ADD B START 6 23 ADD C EOC 7 22 ALE 2-5 MSB OE CLOCK VCC 11 LSB V REF (+) GND V REF(-) 图 5.11 ADC0809 模拟 / 数字转换器 DIP28 封装外形图 80

81 在图 5.11 中, 各个管脚的功能如下 : 管脚 IN0~IN7:8 路模拟信号电压输入管脚 管脚 ADD A ADD B 和 ADD C:8 路模拟信号电压输入选择地址 管脚电平与输入 通道之间的对应关系如表 5.4 所示 表 5.4 地址与输入通道对应关系表 地址码 对应的 地址码 对应的 ADD C ADD B ADD A 输入通道 ADD C ADD B ADD A 输入通道 IN IN IN IN IN IN IN IN7 管脚 ALE: 地址锁存信号输入 管脚 V REF (+) 和 V REF (-): 参考电压输入端 为简化电路, 通常管脚 V REF (+) 与电源相连接, 管脚 V REF (-) 与地线相连接 管脚 CLOCK: 时钟输入 管脚 START: 模拟 / 数字转换启动控制信号输入 管脚 EOC: 模拟 / 数字转换结束信号输出 管脚 OE: 输出允许信号输入 管脚 2-1 ~2-8 :8 位数字信号输出 ADC0809 模拟 / 数字转换器的工作时序如图 5.12 所示 图 5.12 ADC0809 模拟 / 数字转换器的工作时序图 81

82 在图 5.12 中, 时钟 CLOCK 的最高频率为 1280KHz; 转换时间的最小值为 90us, 最大值为 116us 单片机读取 ADC0809 模拟 / 数字转换器的输出数字信号的方式有 3 种 : 等待延时方式 查询方式和中断方式 本节只讨论前 2 种方式的具体应用 等待延时方式 采用等待延时方式的 ADC0809 模拟 / 数字转换器应用电路如图 5.13 所示 由于 ADC0809 模拟 / 数字转换器没有片内时钟, 它采用单片机的地址锁存允许信号 ALE 作它的 时钟信号 当单片机采用 12MHz 的时钟, 在不执行 MOVX 指令时, 单片机的地址锁存允 许信号 ALE 的频率是 2MHz 这个频率高于 ADC0809 模拟 / 数字转换器时钟的最高频率, 但是通过实验证实在这种情况下模拟 / 数字转换可以正常进行 ADC0809 模拟 / 数字转换器的模拟信号电压输入选择地址管脚与地址锁存器输出的单 片机地址总线的低 3 位相连接 它的数字信号输出与单片机数据总线相连接 为简化电路 连接, 参考电压输入管脚 V REF (+) 和 V REF (-) 可以分别与电源线和接地线相连接 在 ADC0809 模拟 / 数字转换器的工作控制方面, 当单片机的片选信号 P2.7 和写控制信 号 WR 都为低电平, 管脚 ALE 和管脚 START 出现高电平, 它的模拟信号电压输入选择地 址被锁存, 模拟 / 数字转换过程被启动 在模拟 / 数字转换完成之后, 单片机的片选信号 P2.7 和读控制信号 RD 都为低电平, 管脚 OE 出现高电平, 单片机数据总线上出现模拟 / 数字转 换的结果 10 CLOCK 25 ADD A V REF (+) ADD B V REF (-) ADD C 1Q 2Q 3Q ALE CP OC 1 ADC 89S51 1D 2D 3D 4D 5D 6D 7D 8D P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P IN7 IN6 IN5 IN4 IN3 IN2 IN P IN & WR >1 6 START P2.7 ALE & >1 9 RD 17 OE 图 5.13 ADC0809 模拟 / 数字转换器的等待延时方式接口电路图 82

83 采用如图 5.13 所示的 ADC0809 模拟 / 数字转换器的等待延时方式的电路, 实现输入通道 IN0 模拟 / 数字转换的程序示例如下 程序示例 5.4: ORG 0000H MOV DPTR, #7FF8H ;P2.7=0, 输入通道 IN0 LOOP: A ; 启动模拟 / 数字转换 MOV R7, #0AH ; 软件延时, 等待转换过程结束 LOOP1: NOP NOP NOP NOP NOP DJNZ R7, LOOP1 MOVX ; 读模拟 / 数字转换结果 MOV 61H, A ; 向 2 位显示子程序的入口送将要显示的数据 ACALL LED2 ; 调用显示 2 位 16 进制数据的子程序 ACALL TIMER1S ; 调用延时 1s 子程序 AJMP LOOP ; 准备下一次模拟 / 数字转换 LED2: ; 显示一个字节的 2 位 16 进制数据子程序 LED1: ; 显示 1 位数据 ( 共阴极数码管 ) 子程序 TIMER1S: ; 延时 1s 子程序 END 查询方式 采用查询方式的 ADC0809 模拟 / 数字转换器应用电路如图 5.14 所示 与图 5.13 所示的采用等待延时方式的 ADC0809 模拟 / 数字转换器应用电路相比,ADC0809 模拟 / 数字转换器管脚 EOC 的模拟 / 数字转换结束信号被单片机通过管脚 P1.0 来读取 当管脚 P1.0 变为高电平时,ADC0809 的模拟 / 数字转换工作完成, 单片机可以读取模拟 / 数字转换的结果 采用如图 5.14 所示的 ADC0809 模拟 / 数字转换器的查询方式电路, 实现输入通道 IN0 模拟 / 数字转换的程序如程序示例 5.5 所示 83

84 S51 ALE 30 P P P P P P P P WR P RD Q 2Q 3Q 11 74LS373 CP OC 1 1D 2D 3D 4D 5D 6D 7D 8D & >1 & > P CLOCK ADD A ADD B ADD C START ALE OE EOC ADC 0809 V REF (+) V REF (-) IN7 IN6 IN5 IN4 IN3 IN2 IN1 IN 图 5.14 ADC0809 模拟 / 数字转换器的查询方式接口电路图 程序示例 5.5: ORG 0000H MOV DPTR, #7FF8H ;P2.7=0, 输入通道 IN0 LOOP: A ; 启动模拟 / 数字转换 LOOP1: JNB P1.0, LOOP1 ; 等待转换过程结束 MOVX ; 读模拟 / 数字转换结果 MOV 61H, A ; 向 2 位显示子程序的入口送将要显示的数据 ACALL LED2 ; 调用显示 2 位 16 进制数据的子程序 ACALL TIMER1S ; 调用延时 1s 子程序 AJMP LOOP ; 准备下一次模拟 / 数字转换 LED2: ; 显示一个字节的 2 位 16 进制数据子程序 LED1: ; 显示 1 位数据 ( 共阴极数码管 ) 子程序 TIMER1S: ; 延时 1s 子程序 END 84

85 5.5 小结 单片机通过向相应的外部数据存储空间地址单元写入数据实现控制对应的片外外围器件的工作, 从相应的外部数据存储空间地址单元读出数据获得对应的片外外围器件的工作结果 本章介绍了访问外部数据空间的单片机汇编语言指令 MOVX 的形式和该指令被执行时单片机的输出信号时序 在访问外部数据空间时, 单片机的输入 / 输出端口 P0 的 8 个管脚被用作数据总线和地址总线的低 8 位, 因此八 D 锁存器 (3S) 被用于低 8 位地址锁存的 本章还讨论了一些映射到外部数据空间器件的使用, 这些器件包括扩展数据存储容量的 HM6264A 芯片 实现模拟 / 数字转换的 ADC0809 芯片和实现数字 / 模拟转换的 DAC0832 芯片 实验 1. 按图 5.6 所示电路原理图组装 HM6264A 芯片应用电路, 再添加能够实现数据显示的相关电路 应用访问外部数据空间的指令 MOVX 实现向 HM6264A 芯片写入数据, 然后读出并显示数据以验证它的正常工作 2. 按图 5.9 所示 DAC0832 数字 / 模拟转换器的单缓冲方式接口的原理电路电路图组装硬件电路 验证程序示例 5.1 和程序示例 利用练习 2 所接的电路, 读者练习编写一个应用程序测量数字 / 模拟转换器 ADC0832 芯片的输入数字信号和输出模拟电压之间的关系特性, 并计算输出电压的最大绝对误差和相对误差 4. 按图 5.13 或者图 5.14 所示电路图组装硬件电路, 再添加能够实现数据显示的相关电路 读者练习编写一个应用程序测量模拟 / 数字转换器 ADC0809 芯片的输入模拟电压和输出数字信号之间的关系特性, 并计算输出数据的最大绝对误差和相对误差 5. 组装一个包括 HM6264A 数据存储器芯片 ADC0832 数字 / 模拟转换器芯片和 ADC0809 模拟 / 数字转换器芯片的单片机应用电路 编写一段应用程序, 该程序首先利用 ADC0809 完成数据采集, 接着把采集的数据存入 HM6264A 数据存储器芯片, 最后把 HM6264A 中的数据通过 ADC0832 进行连续 循环地输出 输入模拟信号可以由信号产生器产生, 输出模拟信号可以通过示波器观察 85

86 第 6 章串行接口器件的访问 传统的单片机外围器件的数据接口常采用并行方式, 例如在前一章所讨论的数字 / 模拟转换器 DAC0832 和模拟 / 数字转换器 ADC0809 在这种情况下, 单片机与外围器件的数据通信需要 8 条数据线, 同时还需要一些地址线和控制线 单片机与它的外围器件之间的大量连线使得电路组装很困难, 这点尤其是在使用面包板组装应用电路的时候, 另外大量的连线也使得电路的可靠性降低 为了简化电路设计和组装, 采用串行通信方式的外围器件是一种越来越常用的方法 6.1 使用普通输入 / 输出管脚实现同步串行接口 概述 在第 3 章中, 应用单片机串行输入 / 输出接口的工作方式 0, 即同步移位寄存器方式, 基于数码管的数据显示可以很方便地实现 由于 AT89S51 单片机只有一个串行输入 / 输出接口, 当它被用于数据显示时, 如果还需要使用串行输入 / 输出接口实现与另一个单片机进行通信, 我们将面临很大的困难 本节讨论如何应用普通的输入 / 输出管脚, 例如管脚 P1.0 和 P1.1, 实现数据的显示 这项工作可以通过使用位操作指令控制输入 / 输出管脚产生如图 6.1 所示的串行口工作方式 0 的输出时序图来实现 RXD (DATA OUT) D0 D2 D2 D1 D2 D2 D3 D4 D2 D5 D2 D2 D6 D2D7 TXD (SHIFT CLOCK) 图 6.1 串行口工作方式 0 的输出时序图 如果用管脚 P1.0 代替数据输出管脚 RXD, 管脚 P1.1 代替移位时钟输出管脚 TXD, 要 实现如图 6.1 所示的时序, 管脚 P1.0 应该首先输出数据, 然后管脚 P1.1 再输出移位时钟即 可以完成一位数据的输出 上述过程可以用以下程序来实现 MOV C, 00H ; 把输出的数据位复制到进位位 C MOV P1.0, C ; 把进位位 C 中的内容送到管脚 P1.0 SETB P1.1 ; 管脚 P1.1 输出高电平 CLR P1.1 ; 管脚 P1.1 输出低电平 86

87 6.1.2 基于普通输入 / 输出管脚的串行显示子程序 ; 子程序名 :LED1A ; 程序功能 : 显示 1 位数据 ( 共阴极数码管 ) ; 程序入口 :20H ; 保存需要显示的数据 ; 程序出口 : 管脚 P1.0( 输出数据 ) ; 管脚 P1.1( 输出时钟 ) ; 应用串行方式输出显示代码 ; 占用资源 : 累加器 A, 数据指针 DPTR, 内部数据存储单元 20H, 进位位 C, 管脚 P1.0 和 P1.1 ; 程序清单 : LED1A: MOV A, 20H ; 子程序开始 把要显示的数据复制到累加器 A MOV DPTR, #TAB ; 显示代码表的开始地址送到数据指针 DPTR MOVC ; 把要显示的数据转换成相应的显示代码 MOV 20H, A ; 显示代码复制到内部数据空间的 20H 地址单元 CLR P1.1 ; 移位时钟输出管脚初始化 MOV C, 00H ; 显示数据的第 0 位送往进位位 C MOV P1.0, C ; 进位位中数据送往数据输出管脚 P1.0 SETB P1.1 ; 移位时钟输出管脚置 1 CLR P1.1 ; 移位时钟输出管脚清 0, 产生 1 个移位时钟 MOV C, 01H ; 显示数据的第 1 位送往进位位 C MOV P1.0, C ; 进位位中数据送往数据输出管脚 P1.0 SETB P1.1 ; 移位时钟输出管脚置 1 CLR P1.1 ; 移位时钟输出管脚清 0, 产生 1 个移位时钟 MOV C, 02H ; 显示数据的第 2 位送往进位位 C MOV P1.0, C ; 进位位中数据送往数据输出管脚 P1.0 SETB P1.1 ; 移位时钟输出管脚置 1 CLR P1.1 ; 移位时钟输出管脚清 0, 产生 1 个移位时钟 MOV C, 03H ; 显示数据的第 3 位送往进位位 C MOV P1.0, C ; 进位位中数据送往数据输出管脚 P1.0 SETB P1.1 ; 移位时钟输出管脚置 1 CLR P1.1 ; 移位时钟输出管脚清 0, 产生 1 个移位时钟 MOV C, 04H ; 显示数据的第 4 位送往进位位 C MOV P1.0, C ; 进位位中数据送往数据输出管脚 P1.0 SETB P1.1 ; 移位时钟输出管脚置 1 CLR P1.1 ; 移位时钟输出管脚清 0, 产生 1 个移位时钟 MOV C, 05H ; 显示数据的第 5 位送往进位位 C MOV P1.0, C ; 进位位中数据送往数据输出管脚 P1.0 SETB P1.1 ; 移位时钟输出管脚置 1 CLR P1.1 ; 移位时钟输出管脚清 0, 产生 1 个移位时钟 87

88 MOV C, 06H ; 显示数据的第 6 位送往进位位 C MOV P1.0, C ; 进位位中数据送往数据输出管脚 P1.0 SETB P1.1 ; 移位时钟输出管脚置 1 CLR P1.1 ; 移位时钟输出管脚清 0, 产生 1 个移位时钟 MOV C, 07H ; 显示数据的第 7 位送往进位位 C MOV P1.0, C ; 进位位中数据送往数据输出管脚 P1.0 SETB P1.1 ; 移位时钟输出管脚置 1 CLR P1.1 ; 移位时钟输出管脚清 0, 产生 1 个移位时钟 RET ; 子程序返回指令 TAB: DB 3FH, 06H, 5BH, 4FH ; 显示代码表 DB 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH DB 39H, 5EH, 79H, 71H, 00H 由图 6.1 所示的串行口工作方式 0 的输出时序图可以看出, 一个字节中包含的 8 位数据是被一位一位地输出 数据输出管脚每输出一位数据, 移位时钟输出管脚输出一个移位时钟 位数据输出的顺序为低位在前 子程序 LED1A 利用软件编程的方法实现了这样的输出时序, 但是它可以使用任意普通输入 / 输出管脚 AT89S51 单片机内部数据存储器的 20H 地址单元即可以采用字节寻址的方法进入, 也可以采用位寻址的方法进入, 因此基于普通输入 / 输出管脚的串行显示子程序 LED1A 的程序入口选用单片机内部数据存储器的 20H 地址单元 显示的数据经过译码以后仍被存于单片机内部数据存储器的 20H 地址单元准备逐位输出 图 6.1 所示的输出时序图中, 每当数据输出管脚输出一位数据, 移位时钟输出管脚输出一个移位时钟 为保证在输出数据的第 0 位时一定能对应输出一个移位时钟的上跳边沿, 因此在开始输出数据之前对移位时钟输出管脚进行清 0, 即进行初始化 单片机内部数据存储器的 20H 地址单元对应的位地址为 00H~07H, 位地址 00H 对应着字节数据的最低位, 因此输出数据时首先输出位地址 00H 中的内容, 最后输出位地址 07H 中的内容, 以保证数据传输低位在前, 高位在后的顺序 相对于在第 3 章中讨论的基于单片机串行输入 / 输出接口的显示子程序 LED1, 基于普通输入 / 输出管脚的串行显示子程序 LED1A 无论程序存储时占用的程序存储空间, 还是程序被执行时需要的时间都大得多, 但是它最大的优点是不占用单片机唯一的串行输入 / 输出接口资源 采用串行通信方式的其它外围器件的工作时序非常类似于图 6.1 所示的串行口工作方式 0 的输出时序图, 或者 8 位移位寄存器 ( 串行输入, 并行输出 )74LS164 的输入时序图, 利用基于普通输入 / 输出管脚的串行显示子程序 LED1A 的方法可以实现单片机与这些外围器件之间的通信 88

89 位串行输入数字 / 模拟转换器 DAC 数字 / 模拟转换器 DAC7611 的介绍 DAC7611 是美国 BURR-BROWN 公司生产的一种具有串行接口的 12 位数字 / 模拟转换器 DAC7611 具有片内参考电压源, 它的封装形式之一为 PDIP8, 如图 6.2 所示 V DD 1 8 V OUT CS CLK 2 3 DAC GND CLR SDI 4 5 LD 图 6.2 DAC7611 的 PDIP8 封装外形图 DAC7611 的串行通信接口包括以下管脚 管脚 3(CLK): 串行时钟输入 管脚 4(SDI): 串行数据输入 在串行时钟的上跳边沿数据被移入 DAC7611 内部的串行移位寄存器 管脚 5( LD ): 控制移入的数据装载到 DAC7611 内部的 DAC 寄存器, 触发数字 / 模拟转换的工作过程 该管脚低电平有效, 它的工作与串行时钟和下面将要讨论的芯片选择信号无关 除去上述组成串行通信接口的管脚,DAC7611 还提供 2 个控制管脚 : 管脚 2( CS ): 芯片选择信号输入管脚 低电平有效 管脚 6( CLR );DAC7611 内部 DAC 寄存器的异步清 0 控制管脚 当该管脚为低电平时,DAC 寄存器的内容将变为 000H, 使得 DAC7611 的模拟输出电压为 0V 管脚 2( CS ) 可以被用来在使用多个串行接口器件时实现芯片选择 管脚 6( CLR ) 提供一种简单的输出模拟电压清 0 的方法, 只要管脚被置为低电平时,DAC7611 的输出模拟电压就为 0V 管脚 8(V OUT ) 为模拟电压输出 输出模拟电压的范围为 0V~4.095V DAC7611 的数字输入与模拟电压输出之间的关系如表 6.1 所示 表 6.1 数字输入与模拟电压输出关系表数字输入模拟输出 (V) FFFH 满刻度 801H 中间刻度 + 1LSB 800H 中间刻度 7FFH 中间刻度 1LSB 000H 刻度 89

90 由表 6.1 可以看出, 当 DAC7611 输入的数字量为 000H 时, 它的模拟输出为 0V; 当输入的数字量为 FFFH 时, 它的模拟输出为 4.095V, 即它的最大模拟输出电压为 4.095V 输入的数字量每改变 1 位, 输出的模拟电压改变 1mV DAC7611 的应用电路和控制时序 DAC7611 的一种应用电路如图 6.3 所示 +5V + 10uF 串行时钟 串行数据 0.1uF V DD DAC7611 V OUT 8 CS GND 7 CLK CLR 6 SDI LD 5 0V 到 V 数据装载 图 6.3 DAC7611 的一种应用电路图在图 6.3 所示的 DAC7611 的应用电路之中, 由串行时钟输入管脚 CLK 串行数据输入管脚 SDI 和数据装载管脚 LD 组成的串行通信接口可以直接与单片机的输入 / 输出管脚连接 另外片选管脚 CS 也直接与单片机的输入 / 输出管脚连接 为了减少对单片机输入 / 输出管脚的占用, 同时也简化程序的设计, 输出模拟电压清 0 管脚 CLR 直接与电源连接, 因此这个电路不能使用该项功能 如果需要一种快速使输出模拟电压为 0 的能力, 管脚 CLR 可以与一个单片机的输入 / 输出管脚相连接, 当这个单片机的输入 / 输出管脚输出低电平时, DAC7611 的输出模拟电压立刻为 0 在电源管脚 V DD 旁边通常应该连接 2 个容量分别为 10uF 和 0.01uF 的滤波电容, 前者采用电解电容, 后者采用瓷片电容, 它们被用来滤除电源中的干扰 模拟输出电压从管脚 V OUT 输出 要使图 6.3 所示的 DAC7611 的应用电路工作, 单片机与它的数据通信必须满足如图 6.4 所示的时序 (MSB) (LSB) SDI D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 CLK CS LD 图 6.4 DAC7611 的工作时序图 90

91 从工作时序图可以看出, 对于每一次数字 / 模拟转换过程首先应该将 DAC7611 的数据装载管脚 LD 置为高电平, 然后将片选管脚 CS 和串行时钟输入管脚 CLK 置为低电平 上述准备工作完成后, 单片机就可以向 DAC7611 传送数据 数据传送应该高位在前, 这点与 8 位移位寄存器 ( 串行输入, 并行输出 )74LS164 的数据输入顺序不同 单片机每输出一位数据, 应该输出一个时钟信号 时钟信号的上跳边沿把数据移入 DAC7611 这个过程重复 12 次, 把 12 位数据全部移入 DAC7611 数据信号传送不仅要满足所要求的时序, 而且还需要满足时序中的时间关系 DAC7611 的时钟信号的高电平和低电平的保持时间必须大于 30ns, 这点在使用 AT89S51 单片机向它传输数据时是肯定可以满足的 完成数据传送后, 管脚 CLK 应保持为高电平, 这时还需要将片选管脚 CS 置为高电平, 将装载管脚 LD 置为低电平 当装载管脚 LD 置为低电平时, 数字 / 模拟转换过程被启动 从装载管脚 LD 置为低电平到管脚 V OUT 输出模拟输出电压达到稳定需要 7us 的时间 当再一次向 DAC7611 移入数据以前, 装载管脚 LD 必须恢复为高电平 如果装载管脚 LD 为低电平, 每向 DAC7611 移入一位数据都将引起输出模拟电压的改变 DAC7611 的数据输入采用双缓冲 这个意味输入的数据不会立即影响它的输出模拟电压 要改变输出的模拟电压, 装载管脚 LD 必须被置为低电平 控制 DAC7611 工作的子程序 单片机 AT89S51 的输入 / 输出管脚与数字 / 模拟转换器 DAC7611 的管脚可以采用如表 6.2 所示的连接关系 表 6.2 AT89S51 与 DAC7611 的管脚连接关系表 AT89S51 DAC7611 P1.0 SDI P1.1 CLK P1.2 CS P1.3 LD 在图 6.3 所示的 DAC7611 的应用电路之中, 输出模拟电压清 0 管脚 CLR 直接与电源连接, 因此单片机不必控制该管脚 控制数字 / 模拟转换器 DAC7611 工作的子程序如下 ; 子程序名 :DAC7611 ; 程序功能 : 控制数字 / 模拟转换器 DAC7611 的工作 ; 程序入口 :20H,21H ; 保存需要进行数字 / 模拟转换的 12 位数据, 其中 ; ; 位地址 00H 保存最低位数据, 位地址 0BH 保存 ; ; 最高位数据 ; 程序出口 : 管脚 P1.0( 输出数据 ) ; 控制 DAC7611 的工作 91

92 ; 管脚 P1.1( 输出时钟 ) ; 管脚 P1.1( 输出片选信号 ) ; 管脚 P1.1( 输出数字 / 模拟转换过程启动信号 ) ; 占用资源 : 内部数据存储单元 20H 和 21H, 进位位 C, 管脚 P1.0 P1.1 P1.2 和 P1.3 ; 程序清单 : DAC7611: SETB P1.3 ;DAC7611 装载管脚 LD 置为高电平 CLR P1.2 ;DAC7611 片选管脚 CS 置为低电平 CLR P1.1 ;DAC7611 时钟管脚 CLK 置为低电平 MOV C, 0BH ; 准备进行转换的第 11 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 0AH ; 准备进行转换的第 10 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 09H ; 准备进行转换的第 9 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 08H ; 准备进行转换的第 8 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 07H ; 准备进行转换的第 7 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 06H ; 准备进行转换的第 6 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 05H ; 准备进行转换的第 5 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 04H ; 准备进行转换的第 4 位数据复制到进位位 C 92

93 MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 03H ; 准备进行转换的第 3 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 02H ; 准备进行转换的第 2 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 01H ; 准备进行转换的第 1 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 CLR P1.1 ; 输出时钟低电平 MOV C, 00H ; 准备进行转换的第 0 位数据复制到进位位 C MOV P1.0 C ; 进位位中数据送往 DAC7611 数据输入管脚 SDI SETB P1.1 ; 输出时钟高电平 SETB P1.2 ;DAC7611 片选管脚 CS 置为高电平 CLR P1.3 ; 装载管脚 LD 置为低电平以启动数字 / 模拟转换 SETB P1.3 ;DAC7611 装载管脚 LD 置为高电平 RET 位串行输出模拟 / 数字转换器 ADS 模拟 / 数字转换器 ADS718 的介绍 ADS7818 是美国 BURR-BROWN 公司生产的一种具有串行接口的 12 位模拟 / 数字转换器 它的封装形式之一为 PDIP8, 如图 6.5 所示 V REF 1 8 +V CC +In -In 2 3 ADS CLK DATA GND 4 5 CONV 图 6.5 ADS7818 的 PDIP8 封装外形图 93

94 94 ADS7818 的串行通信接口包括以下管脚 管脚 7(CLK): 串行时钟输入 管脚 6(DATA): 串行数据输出 在串行时钟的上跳边沿模拟/ 数字的转换结果从 ADS7811 移出 管脚 5(CONV): 转换信号输入 加到该管脚的脉冲信号下跳边沿开始模拟信号的采样 保持 模拟 / 数字转换和数字结果的串行输出 该管脚还可以控制芯片进入掉电模式以及改变数据的串行输出格式 ADS7818 的输入管脚包括管脚 2(+In) 和管脚 3(-In) 管脚 2(+In): 准备进行模拟 / 数字转换的电压被加到该管脚 在使用内部参考电源的情况下, 输入模拟电压的范围为 :GND 200mV~V CC +200mV 管脚 3(-In): 该管脚既可以直接接地, 也可以与传感器的另一个输出端相连接, 后者用来克服传感器输出中的共模信号 它的输入模拟电压的范围为 : 200mV~+200mV ADS7818 进行模拟 / 数字转换的信号源需要有足够的电流驱动能力以保证在采样期间 ADS7818 内部保持电容的充电要求 这个充电电流与模拟电压以及采样率有关 在完成采样之后,ADS7818 对模拟信号源将呈现非常高的阻抗 管脚 1(V REF ): 参考电源输出 ADS7818 内部包含一个 2.5V 的参考电源 在使用内部参考电源的情况下, 输入模拟电压的范围为 GND 200mV~V CC +200mV 由于模拟 / 数字转换以这个参考电源为基准, 因此管脚 1(V REF ) 的负载应该稳定, 而且应该在 7kΩ~ 13 kω 范围之内 在管脚 1(V REF ) 上也可以加入外部参考电源 输入外部参考电源的电压范围为 2.00V~2.55V, 这时输入模拟电压的范围为 4.0V~5.1V 由于参考电源的稳定对模拟 / 数字转换的结果有很大的影响, 因此在管脚 1(V REF ) 与接地线之间必须并列一个 0.1uF 的瓷片电容和一个 2.2uF 的电解电容 瓷片电容应尽可能地靠近管脚, 对电解电容的要求要小一些 在使用内部 2.5V 的参考电源的情况下,ADS7818 的输出数字量与输入模拟电压之间的关系如图 6.6 所示 这个关系反映的是理想情况, 没有考虑模拟 / 数字转换过程中的器件非理想以及噪声干扰等影响 输出码 FS = 满刻度电压 =2 V REF 1 LSB = FS/ LSB ~ ~ ~ ~ ~ 0V 4.999V 输入电压 (V) 图 6.6 理想的输入模拟电压与输出数字量关系图

95 6.3.2 ADS7818 的应用电路和控制时序 ADS7818 的一种应用电路如图 6.7 所示 + 2.2uF 0.1uF 0 到 5V 模拟输入 V REF +In -In GND ADS7818 +V CC 8 CLK 7 DATA 6 CONV 5 +5V + 0.1uF 10uF 串行时钟串行数据来自单片机转换开始 图 6.7 ADS7818 的一种应用电路图 在图 6.7 所示的 ADS7818 的应用电路之中, 由串行时钟输入管脚 CLK 串行数据输出管脚 DATA 和转换信号输入管脚 CONV 组成的串行通信接口直接与单片机的输入 / 输出管脚连接 在电源管脚 V DD 旁边通常应该连接 2 个容量分别为 10uF 和 0.01uF 的滤波电容, 前者采用电解电容, 后者采用瓷片电容, 它们被用来滤除电源中的干扰 这个应用电路使用 ADS7818 的内部参考电源以简化电路设计 在参考电源管脚 V REF 和接地线之间并联容量分别为 0.1uF 和 2.2uF 两个电容以滤除干扰 待转换的模拟电压从管脚 +In 输入, 管脚 -In 直接接地 由于使用 2.5V 的片内参考电源, 因此模拟输入电压的范围为 0.0V~5.0V 要使图 6.7 所示的 ADS7818 的应用电路工作, 单片机加到它的管脚上的信号必须满足如图 6.8 所示的时序 CONV CLK ~ DATA D11 (MSB) ~ ~ D10 D9 D2 D1 D0 (LSB) 图 6.8 ADS7818 的工作时序图 从工作时序图可以看出, 对于每一次模拟 / 数字转换过程首先应该将 ADS7818 的转换信号输入管脚 CONV 置为低电平 这个过程产生的下跳边沿将触发采样到保持的转换 这个转换与时钟信号无关 在完成触发采样到保持的转换以后, 管脚 CONV 可以立刻置为高电平, 也可以等一会再置为高电平 从第 2 个串行时钟开始, 在时钟的上升边沿将转换结果移出 ADS7818, 因此至少需要 95

96 13 个时钟脉冲 移出的数据顺序为高位在前, 低位在后 全部数据移出之后, 时钟即可以继续存在, 也可以停止 如果时钟停止, 时钟输入管脚既可以保持高电平, 也可以保持低电平 ADS7818 的采样时间为 350ns 时钟的最高频率为 8MHz, 时钟的高电平和低电平都至少要维持 50ns 如果采用 AT89S51 来控制 ADS7818, 采样时间和最高时钟频率的要求都可以满足 这里需要注意的是时钟还必须大于 200kHz 的最低频率, 最低频率是由于片内的保持电容上电荷的放电情况决定 控制 ADS7818 工作的子程序 单片机 AT89S51 的输入 / 输出管脚与模拟 / 数字转换器 ADS7818 的管脚可以采用如表 6.3 所示的连接关系 表 6.3 AT89S51 与 ADS7818 的管脚连接关系表 AT89S51 ADS7818 P1.0 CONV P1.1 CLK P1.2 DATA 控制模拟 / 数字转换器 ADS7818 工作的子程序如下 ; 子程序名 :ADS7818 ; 程序功能 : 控制模拟 / 数字转换器 ADS7818 的工作 ; 程序入口 : 管脚 P1.0( 输入信号 ) ; 采样 / 保持转换控制信号 CONV ; 管脚 P1.1( 输入信号 ) ; 串行时钟信号 CLK ; 管脚 P1.2( 输出信号 ) ; 串行数据输出 DATA ; 程序出口 : 20H,21H ; 保存作为模拟 / 数字转换结果的 12 位数据, 其中 ; ; 位地址 00H 保存最低位数据, 位地址 0BH 保存 ; ; 最高位数据 ; 占用资源 : 内部数据存储单元 20H 和 21H, 进位位 C, 管脚 P1.0 P1.1 和 P1.2 ; 程序清单 : ADS7818: CLR P1.0 ; 产生 CONV 信号的下跳沿, 触发采样到保持的转换 CLR P1.1 ;CLK 信号清 0 SETB P1.1 ; 产生第一个时钟信号 96 CLR P1.1 ; SETB P1.1 ; 产生第二个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 11 位数据 D11 MOV 0BH, C ; 存储数据 D11 CLR P1.1 ;

97 SETB P1.1 ; 产生第三个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 10 位数据 D10 MOV 0AH, C ; 存储数据 D10 CLR P1.1 ; SETB P1.1 ; 产生第四个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 9 位数据 D9 MOV 09H, C ; 存储数据 D9 CLR P1.1 ; SETB P1.1 ; 产生第五个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 8 位数据 D8 MOV 08H, C ; 存储数据 D8 CLR P1.1 ; SETB P1.1 ; 产生第六个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 7 位数据 D7 MOV 07H, C ; 存储数据 D7 CLR P1.1 ; SETB P1.1 ; 产生第七个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 6 位数据 D6 MOV 06H, C ; 存储数据 D6 CLR P1.1 ; SETB P1.1 ; 产生第八个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 5 位数据 D5 MOV 05H, C ; 存储数据 D5 CLR P1.1 ; SETB P1.1 ; 产生第九个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 4 位数据 D4 MOV 04H, C ; 存储数据 D4 CLR P1.1 ; SETB P1.1 ; 产生第十个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 3 位数据 D3 MOV 03H, C ; 存储数据 D3 CLR P1.1 ; SETB P1.1 ; 产生第十一个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 2 位数据 D2 MOV 02H, C ; 存储数据 D2 CLR P1.1 ; SETB P1.1 ; 产生第十二个时钟信号 97

98 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 1 位数据 D1 MOV 01H, C ; 存储数据 D1 CLR P1.1 ; SETB P1.1 ; 产生第十三个时钟信号 MOV C, P1.2 ; 读入模拟 / 数字转换结果的第 0 位数据 D0 MOV 00H, C ; 存储数据 D0 CLR P1.1 ; SETB P1.0 ;CONV 信号复位 SETB P1.1 ; 产生第十四个时钟信号 CLR P1.1 ; SETB P1.1 ; 产生第十五个时钟信号 CLR P1.1 ; SETB P1.1 ; 产生第十六个时钟信号 CLR P1.1 ; RET 子程序 ADS7818 提供了一种控制模拟 / 数字转换器 ADS7818 工作的方法 对于 ADS7818 的控制还有其它的方法, 这些方法包括输出数据低位在前的方法 在不需要 12 位精度时的短数据格式输出以及芯片的掉电模式等 由于篇幅所限, 这里不进行讨论, 有兴趣的读者可以参考 ADS7818 的数据手册 BURR-BROWN 公司产品的数据手册从网上下载, 网址为 : 6.4 小结 本章介绍了单片机对具有同步串行接口的外围器件的访问, 这些器件包括 8 位移位寄存器 ( 串行输入, 并行输出 )74LS164 数字/ 模拟转换器 DAC7611 和模拟 / 数字转换器 ADS7818 这些外围器件具有少的管脚和小的体积, 使用它们大大地降低了应用电路的规模, 减少了接线的数量 单片机与具有同步串行接口的外围器件通信的关键为产生外围器件所要求的工作时序 这项工作可以由单片机的位操作类指令和单片机具有位寻址能力的内部数据存储器来完成 本章介绍的方法可以用于单片机与许多别的具有同步串行接口的外围器件之间的通信 98

99 实验 6. 按第 3 章中图 3.4 所示电路图组装硬件电路 使用子程序 LED1A, 读者试着编写一个实现字符从 0~F 连续循环显示的应用程序 7. 按第 3 章中图 3.6 所示电路图组装硬件电路 使用子程序 LED1A, 读者试着编写一个实现字符从 00~FF 连续循环显示的应用程序 8. 把上面的硬件电路扩展到具有 3 个数码管 读者试着编写一个汇编语言次序来实现数据从 0000~0255 顺序 循环地显示 9. 应用子程序 DAC7611, 读者试着编写一个能够实现三角波输出的子程序, 并用示波器对输出波形进行观察, 测量输出波形的幅度和周期 10. 对子程序 LED1A 和 DAC7611 进行适当的调整, 用数码管的显示数字量, 用三用表测量输出模拟电压, 完成 DAC7611 的数字量 / 模拟电压关系曲线的测量 11. 对子程序 LED1A 和 ADS7818 进行适当的调整, 用数码管的显示数字量, 用三用表测量输入模拟电压, 完成 ADS7818 的模拟电压 / 数字量关系曲线的测量 99

100 第 7 章中断系统的应用 7.1 中断系统介绍 概述 MCS51 系列单片机属于程序控制式计算机 它的工作过程是在程序控制器的控制下逐条执行程序指令的过程 中断系统是为了使单片机具有处理外界异步事件的能力而设置的 当单片机正在程序控制器的控制下处理设定的事件, 如果外界发生了紧急事件的处理请求, 这时单片机需要暂停正在处理的设定事件, 转去处理这个突发的紧急事件 在这个紧急事件被处理以后, 单片机应该回到刚才暂停的地方, 继续进行设定事件的处理 上述工作过程被称作为中断处理过程, 实现这个过程的单片机内部电路被称作为中断系统, 请求单片机执行中断处理过程的信号被称作为中断信号源 AT89S51 单片机存在多个中断信号源, 因此几个中断信号源可能同时请求进行中断处理 根据中断处理过程的重要性, 程序设计者可以规定其中的一些中断信号具有高的优先级, 另外的一些中断信号具有低的优先级 当几个中断信号同时请求进行中断处理时, 具有高优先级的中断信号将首先被处理 即使当单片机正在处理一个低优先级的中断信号时, 如果高优先级的中断信号提出中断请求, 这时单片机也将停止处理低优先级的中断信号, 转去处理高优先级的中断信号 在完成高优先级的中断信号处理以后, 单片机接着处理低优先级的中断信号, 最后回到正常的设定事件的处理 中断源 AT89S51 单片机具有 5 个中断源, 它们分别是 : 定时 / 计数器 0 溢出中断信号源 ; 定时 / 计数器 1 溢出中断信号源 ; 由管脚 P3.2 输入的外部中断信号源 0( INT 0 ); 由管脚 P3.3 输入的外部中断信号源 1( INT 1 ); 串行输入 / 输出口的发送 / 接收中断信号源 这 5 个中断信号分别由定时 / 计数器控制寄存器 (TCON) 和串行口控制寄存器 (SCON) 的相应位进行锁存 定时 / 计数器控制寄存器 (TCON) 定时 / 计数器控制寄存器 (TCON) 在第 4 章已经部分介绍过, 这里接着介绍与中断有关的低 4 位 这个特殊功能寄存器在内部数据存储器中的字节地址为 88H, 它即可以进行字节寻址, 也可以进行位寻址 这个寄存器的格式如表 7.1 所示 100

101 表 7.1 定时 / 计数器控制寄存器 (TCON) 的格式表 D7 D6 D5 D4 D3 D2 D1 D0 TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 位地址 8F 8E 8D 8C 8B 8A 复位值 在表 7.1 中, 除去运行控制位 TR1 和 TR0, 其它的位都被用来控制单片机的中断, 每一位的具体功能如下 TF1: 定时 / 计数器 1 的溢出标志位 当定时 / 计数器 1 的计数寄存器最高位产生进位时, TF1 被置 1, 同时申请中断 当 CPU 响应中断时,TF1 被清 0,TF1 也可以由软件进行查询和清 0 TF0: 定时 / 计数器 0 的溢出标志位 功能与 TF1 相同 IE1: 外部中断 1 请求标志位 当外部中断 1 依据触发方式满足产生中断请求的条件时, 该标志位被置 1, 同时申请中断 当 CPU 响应中断时,IE1 被清 0 IT1: 外部中断 1 触发方式选择位 该位由软件进行设置 当 IT1=0, 外部中断 1 被设置为电平触发 CPU 在每一个机器周期的 S5P2 期间对管脚 P3.3( INT 1 ) 进行采样, 如果管脚输入为低电平, 则 IE1 被置 1 采用电平触发方式时, 外部中断信号必须保持为低电平状态一直到该中断被 CPU 响应 另外, 在该中断被处理完之前, 外部中断信号还必须清除, 即转换成高电平, 否则将产生另一次中断 当 IT1=1, 外部中断 1 被设置为边沿触发 CPU 在每一个机器周期的 S5P2 期间对管脚 P3.3( INT 1 ) 进行采样, 如果在相继的 2 个机器周期的采样中, 前一个采样为高电平, 后一个采样为低电平, 则 IE1 被置 1 因为每个机器周期仅对管脚采样一次, 因此外部中断信号的高电平和低电平时间必须保持 1 个机器周期以上才能保证 CPU 检测到中断信号从高到低的跳变 IE0: 外部中断 0 请求标志位 功能与 IE1 相同 IT0: 外部中断 0 触发方式选择位 功能与 IT1 相同 串行口控制寄存器 (SCON) 串行口控制寄存器 (SCON) 在第 3 章已经介绍过, 这里着重介绍与中断有关的低 2 位 这个特殊功能寄存器在内部数据存储器中的字节地址为 98H, 它即可以进行字节寻址, 也可以进行位寻址 这个寄存器的格式如表 7.2 所示 表 7.2 串行口控制寄存器 (PCON) 的格式表 D7 D6 D5 D4 D3 D2 D1 D0 PCON SM0 SM1 SM2 REN TB8 RB8 TI RI 位地址 9F 9E 9D 9C 9B 9A 复位值

102 TI: 串行口发送中断标志位 当串行口工作在方式 0 时, 每发送完 8 位数据该位被置 1; 当串行口工作在方式 1 方式 2 或者方式 3 时, 在发送停止位时数据该位被置 1 CPU 响应中断时, 该位不被清 0, 它需要在中断服务程序中用软件的方式清 0 这点与前面讨论的定时器中断和外部中断不同, 需要特别注意 RI: 串行口接收中断标志位 在串行口允许接收, 即 REN=1, 的情况下, 当串行口工作在方式 0 时, 每接收到第 9 位数据该位被置 1 当串行口工作在方式 1 方式 2 或者方式 3 时, 如果 SM2=0, 当接收到停止位时该位被置 1; 如果 SM2=1, 当接收到停止位, 还必须满足第 9 位数据 (RB8) 为 1 时该位才被置 1 与串行口发送中断一样,CPU 响应中断时, 该位不被清 0, 它需要在中断服务程序中用软件的方式清 中断控制 AT89S51 单片机的中断控制包括中断的开关管理和中断优先级管理, 这些管理通过中 断允许寄存器 (IE) 和中断优先级寄存器 (IP) 来实现 中断允许寄存器 (IE) 这个特殊功能寄存器在内部数据存储器中的字节地址为 A8H, 它即可以进行字节寻址, 也可以进行位寻址 这个寄存器的格式如表 7.3 所示 表 7.3 中断允许寄存器 (IE) D7 D6 D5 D4 D3 D2 D1 D0 IE EA - - ES ET1 EX1 ET0 EX0 位地址 AF - - AC AB AA A9 A8 复位值 EA:CPU 的中断允许控制位 当 EA=1,CPU 允许中断 ;EA=0,CPU 屏蔽所有的中断申请 ES: 串行口中断允许控制位 当 ES=1, 允许串行口中断 ;ES=0, 禁止串行口中断 ET1: 定时 / 计数器 1 溢出中断允许控制位 当 ET1=1, 允许定时 / 计数器 1 溢出中断 ; ET1=0, 禁止定时 / 计数器 1 溢出中断 EX1: 外部中断 1 中断允许控制位 当 EX1=1, 允许外部中断 1 中断 ;EX1=0, 禁止外部中断 1 中断 ET0: 定时 / 计数器 0 溢出中断允许控制位 当 ET0=1, 允许定时 / 计数器 0 溢出中断 ; ET0=0, 禁止定时 / 计数器 0 溢出中断 EX0: 外部中断 0 中断允许控制位 当 EX0=1, 允许外部中断 0 中断 ;EX0=0, 禁止外部中断 0 中断 102

103 中断优先级寄存器 (IP) 这个特殊功能寄存器在内部数据存储器中的字节地址为 B8H, 它即可以进行字节寻址, 也可以进行位寻址 这个寄存器的格式如表 7.4 所示 表 7.4 中断优先级寄存器 (IP) D7 D6 D5 D4 D3 D2 D1 D0 IP PS PT1 PX1 PT0 PX0 位地址 BC BB BA B9 B8 复位值 PS: 串行口中断优先级控制位 当 PS=1, 串行口中断被定义为高优先级中断 ;PS=0, 串行口中断被定义为低优先级中断 PT1: 定时 / 计数器 1 溢出中断优先级控制位 当 PT1=1, 定时 / 计数器 1 溢出中断被定义为高优先级中断 ;PT1=0, 定时 / 计数器 1 溢出中断被定义为低优先级中断 PX1: 外部中断 1 优先级控制位 当 PX1=1, 外部中断 1 被定义为高优先级中断 ;PX1=0, 外部中断 1 被定义为低优先级中断 PT0: 定时 / 计数器 0 溢出中断优先级控制位 当 PT0=1, 定时 / 计数器 0 溢出中断被定义为高优先级中断 ;PT0=0, 定时 / 计数器 0 溢出中断被定义为低优先级中断 PX0: 外部中断 0 优先级控制位 当 PX0=1, 外部中断 0 被定义为高优先级中断 ;PX0=0, 外部中断 0 被定义为低优先级中断 利用中断允许寄存器 (IE) 可以允许单片机处理全部或者部分中断申请 ; 利用中断优先级寄存器 (IP) 可以使得一些中断申请比另一些中断申请获得优先处理, 从而满足一些具有更紧急处理事件的处理要求 除过利用中断优先级寄存器 (IP) 来安排中断申请的处理顺序之外, 如果同时收到几个处于同一优先级的中断申请, 还可以利用单片机内部的查询顺序, 使得一些中断申请获得优先处理 在同一优先级的情况下, 不同的中断信号还具有不同的优先顺序, 这个优先顺序如表 7.5 所示 表 7.5 同一优先级中的中断信号优先顺序中断信号优先顺序外部中断 0 最高定时 / 计数器 0 溢出中断 外部中断 1 定时 / 计数器 1 溢出中断 串行口中断最低 103

104 7.1.4 中断的响应过程 AT89S51 单片机的 CPU 在每个机器周期对每一个中断信号的中断请求标志位进行采样 如果不存在下面的阻止条件, 单片机将在下一个机器周期响应被激活的中断请求 阻止单片机响应中断的条件如下 : 1CPU 正在处理同一优先级级或更高级优先级的中断 ; 2 当前的机器周期不是所执行指令的最后一个机器周期, 即在 CPU 中正在被执行的指令尚没有完成 ; 3 正在执行的指令是中断返回指令 (RETI) 访问中断允许寄存器(IE) 的指令或者访问中断允许寄存器 (IE) 的指令 如果存在上述阻止单片机响应中断的条件之一, 本次被采样到的中断请求将被丢弃 当单片机响应被激活的中断请求, 它将执行下列的操作 : 1 硬件清除相应的中断请求标志, 注意, 对于串行口中断必须使用软件的方式清除相应的中断请求标志 ; 2 执行一条硬件子程序, 将程序指针 (PC) 的内容压入堆栈, 把中断服务程序的入口地址送入程序指针 (PC); 3 执行完中断服务程序之后, 执行中断返回指令 (RETI), 把堆栈中保存的主程序断点地址送入程序指针 (PC), 返回主程序 每种中断信号的中断服务程序的入口地址如表 7.6 所示 表 7.6 中断服务程序的入口地址 中断信号外部中断 0 定时 / 计数器 0 溢出中断外部中断 1 定时 / 计数器 1 溢出中断串行口中断 入口地址 0003H 000BH 0013H 001BH 0023H 由表 7.6 可以看出, 各中断服务程序的入口地址仅间隔 8 个字节, 这点程序存储空间不足以放置中断服务程序 通常在中断服务程序的入口地址处放置一条转移指令, 例如 AJMP, 执行该指令跳转到实际的中断服务程序 中断服务程序的最后一条指令必须是中断返回指令 (RETI), 该指令是中断服务程序的结束标志 当这条指令被执行以后,CPU 将清除为响应中断对硬件电路所进行的设置, 把堆栈中保存的主程序断点地址送入程序指针 (PC), 返回主程序 子程序返回指令 (RET) 虽然也能把把堆栈中保存的主程序断点地址送入程序指针 (PC), 返回主程序, 但是不能清除为响应中断对硬件电路所进行的设置 如果不清除为响应中断对硬件电路所进行的设置, 单片机将不能响应下一次的中断请求 104

105 7.2 定时器溢出中断的应用 基于定时 / 计数器的信号周期测量 在第 4 章中, 我们讨论了基于定时 / 计数器的信号频率测量 当待测信号的频率较低时, 如果测量数据仍然希望保证足够的有效数字, 则计数闸门必须展宽 例如希望测量结果具有 3 位有效数字, 当待测信号的频率为几十赫兹时, 对应计数闸门的时间应为 10s; 当待测信号的频率为几赫兹时, 对应计数闸门的时间应为 100s 待测信号的频率越低, 需要计数闸门的时间越大, 完成一次频率测量所需的时间越长 完成一次频率测量所需的时间过长将使得信号测量的实时性变差 频率和周期都是反映信号变化快慢的参数, 它们之间的关系为 : f = 1 / T 当待测信号的频率较低时, 我们可以采用测量周期来代替测量频率 当待测信号的频率为 10Hz 时, 对应的信号周期为 100ms 当待测信号的频率为 1Hz 时, 对应的信号周期为 1s 与测量信号的频率相比较, 测量信号周期所需要的时间要少得多 测量信号周期可以利用定时 / 计数器的定时模式来实现, 这时的计数信号是通过 12 分频的单片机时钟信号, 计数闸门由被测量的信号产生 通过对一个被测量的信号周期内包含的单片机工作周期的计数, 计数寄存器 THx 和 TLx 中将获得信号的周期 当单片机的时钟频率选为 12MHz, 则单片机的工作周期为 1us 如果被测量的信号周期为 10ms, 计数寄存器的计数值将为 如果被测量的信号周期为 100ms, 计数寄存器的计数值将为 待测信号的周期越长, 频率越低, 计数寄存器中包含的被测量的信号的周期数的有效数位越多 综上所述, 当待测信号的频率较低时, 采用定时 / 计数器的定时模式测量信号的周期既可以降低测量时间, 也可以保证测量的精度 计数寄存器的最大计数值为 65535, 如果被测量信号周期的计数值大于这个最大计数值, 由于计数寄存器发生计数溢出, 测量结果将是错误的 这个问题可以通过定时 / 计数的中断功能来克服 当计数寄存器发生计数溢出时, 定时 / 计数的中断被触发, 它的中断服务程序使一个用户指定的存储单元内容加 1, 由此获得更大的计数范围 定时器溢出中断的模拟 本节通过一个程序来学习定时器溢出中断的使用 为了减少单片机模拟调试软件的模 拟时间, 在程序中对定时 / 计数器的计数寄存器赋予初始值 程序示例 7.1: ORG 0000H AJMP MAIN ; 保留中断服务程序的入口地址 ORG 000BH ; 定时 / 计数器 0 溢出中断服务程序的入口地址 AJMP TIMER0I ; 跳转到实际的中断服务程序 105

106 ORG 0030H ; 保留中断服务程序的入口地址 MAIN: MOV SP, #70H ; 把堆栈的顶部上调以避开工作寄存器区 MOV TMOD, #01H ; 设置定时 / 计数器 0 为定时器模式 工作方式 1 MOV IE, #82H ; 允许 CPU 中断, 允许定时 / 计数器 0 溢出中断 MOV TH0, #0F0H ; 计数寄存器 TH0 赋初值 MOV TL0, #80H ; 计数寄存器 TL0 赋初值 SETB TR0 ; 启动定时 / 计数器 0 计数 HERE: AJMP HERE ; 等中断 TIMER0I: ; 实际的中断服务程序 MOV TH0, #0F0H ; 计数寄存器 TH0 赋初值 MOV TL0, #80H ; 计数寄存器 TL0 赋初值 RETI ; 中断返回 END 与以前的程序示例不同, 程序示例 7.1 中位于程序空间 0000H 处是一条转移指令, 这条转移指令的目的地址位于程序空间 0030H, 即编写的汇编语言源程序实际从程序空间 0030H 位置开始存放 按照这样的安排, 每种中断信号的中断服务程序的入口地址就可以被保留下来 程序示例 7.1 中, 在定时 / 计数器 0 溢出中断的中断服务程序的入口地址 000BH 放置了一条转移指令, 它的目的地址为实际的中断服务程序 在程序示例 7.1 中, 通过向中断允许寄存器 (IE) 赋值 82H 使得 CPU 中断和定时 / 计数器 0 溢出中断被允许 由于中断允许寄存器 (IE) 在内部数据存储器中的地址是 A8H, 对它的访问即可以进行字节寻址, 也可以进行位寻址, 因此字节寻址指令 : MOV IE, #82H 可以用下面 2 条位寻址指令代替 : SETB EA SETB ET0 在定时 / 计数器 0 的计数被启动以后, 单片机通过执行指令 : HERE: AJMP HERE 等待定时 / 计数器 0 发生溢出中断 在图 7.1 所示的 Keil 单片机模拟调试软件的集成开发环境中显示已经发生定时器 0(Timer0) 溢出中断, 程序指针 (PC) 中的程序地址为定时器 0(Timer0) 溢出中断的中断服务程序的入口地址 000BH, 下一次将执行指令的黄箭头标志也指向对应的位置 程序指针 (PC) 中的内容改为定时 / 计数器 0 溢出中断的中断服务程序的入口地址 000BH, 在主程序中的断点地址被送往堆栈进行保存, 同样从图 7.1 所示的 Keil 单片机模拟调试软件的集成开发环境中显示堆栈 (SP) 顶部变为 72H 在定时 / 计数器 0 发生计数溢出以后, 它的计数工作从 0 开始, 继续进行, 这也可以从 106

107 图 7.1 Keil 单片机模拟调试软件的集成开发环境图 7.1 所示的定时 / 计数器 0 的工作状态窗口观察到, 这时计数寄存器 TH0 的内容为 00H, 计数寄存器 TL0 的内容为 03H 程序示例 7.1 的目的是演示定时 / 计数器 0 溢出中断的处理过程, 因此在中断服务程序 (TIMER0I) 中仅向计数寄存器进行赋值以减小再次观察到发生中断的时间 在中断服务程序中完成向计数寄存器进行赋值以后, 接着执行的指令为中断返回指令 (RETI) 中断返回指令 (RETI) 被执行以后, 程序将返回主程序的断点处继续执行, 即返回指令 : HERE: AJMP HERE 等待定时器 0(Timer0) 再次发生溢出中断 信号周期测量的实现 利用定时 / 计数器的定时模式实现信号的周期测量时, 计数信号来自经过 12 分频的单片机时钟信号, 计数寄存器计数的开始和停止受待测信号的控制 待测信号的波形如图 7.2 所示 在第一个脉冲的上跳沿 t A 处启动计数, 在第二个脉冲的上跳沿 t B 处停止计数, 这样计数寄存器中的数值就是以单片机的工作周期为单位的待测信号周期 这里仍然使用定时 / 计数器 0, 待测信号仍然从管脚 T0(P3.4) 输入 t A t B 图 7.2 待测信号的波形图 107

108 实现测量信号周期的具体的汇编语言源程序如下面程序示例 7.2 程序示例 7.2: ORG 0000H AJMP MAIN ; 保留中断服务程序的入口地址 ORG 000BH ; 定时器 0(Timer0) 溢出中断服务程序的入口地址 AJMP CYCLE ; 跳转到实际的中断服务程序 ORG 0030H ; 保留中断服务程序的入口地址 MAIN: MOV SP, #70H ; 把堆栈的顶部上调以避开工作寄存器区 MOV TMOD, #01H ; 设置定时器 0(Timer0) 为定时器模式 工作方式 1 MOV IE, #82H ; 允许 CPU 中断, 允许定时器 0(Timer0) 溢出中断 START: MOV TH0, #00H ; 计数寄存器 TH0 的内容清 0 MOV TL0, #00H ; 计数寄存器 TL0 的内容清 0 MOV R2, #00H ; 工作寄存器 R2 用来扩展定时器 0(Timer0) 计数范围 TA0: JB P3.4, TA0 ; 等待测信号的下跳沿 TA1: JNB P3.4, TA1 ; 等待测信号的上跳沿 SETB TR0 ; 启动定时器 0(Timer0) 计数 TA2: JB P3.4, TA2 ; 等待测信号的下跳沿 TA3: JNB P3.4, TA3 ; 等待测信号的上跳沿 CLR TR0 ; 停止定时器 0(Timer0) 计数 AJMP START ; 再次测量 CYCLE: INC R2 ; 实际的中断服务程序 当定时器 0(Timer0) 发生计 ; 数溢出时工作寄存器 R2 的内容加 1 RETI END ; 中断返回 程序示例 7.2 中, 下面 2 条指令 : TA0: JB P3.4, TA0 TA1: JNB P3.4, TA1 用来检测待测信号的上跳沿, 实现如图 7.2 所示的在第一个脉冲的上跳边沿 t A 处启动计数, 在第二个脉冲的上跳边沿 t B 处停止计数, 从而完成一个信号周期的时间测量 当定时 / 计数器 0 发生溢出时, 中断服务程序中工作寄存器 R2 加 1, 由此扩展信号周期的测量范围 测量获得的信号周期保存在工作寄存器 R2 计数寄存器 TH0 和计数寄存器 TL0 之中 如果单片机的时钟频率为 12MHz, 程序示例 7.2 可以测量的最大信号周期为 2 23 us, 即 us, 或者 s 需要注意, 程序示例 7.2 中没有用于显示的子程序, 如果要进行实际测量, 需要在其中添加相应的部分 108

109 7.3 基于外部中断的简单键盘 键盘概述 数码管, 当然还有许多别的器件, 可以被用来显示单片机的工作状态和工作结果 当需要向单片机传送命令和输入数据时, 键盘通常被使用 键盘是一组按键开关的集合 像数码管一样, 键盘也是单片机应用系统的一个关键部件 按键开关具有 2 个状态, 闭合或者断开 这 2 个状态反映在电压上就是按键开关呈现出高电平或者低电平 如果按键开关呈现高电平表示它断开, 那么按键开关呈现低电平表示它闭合, 因此通过检测按键开关呈现的电平状态就可以确认按键开关是否被按下 通常使用的按键开关为机械式弹性开关, 它利用机械触点实现开关的闭合或者断开 直流电压通过机械触点的闭合 断开过程所产生的信号波形如图 7.3 所示 键按下 前沿抖动 闭合稳定 后沿抖动 图 7.3 按键开关产生的信号波形图由于机械触点的弹性作用, 按键开关在闭合时不会立刻稳定地接通, 在断开时也不会一下子断开 在闭合和断开的瞬间都伴随一连串的抖动, 抖动的时间取决于按键的机械特性, 这个时间一般为 5~10ms 抖动的持续时间值是很重要的, 它在后面将要讨论的利用软件方法去除开关抖动影响中要用到 按键开关的闭合时间取决操作者的习惯, 一般为十分之几秒到几秒之间 为了确保单片机对一次按键动作能确认为一次按键, 抖动的影响必须被消除 消除键盘抖动的方法具有采用硬件电路的方法和利用软件编程的方法 由于采用软件编程的方法可以降低硬件电路的开销, 这里只讨论利用软件编程的方法来消除抖动的影响 利用软件编程的方法消除抖动影响由引入一段延时来实现 如图 7.3 所示, 当第一次检测到按键呈现低电平时, 执行一段延时大于 10ms, 即抖动的持续时间, 的延时子程序, 然后再次确认按键是否呈现低电平 如果按键仍然呈现低电平, 则确认按键被按下, 否则表示第一次的检测失败 常用的键盘有独立式键盘和矩阵式键盘 前者电路结构和软件结构都比较简单, 但是每一个按键开关需要占用一个单片机的输入 / 输出管脚 后者占用较少的单片机输入 / 输出管脚, 例如一个 3 3 的矩阵式键盘包含 9 个按键开关, 只需要 6 个单片机输入 / 输出管脚 ; 一个 4 4 的矩阵式键盘包含 16 个按键开关, 只需要 8 个单片机输入 / 输出管脚 109

110 在键盘包含的按键开关较少的情况下, 例如只包含 4 个按键开关, 独立式键盘占用的单片机输入 / 输出管脚数量是可以接受的 独立式键盘的工作方式又可以分为中断方式和查询方式, 其中中断方式的独立式键盘电路如图 7.4 所示 +5V AT89S51 R1 R2 R3 R4 P1.3 P1.2 P1.1 P1.0 INT0 & KEY3 KEY2 KEY1 KEY0 图 7.4 中断方式的独立式键盘电路 在图 7.4 所示的电路中,4 个按键开关分别与单片机的输入 / 输出管脚 P1.0~P1.3 相连接, 每个按键还通过一个限流电阻与电源 V CC 相连接 另外,4 个按键开关还分别与 4 输入与门的 4 个输入管脚相连接,4 输入与门的输出管脚与单片机的外部中断信号 0 的输入管脚 INT0 相连接 这里的按键开关采用常开开关, 即在没有执行按键动作的时候, 开关是断开的 合理选择限流电阻的阻值, 推荐值为 10kΩ, 在开关断开时, 单片机的输入 / 输出管脚和 4 输入与门的 4 个输入管脚都为高电平 当某个按键开关被按下, 与该按键开关相连接的单片机的输入 / 输出管脚和 4 输入与门的输入管脚都变为低电平 4 输入与门只要有一个输入管脚变为低电平, 它的输出就变为低电平 当按键被按下时, 外部中断信号 0 的输入管脚 INT0 为低电平, 它向单片机发出中断申请 如果这时外部中断 0 的中断被允许, 则 CPU 将响应中断 在中断服务程序中, 首先读入管脚 P1.0~ 管脚 P1.3 的状态 ; 接着执行一端 10ms 的延时程序 ; 再次读入管脚 P1.0~ 管脚 P1.3 的状态 ; 通过比较两次读入的状态实现软件去抖动 确定有按键被按下, 利用程序可以判断哪一个管脚的输入为低电平, 从而确定哪一个按键被按下 外部中断的模拟 下面将要介绍的程序所需要的硬件电路可以由图 7.4 所示的电路再添加一位数码管组成显示电路来构成 当把程序示例 7.3 下载到单片机的内部程序存储器, 在电路中如果按键 KEY0 被按下, 数码管将显示 0 ; 如果按键 KEY1 被按下, 数码管将显示 1 ; 如果按键 KEY2 被按下, 数码管将显示 2 ; 如果按键 KEY3 被按下, 数码管将显示 3 程序示例 7.3 的具体内容如下 110

111 程序示例 7.3: ORG 0000H AJMP MAIN ; 保留中断服务程序的入口地址 ORG 0003H ; 外部中断 0 中断服务程序的入口地址 AJMP KEY4 ; 跳转到实际的中断服务程序 ORG 0030H ; 保留中断服务程序的入口地址 MAIN: MOV SP, #70H ; 把堆栈的顶部上调以避开工作寄存器区 MOV IE, #81H ; 允许 CPU 中断, 允许外部中断 0 中断 HERE: AJMP HERE ; 等待中断 KEY4: MOV A, P1 ; 把 P1 口内容复制到累加器 A ANL A, #0FH ; 屏蔽与键盘无关的高 4 位 MOV 20H, A ; 保存键盘状态 ACALL D10MS ; 延时 10ms, 去抖动 MOV A, P1 ; 再次读取键盘状态 ANL Q, #0FH ; 屏蔽与键盘无关的高 4 位 CJNE A, 20H, KEYE ; 比较 2 次读取的键盘状态, 如果它们不相等 ; 退出中断服务程序 JNB 00H, KEY0 ; 当 P1.0 为低电平, 跳到它的处理程序 JNB 01H, KEY1 ; 当 P1.1 为低电平, 跳到它的处理程序 JNB 02H, KEY2 ; 当 P1.2 为低电平, 跳到它的处理程序 JNB 03H, KEY3 ; 当 P1.3 为低电平, 跳到它的处理程序 KEYE: RETI ; 退出中断服务程序 KEY0: MOV 60H, #00H ; 向子程序 LED1 的入口赋数据 0 ACALL LED1 ; RETI ; 退出中断服务程序 KEY1: MOV 60H, #01H ; 向子程序 LED1 的入口赋数据 1 ACALL LED1 ; RETI ; 退出中断服务程序 KEY2: MOV 60H, #02H ; 向子程序 LED1 的入口赋数据 2 ACALL LED1 ; RETI ; 退出中断服务程序 KEY3: MOV 60H, #03H ; 向子程序 LED1 的入口赋数据 3 ACALL LED1 ; RETI ; 退出中断服务程序 LED1: ; 显示 1 位数据 ( 共阴极数码管 ) 子程序 D10MS: ; 延时 10ms 子程序 END 111

112 图 7.5 显示了程序示例 7.3 在单片机输入中断信号外部中断 0( INT 0 ) 时的执行情况 在 Keil 单片机模拟调试软件的集成开发环境中, P1 口和 P3 口的观察窗口已经被打开 点击观察窗口中表示单片机管脚的小窗口, 即具有 标志的位置, 可以改变对应管脚的状态 具有 标志表示该管脚为高电平 ; 不具有 标志表示该管脚为低电平 在图 7.4 中, 管脚 P1.0 和管脚 P3.2 已经被置为低电平, 前者被用来模拟按键 KEY0 被按下, 后者被用来模拟中断信号外部中断 0( INT 0 ) 112 图 7.5 Keil 单片机模拟调试软件的集成开发环境 在程序示例 7.3 中, 通过向中断允许寄存器 (IE) 赋值 81H 使得 CPU 中断和外部中断 0( INT 0 ) 中断被允许 在设置堆栈指针 (SP) 和中断允许寄存器 (IE) 之后, 单片机执行指令 : HERE: AJMP HERE 等待外部中断 0( INT 0 ) 中断信号的产生 通过在 P1 口和 P3 口的观察窗口设置相应管脚的状态来模拟按键动作和中断信号, 接着继续单片机的模拟调试过程, 在图 7.5 所示的 Keil 单片机模拟调试软件的集成开发环境中显示已经发生外部中断 0( INT 0 ) 中断 程序指针 (PC) 中的程序地址为外部中断 0( INT 0 ) 中断的中断服务程序的入口地址 0003H 在中断服务程序中, 首先利用软件的方法完成按键的去抖动, 然后判断是哪一个按键被按下 在判断过程中, 按键 KEY0 具有最高优先级, 按键 KEY3 的优先级最低 如果有 2 个按键被同时按下, 只有高优先级的按键功能被处理 如果没有按键被按下, 退出中断服务程序 程序示例 7.3 的按键功能仅为显示按键的代号 在模拟调试中, 一旦完成按键的识别, 应该去掉中断信号, 否则当中断返回指令 (RETI) 被执行以后, 将再次发生中断

DPJJX1.DOC

DPJJX1.DOC 8051 111 2K 1 2 3 ' ' 1 CPU RAM ROM / A/D D/A PC CPU 40 68 10 20 8 51 PIII 8051 2 MCS51 8051 8031 89C51 8051 8031 89C51? MCS51 INTEL INTEL 8031 8051 8751 8032 8052 8752 8051 8051 8051 MCS51 8031 8031

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0 SH79F6431 1. SH79F6431 1T 8051 FLASH SH79F JET51 Keil µ vision JTAG 1.1. SH79F6431 LQFP64 1.2. (Target Board) SH79F6431 1 V 1.0 1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F6431 1 2 1 B. 1(VCC/GND)

More information

CH559指令周期.doc

CH559指令周期.doc CH55X 汇编指令周期表 CH55X 汇编指令概述 : 型号包含 : a. 指令单周期型号 :CH557 CH558 CH559; b. 指令 4 周期型号 :CH551 CH552 CH553 CH554; c. 非跳转指令的指令周期数与指令字节数相同 ; d. 跳转指令含 MOVC/RET/CALL 通常比字节数多若干个周期 ; e.movc 指令多 4 或 5 个周期 ( 下条指令地址为奇数时多

More information

W77E58中文手册

W77E58中文手册 W77E58 77E58 8051 8051 8051 77E58 8051 1.5 3 COMS 32K EEPROM 1K SRAM 1 8 2 40M 4 3 8051 4 8051 5 4 8 I/O 6 4 I/O 44 PLCC QFP 7 16 / 8 12 9 10 11 1K 12 13 16 DPTR 14 15 DIP40 W77E58 25/40 PLCC44 W77E58P

More information

Microsoft Word - 專題封面.doc

Microsoft Word - 專題封面.doc 逢 甲 大 學 資 訊 工 程 學 系 專 題 研 究 報 告 8051 小 遊 戲 -21 點 指 導 教 授 : 陳 德 生 學 生 : 許 博 益 中 華 民 國 九 十 六 年 六 月 I 目 錄 第 一 章 緒 論 1 1-1 研 究 背 景 1 1-2 研 究 動 機 2 1-3 研 究 目 的 3 1-3-1 21 點 源 起 3 1-3-2 21 點 規 則 3 第 二 章 微 電

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

<4D6963726F736F667420576F7264202D20B9F9B0EABBCDBBAFAB48DEB3B4C1A5BDB3F8A7692E646F63>

<4D6963726F736F667420576F7264202D20B9F9B0EABBCDBBAFAB48DEB3B4C1A5BDB3F8A7692E646F63> 臺 北 市 立 松 山 高 級 工 農 職 業 學 校 資 訊 科 專 題 製 作 報 告 題 目 : 反 彈 空 間 指 導 老 師 : 余 耀 銘 學 生 : 廖 國 銓 趙 信 瑋 中 華 民 國 102 年 5 月 摘 要 在 這 高 速 科 技 的 起 飛 下, 科 技 都 建 立 起 於 基 礎, 有 些 人 把 這 基 礎 轉 為 理 論, 教 給 大 眾 學 習 ; 有 些 人 利

More information

2 Keil µ vision 2.1 1) Keil µ vision2 V2.34 µ vision3 2) Sino_Keil.exe Keil c:\keil\ 3) JET51 USB PC C:\Keil\ USB PC 4) S-L

2 Keil µ vision 2.1 1) Keil µ vision2 V2.34 µ vision3 2) Sino_Keil.exe   Keil c:\keil\ 3) JET51 USB PC C:\Keil\ USB PC 4) S-L 1 SH88F516 8051 64K FLASH 1024 EEPROM SH88F516 JET51 S-Lab Keil µ vision ISP51 Keil µ vision ISP51 ISP51 PC RS232 MCU SH88F516 SH88F516 1.1 SH88F516 1.1 SH88F516 SH88Fxx: QFP44, DIP40 RAM Flash E2 ADC

More information

SST SPAC SST SoftICE SST89C5x/SST89x554RC /564RD /SST89x516/5xRD / SoftICE SoftICE MCU SoftICE SS

SST SPAC SST SoftICE SST89C5x/SST89x554RC /564RD /SST89x516/5xRD / SoftICE SoftICE MCU SoftICE SS SST SoftICE SST89C5x/SST89x554RC /564RD /SST89x516/5xRD2 1...2 1.1...2 1.2...2 1.3 /...2 2 SoftICE...2 3 SoftICE MCU...2 4 SoftICE...3 4.1 SST BootLoader SOFTICE...3 4.2 SoftICE SST MCU...6 5 SoftICE...7

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information

專題最終版.doc

專題最終版.doc The Principle and Application of the Electric Combination Lock The Principle and Application of the Electric Combination Lock Abstract Recently, there are more and more burglaries in the society. It's

More information

单片机原理及应用实验指导书.doc

单片机原理及应用实验指导书.doc 1 2 3 4...2...4...9...9 AEDK598 MCS51...9 MCS51...10...10...10...10...10...10...11 P1...12...12...12....12...12...13 P3...14...14...14...14...14...14 I/O...15...15...15...15...15...16...17...17...17...17...17...18...19...19

More information

128K Flash EPROM 的程序?\(Bank=64K\) 切?

128K Flash EPROM 的程序?\(Bank=64K\) 切? 应用说明 华邦 8 位单片机 (8051 内核 ) 应用说明 华邦 8 位单片机 (8051 内核 ) ANSC-UC08-0007 目录 - 1. 应用说明 :...4 1.1...4 1.2 相关寄存器介绍...4 1.2.1 串行口控制寄存器 (SCON)... 4 1.2.2 串行数据缓冲寄存器 (SBUF)... 5 1.2.3 串行口控制 1 (SCON1)... 5 1.2.4 串行数据接收缓冲

More information

微處理機期末專題

微處理機期末專題 微 處 理 機 期 末 專 題 自 動 鋼 琴 組 員 :b92611004 羅 鈞 瑋 b92611008 吳 妍 儂 b92611038 吳 韋 靜 b92611042 林 佳 穎 一 簡 介 本 組 的 主 題 是 自 動 鋼 琴 在 播 放 音 樂 的 同 時, 鋼 琴 會 自 動 按 下 琴 鍵, 被 按 下 的 琴 鍵 所 對 應 到 的 音 階, 就 是 正 在 撥 放 的 樂 曲 的

More information

<4D F736F F D20B3E6B4B9A4F930365F32A443AC71C5E3A5DCBEB9B1B1A8EE2E646F63>

<4D F736F F D20B3E6B4B9A4F930365F32A443AC71C5E3A5DCBEB9B1B1A8EE2E646F63> 七段顯示器控制電路四位數 _ 使用解碼器驅動 +5 V 10 uf 8.2 k 12 MHz 20 pf 1 2 3 4 5 6 7 8 9 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RESET 10 P3.0 11 12 13 14 15 16 17 18 19 20 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 XTAL2 XTAL1

More information

另外,AT89S52 可降至 0Hz 静态逻辑操作, 支持 2 种软件可选择节电模式 空闲模式下,CPU 停止工作, 允许 RAM 定时器/ 计数器 串口 中断继续工作 掉电保护方式下,RAM 内容被保存, 振荡器被冻结, 单片机一切工作停止, 直到下一个中断或硬件复位为止 8 位微控制器 8K 字

另外,AT89S52 可降至 0Hz 静态逻辑操作, 支持 2 种软件可选择节电模式 空闲模式下,CPU 停止工作, 允许 RAM 定时器/ 计数器 串口 中断继续工作 掉电保护方式下,RAM 内容被保存, 振荡器被冻结, 单片机一切工作停止, 直到下一个中断或硬件复位为止 8 位微控制器 8K 字 AT89C52 中文资料 AT89C52 的中文资料 AT89C52 是美国 Atmel 公司生产的低电压 高性能 CMOS 8 位单片机, 片内含 8KB 的可反复檫写的程序存储器和 12B 的随机存取数据存储器 (RAM), 器件采用 Atmel 公司的高密度 非易失性存储技术生产, 兼容标准 MCS- 51 指令系统, 片内配置通用 8 位中央处理器 (CPU) 和 Flash 存储单元, 功能强大的

More information

1.1 ML_ONOFF = 1 Q 3 Q 8 C 0.3V M 2 L 1 ML_ONOFF = 0 Q 3 Q 8 C 1. + R31 VCC R21 10K ML_ONOFF R15 0:off 1:on 1K Green Light VCC=5V L1 Q VDD=12V C

1.1 ML_ONOFF = 1 Q 3 Q 8 C 0.3V M 2 L 1 ML_ONOFF = 0 Q 3 Q 8 C 1. + R31 VCC R21 10K ML_ONOFF R15 0:off 1:on 1K Green Light VCC=5V L1 Q VDD=12V C AUTOMATIC TROLLEY H K Hwang K K Chen J-S Lin S-C Wang M-L Li C-C Lin W-B Lin Dept. Of Electrical Engineering Far East College ABSTRACT This paper proposes an automatic trolley which can move automatically

More information

» n ¹ú KS0108 x ÍÍÙ q n KS0108 KS KS0107 KS0108 KS *32 128*64 192*64 KS0108 KS0108 KS0107 KS =4096 RAM RAM LCD 2 KS

» n ¹ú KS0108 x ÍÍÙ q n KS0108 KS KS0107 KS0108 KS *32 128*64 192*64 KS0108 KS0108 KS0107 KS =4096 RAM RAM LCD 2 KS KS0108 KS0108 8 KS0107 KS0108 KS0108 128*32128*64 192*64 KS0108 KS0108 KS0107 KS0108 1 6464=4096 RAMRAM LCD 2KS0108 64 3KS0108 68 68 4KS0108 1/48--1/64 KS0108 CS1,CS2,CS3 CS1 CS2 CS3 E E KS0108 E R/W R/W=1

More information

12232A LED LED LED EL EL CCFL EL CCF

12232A LED LED LED EL EL CCFL EL CCF 12232A 0 50-20 +70-30 +85 LED LED LED EL EL CCFL EL CCF 122 x 32 1/32Duty 1/5Bias 6:00 STN( ), EL LED EL/100VAC 400HZ LED/4.2VDC 1 / VDD-VSS 0 6.5 V Ta=25 LCD VDD-V0 0 12.0 V V1 0 VDD V VDD-VSS - 4.75

More information

1 TPIS TPIS 2 2

1 TPIS TPIS 2 2 1 1 TPIS TPIS 2 2 1. 2. 3. 4. 3 3 4 5 4 TPIS TPIS 6 5 350 Mark Coil F3/F6 350 M 150 M 25 M 7.12M 8 M F3 F6 F4 F7 F8 8M AA 7 350 28V 5V IC HCPL2731 0.5mA 6 8 (TPIS) TPIS 9 7 IC AT89C2051 AT89C2051 CMOS8

More information

物品重量分級器.doc

物品重量分級器.doc Ω Ω Ω Ω Ω Ω Ω 9 A R = Ω Ω + - - + R = A R = - ρ A A R = + A A R = A ρ Ω = + A A A - R + + = + = ρ ) A A ) ( A R ( + + = + + = A ) A R (+ R R = R R = F F Active Dummy V Active Dummy ± ± ± mv = mv ±

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

图 内部结构图 8251 的外部引脚如图 所示, 共 28 个引脚, 每个引脚信号的输入输出方式如图中的箭 头方向所示

图 内部结构图 8251 的外部引脚如图 所示, 共 28 个引脚, 每个引脚信号的输入输出方式如图中的箭 头方向所示 实验题目 : 串行接口芯片 8251 实验目的 : 1. 掌握 8251 的工作方式及应用 2. 了解有关串口通讯的知识 串行接口芯片 8251 3. 掌握使用 8251 实现双机通讯的软件编程和电路连接 实验设备 : IA-32 架构的微机系统及应用教学平台两套 实验原理 : 1. 8251 的基本性能 性能 : 8251 是可编程的串行通信接口, 可以管理信号变化范围很大的串行数据通信 有下列基本

More information

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464> 第 1 章 进入 Photoshop 的全新世界 本章导读 Photoshop 1 1.1 Photoshop CS6 Photoshop Photoshop 1.1.1 Photoshop POP 1-1 图 1-1 平面广告效果 1.1.2 Photoshop 1-2 Photoshop CS6 Photoshop CS6 Photoshop CS6 Extended 3D 3 Photoshop

More information

untitled

untitled EDM16080-01 Model No.: Editor: 1. ----------------------------------------------------3 2. ----------------------------------------------------3 3. ----------------------------------------------------3

More information

HD61202 HD HD61203 HD61202, HY HY HD61202 HD61202 HD61203 HD =4096 RAMRAM LCD 2HD HD HD /32--

HD61202 HD HD61203 HD61202, HY HY HD61202 HD61202 HD61203 HD =4096 RAMRAM LCD 2HD HD HD /32-- HD61202 C-7 1 HD61202 HD61202 8 HD61203 HD61202, HY-12864 HY-19264 HD61202 HD61202 HD61203 HD61202 1 6464=4096 RAMRAM LCD 2HD61202 64 3HD61202 68 68 4HD61202 1/32--1/64 HD61202 HD61202 2 CS1,CS2,CS3 CS1

More information

Microsoft Word - 第1章 MCS-51单片机基础.docx

Microsoft Word - 第1章 MCS-51单片机基础.docx 51 单片机应用开发实战手册 作者 : 华清远见 第 1 章 MCS-51 单片机基础 本章目标 单片机作为嵌入式微控制器在工业测控系统 智能仪器和家用电器中得到广泛 应用 虽然单片机的品种很多, 但 MCS-51 系列单片机仍不失为单片机中的主流机 型 本章主要介绍 MCS-51 单片机的基础知识和学习要点, 以目前应用最为广泛的 AT89SXX 系列单片机为例, 介绍单片机的历史发展 应用领域

More information

Microsoft Word - IRFWX_A051_C_SyncMOS_with_STC_APN_SC_.doc

Microsoft Word - IRFWX_A051_C_SyncMOS_with_STC_APN_SC_.doc EEPROM 应用说明 1 适用产品 :SM59D03G2 SM59D04G2 series 2 应用范围 : 针对需使用 EEPORM 功能替换 STC 89C5X 的应用及汇编语言之范例程序 ( 使用内部扩充内存为暂存区 ) 3 功能说明 : 3.1 本公司上述产品 EEPORM 功能皆可替换 STC89C5X, 仅需对特殊功能缓存器定义 ( 详见表 1) 及 ISP 命令定义 ( 详见表 2)

More information

Microsoft PowerPoint - 第一章(07版).PPT

Microsoft PowerPoint - 第一章(07版).PPT 单片机原理及综合设计 嵌入式微控制器的开发入门 微机及单片机原理原理实验室综合楼 419 室 大连理工大学电信学院陈育斌 1 ( 理论课 ) 上课时间表 (10~17 周 ) 周次 星期 一 二 三 四 五 六 日 1 至 6 时间地点 大五节综 309 (18:00) 大连理工大学电信学院陈育斌 2 课程总体安排 总学时 : 理论课 + 实验课 =36 学时 其中 : 理论课 :24: 学时 ;

More information

控制器 EtherCAT EtherCAT EtherCAT 接下一个电机驱动模块 (X4) 接下一个电机驱动模块 (X5) X11 IN X4 IN X3 OUT X5 IN X6 OUT X2 X1 X4 IN X3 OUT X5 IN X6 OUT X2 X1 SYS STA DC BUS D

控制器 EtherCAT EtherCAT EtherCAT 接下一个电机驱动模块 (X4) 接下一个电机驱动模块 (X5) X11 IN X4 IN X3 OUT X5 IN X6 OUT X2 X1 X4 IN X3 OUT X5 IN X6 OUT X2 X1 SYS STA DC BUS D 控制器 thert thert thert 接下一个电机驱动模块 () 接下一个电机驱动模块 () 电机驱动模块 电机驱动模块 电源模块 接下一个电机驱动模块 () 接下一个电机驱动模块 () 接下一个电机驱动模块 () 接下一个电机驱动模块 () X 0 X 0 4 /RK /RK 注 注 制动电阻阻值 Ω Φ 80: 适用电机驱动模块型号 8-M-XXXX--XX Φ : 适用电机驱动模块型号

More information

LETD型LED灯炮规格的更改

LETD型LED灯炮规格的更改 2018 十二月 1/10 页 软件错误问题软件错误 1 Automation Organizer(WindLDR) 软件之修复 针对版本 : WindLDR 版本 8.2.0 至版本 8.9.1 (Automation Organizer 版本 3.20 至 版本 3.12.1) 注 : 包括由官网下载的版本 当使用以上版本软件, 软件错误 1 将会出现在以下型号 : FC6A CPU 模块 -

More information

Microsoft Word - SoftICE用户指南.doc

Microsoft Word - SoftICE用户指南.doc SST89E/V5xRD2 SST89E/V554RC SST89E/V564RD SST89E516RD2 单片机 SoftICE 用户指南 1 介绍 SoftICE 的英文是 Software In Circuit Emulator, 翻译成中文是 在电路上的软件模拟, 它是 SST 公司为方便 SST 用户使用 SST89E/V5xRD2 SST89E516RD2 SST89V516RD2 SST89E/V554RC

More information

Microsoft Word - P3.doc

Microsoft Word - P3.doc ;P3.3 警报器 ;* ( 程序转载请著明出处, 未声明可适应本站腾龙 /isp 开发套件 / 倚天版开发套件 * ;* E-mail:sxj1974@163.com (51c51 test web) 51 测试网, 自学单片机的网站 * ;* Create by : 石学军 www.51c51.com www.8951.com 更多例程请登陆网站 * org 00h ajmp dlv org 0030h

More information

µPSD3000 系列

µPSD3000 系列 8032 FLASH MCU µpsd3251f-40t6 µpsd3251 8032 FlashPSD Flash SRAM I/O I 2 C, ADC and PWM 8032, 16 / FlashPSD µpsd32 JTAG ISP 2K SRAM Flash - 64K Flash - 16K Flash - Flash 8032 12 I2C ADC 6 I/O 37 I/O 16

More information

1

1 W7E65 1. W7E65 ISP Flash EPROM ISP Flash EPROM 52 W7E65 64K Flash EPROM 4K Flash EPROM 4K Flash EPROM loader 64K ROM 1K RAM 4 I/O 4 I/O P4 3 16 / 2 W7E65 Flash EPROM W7E65 2 2 2. CMOS 12 64K ISP Flash

More information

*_* IAP In Applications Program, *_* ROM RAM A/D D/A KELL C51 2 0531-86213622 Micro Controller Unit( ) INTEL MCS-48 MCS-51 MCS-96 51 MCS-51 8 MCS-96 16 INTEL / 51 87 LPC W78L DS87 GSM97 ATMEL 89C51

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

CA24064B LED LED LED EL EL CCFL EL CCF /

CA24064B LED LED LED EL EL CCFL EL CCF / CA24064B 0 50-20 +70-30 +85 LED LED LED EL EL CCFL EL CCF 39 2 6 0755-81995643/27890716 0 13713911853 0755-27890716 1 : VDD-VSS 0 6 V LCD VDD-V0 Ta=25 0 28.0 V VI 0 VDD V : VDD-VSS --- 4.75 5.0 5.25 V

More information

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ]

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ] 作者 : 利尔达 MSP430 系列单片机的指令系统 1 CPU 内核组成 : 16 位的 (ALU) 算术运算单元 16 个寄存器 (PC SP SR R4~R15) 指令控制单元 2 存储器组织结构 3 外围模块寄存器地址 它们被分配在相应的字模块或字节模块当中 分配在 00-FFH 中为字节, 分配在 100-1FFH 中为字 4 寻址模式 : 5 指令格式 : 1) 书写格式标号指令助记符源操作数,

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

电子技术基础 ( 第 版 ) 3. 图解单相桥式整流电路 ( 图 4-1-3) 电路名称电路原理图波形图 整流电路的工作原理 1. 单相半波整流电路 u 1 u u sin t a t 1 u 0 A B VD I A VD R B

电子技术基础 ( 第 版 ) 3. 图解单相桥式整流电路 ( 图 4-1-3) 电路名称电路原理图波形图 整流电路的工作原理 1. 单相半波整流电路 u 1 u u sin t a t 1 u 0 A B VD I A VD R B 直流稳压电源 第 4 章 4.1 整流电路及其应用 学习目标 1. 熟悉单相整流电路的组成, 了解整流电路的工作原理. 掌握单相整流电路的输出电压和电流的计算方法, 并能通过示波器观察整流电路输出电压的波形 3. 能从实际电路中识读整流电路, 通过估算, 能合理选用整流元器件 4.1.1 认识整流电路 1. 图解单相半波整流电路 ( 图 4-1-1) 电路名称电路原理图波形图 4-1-1. 图解单相全波整流电路

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

Microsoft Word - 新1-3.doc

Microsoft Word - 新1-3.doc 模块三 80C51 的指令系统和程序设计 (1) 了解 80C51 指令系统的构成 (2) 掌握 80C51 单片机的寻址方式 (3) 掌握 80C51 单片机的各种指令及其应用 (4) 掌握汇编语言程序设计方法, 为以后实际控制系统的程序设计奠定基础 3.1 80C51 指令系统概述 对于任何一台计算机, 如果只有硬件 ( 称为裸机 ), 而没有软件 ( 即程序 ) 的支持是不能工作的 单片机也不例外,

More information

ATMEL AT90S8515 AVR CPU AVR AVR AVR ATMEL RISC 32 8 r0 r X Y Z R0 R1 R2 R13 R14 R15 R16 R17 R26 R27 R28 R29 R30 R31 0x00 0x

ATMEL AT90S8515 AVR CPU AVR AVR AVR ATMEL RISC 32 8 r0 r X Y Z R0 R1 R2 R13 R14 R15 R16 R17 R26 R27 R28 R29 R30 R31 0x00 0x 115 AVR W.V. Awdrey ATMEL AVR PIC AVR PIC AVR RISC AVR PIC AVR AVR AVR AVR AVR ATtiny15 AVR AVR AVR RAM ROM 121 116 122 ATMEL AT90S8515 AVR CPU AVR AVR AVR ATMEL RISC 32 8 r0 r31 3 16 X Y Z 6-1 118 7 0

More information

AT89C2051中文资料.doc

AT89C2051中文资料.doc 图形点阵液晶显示模块使用手册 TG12864C(L) 广州捷胜吉电子科技 地址 : 广州市天河区天河路 561# 新赛格电子城 B2226 电话 :(020)33550997 13829772038 网址 :WWW.GZJSJDZ.COM E-mail:CJKD@21CN.COM 目 录 ( 一 ) 概述 (1) ( 二 ) 外形尺寸图 (1) ( 三 ) 模块主要硬件构成说明 (2) ( 四 )

More information

器之 间 向一致时为正 相反时则为负 ③大量电荷的定向移动形成电 流 单个电荷的定向移动同样形成电流 3 电势与电势差 1 陈述概念 电场中某点处 电荷的电势能 E p 与电荷量 q Ep 的比值叫做该点处的电势 表达式为 V 电场中两点之间的 q 电势之差叫做电势差 表达式为 UAB V A VB 2 理解概念 电势差是电场中任意两点之间的电势之差 与参考点的选择无关 电势是反映电场能的性质的物理量

More information

单片机学习教程

单片机学习教程 . 89S51 1. 2.p1 3.8 3 4.8 3. 1. 0-F 2. 0000 0255. 1. : BB 2. : ( --- ) : :. 1. 2..232.I 2 C 1. X24C02 MCS-51 2. : 22H 24C02 50H 3. : ; 8 4. :I2C. / 1. 1 2. 2. 1. 1. 2. 2.. 1. 1: 2. 2: 3. 3 1 LED 1 89S51

More information

Microsoft Word - em78 sub program.doc

Microsoft Word - em78 sub program.doc 一 二进制数转换为 ASCⅡ 码 将一个字节的二进制数转换为两位 16 进制数的 ASCⅡ 码 main: mov a,@0x9f ; 二进制数为 0x9f mov 0x30,a ; 二进制数存入 0x30 mov a,@0x02 mov 0x10,a ;0x10 中存放转换次数 mov a,@0x31 mov 0x04,a ;0x04 中为转换后数据存放地址 mov a,0x30 B1: ; 取

More information

FPGAs in Next Generation Wireless Networks WPChinese

FPGAs in Next Generation Wireless Networks WPChinese FPGA 2010 3 Lattice Semiconductor 5555 Northeast Moore Ct. Hillsboro, Oregon 97124 USA Telephone: (503) 268-8000 www.latticesemi.com 1 FPGAs in Next Generation Wireless Networks GSM GSM-EDGE 384kbps CDMA2000

More information

System Design and Setup of a Robot to Pass over Steps Abstract In the research, one special type of robots that can pass over steps is designed and se

System Design and Setup of a Robot to Pass over Steps Abstract In the research, one special type of robots that can pass over steps is designed and se 8051 8051 System Design and Setup of a Robot to Pass over Steps Abstract In the research, one special type of robots that can pass over steps is designed and setup. This type of robot uses two kinds of

More information

杨欣王玉凤刘湘黔编著清华大学出版社 2008 年 1 月 ISBN 单片机应用从零开始 8051Microcontroller: An Applications Based Introduction 第 1 章 身边的单片机 欢迎访问电路飞翔网

杨欣王玉凤刘湘黔编著清华大学出版社 2008 年 1 月 ISBN 单片机应用从零开始 8051Microcontroller: An Applications Based Introduction 第 1 章 身边的单片机 欢迎访问电路飞翔网 第 1 章 身边的单片机 欢迎访问电路飞翔网 http://www.circuitfly.com 获取更多信息 1.1 单片机在哪里 1.2 单片机是什么样子的 1.3 单片机如何控制其他器件 1.4 如何使用单片机 1.5 有哪些单片机 1.6 实例点拨 电子万年历 例 1: 空调机 1.1 单片机在哪里 制冷功能模块 温度监控功能模块 如何协调工作? 遥控器接收功能模块 1.1 单片机在哪里 数码管指示灯功能按键

More information

Microsoft Word - LMB402CBC-AppNote-V0.1.doc

Microsoft Word - LMB402CBC-AppNote-V0.1.doc LMB402CBC 液晶显示模块应用参考 深圳市拓普微科技开发有限公司 版本描述日期编者 0.1 新版本 2006-02-09 杨军 http://www.topwaysz.com 1 / 1 目录 1 概述 3 2 硬件接口 3 3 软件特性 3 3.1 控制器接口信号说明 3 3.2 模块指令系统 4 4 显示数据存储器的地址 4 5 字符发生器 CGRAM 的地址 5 6 应用举例 5 6.1

More information

HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD

HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD Leica MC170 HD Leica MC190 HD 5 6 7 8 11 12 13 14 16 HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD 22 23 24 26 Leica MC170 HD Leica MC190 HD ( ) 28

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378>

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378> 第一章第二章 Q2 1: 高序 : 最低位字节存储在字的最低位 ; 低序 : 最低位字节存储在字的最高位 ; Q2 2: 冯. 诺依曼结构 : 数据和指令都存储在同一存储器中 ; 哈佛结构 : 数据和程序存储在各自独立的存储器中 Q2 3: a) ARM 有 16 个通用寄存器,r0 r15, 其中 r15 还被用作程序计数器 b) CPSR 是程序状态寄存器, 包含了条件码标识 中断禁止位 当前处理器模式和其他状态

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

Converting image (bmp/jpg) file into binary format

Converting image (bmp/jpg) file into binary format RAiO Image Tool 操作说明 Version 1.0 July 26, 2016 RAiO Technology Inc. Copyright RAiO Technology Inc. 2013 RAiO TECHNOLOGY INC. www.raio.com.tw Revise History Version Date Description 0.1 September 01, 2014

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

TSINGTEK DISPLAY CO.,LTD LCD CONTROLLER & DRIVER ST7920 OR EQUIVALENT (f) 639 2A f B1

TSINGTEK DISPLAY CO.,LTD LCD CONTROLLER & DRIVER ST7920 OR EQUIVALENT (f) 639 2A f B1 TSINGTEK DISPLAY CO.,LTD LCD CONTROLLER & DRIVER ST7920 OR EQUIVALENT 588 4 1 0571-85121224 85121742 85121304(f) 639 2A095 0571-88256346 89902095 f B1618 010-62051209 62000662 62568913 82036512 f http://www.tsingtek.com

More information

逢 甲 大 學

逢    甲    大    學 論 車 Auto Vehicle 立老 磊 年 老 立老 了 見 老 了不 料 利 了 識 更了 力量! i 車. 車 利 89c51 來 流. 令. 車 8051 類 車利 車 ii Abstract The goal of this thesis is to design a small auto vehicle by using IC as its control center. Our auto

More information

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor 1 4.1.1.1 (Load) 14 1.1 1 4.1.1.2 (Save) 14 1.1.1 1 4.1.2 (Buffer) 16 1.1.2 1 4.1.3 (Device) 16 1.1.3 1 4.1.3.1 (Select Device) 16 2 4.1.3.2 (Device Info) 16 2.1 2 4.1.3.3 (Adapter) 17 2.1.1 CD-ROM 2 4.1.4

More information

Microsoft Word - ISSFA-0134_A_AP_User-definedDownload_SC_.doc

Microsoft Word - ISSFA-0134_A_AP_User-definedDownload_SC_.doc 自定义下载应用说明 一 适用产品 :SM59XX 系列 SM59D XX 系列 SM59R XX 系列二 应用方式 : 可以让使用者自定义 command 作为进入 ISP 刻录的通关指令, 透过 UART 连接 ISAP 软件做联机更新三 操作说明 ( 使用 SM59D04G2 为例 ): 1. ISAP 操作方式 : 1.1 先将主程序及 ISP 服务程序烧进 MCU 中 1.2 将 MCU 放至系统版上,

More information

untitled

untitled EDM12832-08 : 25-1 : 116600 : (0411)7612956 7632020 7631122 : (0411)7612958 Model No.: Editor: LCD 1. ----------------------------------------------------3 2. ----------------------------------------------------3

More information

93C46串行EEPROM数据读写

93C46串行EEPROM数据读写 一 \ 实验目的 93C46 串行 EEPROM 数据读写 1 学会 93C46 的操作指令, 掌握 93C46 读 / 写程序的编写 2 掌握 93C46 与单片机的接口方式二 实验说明 93C46/56/66 是 1K/2K/4K 位的串行电可擦写的 EPROM 93C46 的 1K 位 EPROM, 可以按 128 字节排列, 也可以 64 字节排列 93C46 芯片有 8 脚, 当 ORG

More information

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2 第 3 章 8086 的寻址方式和指令系统 (1) 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 1 主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2 3.1 8086 的寻址方式 两种不同的类型 : 一类是程序地址 ( 在代码段中 ) 的寻址方式 ; 另一类是操作数地址的寻址方式

More information

Microsoft Word - Ö¸Á.doc

Microsoft Word - Ö¸Á.doc 指令集说明 注 由于资源大小问题 其中以下几款 MCU 只有 62 条指令 其余均为 63 条指令 HT48CA0/HT48RA0A 无 RETI 指令 HT48R05A-1 无 TABRDL 指令 指令寻址方式有下面 5 种 立即寻址 此一寻址法是将立即的常数值紧跟在运算码 (opcode) 后 例如 MOV A, 33H ADD A, 33H 直接寻址 直接寻址的情況只允许在存储器之间作数据传送

More information

展 望 与 述 评 2 广 电 设 备 与 技 术 2013.2

展 望 与 述 评 2 广 电 设 备 与 技 术 2013.2 展 望 与 述 评 2013.2 广 电 设 备 与 技 术 1 展 望 与 述 评 2 广 电 设 备 与 技 术 2013.2 展 望 与 述 评 2013.2 广 电 设 备 与 技 术 3 展 望 与 述 评 4 广 电 设 备 与 技 术 2013.2 展 望 与 述 评 2013.2 广 电 设 备 与 技 术 5 展 望 与 述 评 骆 萧 萧 卜 筱 皛 本 文 讨 论 了 在 非

More information

Microsoft Word - 第1章 MCS-51单片机概述.docx

Microsoft Word - 第1章 MCS-51单片机概述.docx 单片机 C 语言入门 ( 修订版 ) 作者 : 华清远见 第 1 章 MCS-51 单片机概述 本章目标 单片微型计算机简称单片机, 又称为微控制器 (MCU), 是微型计算机的一个重要分支 单片机是 20 世纪 70 年代中期发展起来的一种大规模集成电路芯片, 将 CPU RAM ROM I/O 接口和中断系统等集 成于同一硅片内 20 世纪 80 年代以来单片机发展迅速, 各类新产品不断涌现,

More information

吉林大学学报 工学版 244 第 4 卷 复杂 鉴于本文篇幅所限 具体公式可详见参考文 献 7 每帧的动力学方程建立及其解算方法如图 3 所示 图4 滚转角速度与输入量 η 随时间的变化波形 Fig 4 Waveform of roll rate and input η with time changing 图5 Fig 5 滚转角随时间的变化波形 Waveform of roll angle with

More information

PowerPoint 簡報

PowerPoint 簡報 微算機原理與實驗 (UEE 2301/1071 ) Chap 5. MCS-51 Addressing Modes 宋開泰 Office:EE709 Phone:5731865( 校內分機 :31865) E-mail:ktsong@mail.nctu.edu.tw URL:http://isci.cn.nctu.edu.tw 1 Addressing Modes Addressing mode is

More information

, STC11F01-35C-SOP16 RMB 1.99 STC10F04-35C-LQFP44 R MB 2. 99

, STC11F01-35C-SOP16 RMB 1.99 STC10F04-35C-LQFP44 R MB 2. 99 , STC11F01-35C-SOP16 RMB 1.99 STC10F04-35C-LQFP44 R MB 2. 99 , STC12C5A08AD-35C-LQFP44,RMB 7.5 , STC12C5201AD-SOP16,RMB 2.49 STC12C5202AD-LQFP32,RMB 3.99 , , 0.1uF STC 89LE58 RD+ 32K 1280 16K+ 0.1uF

More information

untitled

untitled XZL024 http://item.taobao.com/item.htm?id=6321822194 1 1 1.1 1.2 1.3 1.4 2 2.1 2.2 2.3 3 USBee Suite 3.1 3.2 3.3 3.4 4 RS232 RS485 RS422 CAN http://item.taobao.com/item.htm?id=6321822194 2 1 XZL024 PC

More information

Microsoft Word - 部分习题参考答案.doc

Microsoft Word - 部分习题参考答案.doc 部分习题参考答案 第 1 章 1.1 (1) U ab 5 (2) U ab 5 () I 2 () I 2 1.2 (a)-10w(b)-8w,0w(c)-50w,25w 1. () P 560 W, P 50 W, P 600 W, P 20 W, P 180 W 1. I 2 m U 60 1.5 P 50 W 1.6 U 26, U 7 ac bd 1.7 U ab 11, I, I 2,

More information

Microsoft PowerPoint - chap3.ppt

Microsoft PowerPoint - chap3.ppt MCS-51 CPU 的規劃模式 位元組位址 1F 18 17 10 0F 08 07 06 05 04 03 02 01 00 通用資料暫存器 暫存器庫 3 暫存器庫 2 暫存器庫 1 R7 R6 R5 R4 R3 R2 R1 R0 內部 RAM 位元組位址 暫存器庫 0 F0 F7 F6 F5 F4 F3 F2 F1 F0 B E0 E7 E6 E5 E4 E3 E2 E1 E0 ACC D0

More information

ICD ICD ICD ICD ICD

ICD ICD ICD ICD ICD MPLAB ICD2 MPLAB ICD2 PIC MPLAB-IDE V6.0 ICD2 usb PC RS232 MPLAB IDE PC PC 2.0 5.5V LED EEDATA MPLAB ICD2 Microchip MPLAB-IDE v6.0 Windows 95/98 Windows NT Windows 2000 www.elc-mcu.com 1 ICD2...4 1.1 ICD2...4

More information

<4D F736F F D20B5A5C6ACBBFAD4ADC0EDD3EBD3A6D3C3BCB B3CCD0F2C9E8BCC65FB5DA33B0E65F2DD6D5B8E52D4E65772DBFB1CEF3B1ED2DB3F6B0E6C9E72E646F6378>

<4D F736F F D20B5A5C6ACBBFAD4ADC0EDD3EBD3A6D3C3BCB B3CCD0F2C9E8BCC65FB5DA33B0E65F2DD6D5B8E52D4E65772DBFB1CEF3B1ED2DB3F6B0E6C9E72E646F6378> 单片机原理与应用及 C51 程序设计 ( 第 3 版 )- 终稿 -New 勘误表 1. P18 页 11 行原来 : 汇编语言 机器语言 功能 MOV AL,01H 1011 0000 0000 0011B ; 把 01 送入累加器 A ADD AL,02H 0000 0100 0000 0101B ;02 与 A 中内容相加, 结 果存入 A HLT 11110100B ; 停止操作 汇编语言

More information

ARM Cortex-M3 (STM32F) STMicroelectronics ( ST) STM32F103 Core: ARM 32-bit Cortex -M3 CPU 72 MHz, 90 DMIPS with 1.25 DMIPS/MHz Single-cycle multiplica

ARM Cortex-M3 (STM32F) STMicroelectronics ( ST) STM32F103 Core: ARM 32-bit Cortex -M3 CPU 72 MHz, 90 DMIPS with 1.25 DMIPS/MHz Single-cycle multiplica CP Chip Power ARM Cortex-M3 (STM32F) ARM Cortex-M3 (STM32F) STMicroelectronics ( ST) STM32F103 Core: ARM 32-bit Cortex -M3 CPU 72 MHz, 90 DMIPS with 1.25 DMIPS/MHz Single-cycle multiplication and hardware

More information

管脚描述 X1 X KHz 晶振管脚 GND 地 RST 复位脚 I/O 数据输入 / 输出引脚 SCLK 串行时钟 Vcc1,Vcc2 电源供电管脚 订单信息部分 # 描述 DS1302 串行时钟芯片 8 脚 DIP DS1302S 串行时钟芯片 8 脚 SOIC 200mil DS

管脚描述 X1 X KHz 晶振管脚 GND 地 RST 复位脚 I/O 数据输入 / 输出引脚 SCLK 串行时钟 Vcc1,Vcc2 电源供电管脚 订单信息部分 # 描述 DS1302 串行时钟芯片 8 脚 DIP DS1302S 串行时钟芯片 8 脚 SOIC 200mil DS DS1302 涓流充电时钟保持芯片的原理与应用 摘要本文概括介绍了 DS1302 时钟芯片的特点和基本组成通过实例详细说明了有关功能的应用软件关于 DS1302 各寄存器的详细位控功能请参考 DALLAS 达拉斯公司的相应产品资料 概述 DS1302 是 DALLAS 公司推出的涓流充电时钟芯片 内含有一个实时时钟 / 日历和 31 字节静态 RAM 通过简 单的串行接口与单片机进行通信 实时时钟

More information

PowerPoint Presentation

PowerPoint Presentation 7.2 并行接口 二. 可编程并行接口芯片 8255A 的功能及其应用 与 CPU 一侧相连的引脚 D0 PA0 ~ ~ ~ ~ ~ D7 PA7 RESET PC7 WR RD PC4 PC3 PC0 A0 PB0 A1 PB7 CS PA 口 PC 口上半部 PC 口下半部 PB 口 A 组 B 组 与 I/O 设备相连的引脚 7.2 并行接口二. 可编程并行接口芯片 8255A 的功能及其应用

More information

Tel: , Fax: STR-15 STR bps 2400bps 4800bps 9600bps STR : 500mW 2.ISM 433

Tel: , Fax: STR-15 STR bps 2400bps 4800bps 9600bps STR : 500mW 2.ISM 433 Tel:086-21-50807785, 50273226 Fax:086-21-50807785-807 http://www.sendbow.com TEL +86-021-50273226 50807785 13816690692 FAX:+86-021-50807785-807 167 E-mail:mailto:technology@sendbow.com web:http://www.sendbow.com

More information

2005.book

2005.book ...4... 4... 7...10... 10... 10... 10... 10... 11... 11 PCC... 11 TB170... 12 /... 12...13... 13 BP150 / BP151 / BP152 / BP155... 14...15... 15... 15... 15... 15... 15... 15... 16 PS465 / PS477... 17 PS692

More information

Ps22Pdf

Ps22Pdf ( ) ( 150 ) 25 15 20 40 ( 25, 1, 25 ), 1. A. B. C. D. 2. A. B. C. D. 3., J = 1 H = 1 ( A B, J', J, H ) A. A = B = 1, J' =0 B. A = B = J' =1 C. A = J' =1, B =0 D. B = J' = 1, A = 0 4. AB + AB A. AB B. AB

More information

, , STC11F01-35C-SOP16 RMB 1.99 STC10F04-35C-LQFP44 R MB 2. 99 , STC12C5A08AD-35C-LQFP44,RMB 7.5 , STC12C5201AD-SOP16,RMB 2.49 STC12C5202AD-LQFP32,RMB 3.99 0.1uF 0.1uF 0.1uF STC 89 E 2 PROM Data Flash

More information

<4D6963726F736F667420576F7264202D203130B5A5C6ACBBFACAB5D1E9D6B8B5BCCAE92E646F63>

<4D6963726F736F667420576F7264202D203130B5A5C6ACBBFACAB5D1E9D6B8B5BCCAE92E646F63> 单 片 机 及 接 口 技 术 实 验 指 导 书 张 勇 编 计 算 机 与 通 信 工 程 学 院 信 息 与 通 信 工 程 系 2004.12 1 - 前 言 单 片 机 及 接 口 技 术 是 通 信 工 程 专 业 的 专 业 技 能 课 程, 在 专 业 知 识 结 构 体 系 中 具 有 十 分 重 要 的 地 位, 课 程 的 实 践 性 很 强, 学 习 必 须 理 论 和 实

More information

DATASHEET SEARCH SITE ==

DATASHEET SEARCH SITE == , STC 89 1280 8/16/32/64k IAP SRAM ISP P0 8 P1 8051 E 2 PROM + P2 IAP STC Data Flash P4.0P4.3 P3 MAX810 I/O P4 A/D UART A / D 3 STC 89 P I I E 2 P 4 S A ROM EMI P P STC 89C51 RC 4K 512 2K STC 89C52 RC

More information

内容简介 本书以 Proteus 为仿真软件, 以汇编语言和 C 语言为编程语言, 结合趣味应用实例, 系统介绍 MCS-51 单片机的组织结构 工作原理 指令系统 程序设计 中断 定时 / 计数器 串行通信 系统扩展 接口技术 应用系统设计等内容 每章的例题 习题都用 Proteus 仿真实现,

内容简介 本书以 Proteus 为仿真软件, 以汇编语言和 C 语言为编程语言, 结合趣味应用实例, 系统介绍 MCS-51 单片机的组织结构 工作原理 指令系统 程序设计 中断 定时 / 计数器 串行通信 系统扩展 接口技术 应用系统设计等内容 每章的例题 习题都用 Proteus 仿真实现, 普通高等教育电气信息类应用型规划教材 单片机原理与应用 基于实例驱动和 Proteus 仿真 ( 第二版 ) 李林功编著 北 京 内容简介 本书以 Proteus 为仿真软件, 以汇编语言和 C 语言为编程语言, 结合趣味应用实例, 系统介绍 MCS-51 单片机的组织结构 工作原理 指令系统 程序设计 中断 定时 / 计数器 串行通信 系统扩展 接口技术 应用系统设计等内容 每章的例题 习题都用

More information

MCS FCC

MCS FCC F&B 100% MCS FCC6000...1...2...2...3...4...5...7...8...18 HIGH LOW OUT MAN COM1 COM2 PRINT ERROR MONTH.DATA HOUR.MINUTE MAN LOW HIGH OUT HIGH LOW OUT MAN 0 0 1-0 1 1 2 5 4. 5 0 0 1-0 2 2 5 4 6. 9 0 0 1-0

More information

例 如, 一 个 含 有 2000 个 记 录 的 文 件, 每 个 磁 盘 块 可 容 纳 250 个 记 录, 则 该 文 件 包 含 8 个 磁 盘 块 然 后 对 该 文 件 作 二 路 归 并 的 外 排 序, 每 次 往 内 存 读 入 两 个 磁 盘 块, 排 序 后 再 写 回 磁

例 如, 一 个 含 有 2000 个 记 录 的 文 件, 每 个 磁 盘 块 可 容 纳 250 个 记 录, 则 该 文 件 包 含 8 个 磁 盘 块 然 后 对 该 文 件 作 二 路 归 并 的 外 排 序, 每 次 往 内 存 读 入 两 个 磁 盘 块, 排 序 后 再 写 回 磁 说 明 改 动 的 内 容 很 少, 且 都 是 不 怎 么 重 要 的, 因 此 无 需 过 多 纠 结, 大 家 看 完 后 一 目 了 然 第 6 章 排 序 1 增 加 了 :( 十 ) 外 部 排 序 第 一 部 分 : 数 据 结 构 2 后 面 的 修 改 :( 十 一 ) 各 种 内 部 排 序 算 法 的 比 较 ;( 十 二 ) 内 部 排 序 算 法 的 应 用 外 部 排 序

More information

論 車 年六 老 老 不 不 不 了 浪 老 更 勵 料 利 老 i 都 來 車 利 8051 來 流 識 令 利 理 來 令 行 車 路 了 識 來說 ii In the technological world, many things can be done by machine instead of the man.. and our project is one thing of the

More information

Microsoft Word - 4位7段LED?示 CH.doc

Microsoft Word - 4位7段LED?示 CH.doc 4 位 7 段 LED 显示 在单片机应用系统中经常使用发光二极管来显示, 发光二极管简称 LED (Light Emitting Diode) LED 的价格便宜, 而且配置比较灵活, 与单片机的接口也比较方便 在这里将讲解如何使用中颖的单片机进行 4 位 7 段 LED 显示的方法 1. 7 段 LED 的结构原理 单片机中经常使用 7 段 LED 来显示数字, 也就是用 7 个 LED 构成字型

More information

´®ÐжàͨµÀ10λA/Dת»»Æ÷TLC1543¼°ÆäÔÚµçѹÊý¾Ý²É¼¯ÏµÍ³ÖеÄÓ¦ÓÃ

´®ÐжàͨµÀ10λA/Dת»»Æ÷TLC1543¼°ÆäÔÚµçѹÊý¾Ý²É¼¯ÏµÍ³ÖеÄÓ¦Óà 电子世界 杂志 串行 A/D 转换器 TLC1543 及其应用 严天峰 TLC1543 是美国 TI 公司生产的多通道 低价格的模数转换器 采用串行通信接口, 具有输入通道多 性价比高 易于和单片机接口的特点, 可广泛应用于各种数据采集系统 TLC1543 为 20 脚 DIP 封装的 CMOS 10 位开关电容逐次 A/D 逼近模数转换器, 引脚排列如图 1 所示 其中 A0~A10(1~9 11

More information

7688使用手冊V10.doc

7688使用手冊V10.doc TP-7688 . 2 2. 3 3. 5 4. 5 5. 6 6. 7 7. 8 8. 9 9.. 4. 7 2 2., 7x9 / 6x9 7x9.3() x 3.()mm 6x9 2.84() x 3.()mm 3 ASCII 7x9 95 ASCII 6x9 95 6x9 7 BIG5 6x9 3973 6x9 28 7x9 24 24 55 6x9 2 2 27 4.23mm (/6 inch)

More information

指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2

指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2 第 3 章 8086 的寻址方式和指令系统 (2) 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 1 3.3 8086 指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2 3.3.1 数据传送指令 可实现 存储器 立即数 段寄存器 CS DS

More information

(10) 在满足串行口接收中断标志位 RI SCON.0 =0 的条件下, 置允许接收位 REN(SCO N.4)=1 就会启动接收一帧数据进入输入移位寄存器, 并装载到接收 SBUF 中, 同时使 RI =l 当发读 SBUF 命令时 ( 执行 MOV A,SBUF 指令 ), 即是由接收缓冲器

(10) 在满足串行口接收中断标志位 RI SCON.0 =0 的条件下, 置允许接收位 REN(SCO N.4)=1 就会启动接收一帧数据进入输入移位寄存器, 并装载到接收 SBUF 中, 同时使 RI =l 当发读 SBUF 命令时 ( 执行 MOV A,SBUF 指令 ), 即是由接收缓冲器 微机原理与接口技术 -- 历年考研真题复习资料 微型计算机的基本组成由微处理器 存储器 I/O 接口电路和系统总线构成, 输入 / 输出 (I /O) 接口和系统总线组成的, 即中央处理器 CPU( 通常包括运算器和控制器 )+ 存储器 + 输入 / 输出 (I/O) 接口, 单片微处理机就是把 (CPU 存储器和 I/O 接口电路 ) 等部件都集成在电路芯片上, 华中科技大学微机原理与接口技术一

More information

Microsoft Word - AVR32 UC3 isp下载.doc

Microsoft Word - AVR32 UC3 isp下载.doc AVR32 UC3 ISP 下载 2008 年 4 月 1 AVR32 UC3 系列控制器在出厂时在内部 Flash 里已经固化了一个 USB DFU bootloader, 可以通过 AVR32 UC3 系列控制器的 USB 接口, 利用内部固化的 USB bootloader 进行 ISP(In-System Programming) 下载 一 Bootloader 环境 图 1 Bootloader

More information