实训2 单片机指令系统实训

2.1 数据传送指令实训

2.1.1 实训目的

1. 学习传送指令的寻址方式;

2. 掌握数据传送指令的功能、助记符及使用方法。

2.1.2 相关知识

1. MCS—51单片机存储器的结构

MCS—51型单片机的存储器组织结构可以分为三个不同的存储空间,分别是:

● 外部数据存储器(外RAM);

● 内部数据存储器(内RAM),包括特殊功能寄存器;

● 程序存储器(ROM),包括片内ROM和片外ROM。

(1)数据存储器(RAM)。

数据存储器(RAM)用于存放程序运行中间数据和最终结果。MCS—51单片机数据存储器分成片内RAM和片外RAM,其中片内RAM有128个单元(地址是00H 7FH),还有一个特殊功能寄存器(SFR)区。

① 片内数据寄存器地址是8位,共128个单元,分成工作寄存区、位寻址区和用户RAM区。

② 特殊功能寄存器专门用于控制、管理片内算术逻辑部件、并行I/O口、串行I/O口、定时/计数器、中断系统等各功能部件。MCS—51系列单片机有18个专用寄存器,其中3个为双字节,共占用21个字节。

(2)程序存储器(ROM)。

程序存储器(ROM)用于存储编好的程序。MCS—51单片机内有4KB单元的ROM,若扩展,容量可达到64KB,地址范围为0000H FFFFH,用EA控制片内ROM和片外ROM寻址。

2. MCS—51单片机的指令系统

(1)指令格式。

MCS—51单片机指令的格式由操作码助记符和操作数组成,基本格式为:

指令地址:操作码助记符 目的操作数,源操作数;注释

(2)寻址方式。

在单片机的运算中,可以通过寻找存放操作数的存储单元的地址找到该操作数。寻址方式就是得到存储单元地址的方法,MCS—51系列单片机共有7种寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。

① 立即寻址。

在立即寻址中,直接给出参与运算的操作数,即指令中操作数就是具体数字,而不是存储单元的地址,该操作数称为立即数,用“#”标志。

例如:

            MOV  A,#40H;   A ←40H

表示把立即数40H送累加器A中。

② 直接寻址。

在直接寻址中,操作数的存放地址直接在指令中给出。

例如:

            MOV  A,50H;   A ←(50H)

表示把内部RAM 50H单元的内容送到累加器A中。

③ 寄存器寻址。

指令中寄存器存放的内容就是操作数。寄存器寻址是寻找这个寄存器,以便对寄存器进行读写操作。能实现这种寻址功能的寄存器是:累加器A、寄存器B、通用寄存器R0 R7、数据指针寄存器DPTR等。

例如:

            MOV  A,R0;   A ←(R0)

表示把通用寄存器组中的R0的内容送到累加器A中。

④ 寄存器间接寻址。

在寄存器间接寻址中,寄存器中存放的不是操作数,而是操作数所在单元的地址,可以通过这个地址值找到地址单元。

具有间接寻址功能的寄存器有R0、R1、DPTR和SP。间接寻址的寄存器前面加“@”标志。

例如:假定R0寄存器的内容是30H,30H单元的内容是73H,

            MOV  A,@R0;   A ←((R0))

表示以R0寄存器内容30H为地址,把该地址单元的内容73H送累加器A中。

⑤ 变址寻址。

当访问程序存储器的某存储单元时,该单元地址的构成是基址寄存器(PC或DPTR)的内容与变址寄存器(A)的内容相加得出的十六位地址组成。

例如:

            MOVC  A,@A+DPTR;   A ←(A+DPTR)

表示把DPTR和A的内容相加作为单元的地址,再把该地址单元的内容送累加器A中。

⑥ 相对寻址。

相对寻址是把PC当前值与指令给出的偏移量rel相加,形成转移的目的地址。它在转移指令中,用于指定转移的目标地址。其中,rel是带符号的8位二进制补码数,取值范围是-128 +127。

⑦ 位寻址。

位寻址是指对片内RAM的位寻址区或SFR进行位操作的寻址方式。

例如:

            MOV  C,3AH;   C ←(3AH)

表示把位地址3AH的单元内容送位累加器C中。

(3)数据传送指令。

① 内部数据存储器的访问指令。

● 以累加器A为目的的操作数指令

            MOV  A,#data           ;(A)← #data
            MOV  A,direct          ;(A)←(direct)
            MOV  A,Rn              ;(A)←(Rn)
            MOV  A,@ Ri            ;(A)←((Ri))

指令功能是把源操作数的内容送累加器A,但源操作数的内容不变。

● 以Rn为目的的操作数指令

            MOV  Rn,#data          ;(Rn)← #data
            MOV  Rn,direct         ;(Rn)←(direct)
            MOV  Rn,A              ;(Rn)←(A)

指令功能是把源操作数的内容送到当前工作寄存器组Rn(R0 R7)中的某个寄存器,源操作数的内容不变。

● 以直接地址为目的的操作数指令

            MOV  direct,#data         ;(direct)← #data
            MOV  direct2,direct1      ;(direct2)← direct1
            MOV  direct,A             ;(direct)←(A)
            MOV  direct,Rn            ;(direct)←(Rn)
            MOV  direct,@Ri           ;(direct)←((Ri))

指令功能是把源操作数的内容送到直接地址指出的存储单元中,源操作数的内容不变。

● 以间接地址为目的的操作数指令

            MOV  @ Ri,#data        ;((Ri))← #data
            MOV  @ Ri,direct       ;((Ri))←(direct)
            MOV  @ Ri,A            ;((Ri))←(A)

指令功能是把源操作数的内容送到以间接寄存器Ri(R0或R1)的内容为地址的内部RAM存储单元中,源操作数的内容不变。

② 外部数据存储器的访问指令。

累加器A与外部数据存储器RAM传送指令。

            MOVX  A,@ Ri         ;A ← (( Ri))
            MOVX  A,@ DPTR       ;A ← (( DPTR))
            MOVX  @ Ri,A         ;(Ri) ← (A)
            MOVX  @ DPTR,A       ;(DPTR) ← (A)

指令功能是把累加器A和外部扩展的RAM或I/O口之间的数据进行传送。指令助记符为MOVX,使用DPTR或Ri作为间接寻址寄存器。

③ 程序存储器的访问指令。

MCS—51单片机使用MOVC指令访问程序存储器,该指令既用于访问内部ROM,也可以用于访问外部ROM。

            MOVC  A,@ A + PC     ;A ←((A)+(PC))
            MOVC  A,@ A + DPTR   ;A ←((A)+(DPTR))

指令功能是将基址寄存器(PC或DPTR)的内容与偏移量(A)的内容相加得出的数据作为地址,然后根据地址在ROM中找出存储单元,把该存储单元的内容送累加器A。指令助记符为MOVC。

2.1.3 实训要求

1. 根据程序的指令写出操作数的寻址方式,分析程序指令的功能,写出结果;

2. 在程序运行前,检查目的操作数单元和源操作数单元的内容;

3. 单步运行程序,观察是否传送成功。

2.1.4 实训设备

MCS—51单片机教学实训系统一台。

2.1.5 实训内容及步骤

1. 实训内容

数据传送指令实训程序:

            ORG    2000H
            MOV    R0,#60H
            MOV    R1,#61H
            MOV    A,R0
            MOV    70H,A
            MOV    71H,70H
            MOV    A,#70H
            MOV    @ R0,A
            MOV    A,70H
            MOV    R1,A
            MOV    A,@ R0
            MOV    R5,A
            MOV    DPTR,#500H
            MOV    40H,R5
            MOV    50H,@ R0
            MOV    55H,#88H
            MOV    @ R0,40H
            MOV    @ R1,#38H
            L1:SJMP  L1
            END

2. 实训步骤

(1)把程序存入单片机的存储器中;

(2)检查程序是否正确无误;

(3)分析每条指令的结果;

(4)用单步运行方式顺序执行程序中的每一条指令,查看并记录每条指令的运行结果,比较运行结果并分析结果。

2.1.6 实训报告

1. 写出程序运行的最后结果。

2. 每条指令的运行结果和分析结果是否相同?为什么?

3. 通过本次实训你有何收获?对存在的问题请给出分析与建议。