MCS-51单片机的程序设计语言

一、程序语言的种类和汇编指令的格式

1.1程序语言的种类

(1)机器语言(machine language)

        直接用机器码(0、1代码)编写的语言,能够成为计算机直接执行的机器级语言。

        优点:执行速度快;

        缺点:可读性极差,程序的设计、输入、调试、修改都十分麻烦。

(2)汇编语言(assembly language)

        用指令助记符代替机器码的编程语言。

        优点:程序结构简单、执行速度快、程序易优化、编译后占用内存少;

        缺点:可读性比较差。

(3)高级语言(high-level language)

        在汇编语言的基础上,用接近人的自然语言的语句来编写程序。

        优点:程序可读性强,通用性好,适用于不熟悉处理器底层硬件的用户;

        缺点:结构不紧凑,编译后占空间较大。

1.2 MCS-51汇编语言的指令格式

(1)常用符号

        Rn(n=0~7):表示当前工作寄存器R0-R7中的任一个

        Ri(i=0或1):表示当前工作寄存器中用于间址的R0或R1

        #data:表示8位立即数

        #data16:表示16位立即数

        direct:表示片内RAM的8位地址

        addr11:表示11位目的地址,用于ACALL和AJMP指令中

        addr16:表示16位目的地址,用于LCALL和LJMP指令中

        rel:用补码形式表示的8位二进制地址偏移量,取值范围是-128~+127

        bit:表示片内RAM的位寻址区,或者是可以位寻址的SFR的位地址

        A(或ACC):表示累加器

        B:B寄存器

        C:PSW中的进位标志Cy

        @:在寄存器间接寻址方式中,是间址寄存器指针的前缀标志

        $:表示当前指令地址

        (X):表示由X所指的某寄存器或某单元中的内容,即X是单元地址,(X)是单元中的内容。

(2)指令格式

[标号:]        操作码        [操作数]        [,操作数]        [;注释]

二、MCS-51单片机的寻址方式

2.1 寄存器寻址

指令所需的操作数在MSC-51内部累加器A、通用寄存器B、某个工作寄存器Rn、数据指针DPTR等。

例:MOV A,R1  ;将寄存器R1中的内容送到累加器A当中

       MOV R6,A;  将累加器A中的内容送到寄存器R6当中

特点:寄存器寻址方式的指令大多是单字节指令。工作寄存器的3位代码与操作码OP共同占用一个指令字节。

2.2 直接寻址

指令的指令码中含有操作数的地址。

寻址范围:片内RAM的低128字节以及SFR,SFR只能通过直接寻址;

例:MOV A,30H;将内部RAM中30H单元的内容送到累加器A中

       MOV 30H,50H;将内部RAM中50H单元中的内容送到30H单元中

注意:

a)当直接寻址的地址为SFR的某一个时,direct既可以使用SFR的物理地址,也可以使用SFR的名称符号;

        例:MOV A,80H

               MOV A,P0

P0的物理地址是80H,上面两个语句的执行结果是相同的,但提倡后者,可读性更强

b)当直接地址是在工作寄存器区中时,最好用寄存器寻址方式来访问

        例:MOV A,00H;双字节

               MOV A,R0;单字节

c)同样的,在MCS-51的指令系统中,累加器有A、ACC、和E0H(物理地址)三种表示形式,分别属于两种不同的寻址方式,但指令的执行效果是相同的。

例:INC A;寄存器寻址(单字节)

       INC ACC;直接寻址(双字节)

       INC E0H;直接寻址(双字节)

2.3立即寻址

指令中直接含有所需要的操作数data

例:MOV A,#data

       MOV DPTR,#data16

特点:立即寻址的指令长度为2或3字节

区别于直接寻址:

MOV A,#30H;(A)\leftarrow30H

MOV A,30H;(A)\leftarrow(30H)

2.4寄存器间接寻址

指令中含有保存操作数地址的寄存器(Ri或DPTR)

执行过程:CPU先从寄存器中找到操作数地址,然后再根据该地址找到操作数。

例:MOV R0,#20H;(R0)\leftarrow20H

       MOV A,@R0; (A)\leftarrow((R0))即 (A)\leftarrow(20H)

       MOVX A,@R0;此时20H的地址是片外RAM中的地址

       MOV DPTR,#1FF0H;

       MOVX A,@DPTR

寻址范围:片内RAM低128字节、外部RAM

 错误使用间址寻址:MOV R0,80H

                                 MOV A,@R0

解析:80H是SFR中P0的物理地址,SFR只能使用直接寻址,不能使用间址寻址,间址寻址的范围是片内RAM低128字节和片外RAM

2.5变址寻址

指令中使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其合作为操作数地址。

特点:1.DPTR或PC中应预先存放有操作数的基地址;

           2.累加器A中应预先放有被寻址操作数地址与基地址之间的偏移量,该地址偏移量应该是00H~FFH范围内的无符号数;

           3.在执行变址寻址时,单片机首先将基地址与地址偏移量相加,以形成操作数的物理地址;

           4.变址寻址指令是单字节双周期指令。

寻址空间:ROM,这是访问程序存储器ROM中数据的唯一方式,变址寻址方式常用于查表操作。

例:MOVC A,@A+PC; (A)\leftarrow(A+PC)

       MOVC A,@A+DPTR; (A)\leftarrow(A+DPTR)

例题:已知ROM中的0300H~0309H中存放着0~9的平方表,编程求A中数据的平方(设A=02H)

MOV DPTR,#3000H

MOVC A,@A+DPTR

2.6 相对寻址

相对转移指令使用的一种寻址方式。

相对转移指令中给出一个转移地址的偏移量rel(操作数)。在执行中将当前的PC值(将要执行的指令的首地址)与偏移量rel(补码)相加,形成实际转移的目标地址。

rel是八位有符号数(-128~127)

2.7 位寻址

指令与直接寻址相似,区别在于指令中的地址是“位地址”。

三、数据传送指令

3.1 内部数据传送指令

特点:源操作数和目的操作数的地址都在单片机内部,可以是片内RAM地址,也可以是特殊功能寄存器SFR的地址。

分类:按照寻址方式分为立即、直接、寄存器、寄存器间址四类。

(1)立即寻址型传送指令

特点:多字节指令,源操作数是立即数。

类型:MOV A,#data;双字节指令

           MOV Rn,#data;双字节指令

           MOV @Ri,#data;双字节指令

           MOV direct,#data;双字节指令

这类指令多用于程序的初始化。

(2)直接寻址型传送指令

特点:多字节指令,指令中至少含有一个源操作数或目的操作数的地址,在第2或第3字节上。

类型:MOV A,direct

           MOV direct,A

           MOV Rn,direct

           MOV @Ri,direct

           MOV direct1,direct2

(3)寄存器寻址型传送指令

        MOV A,Rn

        MOV Rn,A

        MOV direct,Rn

(4)寄存器间址型传送指令

        MOV A,@Ri

        MOV @Ri,A

        MOV direct,@Ri

3.2 外部数据传送指令

(1)16位数传送指令

        MOV DPTR,#data16

该指令将16位立即数送入DPTR,高8位送到DPH,低8位送到DPL,这个被当作是立即数的data16实际是外部RAM或ROM的地址,是专门配合外部数据传送指令使用的。

(2)外部ROM的字节传送指令(查表指令)

        MOVC A,@A+DPTR;远程查表指令

        MOVC A,@A+PC;近程查表指令

两条指令均为变址寻址方式,第一条指令中的DPTR可以由用户赋值一个任意的16位数,因此外部ROM的64k范围内的都可以访问;第二条指令中的基地址为PC,PC的内容虽然是可以改变的,但是一旦被执行指令在程序中的位置确定,PC内的值也就确定了,因此PC+A可变化的范围只是A中的8位数,因此只能访问PC后256B的空间。

(3)外部RAM的字节传送指令

特点:①都要通过累加器A;

           ②只能使用寄存器间址的方式。

MOVX A,@Ri

MOVX @Ri,A

MOVX A,@DPTR

MOVX @DPTR,A

3.3 堆栈操作指令

压栈指令:PUSH direct;SP\leftarrowSP+1,(SP)\leftarrow(direct),先加后压

弹出指令:POP direct; (direct)\leftarrow(SP),SP\leftarrowSP-1,先弹后减

注意:①PUSH、POP指令使用的是直接寻址方式,因此direct位置只能是物理地址或者SFR特殊功能寄存器中的符号,不能是工作寄存器Rn或累加器A等。

        PUSH A;×

        PUSH ACC;√

          ②系统上电复位时,SP=07H,SP的值一般需要修改,因为07H在工作寄存器组的范围内,后续编程可能会用到工作寄存器组,引起冲突。

3.4 数据交换指令

累加器A与寄存器/片内RAM之间的数据交换

XCH A,Rn;(A)\Leftrightarrow(Rn)

XCH A,direct;(A)\Leftrightarrow(direct) 

XCH A,@Ri;(A)\Leftrightarrow((Ri)) 

XCHD A,@Ri;(A)0~3\Leftrightarrow((Ri))0~3 半字节交换,只交换低4位

四、算术与逻辑运算和移位指令

功能:实现算术运算、逻辑运算和循环换位三大功能。

特点:大多数指令都由A存放一个源操作数,并把操作结果放回累加器A中。

4.1算术运算指令

(1)加法指令

        a)不带进位加法

        ADD A,Rn; A\leftarrowA+Rn

        ADD A,@Ri; A\leftarrowA+@Ri

        ADD A,direct; A\leftarrowA+direct

        ADD A,#data; A\leftarrowA+data

        注:①参与运算的数是8位的,结果也是8位的,并且影响PSW(Cy、Ac、OV、P);

               ②8位数据可以是有符号数,也可以是无符号数,CPU均将其视为有符号数(补码)进行运算并影响PSW(Cy、Ac、OV、P);

              ③两数都是无符号数,且PSW中的进位Cy为0,说明数据没有溢出,结果正确;

              ④两数都是有符号数,且PSW中的OV=0,说明数据没有溢出,结果正确;若OV=1,说明溢出,出现了两正数相加为负或两负数相加为正的情况,结果不正确。

        b)带进位加法

        常用于多字节数相加中的高位加法。

        ADDC A,Rn;A\leftarrowA+Rn+Cy

        ADDC A,@Ri; A\leftarrowA+@Ri+Cy

        ADDC A,direct; A\leftarrowA+direct+Cy

        ADDC A,#data; A\leftarrowA+data+Cy

        Cy:指令执行前的Cy。

        对PSW的影响同ADD指令

        c)加一指令

        INC A

        INC Rn

        INC @Ri

        INC direct

        INC DPTR;唯一一条16位算术运算指令

(2)减法指令

        a)带进位的减法指令

        SUBB A,Rn; A\leftarrowA-Rn-Cy

        SUBB A,@Ri; A\leftarrowA-@Ri-Cy

        SUBB A,direct; A\leftarrowA-direct-Cy

        SUBB A,#data; A\leftarrowA-data-Cy

        在MCS-51的指令系统中,没有不带进位的减法,需要时,可以在使用SUBB之前将Cy清零指令:CLR C

        b)减一指令

        DEC A

        DEC Rn

        DEC @Ri

        DEC direct

        注意:DPTR不能使用DEC指令实现减1

DPTR的减1实现代码:

DPTRSUB1:CLR C;进位标志清零

                    MOV A,DPL;先对DPTR的低8位减1

                    SUBB A,#1

                    MOV DPL,A

                    MOV A,DPH;再对DPTR的高8位减0

                    SUBB A,#0

                    MOV DPH,A

(3)十进制调整指令

        DA        A;若Ac=1或A3~0>9,则A+06H\rightarrowA

                          若Cy=1或A7~4>9,则A+60H\rightarrowA

(4)乘法与除法指令

        MUL        AB; A*B,结果的低8位存在A中,高8位存在B中

        DIV        AB; A/B,结果的商存在A中,余数存在B中

在乘法指令中,影响PSW的Cy、OV、P:Cy总是清零;OV表示积的大小,当超过255(B>0)时,OV=1;P取决于A中1的个数

在除法指令中,影响PSW的Cy、OV、P:Cy总是清零;当B=0时OV=1(除数=0无意义);P取决于A中1的个数

4.2 逻辑运算指令

(1)逻辑与运算指令

        目的:操作数按位相与

        ANL A,Rn

        ANL A,@Ri

        ANL A,direct

        ANL A,#data

        ANL direct,A

        ANL direct,#data

特殊用法:屏蔽掉一个字节中的某些位置,例如用0FH与,屏蔽掉高四位,用F0H屏蔽掉低四位

(2)逻辑或运算指令

        目的:操作数按位取或

        ORL A,Rn

        ORL A,@Ri

        ORL A,direct

        ORL A,#data

        ORL direct,A

        ORL direct,#data

特殊用法:可以对字节中某个位置置1,其他不变,例如0FH对低4位置1,高四位不变。

(3)逻辑异或运算指令

        目的:对操作数按位取异或

        XRL A,Rn

        XRL A,@Ri

        XRL A,direct

        XRL A,#data

        XRL direct,A

        XRL direct,#data

特殊用法:可以对字节中某个位置取反,其他不变,利用用0FH对低4位取反,高四位不变

(4)累加器清零或取反指令

        累加器清零:CLR A

        累加器取反:CPL A

4.3移位指令

        RL A;左移位

        RR A;右移位

        RLC A;带进位位左移位

        RRC A;带进位位右移位

        SWAP A;高四位与第四位互换位置

五、控制转移指令

作用:改变程序计数器PC中的内容实现改变程序的流向。

5.1 无条件转移指令

(1)长转移指令(三字节双周期指令)

        LJMP addr16;PC\leftarrowaddr16

        将指令码中addr16送入程序计数器PC中,使机器执行下条指令时无条件跳转到addr16处执行程序。由于addr16是一个16位的二进制地址,因此长跳转指令是可以在64k空间范围内转移的指令。

(2)绝对转移指令(双字节双周期)

        AJMP addr11;PC\leftarrowPC+2, PC10~PC0\leftarrowaddr11

         转移范围:PC的高5位不变,低11位改为addr11的内容,因此可以在2KB的范围内向前或向后转移。

(3)短转移指令(双字节双周期)

        SJMP rel; PC\leftarrowPC+2, PC\leftarrowPC+rel

        先执行完该指令,因为短转移指令是双字节指令,因此PC=PC+2,根据该指令,PC要加上偏移量rel,PC=PC+rel,因此跳转后的PC内容为PC=PC+2+rel。

        rel是8位无符号数,因此转移范围是-128~+127

(4)变址转移指令(单字节双周期)

        JMP @A+DPTR

        寻址范围:64KB

5.2 条件转移指令

(1)累加器A判零转移指令(双字节)

        JZ rel;若A=0,则 PC\leftarrowPC+2+rel

                    若A\neq0,则 PC\leftarrowPC+2

        JNZ rel; 若A\neq0,则 PC\leftarrowPC+2+rel 

                        若A=0,则 PC\leftarrowPC+2

(2)比较转移指令

        CJNE A,#data,rel

        CJNE Rn,#data,rel

        CJNE A,direct,rel

        CJNE @Ri,#data,rel

四条指令均为将操作数1与操作数2比较,两数不相等时跳转,两数相等时不跳转。

同时该指令对PSW中的Cy位有影响,当操作数1小于操作数2时,Cy=1;当操作数1大于等于操作数2时,Cy=0。因此还可以作为比较指令使用。

(3)减1条件转移指令

        DJNZ Rn,rel;双字节指令

        DJNZ direct,rel;三字节指令

操作数减1后判断是否等于0,等于0不跳转,不等于0跳转。

5.3 子程序调用与返回指令

(1)子程序调用指令

        ACALL addr11;短调用指令

                                   PC\leftarrowPC+2

                                   SP\leftarrowSP+1,(SP)\leftarrowPC7~PC0低八位

                                   SP\leftarrowSP+1,(SP)\leftarrowPC15~PC8高八位

                                   PC10~0\leftarrowaddr11

        LCALL addr16;长调用指令

                                   PC\leftarrowPC+2

                                   SP\leftarrowSP+1,(SP)\leftarrowPC7~PC0低八位

                                   SP\leftarrowSP+1,(SP)\leftarrowPC15~PC8高八位

                                   PC\leftarrowaddr16

(2)子程序返回指令

        RET;子程序返回

                  (SP)\rightarrowPC15~PC8,SP-1\rightarrowSP

                  (SP)\rightarrowPC7~PC0,SP-1\rightarrowSP

        RETI;中断子程序返回

                  (SP)\rightarrowPC15~PC8,SP-1\rightarrowSP

                  (SP)\rightarrowPC7~PC0,SP-1\rightarrowSP

5.4 空操作指令

NOP

功能:仅使程序计数器PC加1,消耗一个机器周期,所以常用作延时。

六、位操作指令

6.1位传送指令

        MOV C,bit

        MOV bit,C

6.2位置位和位清零指令

        CLR C;C清零

        SETB C;C置1

        CLR bit;bit清零

        SETB bit;bit置1

6.3位运算指令

        ANL C,bit

        ANL C,/bit

        ORL C,bit

        ORL C,/bit

        CPL C

        CPL bit

6.4位控制转移指令

(1)以Cy的内容为条件的跳转指令

        JC rel;Cy=1跳转,Cy=0不跳转

        JNC rel;Cy=0跳转,Cy=1不跳转

(2)以位地址的内容为条件的跳转指令

        JB bit,rel;bit=1跳转,bit=0不跳转

        JNB bit,rel;bit=0跳转,bit=1不跳转

        JBC bit,rel;bit=1跳转,同时将bit清零,bit=0不跳转

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值