《单片机原理及应用》项目三--MCS–51程序设计——交通信号灯模拟系统设计_第1页
《单片机原理及应用》项目三--MCS–51程序设计——交通信号灯模拟系统设计_第2页
《单片机原理及应用》项目三--MCS–51程序设计——交通信号灯模拟系统设计_第3页
《单片机原理及应用》项目三--MCS–51程序设计——交通信号灯模拟系统设计_第4页
《单片机原理及应用》项目三--MCS–51程序设计——交通信号灯模拟系统设计_第5页
已阅读5页,还剩178页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机原理及应用技术MCS51程序设计交通信号灯模拟系统设计任务一 MCS-51指令系统入门任务二 指令系统任务三 汇编语言程序设计基础任务四 典型应用交通信号灯模拟 系统设计Project任务1MCS-51指令系统入门指令系统概述one由于单片机的硬件只能识别二进制数,因此最初的指令采用二进制表示,后来用八进制和十六进制表示,这些都称为机器语言。机器语言不易理解,不易记忆,编制程序容易出错。为了便于阅读和书写,一些厂商根据指令功能和操作对象的不同,给出不同指令的英文缩写符号,称为助记符。用助记符表示的指令称为汇编语言指令。我们将要学习的就是这种指令,需要注意的是,汇编语言指令不能直接运行,它

2、要翻译为机器语言指令后才能运行。指令是单片机能够识别和执行的命令,一个单片机能够执行的全部指令的集合称为这个单片机的指令系统。提示单片机的指令系统由其生产厂商定义,因此,不同的单片机具有不同的指令系统。指令格式two一条指令通常由操作码和操作数两部分组成。操作码表示本条指令所要执行的操作,操作数则表示本条指令的操作对象。指令格式如下:操作码 操作数1,操作数2,操作数3操作码和操作数之间必须空一个格,操作数之间用逗号“,”隔开。操作码一般使用25个英文字母的助记符表示,如JC,MOV,SUBB等。在不同的指令中,操作数的数量从03个不同。它可以是一个数据,也可以是一个地址或寄存器符号。指令格式

3、two在MCS-51系统中采用变长指令,对于不同类型的指令,或者相同指令的操作数类型不同,其长度是可变的,因此,MCS-51指令为变长指令。大部分指令的长度为13个字节。提示对于双操作数指令来说,一般操作数1是目的操作数,操作数2是源操作数。采用RISC的单片机,每条指令的长度相同,如ARM芯片全部指令都是32位的。指令中常用符号three符号含义A累加器ACCB寄存器BRi寄存器间接寻址的寄存器(i=0或1)Rn当前工作寄存器R0R7的一个bit具有位寻址功能的位地址rel用补码形式表示的偏移量,范围为 128+127#data指令中的8位立即数,即00HFFH#data16指令中的16位立

4、即数,即0000HFFFFHaddr1111位的目的地址,只限于ACALL和AJMP中使用addr1616位的目的地址,只限于LCALL和LJMP中使用direct8位片内RAM的00H7FH地址范围和SFRMCS-51系列单片机指令中常用助记符及含义符号含义(X)X的内容(X)以X的内容为地址的内容/加在位地址之前,表示对该位取反#立即数前缀间址寄存器前缀程序计数器PC的当前值箭头右面的数据传送到箭头左面逻辑与运算逻辑或运算逻辑异或运算DPTR16位片外数据指针,范围为0000HFFFFH续上表指令分类fourMCS-51系列单片机指令系统共有111条指令,可分为以下5大类。数据传送类指令(

5、29条)算数运算类指令(24条)逻辑运算类指令与位移指令(24条)控制转移类指令(17条)位操作指令(17条)寻址方式five大部分指令都需要使用操作数,在执行指令过程中,去何处取得操作数是需要解决的问题,寻找操作数地址的方式就称为寻址方式。源操作数和目的操作数都存在寻址问题。在MCS-51系列单片机中设有7种寻址方式,即立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。寻址方式越丰富,CPU功能越强,灵活性就越大,处理数据的效率也就越高。寻址方式相应寻址空间立即寻址程序存储器ROM直接寻址片内RAM寄存器寻址R0R7、A、B、DPTR等寄存器间接寻址片内RAM中00

6、H7FH区间及片外RAM变址寻址程序存储器ROM相对寻址以当前PC值为基址,偏移范围128+127字节的ROM位寻址片内RAM位寻址区202FH及部分SFR寻址方式的设定与单片机的存储空间有关,MCS-51单片机不同寻址方式对应不同的寻址空间,如表所示。MCS-51系列单片机寻址方式所对应寻址空间1)立即寻址立即寻址是指在指令中直接给出参加运算的操作数的寻址方式。这种形式的操作数称为立即数。为了与直接寻址指令中的直接地址相区别,立即数前面要加“#”标志。【例3-1】编号汇编语言指令机器语言指令功能aMOV A,#40H7440H(A)40HbMOV DPTR,#4000H904000H(DPT

7、R)4000H立即寻址方式如表所示:提示MCS-51指令表中可以查到指令a的机器码为74H data,指令b的机器码为90H data。项目三寻址方式的例子中均假设PC初值为40H,立即寻址方式具体操作如图所示:A4074ROMPC 40HDPTR0040ROM90DPHDPLPC 40H提示立即数是指令的一部分,存放在程序存储器ROM中。在8051单片机的指令系统中,仅有一条指令MOV DPTR,#X的操作数是16位的立即数。(a)MOV A,#40H(b)MOV DPTR,#4000H2 直接寻址直接寻址是指在指令中直接给出操作数地址的寻址方式。指令中出现的是操作数的地址(指令表中以“di

8、rect”标识),此单元地址中的内容才是实际参与运算或操作的操作数。在8051系列单片机中,CPU通过直接寻址方式可以访问片内RAM区间00HFFH共128单元(包括位寻址区20H2FH)以及特殊功能寄存器SFR。【例3-2】编号汇编语言指令机器语言指令功能aMOV A,60HE560H(A)(60H)bMOV A,88HE588H(A)(88H)cMOV A,TCONE588H(A)(88H)编号汇编语言指令机器语言指令功能直接寻址方式如表所示:在项目二中,我们知道定时器控制字TCON的地址是88H单元。所以编号b和编号c两条指令的表述是等价的,翻译为机器指令后是相同的。自然,其执行结果也相

9、同,即将88H单元的内容送累加器A。XX片内RAM60H41HAPC 40HROM60E5 88H TCONSFR41HPC 40HROM88E5A(a)MOV A,60H(b)MOV A,88H/MOV A,CON直接寻址方式具体操作如图所示:提示对于SFR,可以采用16进制的地址形式表示,也可以用它们各自的名称符号来表示,以增强程序的可读性。3 寄存器寻址寄存器寻址是指以指令中寄存器的内容作为操作数的寻址方式。指令中用寄存器的名字来表示实际参与运算或操作的操作数的地址。这些寄存器有工作寄存器R0R7、累加器A、通用寄存器B、数据指针DPTR、进位Cy等。【例3-3】寄存器寻址方式如表所示:

10、编号汇编语言指令机器语言指令功能aMOV A,R011101000(E8H)(A)(R0)bINC R300001011(0BH)(R3)(R3)+1指令a(MOV A,R0)中,目的操作数与源操作数均采用寄存器寻址方式,该指令二进制形式的低三位000是Rn寄存器编码;指令b(INC R3)只有一个操作数,指令执行加1操作。指令a的具体操作如图所示,指令b的原理相同:XXPC 40HROM11101000AR1 001R0 000R7 111寄存器寻址示意图4 寄存器间寻址寄存器间接寻址是指以指令中寄存器的内容作为操作数地址的寻址方式。寄存器中存放的不是操作数本身,而是操作数的地址。寄存器Ri

11、(i=0或1)和DPTR用于寄存器间接寻址。采用寄存器间址寻址方式时,在寄存器前加“”符号,以便区分于寄存器寻址方式。对片内RAM的低128个字节(007FH)进行访问时,通常使用Ri作为间址寄存器。通过项目一的学习我们知道,R0和R1均为8位寄存器,寻址范围可以达到28字节即256字节。对片外RAM的64K存储空间进行访问时,应该使用DPTR作为间址寄存器。DPTR是一个16位寄存器,寻址范围可以达到64K。【例3-4】编号汇编语言指令机器语言指令功能aMOV A,R111100111(E7H)(A)(R1)bMOVX A,DPTR11100000(E0H)(A) (DPTR)寄存器间址寻址

12、方式如表所示:两条指令寻址过程类似,这里只以其中一条为例。假设R1中内容为60H,指令a的具体操作如图所示:寄存器间接寻址示意图PC 40HROM1110011160R1A60H片内RAMXX提示不能通过寄存器间接寻址方式访问特殊功能寄存器SFR。5 变址寻址变址寻址方式是指以某个寄存器的内容为基本地址,在基本地址的基础上加上地址偏移量后,才能得到真正的操作数地址的寻址方式。在MCS-51系列单片机中,数据指针DPTR和程序计数器PC作为基址寄存器,累加器A用来存放地址偏移量。【例3-5】变址寻址方式如表所示:编号汇编语言指令机器语言指令功能aMOVC A,A+PC83H(A)(A)+(PC)

13、bMOVXC A,A+DPTR93H(A)(A)+(DPTR)cJMP A+DPTR73H(PC)(A)+(DPTR)注意在MCS-51系统中变址寻址的指令只有上表中的3条,只用来对ROM寻址。前2条指令主要用于查表操作,第3条是无条件转移指令。PC的值是随程序的执行情况自动改变的,我们不可以随便地给PC赋值,累加器A是一个8位的寄存器,因此指令a的寻址范围是在当前指令下的256个地址单元。当前PC的内容为40H,CPU到40H单元取出指令83H后,将PC中的内容0040H与A中内容20H送ALU相加(同时PC指向下一条将要执行的指令),相加得到的结果60H即为我们所要寻找的操作数的地址。随后

14、,60H地址单元的内容被送往累加器A,整条指令完成。我们假设累加器A的内容为20H,指令a的具体操作如图所示:寄存器寻址示意图XX 60H83HPCA0040H 40HROM20HALU6 相对寻址相对寻址是指以当前PC内容加上指令中给出的相对偏移量形成程序转移的目的地址的寻址方式。这种寻址方式专为实现程序的跳转功能而设计。指令的操作数部分给出的是地址的相对偏移量,在MCS-51系列单片机中常以“rel”表示。它是一个带符号的8位二进制补码数,可正可负,范围是128+127,向地址小的方向转移时为负,向地址大的方向转移时为正。【例3-6】编号汇编语言指令机器语言指令功能aSJMP 04H800

15、4H(PC)(PC)+2+04HbJZ rel60 rel若A0时,(PC)(PC)+2若A=0时,(PC)(PC)+2+rel相对寻址方式如表所示:在指令a中,我们可以看到,PC的当前值加上地址偏移量04H构成了程序跳转的目的地址。需要注意的是,这里所说的PC的当前值是指执行完本条转移指令后的PC值,即PC值加上该指令字节数2。指令b是一条条件转移指令,以累加器A的内容是否为0作为判断条件。为了方便区分,这里将PC的源地址记作PC源,取出本条指令后PC的值记为PC当前,最后形成的目的地址记为PC目的。指令a的具体操作如图所示:相对寻址示意图注意我们人工计算目的地址时,会采用公式PC目的=PC

16、源+指令所占字节数+rel。从图3-6中可知,实际上CPU在取出2个字节的指令码后,PC指针已经指向了PC当前的位置,因此,在机器运算中PC目的是由PC当前和rel直接相加得到的。rel=04HPC当前=0042HPC目的 0046HPC当前 0042H0041HPC源 0040H0480ROMALU7 位寻址位寻址是指对位寻址空间按位进行寻址的操作,指令表中以“bit”表示。在进行位操作处理时,一般借助进位位Cy作为位操作累加器C。MCS-51系列芯片中有以下两个位寻址区。11个特殊功能寄存器SFR分布在RAM的80FFH地址单元,它们的地址单元均能被8整除。具体分布情况参见表2-4。片内R

17、AM的位寻址区地址范围是202FH,共128位,每一位都可以作为独立操作数。具体分布情况参见表2-3。(1)直接用物理地址00HFFH来表示MCS-51系列芯片中有以下四种位地址表示方式:【例3-7】MOV C,2BH指令含义是将位地址为2BH的位内容送Cy。2BH是位地址的物理形式,表示片内RAM25H单元的D3位。位寻址方式是位操作指令专用的,不必担心位地址会与直接寻址中的地址混淆。技巧(2)采用地址单元加位数的表示方法。上面的指令可以改写为:MOV C,2BH.3(3)对于SFR可以采用寄存器名加位数的表示方法。(4)采用伪指令定义方式。详见任务三汇编语言程序设计基础中的伪指令部分。【例

18、3-8】MOV C,P3.4,指令含义是将并行接口P3口的D4位内容送Cy。任务2指令系统数据传送类指令one根据这些指令作用的不同,将其分为内部数据传送指令、外部数据传送指令、访问程序存储器指令、堆栈操作指令和数据交换指令5类。“传送”是指将源地址单元内容送到目的单元中去,数据传送后,源地址单元内容保持不变;“交换”是指将源地址单元内容和目的地址单元内容互换。数据传送类指令中,执行目的操作数为A或对A进行单独操作的指令后,会影响PSW中奇偶标志位P。其他情况不影响标志位。数据传送类指令是编程时使用最多的指令。MCS-51系列单片机数据传送指令共有29条,用到的助记符有MOV、MOVX、MOV

19、C、XCH、XCHD、SWAP、PUSH和POP共8种。1 内部数据传送指令内部数据传送指令共16条,助记符均为“MOV”,英文为“Move”。(1)以累加器A为目的操作数的传送指令编号指令格式机器语言指令功能字节数指令周期数aMOV A,RnE8EF(A)(Rn)11bMOV A,directE5 direct(A)(direct)21cMOV A,RiE6E7(A)(Ri)11dMOV A,#data74 data(A)data21指令a和指令c源操作数分别采用寄存器寻址和寄存器间接寻址方式。由指令的机器语言形式可以看出,这两条指令占用字节数较少,都为1字节;指令b和指令d分别采用直接寻址

20、和立即寻址方式,两条指令都占2个字节数。上述4条指令的指令周期数都为1个机器周期。指令a中,n=07,机器语言E8EF分别对应源操作数为R0R7的指令;指令c中,i=0或1,机器语言E6E7对应源操作数为R0和R1的指令。【例3-9】以累加器A为目的操作数的传送指令示例MOVA,R3;将工作寄存器R3内容送A,A中内容保持不变MOVA,40H;将30H地址单元的内容送A,30H地址单元的内容保持不变MOVA,R0;以R0的内容为地址,将找到的地址单元中的内容送A。该地址单元的内容及R0的内容均保持不变MOVA,#66H;将立即数66H送A,本条指令执行完成后,A中内容为66H(2)以寄存器Rn

21、和DPTR为目的操作数的传送指令编号指令格式机器语言指令功能字节数指令周期数aMOV Rn,#data787F data(Rn)data21bMOV Rn,directA8AF direct(Rn)(direct)22cMOV Rn,AF8FF(Rn)(A)11dMOV DPTR,#data1690 dataH dataL(DPH)dataH(DPL)dataL32以寄存器Rn为目的操作数的传送指令共3条,以操作数为DPTR的指令有1条。4条指令如表所示。指令a、指令b和指令c中源操作数分别采用立即寻址、直接寻址和寄存器寻址方式。这3条指令的功能是将最终获得的8位数据送当前工作寄存器Rn。【例

22、3-10】以寄存器Rn为目的操作数的传送指令示例MOV R0,#68H;将立即数68H送R0,指令执行完成后,R0中内容为68HMOVR1,40H;将40H地址单元的内容送R1,40H地址单元的内容保持不变MOVR2,A;将累加器A中内容送R2,A中内容保持不变注意工作寄存器Rn之间不能直接传送数据,如“MOV Rn,Rn”和“MOV Rn,Rn”都是错误的。要在工作寄存器之间传递数据,可以由累加器A作为中介。指令d是MCS-51指令系统中唯一一条16位的立即数传送指令。它的功能是将16位的立即数#data16送数据指针DPTR,其中高8位dataH送DPH,低8位dataL送DPL。【例3-

23、11】三字节双周期指令示例MOVDPTR,#2046H;将16位的立即数送DPTR。MOVDPH,#20H;数据的高8位20H送DPH。MOVDPL,#46H ;数据的低8位46H送DPL。实际上,本条指令的执行过程相当于执行以下两条8位数据传送指令。(3)以直接地址direct为目的操作数的传送指令编号指令格式机器语言指令功能字节数指令周期数aMOV direct,#data75 direct data(direct)data32bMOV direct,AF5 direct(direct)(A)21cMOV direct,Rn888F direct(direct)(Rn)22dMOV dir

24、ect,Ri8687 direct(direct)(Ri)22eMOV direct1,direct285 direct1,direct2(direct1)(direct2)32以直接地址direct为目的操作数的传送指令共5条,这里需要注意的是direct的地址范围是片内RAM的007FH地址单元和SFR地址单元。5条指令具体情况如表所示:上述5条指令均是8位数送direct。指令e的源操作数和目的操作数均为直接寻址方式。由此我们可以知道,片内RAM之间的数据可以直接传送,而不必以累加器A为中介。注意direct的地址范围并不是00FFH。在表1-5中我们已经知道片内RAM的80FF地址单元

25、并没有完全定义,对未定义的地址单元进行存取和访问,会得到不确定的数,建议用户不要使用。【例3-12】以直接地址direct为目的操作数的传送指令示例MOV 80H,#68H;将立即数68H送片内RAM的80H地址单元。并行接口P0端口的物理地址为80H,指令执行完成后,P0端口的内容为68H。MOV20H,A;将累加器A的内容送片内RAM的20H地址单元,指令执行完成后,20H地址单元内容与A中内容相同MOV30H,R4;将工作寄存器R4的内容送片内RAM的30H地址单元。MOV40H,R0;以R0的内容为地址,将找到的地址单元中的内容送片内RAM的40H地址单元MOVE0H,80H;将P0端

26、口的内容送累加器A(累加器A的物理地址为E0H)(4)以寄存器间址Ri为目的操作数的传送指令编号指令格式机器语言指令功能字节数指令周期数aMOV Rn,#data787F data(Rn)data21bMOV Rn,directA8AF direct(Rn)(direct)22cMOV Rn,AF8FF(Rn)(A)11dMOV DPTR,#data1690 dataH dataL(DPH)dataH(DPL)dataL32以寄存器间址Ri为目的操作数的传送指令共3条,如表所示。三条指令的功能均是把源操作数所指定的内容送Ri所指向的地址单元。【例3-13】以寄存器间址Ri为目的操作数的传送指令

27、示例MOV R0,#68H;将立即数68H送工作寄存器R0所指向的地址单元MOV R0,68H;将片内RAM的68H地址单元的内容送工作寄存器R0所指向的地址单元MOV R1,A;将累加器A的内容送工作寄存器R1所指向的地址单元编号指令格式机器语言指令功能字节数指令周期数aMOVX Ri,AF2F3(Ri)(A)12bMOVX A,RiE2E3(A)(Ri)12cMOVX DPTR,AF0(DPTR)(A)12dMOVX A,DPTRE0(A)(DPTR)122 外部数据传送指令MCS-51系列单片机指令系统中,外部数据传送指令共4条,用于和外部数据存储器之间传送数据。助记符均为“MOVX”,

28、来自英文“Move External RAM”。指令如表所示:由上表我们可以看出,与外部数据存储器之间的数据传送都是以累加器A作为中介进行的。指令a和指令c是将A中的内容送达通过间接寻址获得的外部数据单元,即对外部存储器进行写操作。指令b和指令d是将通过间接寻址方式获得的外部数据单元的内容送达A,即对外部存储器进行读操作。指令a和指令b采用8位Ri作为间址寄存器。8位地址和数据均由P0口分时输入或输出。R0和R1都是一个字节,因此前两条指令的寻址范围是256字节。如果超出此范围,一般选用P2口来输出高8位地址,并在MOVX指令前将高8位地址写入P2口。指令c和指令d采用16位数据指针DPTR作

29、为间址寄存器,可寻址64KB的外部数据存储器。16位地址读取采用分开的方式进行,低8位地址DPL由P0口输出,高8位地址DPH由P2口输出。【例3-14】将片内存储器40H地址单元的内容送到外部数据存储器2046H单元。这里给出两种实现方式。MOV A,40H;40H地址单元的内容送AMOV P2,#20H;将外部数据存储器2046H高8位20H送P2端口MOV R0,#46H;将外部数据存储器2046H低8位46H送R0MOVX R0,A;将片内存储器40H地址单元的内容送到片外RAM2046H单元方法一:MOVDPTR,#2046;40H地址单元的内容送AMOVA,40H;将外部数据存储器

30、2046H高8位20H送P2端口MOVXDPTR,A;将片内存储器40H地址单元的内容送到片外RAM2046H单元方法二:编号指令格式机器语言指令功能字节数指令周期数aMOVC A,A+ DPTR93(A)(A)+(DPTR)12bMOVC A,A+ PC83(A)(A)+(PC)123 访问程序存储器指令MCS-51系列单片机指令系统中,访问程序存储器指令有2条,用于查询存放在程序存储器的固定表格或常数,因此,这两条指令也被称为查表指令。助记符均为“MOVC”,来自英文“Move Code”。指令具体情况如表所示。指令a和指令b源操作数均采用变址寻址方式,寻址过程类似。但是,两条指令的基址寄

31、存器不同,因此指令的适用范围也就不同。指令a以DPTR作为基址寄存器。DPTR是一个16位的寄存器,寻址范围可达64KB。每次查表前,只需将表头地址送入DPTR,就可以方便地使用本条指令查找存放在程序存储器64KB范围内的远程表格或数据了。指令b以PC作为基址寄存器,PC的功能比较特殊,它指向的是当前执行指令的地址。由于PC的值已经确定,查表范围是由累加器A决定的,所以本条指令所能查找的数据只能存放在以当前PC值为起始地址的256字节范围内,一般称为本地表。【例3-15】假设表头地址为41H,A的内容为02H,指令a的执行过程如图所示。在指令a执行过程中,首先要通过变址寻址方式获得源操作数的地

32、址,取出DPTR的值与累加器A的内容相加,即50H+02H=52H。然后将52H中的内容送累加器A,PC内容加1,整条指令完成。指令b的寻址和执行过程与指令a相似。需要注意的是,指令b中的PC值是随程序的执行而变化的。A52HXX50HDPTR 41HMOVC A,A+ DPTRPC 40H93ROMALU02H指令a执行过程示意图编号指令格式机器语言指令功能字节数指令周期数aPUSH directC0(SP)(SP)+1,(SP)(direct)12bPOP directD0(direct)(SP),(SP)(SP)1124 堆栈操作指令用于堆栈操作的命令有两条,POP和PUSH命令,它们的

33、操作数只有一个direct,如表所示。堆栈指令的操作对象是采用直接寻址方式表示的片内RAM低128字节或SFR单元的内容。堆栈操作遵循“后进先出”原则,对堆栈指针SP所指向的地址单元进行压入和弹出操作,PUSH指令和POP指令要成对使用指令b的功能指令b的功能是将栈顶单元的内容弹出送direct地址单元中。在指令执行过程中,数据首先被弹出,然后堆栈指针减1,指向新的栈顶单元。指令a的功能指令a的功能是将direct地址单元的内容压入堆栈。在指令执行过程中,堆栈指针SP先加1,升高栈顶,指向新数据所要存入的地址单元,然后,将数据压入。【例3-16】假设片外ROM地址单元从2046H开始存放着19

34、的立方值。数据指针的初值为4000H,用查表指令取得2048H地址单元的数据后,要求保持DPTR的初值不变。程序如下,指令执行完成结果为:(A)=1BH,(DPTR)=4000H。MOVA,#02H;2048H2046H的地址偏移量02H送APUSHDPH;保护DPTR的高8位入栈PUSHDPL;保护DPTR的低8位入栈MOVDPTR,#2046H;改变数据指针DPTR的初值MOVCA,A+DPTR;采用间接寻址方式将2048H地址单元内容送APOPDPL;弹出DPTR低8位POPDPH;弹出DPTR高8位从上边的例子可以看出,在改变DPTR指针的内容前我们先将其初值4000H压入栈中。当获得

35、2048H地址单元的内容即33后,依照“后进先出”的原则将DPTR的初值弹出。编号指令格式机器语言指令功能字节数指令周期数aXCH A,RnC8CF(A) (Rn)11bXCH A,directC5 direct(A) (direct)21cXCH A,RiC6C7(A) (Ri)11dXCHD A,RiD6D7(A) (Ri)3-011eSWAP AC4(A)7-4 (A)3-0115 数据交换指令MCS-51系列单片机指令系统中,数据交换指令有5条。用到的助记符有为“XCH”、“XCHD”和“SWAP”,这三个助记符来源于均具有“交换”词意的英文单词“Exchange”和“Swap”。指令

36、的具体情况如表所示:5条指令的目的操作数均为累加器A,寻址空间为内部RAM。前3条指令均为整字节交换指令,指令功能是将通过不同寻址方式获得的片内RAM地址单元的内容和累加器A的内容交换。后面两条指令是半字节交换指令,指令d是将寻址获得的地址单元内容的低四位与A中的低四位进行交换,高四位保持不变;指令e是将累加器A本身的低四位与高四位交换。算术运算类指令two在MCS-51系列单片机指令系统中,算术运算类指令共有24条。用到的助记符有ADD、ADDC、SUBB、DA、INC、DEC、MUL和DIV共9种。算术运算类指令可以进行加、减、乘、除和十进制调整等运算。执行这些指令会影响到PSW的相关标志

37、位,如进位位Cy、辅助进位位AC、溢出位OV和奇偶校验位P,参见项目二程序状态字PSW。下面将24条指令按功能分为加法和减法指令、乘法和除法指令两部分进行讲述。1 加法和减法指令(1)不带进位的加法运算指令编号指令格式机器语言指令功能字节数指令周期数aADD A,#data24 data(A)(A)+data21bADD A,Rn282F(A)(A)+(Rn)11cADD A,direct25 direct(A)(A)+(direct)21dADD A,Ri2627(A)(A)+(Ri)11不带进位的加法运算指令共4条,使用助记符ADD,来自英文“Addition”。指令具体情况如表所示。这四

38、条指令的功能是将累加器A的内容与源操作数(源操作数可以通过表中4种寻址方式获得)相加,结果存放A中,运算结果将对PSW的相关位产生影响。这里设8位数从低到高为07位,执行运算指令后,单片机按以下规则对PSW的各标志位置位。不管最初将数定义为无符号数还是有符号数,运算器在做加法运算过程中,总是将各位的值当无符号数去进行运算。在执行加法指令运算时,若结果的第3、7位有进位时,分别将AC、Cy标志位置1;否则置0。提示有符号数和无符号数判断溢出的方法不同:有符号数:针对二进制数而言的表示方式,有符号数将用最高位作为符号位,“0”代表“+”,“1”代表“-”;其余位均用作数值位,代表数值。无符号数:无

39、符号数的全部二进制均代表数值,没有符号位,即第一个“0”或“1”不表示数值的正负。对于无符号数加法运算若进位标志位(Cy)1,表示相加结果超出255,产生溢出;若(Cy)0表示无溢出,结果正确。OV对于无符号数判断溢出没有意义。对于有符号数加法运算正数和负数相加不可能产生溢出,两个正数相加为负或两个负数相加为正,则一定产生溢出。溢出位OV是通过公式OV=C7C6进行置位的,C7表示最高位的进位,C6表示次高位的进位。上述两条指令运行结束后,A中的内容为B2H,二进制表示为10110010。运算过程中由于低四位向高四位有进位,故(AC)=1。最高位没有进位,故(Cy)=0。由于C7C6均为0,O

40、V=C7C6,故(OV)=0。运算结果中有4个1,故奇偶标志位(P)=0。由此可见,两个16进制数无论作为有符号数还是无符号数,相加结果都没有产生溢出。【例3-17】两个16进制数2BH和86H相加MOVA,#2BH;将加数2BH送累加器AADDA,#86H;执行加法指令,2BH与86H相加(2)带进位的加法运算指令编号指令格式机器语言指令功能字节数指令周期数aADDC A,#data34 data(A)(A)+data+(Cy)21bADDC A,Rn383F(A)(A)+(Rn)+(Cy)11cADDC A,direct35 direct(A)(A)+(direct)+(Cy)21dADD

41、C A,Ri3637(A)(A)+(Ri)+(Cy)11带进位的加法运算指令共4条,使用助记符ADDC,来自英文“Add with Carry”。指令具体情况如表所示。注:Cy是指指令开始执行时的进位标志,而不是指令执行过程中产生的Cy通过与(1)中表的对比我们可以知道,带进位的加法运算指令除两个操作数外,还要加上进位表示Cy,因此,这些指令常用于多字节数加法运算。51单片机是一种8位机,所以只能做8位的数学运算,无符号数能够表示0255,有符号数能够表示128+127。然而,在实际工作中往往是不够的,因此就要进行扩展。一般是将2个8位的数学运算合起来,成为一个16位的运算,这样,能表示的数的

42、范围就能达到065535。下面我们通过例子来理解这种运算方式。先看一个十进制运算的例子。例如:24+28这两个数相加我们很快就能得出运算结果52。事实上我们是这样做的:先做4+8(低位),相加结果为12,我们会做一个进位标记,向前进一位,本位值为2;然后再做2+2(高位),还要加上低位的进位1,高位值为5。【例3-18】2046H+11E2H,将相加的结果放在片外数据存储器以2046H为起始地址的地址单元。先做46H+E2H=138H,而138H显然超过了0FFH,因此最终保存在A中的是38H,而“1”只能用到PSW中的Cy位表示。然后再做20H+11H+(Cy),结果是32H,所以最终的结果

43、是3238H。MOVDPTR,#2046HMOVA,#46HADDA,#E2HMOVXDPTR,AINCDPTRMOVA,#20HADDCA,#11HMOVXDPTR,A程序段如下:单片机中做16位加法时采用同样的原理,先做低8位的,如果两数相加产生了进位,也要做个标记,这个标记就是进位位Cy。(3)带借位减法运算指令编号指令格式机器语言指令功能字节数指令周期数aSUBB A,#data94 data(A)(A)-data-(Cy)21bSUBB A,Rn989F(A)(A)-(Rn)-(Cy)11cSUBB A,direct95 direct(A)(A)-(direct)-(Cy)21dSU

44、BB A,Ri9697(A)(A)-(Ri)-(Cy)11带借位减法运算指令共4条,使用助记符SUBB,来自英文单词“Subtract with Borrow”。Cy定义为最高位的借位。指令具体情况如表所示。这四条指令的功能是用累加器A中的内容减去源操作数所指定的内容,再减去Cy的值,将结果存放在A中。减法运算的结果也会影响到PSW的标志位,各标志位的产生法则和加法运算相同。在执行减法指令运算时,若最高位有借位,则(Cy)=1,否则(Cy)=0。若低四位向高四位借位,则(AC)=1,否则(AC)=0。对于无符号数减法运算对于有符号数减法运算有符号数和无符号数判断是否溢出的方法OV=C7C6,C

45、7表示最高位的借位,C6表示次高位的借位。若(OV)=0,表示运算正确;若(OV)=1,表示运算产生了溢出,结果是错误的。若(Cy)=1,有借位,表示小数减大数,发生溢出,结果是错误的;若(Cy)=0,没有借位,表示大数减小数,运算结果正确。提示MCS-51系列单片机中没有单独的不带借位减法运算指令。若有运算需要,可以在减法指令之前,先将Cy位清零。(4)加1指令编号指令格式机器语言指令功能字节数指令周期数aINC A04(A)(A)+111bINC Rn080F(Rn)(Rn)+111cINC direct05 direct(direct)(direct)+121dINC Ri0607(Ri

46、)(Ri)+111eINC DPTRA3(DPTR)(DPTR)+112加1指令共5条,所使用的助记符INC来自英文“Increase”。指令具体情况如表所示。表中5条指令的功能是将源操作数所指定的单元的内容加1。除指令a对奇偶校验位P有影响外,其他指令均不会影响PSW的标志位。另外,指令e是MCS-51系统中唯一一条16位加1指令。加1指令不适合用来做加法计算,这些指令主要用来修改计数器的内容及地址指针的值。(5)减1指令编号指令格式机器语言指令功能字节数指令周期数aDEC A14(A)(A)111bDEC Rn181F(Rn)(Rn)111cDEC direct15 direct(dire

47、ct)(direct)121dDEC Ri1617(Ri)(Ri)111减1指令共4条,所使用的助记符DEC来自英文“Decrease”。指令具体情况如表3-21所示。表中4条指令的功能是将源操作数所指定的单元的内容减1。与加1指令相同,只有指令a影响奇偶校验位P,其他指令均不影响PSW的标志位。(6)十进制调整指令十进制调整指令又称为BCD码调整指令,用于对累加器A中压缩BCD码的加法结果进行修正。它是一条单字节单周期指令,助记符为DA,来自英文“Decimal Adjust”。指令格式为DA A提示BCD码(Binary-Coded Decimal):这种编码形式是利用了四个位单元来储存一

48、个十进制的数码,使得二进制和十进制能够进行快捷的转换。最常用的BCD编码是8421码,它使用09这十个数值的二进码00001001来表示。压缩BCD码:压缩BCD码是指在一个字节中存放两位BCD码。【例3-19】两个BCD码按二进制相加之后,有时会产生错误结果,必须使用十进制调整指令才能得到正确的压缩BCD码的和数。从上面的三个例子中我们可以看到,后两个加法运算出现了错误。运算出错是因为BCD码只用了16个编码中的10个,还有6个没用到的编码(1010、1011、1100、1101、1110、1111)。若相加结果进入或跳过无效码编码区时,就会发生错误。十进制加法相应BCD码加法2+7=9;0

49、010+0111=1001;运算结果正确。6+9=15;0110+1001=1111;运算结果不正确。8+9=17;1000+1001=0001;Cy=1,运算结果不正确。进行BCD调整的原则如下:若AC=1或累加器A的低四位(A)3-09,则(A)3-0(A)3-0+06H;若Cy=1或累加器A的高四位(A)7-49,则(A)7-4(A)7-4+60H【例3-20】(A)=56H,(R5)=67H,将其看作为两个压缩的BCD数,进行加法运算ADDA,R5DAA由于高、低4位分别大于9,所以要分别加6进行十进制调整对结果进行修正。结果为:(A)=23H,(Cy)=1;因为56+67=123,可

50、见调整后结果才是正确的。2 乘法和除法指令编号指令格式机器语言指令功能字节数指令周期数aMUL ABA4(B)15-8(A)7-0 (A)(B)14bDIV AB84(B)余数(A)商 (A)(B)14MCS-51系列单片机中,乘法和除法指令各有1条,均为单字节四周期指令。指令具体情况如表所示。指令a是乘法指令,MUL来自英文“Multiply”。指令功能是将累加器A和寄存器B中两个8位无符号数相乘,乘积的低8位送A,高8位送B。该指令影响PSW的Cy、OV和P标志位。执行指令后,Cy标志位清零。OV标志位表示积的大小,若乘积大于255,即(B)0,则(OV)=1,否则(OV)=0。奇偶标志P

51、由累加器A中1的个数决定。指令b是除法指令,DIV来自英文“Divide”。指令功能是将累加器A和寄存器B中两个8位无符号数相除,商的整数部分送A,余数送B。该指令影响PSW的Cy、OV和P标志位。Cy和P标志的影响和乘法指令相同。当除数为0,即(B)原=0时,(OV)=1,表示除法无意义;否则(OV)=0。逻辑运算与移位指令three在MCS-51系列单片机指令系统中,逻辑运算类指令和移位指令共有24条。用到的助记符有ANL、ORL、XRL、CLR、CPL、RL、RLC、RR和RRC共9种。这两大类指令可以进行与、或、非和异或运算,累加器A的清零、取反和移位操作等。1 逻辑运算指令本节介绍的

52、逻辑运算指令共20条。它们都是字节操作指令,可以对8位二进制数进行与、或,以及异或等逻辑运算。这些指令中,除以累加器A为目的寄存器的指令外,其他指令不会影响到PSW的任何标志位。(1)逻辑与指令逻辑与指令共6条,所使用的助记符ANL来自英文“And Logic”。指令具体情况如下表所示。编号指令格式机器语言指令功能字节数指令周期数aANL A,Rn585F(A)(A)(Rn)11bANL A,Ri5657(A)(A)(Ri)11cANL A, direct55 direct(A)(A)(direct)21dANL A,#data54 data(A)(A)data21eANL direct,A5

53、2 direct(direct)(direct)(A)21提示逻辑与:0和任何值相与为0;1和任何值相与,原值保持不变。即00=0,01=0,10=0,11=1。提示ASCII码(American Standard Code for Information Interchange):ASCII码是美国信息交换标准代码的缩写,它按照特定的规则对数字、字母以及符号进行二进制编码。参见本书附录B。上表中前4条指令是以累加器A为目的操作数的逻辑与指令。指令功能是将累加器A中的内容与源操作数所指定的内容进行按位逻辑与操作,并将结果送累加器A。指令e和指令f是以direct为目的地址的逻辑与指令。指令功能

54、是将direct地址单元的内容与源操作数所指定的内容进行按位逻辑与操作,并将结果送direct地址单元。在实际应用中,若希望目的操作数的某些位屏蔽,就可以和0相与;若希望某些位保持不变,就可以和1相与。若40H单元存放的是9的ASCII码39H,即(40H)=39H。这里我们希望将40H单元的内容变为9的BCD码。只需要用指令“ANL39H,#0FH”将39H的高四位屏蔽掉,40H单元的内容变为09H,即9的BCD码。(2)逻辑或指令逻辑或指令共6条,所使用的助记符ORL来自英文“Or Logic”。指令具体情况如下表所示。编号指令格式机器语言指令功能字节数指令周期数aORL A,Rn484F

55、(A)(A)(Rn)11bORL A,Ri4647(A)(A)(Ri)11cORL A, direct45 direct(A)(A)(direct)21dORL A,#data44 data(A)(A)data21eORL direct,A42 direct(direct)(direct)(A)21fORL direct,#data43 direct data(direct)(direct)data32提示逻辑或:1和任何值进行或运算值为1;0和任何值进行或运算,原值保持原值不变。即10=1,11=1,00=0,01=1。上表中前4条指令是以累加器A为目的操作数的逻辑或指令。指令功能是将累加器

56、A中的内容与源操作数所指定的内容进行按位逻辑或操作,并将结果送累加器A。指令e和指令f是以direct为目的地址的逻辑或指令。指令功能是将direct地址单元的内容与源操作数所指定的内容进行按位逻辑或操作,并将结果送direct地址单元。【例3-21】将片内40H单元的高四位送P1口的对应位,但不能修改P1口的低四位。程序中我们首先用逻辑与运算指令将40H单元中的低四位和P1口的高四位屏蔽掉,然后用逻辑或运算指令将修改后的40H单元的内容和P1的内容合并,达到题目要求的结果。MOVA,40HANLA,#0F0HANLP1,#0FHORLP1,A程序如下:在实际应用中,若希望目的操作数的某些位置

57、1,就可以和1进行或运算;若希望某些位保持不变,就可以和0进行或运算。利用或运算指令的这个特性,可以进行一些信号量的合并。(3)逻辑异或指令逻辑异或指令共6条,所使用的助记符XRL来自英文“Exclusive-Or Logic”。指令具体情况如表3-25所示。编号指令格式机器语言指令功能字节数指令周期数aXRL A,Rn686F(A)(A)(Rn)11bXRL A,Ri6667(A)(A)(Ri)11cXRL A, direct65 direct(A)(A)(direct)21dXRL A,#data64 data(A)(A)data21eXRL direct,A62 direct(direc

58、t)(direct)(A)21fXRL direct,#data63 direct data(direct)(direct)data32提示逻辑异或:两数异或,相同为0,不同为1。即00=0,11=0,01=1,10=1。从运算结果看,规律为:与0相异或,数值不变;与1相异或,数值取反。上表中前4条指令是以累加器A为目的操作数的寄存器的逻辑异或指令。指令功能是将累加器A中的内容与源操作数所指定的内容进行按位逻辑异或操作,并将结果送累加器A。指令e和指令f是以direct为目的地址的逻辑异或指令。指令功能是将direct地址单元的内容与源操作数所指定的内容进行按位逻辑异或操作,并将结果送dire

59、ct地址单元。【例3-22】若累加器A的内容为08H,程序将跳转到LOOP1程序段。可用以下指令实现。由于异或指令的这些特性,它们常被用来对数值进行部分取反操作以及判断两数是否相等。下面我们通过一个例子来学习这条指令。XRLA,#08H异或指令执行08H08H,指令完成后A中内容为0JZLOOP1根据A中内容进行跳转,若A为0,则程序跳转至LOOP1程序段(4)累加器A清零和取反指令MCS-51系列单片机指令系统中,A清零、取反指令各有一条。具体情况如表所示编号指令格式机器语言指令功能字节数指令周期数aCLR AE4(A)011bCPL AF4(A)(A)11注意虽然采用其他指令(如数据传送类

60、指令或逻辑异或指令)也可以达到累加器清零和取反的目的,但是它们至少需要两个字节。指令a为累加器清零指令,所使用的助记符CLR来自英文“Clear”,功能是将累加器A置0;指令b为累加器取反指令,助记符CPL来自英文“Complement”,功能是将累加器A按位取反。这两条指令的操作结果均会影响P标志位。2 移位指令本节所要介绍的移位指令共4条,具体情况如下表所示。编号指令格式机器语言指令功能字节数指令周期数aRL A23(A)循环左移1位11bRR A03(A)循环右移1位11cRLC A33(A)带进位循环左移1位11dRRC A13(A)带进位循环右移1位11是循环左移指令。所使用的助记符

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论