第1章 单片微型计算机概述 1.1单片微型计算机定义和特点 1.2 微计算机系统概念 1.3 单片微型计算机发展概况 1.4 单片机的应用特点 1.5单片机的开发与应用方法简述 1.1 单片微型计算机定义和特点 所谓单片机微型计算机就是把CPU、寄存器、RAM/ROM、I/O接口电路集成在一块集成电路芯片上,构成一个完整的微型计算机 ,见图。 特点: (1)体积小、功耗低、性价比高。 (2)数据大都在单片机内部传送,抗干扰能力强,可靠性高。 (3)结构灵活,应用广泛。 几种单片机封装形式 1.2 微计算机系统概念 1.3 单片微型计算机发展概况 数据位长 1(4(8(16 (32位。 CPU处理能力和速度不断提高 。 增大片内RAM和ROM容量 。 增加片内I/O口和功能模块种类和数量 。 扩大对外部RAM/IO口和程序存储器寻址能力 。 缩小体积,降低功耗。 1.4 单片机的应用特点 控制应用:应用范围广泛,从实时性角度可分为离线应用和在线应用。 软硬件结合:软硬件统筹考虑,不仅要会编程,还要有硬件的理论和实践知识。 应用现场环境恶劣:电磁干扰、电源波动、冲击震动、高低温等环境因素的影响。要考虑芯片等级选择、接地技术、屏蔽技术、隔离技术、滤波技术、抑制反电势干扰技术等。 应用空间大:工业自动化、仪器仪表、家用电器、信息和通信产品、军事装备等领域。 1.5单片机的开发与应用方法简述 由于单片机本身没有开发编程的能力,所以必须借助开发工具。 硬开发工具:各种编程器、仿真开发机等编程开发设备;软开发工具:各种编辑、汇编、模拟调试等工具软件。 开发过程:总体设计、硬件设计、制版与安装、软件设计、调试运行,见图。 硬件仿真调试:借助于各种实时在线开发仿真器,对目标程序进行多种方式的联机运行调试,从而发现程序中的错误之处并改正之,见图。 软件模拟仿真调试:借助于PC机系统,利用模拟(仿真)调试工具软件来进行目标程序的运行调试。 仿真器和逻辑测试仪 编程器 编程器和芯片座 编程器软件界面 各种实验板 Dais单片机微机仿真实验系统 第2章 MCS-51单片机的硬件结构 2.1 MCS-51单片机的物理结构及逻辑结构 2.2 MCS-51单片机的片外总线结构 2.3 MCS-51单片机的存储器配置 2.4 CPU的时序及辅助电路 2.1 MCS-51单片机的物理结构及逻辑结构 2.1.1 MCS-51单片机的封装和引脚分配 2.1.2 MCS-51单片机的系统结构 2.1.3 MCS-51单片机的引脚定义 2.1.4 MCS-51单片机硬件结构要点 2.1.5 MCS-51单片机内部结 2.1.6 输入/输出(I/O)端口结构 2.1.2 MCS-51单片机的系统结构 (1)一个8位微处理器CPU。 (2)数据存储器RAM和特殊功能寄存器SFR。 (3)内部程序存储器ROM。 (4)两个定时/计数器,用以对外部事件进行计数,也可用作定时器。 (5)四个8位可编程的I/O(输入/输出)并行端口,每个端口既可做输入,也可做输出。 (6)一个串行端口,用于数据的串行通信。 (7)中断控制系统。 (8)内部时钟电路。 2.1.3 MCS-51单片机的引脚定义 输入输出口:P0、P1、P2、P3 RST(复位)/ VPD(后备电源引入端) EA (读内/外ROM控制)/Vpp(编程电压) ALE(地址低8位锁存)/ PROG(编程脉冲) PSEN 外部ROM读选通信号 XTAL1、XTAL2 外接晶振端 Vcc +5v电源 Vss 地 P3口的第二功能 2.1.4 MCS-51单片机硬件结构要点 1.内部程序存储器(ROM)和内部数据存储器(RAM)容量(如表2-1所示)。 2.输入/输出(I/O)端口 3.外部程序存储器和外部数据存储器寻址空间 4.中断与堆栈 5.定时/计数器与寄存器区 6.指令系统 2.1.5 MCS-51单片机内部结构 1.运算器 运算器由8位算术逻辑运算单元ALU(Arithmetic Logic Unit)、8位累加器ACC(Accumulator)、8位寄存器B、程序状态字寄存器PSW(Program Status Word)、8位暂存寄存器TMP1和TMP2等组成。 2.控制器 主要由程序计数器PC、指令寄存器IR、指令译码器ID、堆栈指针SP、数据指针DPTR、时钟发生器及定时控制逻辑等组成。 2.1.6 输入/输出(I/O)端口结构 MCS-51单片机有4个双向并行的8位I/O口P0~P3,P0口为三态双向口,可驱动8个TTL电路,P1、P2、P3口为准双向口(作为输入时,口线被拉成高电平,故称为准双向口),其负载能力为4个TTL电路。 1.P0口的结构 2.P1口的结构 3.P2口的结构 4.P3口的结构 2.2 MCS-51单片机的片外总线结构 微型计算机中的总线通常分为: (1)地址总线(AB):地址总线宽度为16位,由P0口经地址锁存器提供低8位地址(A0-A7);P2口直接提供高8位地址(A8~A15)。地址信号是由CPU发出的,故地址总线是单方向的。 (2)数据总线(DB):数据总线宽度为8位,用于传送数据和指令,由P0口提供。 (3)控制总线(CB):控制总线随时掌握各种部件的状态,并根据需要向有关部件发出命令。 2.3 MCS-51单片机的存储器配置 2.3.1 存储器空间分配 2.3.2 片内数据存储器 2.3.3 片外数据存储器 2.3.4 程序存储器 2.3.1 存储器空间分配 空间分配图 物理上有四个存储器空间: (a)程序存储器 [片内、片外] (b)数据存储器 [片内、片外] 逻辑上有三个存储空间: (a)片内外统一的64KB程序存储地址空间 (b) 256B内部数据存储器地址空间 (c) 64KB外部数据存储器地址空间 使用上有五个存储器空间: ( 可被直接寻址的数据地址空间 ( 位地址空间 ( 外部的数据地址空间 ( 程序地址空间 ( 可间接寻址的数据空间 特点:1、数据、程序存储器空间分开。 2、物理存储器有内外之分。 2.3.2 片内数据存储器 片内数据存储器低128单元,00H—7FH。 (1)寄存器区:32个8位寄存器,00H—1FH分为4组。每组8个寄存器,分别为R0—R7,4个组的选择由状态字中的RS1、RS0的值确定。见教材P20 (2)位地址区:20H—2FH,共16个字节单元,128个位单元。 (3)用户RAM区:30H—7FH,通常堆栈放在此区。 2. 片内数据存储器高128单元,80H—0FFH。 (1)专用(特殊功能)寄存器SFR:22个,其中21个可寻址,PC不可寻址。 A、程序计数器PC(16位):用于存放将要执行的指令地址(程序存储器地址),并具有自动加1的功能。 B、累加器A(8位):存放运算中的操作数据及运算后的结果。 C、B寄存器(8位):用于乘除法中的第二个操作数和运算后的结果。 D、程序状态字PSW(8位):寄存着程序运行中的状态信息,各位代表的状态见教材P20。 E、栈指针寄存器SP(8位):其值始终指向栈的顶部,PUSH时值先加1,后存数。 F、其它专用寄存器:数据指针寄存器DPTR(16位)、端口寄存器P0/P1/P2/P3(8位)、串行数据缓冲器SBUF(8位)、定时/计数器T0/T1(16位)、控制寄存器IP/IE/TMOD/TCON/SCON/PCON(8位) (2)专用寄存器的字节寻址:只能使用直接寻址方式,在指令中既可以使用寄存器符号表示,也可以使用寄存器地址表示。 (3)专用寄存器的位寻址:21个SFR中的11个可以位寻址。见教材P22表2-4 2.3.2 片外数据存储器 外部数据存储器又称外部RAM,当片内RAM不能满足数量上的要求时,可通过总线端口和其他I/O口扩展外部数据RAM,其最大容量可达64K字节。 在片外数据存储器中,数据区和扩展的I/O口是统一编址的,使用的指令也完全相同,因此,用户在应用系统设计时,必须合理地进行外部RAM和I/O端口的地址分配,并保证译码的唯一性。 2.3.3 程序存储器 程序存储器的包括片内和片外程序存储器两个部分。其主要用来存放编好的用户程序和表格常数,它以16位的程序计数器PC作为地址指针,故寻址空间为64KB。 8051片内有4kB(0000H—0FFFH),其中特殊保留单元:系统复位后PC=0000H 0000H—0002H 无条件转移指令 0003H—000AH INT0中断地址区 000BH—0012H T0中断地址区 0013H—001AH INT1中断地址区 001BH—0022H T1中断地址区 0023H—002AH 串行中断地址区 2.4 CPU的时序及辅助电路 2.4.1 单片机的时钟电路 2.4.2 振荡周期、时钟周期、机器周期和指令周期 2.4.3 MCS-51单片机指令的取指和执行时序 2.4.4 单片机复位电路及复位状态 2.4.1 单片机的时钟电路 单片机时钟电路通常有两种形式: 1.内部振荡方式:MCS-51单片机片内有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。把放大器与作为反馈元件的晶体振荡器或陶瓷谐振器连接,就构成了内部自激振荡器并产生振荡时钟脉冲(如图1所示)。 2.外部振荡方式:外部振荡方式就是把外部已有的时钟信号引入单片机内(如图2所示)。 2.4.2 振荡周期、时钟周期、机器周期和指令周期 1.振荡周期:为单片机提供时钟信号的振荡源的周期。 2.时钟周期:是振荡源信号经二分频后形成的时钟脉冲信号。 3.机器周期:通常将完成一个基本操作所需的时间称为机器周期。 4.指令周期:是指CPU执行一条指令所需要的时间。一个指令周期通常含有1~4个机器周期。 若MCS-51单片机外接晶振为12MHz时,则单片机的四个周期的具体值为: 振荡周期=1/12MHz=1/12μs=0.0833μs 时钟周期=1/6μs=0.167μs 机器周期=1μs 指令周期=1~4μs 2.4.3 MCS-51单片机指令的取指和执行时序 2.4.4 单片机复位电路及复位状态 1.复位电路 单片机复位电路包括片内、片外两部分。外部复位电路就是为内部复位电路提供两个机器周期以上的高电平而设计的。MCS-51单片机通常采用上电自动复位和按键手动复位两种方式。如图所示。 2.单片机复位后的状态 单片机运行出错或进入死循环时,可按复位键重新运行。21个特殊功能寄存器复位后的状态为确定值,如表所示。 复位后,P0—P3口输出高电平,初值07H写入栈指针SP,清“0”其余的特殊功能寄存器和程序计数器PC。只要RESET保持高电平,单片机循环复位RESET由高变低后,单片机从0地址开始执行程序。单片机初始复位不影响内部RAM的状态,包括工作寄存器R0—R7。 第3章 MCS-51单片机指令系统 3.1 MCS-51指令系统概述 3.2 寻址方式 3.3 分类指令 MCS-51单片机指令系统有如下特点: (1)指令执行时间快。 (2)指令短,约有一半的指令为单字节指令。 (3)用一条指令即可实现2个一字节的相乘或相除。 (4)具有丰富的位操作指令。 (5)可直接用传送指令实现端口的输入输出操作。 3.1 MCS-51指令系统的概述 3.1.1 指令分类 3.1.2 指令格式 3.1.3 指令描述符号介绍 3.1.1 指令分类 按指令功能,MCS-51指令系统分为数据传递与交换、算术运算、逻辑运算、程序转移、布尔处理操作、CPU控制等6类。 布尔处理操作类指令又称位操作指令。 3.1.2 指令格式 在MCS-51指令中,一般指令主要由操作码、操作数组成。 指令应具有以下功能: (1)操作码指明执行什么性质和类型的操作。例如,数的传送、加法、减法等。 (2)操作数指明操作的数本身或者是操作数所在的地址。 (3)指定操作结果存放的地址。 3.1.3 指令描述符号介绍 Rn——当前选中的寄存器区中的8个工作寄存器R0~R7(n=0~7)。 Ri——当前选中的寄存器区中的2个工作寄存器R0、R1(i=0,1)。 direct—8位的内部数据存储器单元中的地址。 #data——包含在指令中的8位常数。 #data16——包含在指令中的16位常数。 addr16——16位目的地址。 addr11——11位目的地址。 rel——8位带符号的偏移字节,简称偏移量。 DPTR——数据指针,可用作16位地址寄存器。 bit——内部RAM或专用寄存器中的直接寻址位。 A——累加器。 B——专用寄存器,用于乘法和除法指令中。 C——进位标志或进位位,或布尔处理机中的累加器。 @——间址寄存器或基址寄存器的前缀,如@Ri,@DPTR。 / ——位操作数的前缀,表示对该位操作数取反,如/bit。 ×——片内RAM的直接地址或寄存器。 (×)——由×寻址的单元中的内容。 ——箭头左边的内容被箭头右边的内容所代替。 3.2 寻址方式 3.2.1 立即寻址 3.2.2 直接寻址 3.2.3 寄存器寻址 3.2.4 寄存器间接寻址 3.2.5 变址寻址 3.2.6 相对寻址 3.2.7 位寻址 3.2.1 立即寻址 指令中跟在操作码以后的第一个字节就是实际的操作数。操作数前面加有#号。 例如:MOV A,#70H ;A←#70H MOV DPTR,#1600H ;DPTR←#1600H MOV 30H,#40H ;30H单元←#40H 3.2.2 直接寻址 指令中直接给出操作数地址的寻址方式,能进行直接寻址的存储空间有SFR寄存器和内部数据RAM。 例如:MOV PSW,# 20H ;PSW←#20H, PSW为直接寻址寄存器的符号地址。 MOV A,30H ;A←30H内部RAM单元中的内容,30H为直接给出的内部RAM的地址。 ANL 70H ,#48H 把RAM中70H单元内容同48H相“与”结果—〉70H单元中 3.2.3 寄存器寻址 以通用寄存器的内容为操作数的寻址方式。通用寄存器指A、B 、DPTR以及R0~R7 。 例如:CLR A ;A←0 INC DPTR ;DPTR←DPTR+1 ADD R5,# 20H ;R5←#20H+R5 3.2.4 寄存器间接寻址 以寄存器中内容为地址,以该地址中内容为操作数的寻址方式。间接寻址的存储器空间包括内部数据RAM和外部数据RAM。 能用于寄存器间接寻址的寄存器有R0,R1,DPTR,SP。其中R0、R1必须是工作寄存器组中的寄存器。SP仅用于堆栈操作。 例如:MOV @R0,A ;内部RAM(R0)←A其指令操作过程示意图如图所示。 又如:MOVX A,@R1;A←外部RAM(P2R1)其指令操作过程示意图如图所示。 再如:MOVX @DPTR,A;外部RAM(DPTR)←A 其指令操作过程示意图如图 所示。 3.2.5 变址寻址 变址寻址只能对程序存储器中数据进行操作。由于程序存储器是只读的,因此变址寻址只有读操作而无写操作,在指令符号上采用MOVC的形式(如图所示)。 例如:MOVC A,@ A+DPTR;A←(A+DPTR) 又如,MOVC A,@ A+PC ;A←(A+PC) 这条指令与上条指令不同的是,基址寄存器是PC。 3.2.6 相对寻址 以当前程序计数器PC的内容为基础,加上指令给出的一字节补码数(偏移量)形成新的PC值的寻址方式。 相对寻址用于修改PC值,主要用于实现程序的分支转移。 例如,SJMP 08H ;PC←PC+2+08H 指令操作示意图如图 所示。 3.2.7 位寻址 位寻址只能对有位地址的单元作位寻址操作。 位寻址其实是一种直接寻址方式,不过其地址是位地址。 例如:SETB 10H ;将10H位置1若22H单元中存放着数据40H,22H单元的D0位的位地址为10H,执行上述指令后(22H)=41H。 又如:MOV 32H,C ;32H←进位位C ORL C ,32H ;C←C∨32H 3.3 分类指令 3.3.1 数据传送类指令 3.3.2 算术运算类指令 3.3.3 逻辑运算与循环类指令 3.3.4 程序转移类指令 3.3.5 调用子程序及返回指令 3.3.6 位操作指令 3.3.7 空操作指令 3.3.1 数据传送类指令 数据传送类指令共28条,是将源操作数送到目的操作数。指令执行后,源操作数不变,目的操作数被源操作数取代。数据传送类指令用到的助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP8种。 源操作数可采用寄存器、寄存器间接、直接、立即、变址5种寻址方式寻址,目的操作数可以采用寄存器、寄存器间接、直接寻址3种寻址方式。MCS-51单片机片内数据传送途径如图所示。 1.以A为目的操作数 MOV A,Rn ;A← Rn MOV A,direct ;A←(direct) MOV A,@Ri ;A←(Ri) MOV A,#data ;A← #data 2.以Rn为目的操作数 MOV Rn,A ;Rn ← A MOV Rn,direct ;Rn ←(direct) MOV Rn,#data ;Rn ← #data 3.以直接地址为目的操作数 MOV @Ri,A ;(Ri) ← A MOV @Ri,direct ;(Ri) ←(direct) MOV @Ri,#data ;(Ri) ← #data 4.以间接地址为目的操作数 MOV @Ri,A ;(Ri) ← A MOV @Ri,direct ;(Ri) ←(direct) MOV @Ri,#data ;(Ri) ← #data 例如:设(30H)=6FH,R1=40H,执行MOV @R1,30H后,30H单元中数据取出送入R1间接寻址的40H单元,(40H)=6FH。 5.以DPTR为目的操作数 MOV DPTR,#data16 ;DPTR ← #data16 例如执行 MOV DPTR,#2000H 后, (DPTR)= 2000H。 6.访问外部数据RAM MOVX A,@DPTR ;A ← (DPTR) MOVX @DPTR,A ;(DPTR) ← A MOVX A,@Ri ;A ← (P2Ri) MOVX @Ri,A ;(P2Ri)← A 7.读程序存储器 MOVC A,@A+DPTR ;A ← (A+DPTR) MOVC A,@A+PC ;A ← (A+PC) 例如已知A=30H,DPTR=3000H, 程序存储器单元(3030H)=50H,执行MOVC A,@ A+DPTR后,A=50H。 8.数据交换 ?????字节交换 XCH A,Rn ;A<=> Rn XCH A ,direct ;A<=>(direct) XCH A,@Ri ;A<=>(Ri) ?????半字节交换 XCHD A,@Ri ;A0~3<=>(Ri)0~3 SWAP A ;A0~3<=>A4~7 9.堆栈操作 所谓堆栈是在片内RAM中按“先进后出,后进先出”原则设置的专用存储区。数据的进栈出栈由指针SP统一管理。堆栈的操作有如下两条专用指令: PUSH direct;SP←(SP+1),(SP)←(direct) POP direct ;(direct)←(SP),SP ← SP-1 PUSH是进栈(或称为压入操作)指令。指令执行过程如图所示。 【例3.1】 将片内RAM 30H单元与40H单元中的内容互换。 方法1(直接地址传送法): MOV 31H,30H MOV 30H,40H MOV 40H,31H SJMP $ 方法2(间接地址传送法): MOV R0,#40H MOV R1,#30H MOV A,@R0 MOV B,@R1 MOV @R1,A MOV @R0,B SJMP $ 方法3(字节交换传送法): MOV A,30H XCH A,40H MOV 30H,A SJMP $ 方法4(堆栈传送法): PUSH 30H PUSH 40H POP 30H POP 40H SJMP $ 3.3.2 算术运算类指令 1.加法指令 ADD A,Rn ;A← A + Rn ADD A,direct ;A← A +(direct) ADD A,@Ri ;A← A +(Ri) ADD A,#data ;A← A + #data 2.带进位加指令 ADDC A,Rn ;A← A + Rn + C ADDC A,direct ;A← A +(direct)+ C ADDC A,@Ri ;A← A +(Ri)+ C ADDC A,#data ;A← A + #data + C C为来自PSW状态寄存器中的进位位C。 例如,设A=20H,R0=21H,C=1,执行指令 ADDC A,R0后,A=42H。 3.带借位减指令 SUBB A,Rn ;A← A - Rn - C SUBB A,direct ;A← A -(direct)- C SUBB A,@Ri ;A← A -(Ri)- C SUBB A,#data ;A← A - #data – C 例如,设A=39H,R0=20H,(20H)=32H,C=1,执行指令 SUBBA,@R0后,A=06H。 4.乘法指令 MUL AB ;BA← A×B A和B中各存放一个8位无符号数,指令执行后,16位乘积的高8位在B中,低8位存A中。 例如,A=30H,B=60H,执行 MUL AB 后,A=00H,B=12H。 5.除法指令 DIV AB ;A÷B→商在A中,余数在B中 A和B中各存放一个8位无符号数,A放被除数,B放除数。指令执行后,A中存放商,B中存入余数。若B=00H,则指令执行后OV=1,A与B不变。 例如,A=30H,B=07H,执行 DIV AB 后,A=06H,B=06H。 6.加1指令 INC A ;A← A + 1 INC Rn ;Rn← Rn + 1 INC direct ;(direct)← (direct)+ 1 INC @Ri ;(Ri)←(Ri)+ 1 INC DPTR ;DPTR← DPTR + 1 例如,(30H)=22H,执行 INC 30H 后,(30H)=23H。 7.减1指令 DEC A ;A← A - 1 DEC Rn ;Rn← Rn - 1 DEC direct ;direct← (direct)- 1 DEC @Ri ;(Ri)←(Ri)- 1 例如,R0=30H,(30H)=22H,执行 DEC @R0 后,(30H)=21H。 8.十进制调整指令 DA A ;把A中按二进制相加的结果调整成按BCD码相加的结果 例如,A=65BCD,B=78BCD,C=0,执行下列语句 ADD A,B DA A 后,A=43 BCD,C=1。 【例3.2】 试把存放在R1R2和R3R4中的两个16位数相加,结果存于R5R6中。 解:参考程序如下: MOV A,R2 ;取第一个数的低8位 ADD A,R4 ;两数的低8位相加 MOV R6,A ;保存和的低8位 MOV A,R1 ;取第一个数的高8位 ADDC A,R3 ;两数的高8位相加,并把低8位相加时的进位位加进来 MOV R5,A ;把相加的高8位存入R5寄存器中 SJMP $ 3.3.3 逻辑运算与循环类指令 1.“与”操作指令 2.“或”操作指令 3.“异或”操作指令 4.求反与清除指令 5.循环指令 3.3.4 程序转移类指令 1.无条件转移指令 ?????绝对(短)转移指令 AJMP addr11 ;PC10~0 ← addr11 ?????长转移指令 LJMP addr16 ;PC ← addr16 ?????短(相对)转移指令 SJMP rel ;PC ← PC + 2 + rel ???? 间接转移指令 JMP @A+DPTR ;PC ← A + DPTR 2.条件转移指令 ????累加器为零(非零)转移指令 ?????减1非零转移指令 ?????两数不等转移指令 ?????相对偏移量rel的求法 3.3.5 调用子程序及返回指令 1.调用子程序指令 LCALL addr16 ;PC←PC+3,SP←SP+1,(SP)←PC7~10 ;SP←SP+1,(SP)←PC15~8, PC←addr16 ACALL addr11 ;PC ←PC+2,SP←SP+1,(SP)←PC7~0 ;SP ← SP+1,(SP)← PC15~8,PC10~0←addr11 2.返回指令 RET ;PC15~8← (SP),SP←SP-1 ;PC7~0← (SP),SP←SP-1 RETI ;PC15~8←(SP),SP←SP-1 ;PC7~0 ←(SP),SP←SP-1 3.3.6 位操作指令 1.位数据传送指令 MOV C,bit ;C←(bit) MOV bit,C ;bit←C 2.位状态修改指令 CLR C ;C←0 CLR bit ;(bit)←0 CPL C ;C← CPL bit ;(bit)←(bit) SETB C ;C←1 SETB bit ;(bit)←1 3.位逻辑运算指令 ANL C,bit ;C←C∧(bit) ANL C,/bit ;C←C∧(bit) ORL C,bit ;C←C∨(bit) ORL C,/bit ;C←C∨(bit) 4.位转移指令 JC rel ; 若C=1, 则转移(PC←PC+2+rel);否则程序顺序执行 JNC rel ; 若C=0, 则转移(PC←PC+2+rel);否则程序顺序执 JB bit,rel ; 若(bit)=1, 则转移(PC←PC+3+rel);否则程序顺序执行 JNB bit,rel ; 若(bit)=0, 则转移(PC←PC+3+rel);否则程序顺序执行 JBC bit,rel ; 若(bit)=1, 则PC←PC+3+rel,(bit)←0;否则程序顺序执行 功能:分别检测指定位是1还是0,若条件符合,则CPU转向指定的目标地址去执行程序;否则,顺序执行下条指令。 3.3.7 空操作指令 NOP ;PC ← PC+1 这是一条单字节指令。执行时,不作任何操作(即空操作),仅将程序计数器PC的内容加1,使CPU指向下一条指令继续执行程序。这条指令常用来产生一个机器周期的时间延迟。 第4章 汇编语言程序设计 4.1 汇编语言基本概念 4.2 汇编语言程序设计 4.1 汇编语言基本概念 4.1.1 程序设计语言 4.1.2 汇编语言的语句结构 4.1.3 伪指令 4.1.1 程序设计语言 按照语言的结构及其功能可以分为三种: 1.机器语言:机器语言是用二进制代码0和1表示指令和数据的最原始的程序设计语言。 2.汇编语言:在汇编语言中,指令用助记符表示,地址、操作数可用标号、符号地址及字符等形式来描述。 3.高级语言:高级语言是接近于人的自然语言,面向过程而独立于机器的通用语言。 4.1.2 汇编语言的语句结构 1.汇编语言的指令类型 MCS-51单片机汇编语言,包含两类不同性质的指令。 (1)基本指令:即指令系统中的指令。它们都是机器能够执行的指令,每一条指令都有对应的机器码。 (2)伪指令:汇编时用于控制汇编的指令。它们都是机器不执行的指令,无机器码。 2.汇编语言的语句格式 汇编语言源程序是由汇编语句(即指令)组成的。汇编语言一般由四部分组成。 其典型的汇编语句格式如下: 标号: 操作码 操作数 ;注释 START:MOV A,30H ;A←(30H) 4.1.3 伪指令 1.ORG:汇编起始地址 用来说明以下程序段在存储器中存放的起始地址。 例如程序: ORG 1000H START: MOV A,#20H MOV B,#30H ┇ 2.EQU:赋值 给变量标号赋予一个确定的数值。 3.DB:定义数据字节 把数据以字节数的形式存放在存储器单元中。 4.DW:定义数据字 按字的形式把数据存放在存储单元中。 5.DS:定义存储区 从指定的地址单元开始,保留一定数量存储单元。 6.BIT:位定义 确定字符名为确定的位地址值。 7.END:汇编结束 4.2 汇编语言程序设计 4.2.1 汇编语言程序设计步骤 4.2.2 顺序程序 4.2.3 分支程序 4.2.4 循环程序 4.2.5 子程序 4.2.6 位操作程序 4.2.1 汇编语言程序设计步骤 1.分析问题 2.确定算法 3.设计程序流程图 4.分配内存单元 5.编写汇编语言源程序 6.调试程序 4.2.2 顺序程序 顺序程序是一种最简单,最基本的程序。 特点:程序按编写的顺序依次往下执行每一条 指令,直到最后一条。 【例4.1】 将30H单元内的两位BCD码拆开并转换成ASCII码,存入RAM两个单元中。程序流程如图4.1所示。参考程序如下: ORG 0100H MOV A,30H ;取值 ANL A,#0FH ;取低4位 ADD A,#30H ;转换成ASCII码 MOV 32H,A ;保存结果 MOV A,30H ;取值 SWAP A ;高4位与低4位互换 ANL A,#0FH ;取低4位(原来的高4位) ADD A,#30H ;转换成ASCII码 MOV 31H,A ;保存结果 SJMP $ END 【例4.2】 设X、Y两个小于10的整数分别存于片内30H、31H单元,试求两数的平方和并将结果存于32H单元。 解:两数均小于10,故两数的平方和小于100,可利用乘法指令求平方。程序流程如图4-2所示。参考程序如下: ORG 0100H MOV A,30H ;取30H单元数据 MOV B,A ;将X送入B寄存器 MUL AB ;求X2,结果在累加器中 MOV R1,A ;将结果暂存于R1寄存器中 MOV A,31H ;取31H单元数据 MOV B,A ;将Y送入B寄存器 MUL AB ;求Y2,结果在累加器中 ADD A,R1 ;求X2+ Y2 MOV 32H,A ;保存数据 SJMP $ ;暂停 END 4.2.3 分支程序 1.分支程序的基本形式 分支程序有三种基本形式,如图4-3所示。 分支程序的设计要点如下: (1)先建立可供条件转移指令测试的条件。 (2)选用合适的条件转移指令。 (3)在转移的目的地址处设定标号。 2.双向分支程序设计举例 【例4.3】 设X存在30H单元中,根据下式 X+2 X>0 Y = 100 X=0 ∣X∣ X<0 求出Y值,将Y值存入31H单元。 解:根据数据的符号位判别该数的正负,若最高位为0,再判别该数是否为0。程序流程如图4-4所示。 参考程序如下: ORG 0100H MOV A,30H ;取数 JB ACC.7,NEG;负数,转NEG JZ ZER0 ;为零,转ZER0 ADD A,#02H ;为正数,求X+2 AJMP SAVE ;转到SAVE,保存数据 ZER0:MOV A,# 64H ;数据为零,Y=100 AJMP SAVE ;转到SAVE,保存数据 NEG:DEC A ; CPL A ;求∣X∣ SAVE:MOV 31H,A ;保存数据 SJMP $ ;暂停 3.多向分支程序设计举例 【例4.4】 根据R0的值转向7个分支程序。 R0<10,转向SUB0; R0<20,转向SUB1; R0<60,转向SUB5; R0>=60,转向SUB6; 解:利用JMP @A+DPTR 指令直接给PC赋值,使程序实现转移。程序流程如图4-5所示。 参考程序如下: ORG 0100H MOV DPTR,#TAB;转移指令表首地址 MOV A,R0 ;取数 CLR C RLC A ;A←2*A JMP @A+DPTR ;PC ← A+DPTR TAB: AJMP SUB0 ;转移指令表 AJMP SUB1 AJMP SUB2 AJMP SUB5 AJMP SUB6 4.2.4 循环程序 1.循环程序的结构(如图4-6所示) ☆循环程序一般包括如下四个部分: (1)初始化 (2)循环体 (3)循环控制 (4)结束 ☆循环程序按结构形式,有单重循环与多重循环。 ☆在多重循环中,只允许外重循环嵌套内重循环。 ☆不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部(如图4-7所示)。 2.循环程序设计举例 【例4.5】有一数据块从片内RAM的30H单元开始存入,设数据块长度为10个单元。根据下式: X+2 X>0 Y= 100 X=0 ∣X∣ X<0 求出Y值,并将Y值放回原处。 解:设置一个计数器控制循环次数,每处理完一个数据,计数器减1。程序流程如图4-8所示。 参考源程序如下: ORG 0100H MOV R0,#10 MOV R1,#30H START:MOV A,@R1 ;取数 JB ACC.7,NEG ;若为负数,转NEG JZ ZER0 ;若为零,转ZER0 ADD A,#02H ;若为正数,求X+2 AJMP SAVE ;转到SAVE,保存数据 ZER0:MOV A,# 64H ;数据为零,Y=100 AJMP SAVE ;转到SAVE,保存数据 NEG: DEC A CPL A ;求∣X∣ SAVE:MOV @R1,A ;保存数据 INC R1 ;地址指针指向下一个地址 DJNZ R0,START ;数据未处理完,继续处理 SJMP $ ;暂停 4.2.5 子程序 1.子程序概念 所谓调用子程序,暂时中断主程序的执行,而转到子程序的入口地址去执行子程序。如图4-10所示。调用子程序应注意: (1)子程序占用的存储单元和寄存器。 (2)参数的传递。 (3)子程序经过调用后得到的数据来完成程序之间的参数传递。? (4)嵌套调用与递归调用。如图4-11所示。 2.子程序设计举例 【例4.8】 将4.4节中的例4.5改为子程序结构。 解:数据块中的十个数都需要进行符号判断并作相应处理,可把一部分工作交给子程序完成,主程序只负责读取数据、调用判断处理子程序、保存数据、循环控制工作。源程序如下: ORG 0100H MOV R0,#10 MOV R1,#30H START:MOV A,@R1 ;取数 ACALL DISPOSE ;调用判断、处理子程序 SAVE:MOV @R1,A ;保存数据 INC R1 ;修改地址指针,指向下一个地址 DJNZ R0,START ;数据未处理完,继续处理 SJMP $ ;暂停 ORG 0200H DISPOSE:JB ACC.7,NEG ;若为负数,转NEG JZ ZER0 ;若为零,转ZER0 ADD A,#02H ;若为正数,求X+2 AJMP BACK ;转到SAVE,保存数据 ZER0:MOV A,#64H ;数据为零,Y=100 AJMP BACK ;转到SAVE,保存数据 NEG:DEC A CPL A ;求∣X∣ BACK:RET 4.2.6 位操作程序 【例4.9】 编写一程序,实现图4-12中的逻辑运算电路。其中P3.1、P1.1、P1.0分别是单片机端口线上的信息,RS0、RS1是PSW寄存器中的两个标志位,30H、31H是两个位地址,运算结果由P1.0输出。 程序如下: ORG 0000H MOV C,P3.1 ANL C,P1.1 CPL C MOV 20H,C ;暂存数据 MOV C,30H ORL C,/31H ANL C,RS1 ANL C,20H ANL C,RS0 MOV P1.0,C ;输出结果 SJMP $ 第5章 定时/计数器与中断系统 5.1 定时/计数器结构特点及控制 5.2 中断系统结构及管理 5.3 定时/计数器及中断系统综合应 5.1 定时/计数器结构特点及控制 5.1.1 定时/计数器结构 5.1.2 定时/计数器工作方式 5.1.3 定时/计数器控制寄存器 5.1.4 定时/计数器常数的计算 5.1.1 定时/计数器结构 定时/计数器简称定时器,8031单片机有2个16位的定时/计数器:定时器0(T0)和定时器1(T1)。它们都有定时器或事件计数的功能,可用于定时控制、延时、对外部事件计数和检测等场合。 T0由2个特殊功能寄存器TH0和TL0构成,T1则由TH1和TL1构成。作计数器时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数,当输入脉冲信号从1到0的负跳变时,计数器就自动加1。计数的最高频率一般为振荡频率的1/24。 5.1.2 定时/计数器工作方式 每个定时/计数器还有4种工作模式,也就是每个定时器可构成4种电路结构模式。 在模式0、1和2,T0和T1的工作模式相同,在模式3,两个定时器的模式不同。下面以T1为例,分述各种工作模式的特点和用法。 1.模式0 2.模式1 3.模式2 4.模式3 5.1.3 定时/计数器控制寄存器 定时器共有2个控制寄存器TMOD和TCON,由软件写入TMOD和TCON 两个8位寄存器,设置各个定时器的操作模式和控制功能。 1.工作模式控制寄存器—TMOD(89H) 2.定时器控制寄存器—TCON(88H) 5.1.4 定时/计数器常数的计算 1.计数器初值的计算 把计数器计满为零所需要的计数值设定为C,计数初值设定为TC,由此可得到公式: TC=M-C 式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213;在方式1时M为216;在方式2和方式3时M为28。 2.定时器初值的计算 在定时器模式下,计数器由单片机主脉冲经12分频后计数。因此,定时器定时时间T的公式: T=(M-TC)T计数 上式也可写成:TC=M-T/ T计数 式中,M为模值,和定时器的工作方式有关;T计数是单片机振荡周期TCLK的12倍;TC为定时器的定时初值。 5.2 中断系统结构及管理 5.2.1 中断请求与控制 5.2.2 中断系统的结构 5.2.3 中断控制 5.2.4 中断响应过程 5.2.1 中断请求与控制 5.2.2 中断系统的结构 1.外部中断源 由P3.2端口线引入,低电平或下降沿引起。 由P3.3端口线引入,低电平或下降沿引起。 2.内部中断源(如图5-8所示) T0:定时/计数器0中断,由T0回零溢出引起。 T1:定时/计数器1中断,由T1回零溢出引起。 TI/RI:串行I/O中断,完成一帧字符发送/接收引起。 5.2.3 中断控制 1.中断允许寄存器IE(A8H) IE在特殊功能寄存器中,字节地址A8H,位地址分别是A8H~AFH。IE控制CPU对中断源总的开放或禁止以及每个中断源是否允许中断。其格式如图5-9所示。 2.中断优先寄存器IP(B8H) IP在特殊功能寄存器中,字节地址为B8H,位地址分别是B8H~BFH,IP用来锁存各中断源优先级的控制位,其格式如图5-10所示。 5.2.4 中断响应过程 单片机在每个机器周期的S5P2期间,顺序采样每个中断源,CPU在下一个机器周期S6期间按优先级顺序查询中断标志,如查询到某个中断标志为1,将在再下一个机器周期S1期间按优先级进行中断处理。 中断得到响应后自动清除中断标志,由硬件将程序计数器PC内容压入堆栈保护,然后将对应的中断矢量装入程序计数器PC,使程序转向中断矢量地址单元中去执行相应的中断服务程序。 下列任何一种情况存在中断申请将被封锁: (1)CPU正在执行一个同级或高一级的中断服务程序。 (2)当前正在执行的那条指令还未执行完。 (3)当前正在执行的指令是RETI或对IE,IP寄存器进行读/写指令,执行这些指令后至少再执行一条指令才会响应中断。 5.3 定时/计数器及中断系统综合应用 【例5.2】设MCS-51单片机系统时钟频率ФCLK为6MHZ,请编出利用定时/计数器T0在P1.0引脚上产生周期为2秒,占空比为50%的方波信号的程序 (1)主程序 任务: 1)T0工作方式的设定: 选择方式1(16位方式) (最大定时131ms) 2)定时常数的设定: TC=216-100ms/2μs =15536=3CB0H 即:TH0应装3CH,TL0应装B0H。 3)中断管理: 允许T0中断,开放总中断 即:IE应装10000010B。 4)启动定时器T0: SETB TR0 5)设置软件计数器初值:(如使用R7) 即R7应装0AH 6)动态停机:SJMP $ 主程序如下: MAIN:MOV TMOD,#01H ;设定T0为方式1 MOV TH0,#3CH ;装入定时常数高8位 MOV TL0,#0B0H ;装入定时常数低8位 MOV IE,#82H ;开放T0中断 SETB TR0 ;启动T0 MOV R7,#0AH ;设置软件计数器 SJMP $ (2)中断服务程序 任务:1)恢复T0常数; 2)软件计数器减1; 3)判断软件计数器是否为0。为0时,改变P1.0状态,并恢复软件计数器初值;不为0时中断返回。 程序如下: TOINT:MOV TL0,#0B0H ;恢复定时常数 MOV TH0,#3CH ; DJNZ R7,NEXT CPL P1.0 MOV R7,#0AH NEXT:RETI 完整程序如下: ORG 0000H AJMP MAIN ORG 000BH AJMP TOINT ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H MOV IE,#82H SETB TR0 MOV R7,#0AH SJMP $ TOINT:MOV TL0,#0B0H MOV TH0,#3CH DJNZ R7,NEXT CPL P1.0 MOV R7,#0AH NEXT:RETI END 第6章 MCS-51单片机系统扩展技术 6.1 MCS-51单片机系统扩展的基本概念 6.2 程序存储器扩展技术 6.3 数据存储器扩展 6.4 输入/输出口扩展技术 6.1 MCS-51单片机系统扩展的基本概念 6.1.1 MCS-51单片机最小应用系统 6.1.2 MCS-51单片机的外部扩展性能 6.1.1 MCS-51单片机最小应用系统 1.8051/8751最小应用系统(如图6-1所示)。由于集成度的限制,这种最小应用系统只能用作一些小型的控制单元。其应用特点是: (1)全部I/O口线均可供用户使用。 (2)内部存储器容量有限(只有4KB地址空间)。 (3)应用系统开发具有特殊性。 2.8031最小应用系统 8031是片内无程序存储器的单片机芯片,因此,其最小应用系统应在片外扩展EPROM。图6-2为用8031外接程序存储器构成的最小系统。 6.1.2 MCS-51单片机的外部扩展性能 1.MCS-51单片机的片外总线结构 MCS-51系列单片机片外引脚可以构成如图6-3所示的三总线结构: 地址总线(AB) 数据总线(DB) 控制总线(CB) 所有外部芯片都通过这三组总线进行扩展。 2.MCS-51单片机的系统扩展能力 ● 当系统要大量配置外围设备以及要扩展较多的I/O口时,将占去大量的RAM地址。 ● 当应用系统存储扩展容量或扩展I/O口地址超过单片机地址总线范围时,可采用换体法解决。如图6-4所示。 6.2 程序存储器扩展技术 6.2.1 EPROM扩展电路 6.2.2 EEPROM扩展电路(…) 6.2.1 EPROM扩展电路 1.2764A EPROM扩展电路 2.27128A EPROM扩展电路 6.2.2 EEPROM扩展电路 EEPROM是一种电擦除可编程只读存储器,其主要特点是能在计算机系统中进行在线修改,并能在断电的情况下保持修改的结果。因而在智能化仪器仪表、控制装置等领域得到普遍采用。 常用的EEPROM芯片主要有Intel 2817A、2864A等。 1.2817A EEPROM扩展 2.2864A EEPROM 扩展 2864A有四种工作方式: (1)维持方式 (2)读出方式 (3)写入方式 (4)数据查询方式 2864A与8031单片机的硬件连接如图6-12所示。 6.3 数据存储器扩展 6.3.1 静态RAM扩展电路 6.3.2 动态RAM扩展电路(…) 6.3.1 静态RAM扩展电路 常用的静态RAM芯片有6116,6264,62256等,其管脚配置如图6-13所示。 1.6264静态RAM扩展 表6-1给出了6264的操作方式,图6-14为6264静态RAM扩展电路。 2.62256静态RAM扩展 62256是32K×8位静态随机存储器芯片,CMOS工艺制作,单一+5V供电。28脚双列直插式封装。 6.3.2 动态RAM扩展电 1.2164A动态RAM扩展 ? 行列地址选通信号 ?????刷新方法 ?????地址信息延时的实现 2.2186集成动态RAM扩展 2186是片内具有8K×8位动态RAM系统的集成RAM。单一+5V供电,工作电流70mA,维持电流20mA,存取时间为250ns。28脚双列直插式封装,管脚与6264静态RAM完全兼容,其管脚配置如图6-18所示。 图6-19给出了8051/8751扩展2186集成动态RAM的硬件电路图。 6.4 输入/输出口扩展技术 6.4.1 简单I/O口扩展 6.4.2 可编程I/O口扩展 6.4.1 简单I/O口扩展 1.用并行口扩展I/O口 只要根据“输入三态,输出锁存”与总线相连的原则,选择74LS系列的TTL电路或MOS电路即能组成简单的扩展I/O口。例如采用8位三态缓冲器74LS244组成输入口,采用8D锁存器74LS273,74LS373,74LS377等组成输出口。 图6-20给出了一种简单的输入、输出口扩展电路。当要扩展多个输入/输出口时,可采用图6-21所示连接方法。 2.用串行口扩展I/O口 当MCS-51单片机串行口工作在方式0时,使用移位寄存器芯片可以扩展一个或多个8位并行I/O口。这种方法不会占用片外RAM地址,而且可节省单片机的硬件开销。缺点是操作速度较慢,扩展芯片越多,速度越慢。 图6-22和图6-23分别给出了利用串行口扩展2个8位并行输入口(使用74LS165)和扩展2个8位并行输出口(使用74LS164)的接口电路。 6.4.2 可编程I/O口扩展 1.8155的结构和技术性能 图6-24是8155的结构框图。在8155内部具有: (1)256字节的静态RAM,存取时间为400ns。 (2)三个通用的输入/输出口。 (3)一个14位的可编程定时/计数器。 (4)地址锁存器及多路转换的地址和数据总线。 (5)单一+5V电源,40脚双列直插式封装。 2.8155的RAM和I/O地址编码 3.8155的工作方式与基本操作 (1)作片外256字节RAM使用。 (2)作扩展I/O口使用。命令控制字的格式如图6-25所示。其中C口工作方式如表6-4所示。状态字格式如图6-26所示。 (3)作定时器使用。其格式如图6-27所示。 4.MCS-51单片机与8155的接口与操作 MCS-51单片机可直接和8155连接而不需要任何外加逻辑,可以直接为系统增加256字节外部RAM、22根I/O线及一个14位定时器。其基本硬件连接方法如图6-28所示。