单片机控制rn8209_一个单片机通过键盘控制另一个单片机 - CSDN
精华内容
参与话题
  • 51单片机寄存器

    千次阅读 2015-04-04 19:56:31
    【51单片机寄存器功能一览表】  21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有128个位... 在51单片机内部有一个CPU用来运算、控制,有

    51单片机寄存器功能一览表】 

    21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。

     

      在51单片机内部有一个CPU用来运算、控制,有四个并行I/O,分别是P0P1P2P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器串行I/O中断系统,以及一个内部的时钟电路。在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下(其中带*号的为52系列所增加的特殊功能寄存器):

    MCS51单片机的特殊功能寄存器

    符号

    地址

    功能介绍

    B

    F0H

    B寄存器

    ACC 

    E0H

    累加器

    PSW  

    D0H

    程序状态字

    TH2*

    CDH

    定时器/计数器2(高8位)

    TL2*

    CCH

    定时器/计数器2(低8位)

    RCAP2H*

    CBH

    外部输入(P1.1)计数器/自动再装入模式时初值寄存器高八位

    RCAP2L*

    CAH

    外部输入(P1.1)计数器/自动再装入模式时初值寄存器低八位

    T2CON*

    C8H

    T2定时器/计数器控制寄存器

    IP 

    B8H

    中断优先级控制寄存器

    P3 

    B0H

    P3口锁存器

    IE 

    A8H

    中断允许控制寄存器

    P2 

    A0H

    P2口锁存器

    SBUF

    99H

    串行口锁存器

    SCON

    98H

    串行口控制寄存器

    P1 

    90H

    P1口锁存器

    TH1  

    8DH

    定时器/计数器1(高8位)

    TH0

    8CH

    定时器/计数器1(低8位)

    TL1

    8BH

    定时器/计数器0(高8位)

    TL0  

    8AH

    定时器/计数器0(低8位)

    TMOD

    89H

    T0T1定时器/计数器方式控制寄存器

    TCON

    88H

    T0T1定时器/计数器控制寄存器

    DPH  

    83H

    数据地址指针(高8位)

    DPL

    82H

    数据地址指针(低8位)

    SP

    81H

    堆栈指针

    P0

    80H

    P0口锁存器

    PCON

    87H

    电源控制寄存器

    分别说明如下:

    1ACC---是累加器,通常用A表示

      这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。自身带有全零标志Z,若A0Z1;若A≠0z0。该标志常用作程序分枝转移的判断条件。

    2B--一个寄存器

      在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。

    3PSW-----程序状态字。

      这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应的处理。它的各位功能请看下表:

    PSW 程序状态字

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    CY

    AC

    F0

    RS1

    RS0

    OV

     

    P

    下面我们逐一介绍各位的用途

    CY:进位标志。

    8051中的运算器是一种8位的运算器,我们知道,8位运算器只能表示到0-255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。这样就没事了。有进、借位,CY1;无进、借位,CY0
      例:78H+97H01111000+10010111

    AC:辅助进、借位(高半字节与低半字节间的进、借位)

      例:57H+3AH01010111+00111010

    F0:用户标志位

    由用户(编程人员)决定什么时候用,什么时候不用。
    RS1RS0:工作寄存器组选择位

      通过修改PSW中的RS1RS0两位的状态,就能任选一个工作寄存器区。这个特点提高了MCS-51现场保护和现场恢复的速度。对于提高CPU的工作效率和响应中断的速度是很有利的。若在一个实际的应用系统中,不需要四组工作寄存器,那么这个区域中多余单元可以作为一般的数据缓冲器使用。

    工作寄存器区选择

    RS1

    RS0

    当前使用的工作寄存器区R0~R7

    0

    0

    0(00~07H)

    0

    1

    1(08~0Fh)

    1

    0

    2(10~17h)

    1

    1

    3(18~1Fh)

    0V:溢出标志位

    运算结果按补码运算理解。有溢出,OV=1;无溢出,OV0。什么是溢出我们后面的章节会讲到。

    P:奇偶校验位

    它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,否则为0。运算结果有奇数个1P1;运算结果有偶数个1P0
      例:某运算结果是78H01111000),显然1的个数为偶数,所以P=0

    4DPTRDPHDPL--------数据指针

      可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。分成DPL(8)DPH(8)两个寄存器。用来存放16位地址值,以便用间接寻址或变址寻址的方式对片外数据RAM或程序存储器作64K字节范围内的数据操作。

    5P0P1P2P3--------输入输出口(I/O)寄存器

      这个我们已经知道,是四个并行输入/输出口(I/O)的寄存器。它里面的内容对应着管脚的输出。

    6IE-----中断充许寄存器
    可按位寻址,地址:A8H

    IE 中断允许寄存器

    B7

    B6

    B5

    B4

    B3

    B2

    B1

    B0

    EA

    -

    ET2

    ES

    ET1

    EX1

    ET0

    EX0

    · EA IE.7EA=0时,所有中断禁止(即不产生中断);EA=1时,各中断的产生由个别的允许位决定 

    · IE.6:保留 

    · ET2IE.5:定时2溢出中断允许(8052用) 

    · ES IE.4:串行口中断允许(ES=1允许,ES=0禁止) 

    · ET1IE.3:定时1中断允许 

    · EX1IE.2:外中断INT1中断允许 

    · ET0IE.1:定时器0中断允许 

    · EX0IE.0:外部中断INT0的中断允许 

    7IP-----中断优先级控制寄存器
    可按位寻址,地址位B8H

    IP 中断优先级控制寄存器

    B7

    B6

    B5

    B4

    B3

    B2

    B1

    B0

    -

    -

    PT2

    PS

    PT1

    PX1

    PT0

    PX0

    · IP.7:保留 

    · IP.6:保留 

    · PT2IP.5:定时2中断优先(8052用) 

    · PS IP.4:串行口中断优先 

    · PT1IP.3:定时1中断优先 

    · PX1IP.2:外中断INT1中断优先 

    · PT0IP.1:定时器0中断优先 

    · PX0IP.0:外部中断INT0的中断优先 

    8TMOD-----定时器控制寄存器
    不按位寻址,地址89H

    TMOD 定时器控制寄存器

    B7

    B6

    B5

    B4

    B3

    B2

    B1

    B0

    GATE 

    C/T

    M1

    M0

    GATE

    C/T

    M1

    M0

    · GATE :定时操作开关控制位,当GATE=1时,INT0INT1引脚为高电平,同时TCON中的TR0TR1控制位为1时,计时/计数器01才开始工作。若GATE=0,则只要将TR0TR1控制位设为1,计时/计数器01就开始工作。 

    · C/T :定时器或计数器功能的选择位。C/T=1为计数器,通过外部引脚T0T1输入计数脉冲。C/T=0时为定时器,由内部系统时钟提供计时工作脉冲。 

    · M1 M0T0T1工作模式选择位 

    M1 M0T0T1工作模式选择位

    M1

    M0

    工作模式

    0

    0

    方式013位计数/计时器

    0

    1

    方式,116位计数/计时器

    1

    0

    方式28位自动加载计数/计时器

    1

    1

    方式3,仅适用于T0,定时器0分为两个独立的8位定时器/计数器TH0TL0T1在方式3时停止工作

    9TCON-----定时器控制寄存器

    可按位寻址,地址位88H

    TCON 定时器控制寄存器

    B7

    B6

    B5

    B4

    B3

    B2

    B1

    B0

    TF1

    TR1

    TF0

    TR0

    IE1

    IT1

    IE0

    IT0

    · TF1:定时器T1溢出标志,可由程序查询和清零,TF1也是中断请求源,当CPU响应T1中断时由硬件清零。 

    · TF0:定时器T0溢出标志,可由程序查询和清零,TF0也是中断请求源,当CPU响应T0中断时由硬件清零。 

    · TR1T1充许计数控制位,为1时充许T1计数。 

    · TR0T0充许计数控制位,为1时充许T0计数。 

    · IE1:外部中断1请示源(INT1P3.3)标志。IE11,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”IE1(边沿触发方式)。 

    · IT1:外部中断源1触发方式控制位。IT10,外部中断1程控为电平触发方式,当INT1P3.3)输入低电平时,置位IE1。 

    · IE0:外部中断0请示源(INT0P3.2)标志。IE01,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”IE0(边沿触发方式)。 

    · IT0:外部中断源0触发方式控制位。IT00,外部中断1程控为电平触发方式,当INT0P3.2)输入低电平时,置位IE0。 

    10SCON----串行通信控制寄存器

      它是一个可寻址的专用寄存器,用于串行数据的通信控制,单元地址是98H,其结构格式如下:

     

     

    SCON 串行通信控制寄存器

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

     

    SM0

    SM1

    SM2

    REN

    TB8

    RB8

    TI

    RI

     

    (1)SM0SM1:串行口工作方式控制位。
      SM0SM1    工作方式
         00      方式0-波特率由振荡器频率所定:振荡器频率/12
         01      方式1-波特率由定时器T1T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/32
         10      方式2-波特率由振荡器频率和SMOD所定:2SMOD ×振荡器频率/64
         11      方式3-波特率由定时器T1T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/32 
    (2)SM2:多机通信控制位。< br>    多机通信是工作于方式2和方式3SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式23,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。当SM2=0时,就不管第位数据是0还是1,都难得数据送入SBUF,并发出中断申请。
    工作于方式0时,SM2必须为0。 
    (3)REN:允许接收位。< br>    REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。 
    (4)TB8:发送接收数据位8< br>    在方式2和方式3中,TB8是要发送的——即第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。 
    (5)RB8:接收数据位8
    在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。 
    (6)TI:发送中断标志位。
    可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。 
    (7)RI:接收中断标志位。
    可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。

    11PCON-----电源管理寄存器
       PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,其结构格式如下:

     

     

    PCON电源管理寄存器结构

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

     

    SMOD

    -

    -

    -

    GF1

    GF0

    PD

    IDL

     

      在CHMOS型单片机中,除SMOD位外,其他位均为虚设的,SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0

    12T2CON-----T2状态控制寄存器

    T2CON 定时器控制寄存器

    B7

    B6

    B5

    B4

    B3

    B2

    B1

    B0

    TF2

    EXF2

    RCLK

    TCLK

    EXEN2

    TR2

    C/T2

    CP/RL2

    · TF2T2溢出中断标志。TF2必须由用户程序清“0”。当T2作为串口波特率发生器时,TF2不会被置“1”。 

    · EXF2:定时器T2外部中断标志。EXEN21时,当T2EXP1.1)发生负跳变时置1中断标志DXF2EXF2必须由用户程序清“0”。 

    · TCLK:串行接口的发送时钟选择标志。TCLK=1时,T2工作于波特率发生器方式。 

    · RCLK:串行接口的接收时钟选择标志位。RCLK1时,T2工作于波特率发生器方式。 

    · EXEN2T2的外部中断充许标志。 

    · C/T2:外部计数器/定时器选择位。C/T2=1时,T2为外部事件计数器,计数脉冲来自T2P1.0);C/T2=0时,T2为定时器,振荡脉冲的十二分频信号作为计数信号。 

    · TR2T2计数/定时控制位。TR11时充许计数,为0时禁止计数。 

    · CP/RL2:捕捉和常数自动再装入方式选择位。为1时工作于捕捉方式,为0T2工作于常数自动再装入方式。当TCLKRCLK1时,CP/RL2被忽略,T2总是工作于常数自动再装入方式。 

      下面对T2COND0D2D4D5几位主要控制T2的工作方式,下面对这几位的组合关系进行总结

    定时器T2方式选择

    RCLK+TCLK

    CP/RL2

    TR2

    工作方式

    0

    0

    1

    16位常数自动再装入方式

    0

    1

    1

    16位捕捉方式

    1

    ×

    1

    串行口波特率发生器方式

    ×

    ×

    0

    停止计数

     

    展开全文
  • 51单片机控制转移指令SJMP、LJMP等

    千次阅读 2020-04-22 09:44:57
    控制指令是将程序跳转到某个指定的地址,在顺序执行 控制指令是通过修改PC的内容来实现跳转的功能 PC的内容是将要执行的下一跳指令的地址 一、无条件转移指令 LJMP英文全称:Absolute Jump AJ...


    前言

    控制指令是将程序跳转到某个指定的地址,在顺序执行
    控制指令是通过修改PC的内容来实现跳转的功能
    PC的内容是将要执行的下一跳指令的地址


    一、无条件转移指令

    LJMP英文全称:Long Jump
    AJMP英文全称:Absolute Jump
    SJMP英文全称:Short Jump
    JMP英文全称:Jump


    LJMP addr16

    指令名称:长转移指令
    目的:程序无条件转向64KB程序存储器地址空间的任何单元
    源操作数:16位跳转目标地址

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    LJMP addr16 addr16 -> PC × × × × 3 2
    • 地址范围为0000H—FFFFH;
    • addr16常采用标号地址(如:LOOP、LOOP1、MAIN、START、DONE、NEXT1……)表示;

    AJMP addr11

    指令名称:绝对转移指令
    目的:程序无条件转向2KB程序存储器地址空间的任何单元
    源操作数:11位跳转目标地址

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    AJMP addr16 (PC) + 2 -> PC, addr11 -> PC* × × × × 2 2

    :PC* 表示 PC10 ~ 0,共计11位;

    1. AJMP跳转范围是AJMP后面指令的第一个字节开始的同一2KB范围,也就是说先对PC+2(命令长度为2B),在跳转到以PC当前位置为基准的2KB范围内,如下例子;
    2. AJMP addr11表示跳转到以 PC15 PC14PC13PC12PC11a10a9a8a7a6a5a4a3a2a1a0 为目标地址,最高5位为PC源最高5位的内容,剩下11位为addr11中对应的内容;
    3. AJMP因跳转的范围在LJMP(64KB)和SJMP(256B)之间,也可以叫中跳转指令。

    例 若AJMP指令地址为2FFEH,跳转的范围为

    • PC + 2 = 3000H,故目标转移地址必在3000H—37FFH这2KB区域中;

    例 若AJMP指令地址为2FFDH,跳转的范围为

    • PC + 2 = 2FFFH,故目标转移地址必在 2800H—2FFFH这2KB区域中;

    SJMP rel

    指令名称:相对短转移指令
    目的:程序无条件转向256B程序存储器地址空间的任何单元
    源操作数:8位跳转相对地址

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    SJMP rel (PC) + 2 -> PC, (PC) + rel -> PC × × × × 2 2
    1. rel是一个带符号的偏移字节数,其范围是-128~+127
    2. 00H~7FH(0000 0000B ~ 0111 1111B,第一个位为符号位)表示为0 ~ +127,正向转移;
    3. 80H ~ FFH(1000 0000B ~ 1111 1111B)表示为-128 ~ -1,反向转移;
    4. SJMP rel执行时是先将PC内容加2,在加相对地址;

    例 (PC) = 0100H

    • SJMP 55H:表示正向转移到0100H + 2 + 0055H = 0157H地址;
    • SJMP F6H:表示反向转移到0100H + 2 + FFF6H = 00F8H地址。
    1. rel可以是转移的目的地址的标号;

    例 SJMP RELADR,其中RELADR的标号为0123H,(PC) = 0100H;

    • 相对转移量 rel = 0123H - (0100 + 2)H = 21H;
    • rel并没有直接写出来,需要计算。

    JMP @A + DPTR

    指令名称:间接移指令/散转指令
    目的:程序无条件转向DPTR和A之和的目标地址空间单元
    源操作数:16位的DPTR和8位的累加器A

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    JMP @A + DPTR (A) + (DPTR) -> PC × × × × 1 2
    1. DPTR中存放16位基地址,累加器A存放目标转移地址对基地址的偏移量;
    2. 机器通过变址寻址转移指令便可实现程序的分支转移;
    3. DPTR中的值是固定的,通过修改A中的内容来选择跳转目标地址;
    4. 范围:以DPTR内容为首地址的256B范围内;

    例 (DPTR) = 1000H,修改A中的内容

    • 设 A = 10H, (PC) = 1010H;
    • 设 A = 20H, (PC) = 1020H;
    • 设 A = 30H, (PC) = 1030H;

    关于SJMP、AJMP、LJMP的选择

    SJMP 如果跳转到的标号地址距离当前PC所指的地址小于256字节,用SJMP
    AJMP 如果跳转到的标号地址距离当前PC所指的地址小于2K字节,用AJMP
    LJMP 如果跳转到的标号地址距离当前PC所指的地址小于64K字节,用LJMP


    二、条件转移指令

    JZ英文全称:Jump if Zero
    JNZ英文全称:Jump if Not Zero
    CJNE英文全称:Compare Jump if Not Equal
    DJNE英文全称:Compare Jump if Not Equal


    JZ rel

    指令名称:判零转移指令
    目的:对累加器A中的内容进行零的判定
    源操作数:8位跳转相对地址

    JNZ rel

    指令名称:判零转移指令
    目的:对累加器A中的内容进行零的判定,同JZ
    源操作数:8位跳转相对地址

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    JZ rel (PC) + 2 -> PC; 若 A = 0,则 (PC) + rel -> A;若 A != 0,则 顺序执行,不跳转 × × × × 2 2
    JNZ rel (PC) + 2 -> PC; 若 A != 0,则 (PC) + rel -> A;若 A = 0,则 顺序执行,不跳转 × × × × 2 2
    1. JZ从英文字面上理解成A = Zero即0,就Jump,JNZ从英文字面上理解成A not Zero即!0,就Jump;
    2. 偏移量是一个带符号的8位,所有偏移量取值范围位-127~+128,同SJMP指令;
    3. 实际汇编中,rel用目标标号替代,如“JNZ NEXT”,此时rel并非一个在-127~+128之间的实际数,汇编时自动生成相对地址,同SJMP;

    例 (PC) = 0100H

    • JNZ 55H:当 (A) = 01H, 非零时,表示正向转移到0100H + 2 + 0055H = 0157H地址;当 (A) = 00H,PC = 0102H,继续执行下一条指令,不跳转;

    CJNE XXX, XXX, rel

    指令名称:比较转移指令
    目的:对指定的目的字节和源字节进行比较,不等转移,相等继续执行
    源操作数:8位跳转相对地址,累加器A,直接地址direct,立即数#data,间接寄存器@Ri,寄存器Rn

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    CJNE A, direct, rel (PC) + 3 -> PC; 若(direct) < (A),则 (PC) + rel -> PC且 0 -> CY;若(direct) > (A),则 (PC) + rel -> PC且 1 -> CY;若 (direct) = (A),则顺序执行,不跳转且 0 -> CY; × × × 3 2
    CJNE A, #data, rel (PC) + 3 -> PC; 若#data < (A),则 (PC) + rel -> PC且 0 -> CY;若#data > (A),则 (PC) + rel -> PC且 1 -> CY;若 #data = (A),则顺序执行,不跳转且 0 -> CY; × × × 3 2
    CJNE Rn, #data, rel (PC) + 3 -> PC; 若#data < (Rn),则 (PC) + rel -> PC且 0 -> CY;若#data > (Rn),则 (PC) + rel -> PC且 1 -> CY;若 #data = (Rn),则顺序执行,不跳转且 0 -> CY; × × × 3 2
    CJNE @Ri, #data, rel (PC) + 3 -> PC; 若#data < ((Ri)),则 (PC) + rel -> PC且 0 -> CY;若#data > ((Ri)),则 (PC) + rel -> PC且 1 -> CY;若 #data = ((Ri)),则顺序执行,不跳转且 0 -> CY; × × × 3 2
    1. 三字节指令:CJMP (目的字节), (源字节), rel
    2. 执行CJMP指令结果可以简单理解,想等继续执行,CY清零;不相等,跳转,CY置一还是清零看比较大小;
    3. 目的字节 大于 源字节(前 大于 后)CY清零;
    4. 目的字节 小于 源字节(前 小于 后)CY置一;
    5. 程序转移范围以(PC) + 3为起始地址的-128 ~ +127共256B;

    (A) = 03H,(10) = 04H,CY = 0,rel = 30H,(PC) = 0100H

    • CJMP A, 10H
      (A) = 03H != (10H) = 04H,(PC) = (PC) + 3 + rel = 0133H;
      (A) < (10H) ,CY = 1;

    DJNZ XXX, rel

    指令名称:循环转移指令
    目的:以直接地址或寄存器Rn的单元内容作为循环控制寄存器使用,利用其进行循环
    源操作数:8位跳转相对地址,寄存器Rn,直接地址direct

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    DJNZ Rn, rel (PC) + 2 -> PC;(Rn) - 1 -> Rn;当(Rn) != 0时,则(PC) + rel -> PC;当(Rn) = 0时,则结束循环,程序往下执行 × × × × 2 2
    DJNZ direct, rel (PC) + 3 -> PC;(direct) - 1 -> direct;当(direct) != 0时,则(PC) + rel -> PC;当(direct) = 0时,则结束循环,程序往下执行 × × × × 3 2
    1. 执行一次该语句,第一操作数减一,判断字节变量是否为0,不为0则继续循环;为0,则退出循环;
    2. DJNZ可以理解高级语言中的for (int i = n; i > 0; i–)循环语句;

    例 设(R1)= 07H,rel = 10H,(PC) = 0100H

    • DJNZ R1, rel
      R1循环07H,需要进行7次循环才为00H;
      循环7次后,(PC) = 0114H;
      跳转后, (PC) = 0124H

    三、调用和返回指令

    ACALL英文全称:Absolute subroutine Call
    LCALL英文全称:Long subroutine Call
    RET英文全称:Return from Subroutine
    RETI英文全称:Return from Interruption

    调用和返回之间的过程:

    1. CPU在主程序中遇到调用子程序ADD1的指令;
    2. CPU下一条指令第一字节的地址(PC值,断点处)压入堆栈中;
    3. 栈指针(SP) + 2,并将ADD1的起始地址送入PC,开始执行子程序了。
    4. 子程序执行完,通过RET指令回调到主函数;
    5. 将SP中的地址弹回PC中,回到主函数中。

    ACALL addr11

    指令名称:短调用指令
    目的:调用2KB范围内的所指定的子程序
    源操作数:11位目的地址

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    ACALL addr11 (PC) + 2 -> PC;(SP) + 1 -> (SP), (PCL) -> (SP),(SP) + 1 -> (SP), (PCH) -> (SP),addr(10~0) -> PC(10~0); × × × × 2 2

    • PCL为PC7 ~ 0即PC的低8位值;
    • PCH为PC15 ~ 8即PC的高8位值;
    1. 断点压入栈的过程
      将栈指针SP向下移动一个单元空间(对其加一操作);
      将PC的低8位送入SP的内容指向的单元空间;
      再将栈指针SP向下移动一个单元空间;
      将PC的高8位送入SP的内容指向的单元空间;
    2. 跳转到子程序过程
      将addr10 ~ 0送入PC10 ~ 0, PC15 ~ 11保持不变,形成16位转移目的地址;
      PC就指向子程序的首地址;
    3. 所调用的子程序首地址必须在ACALL指令后第一字节开始的2KB范围内的ROM中。

    例 (SP) = 40H,(PC) = 0100H,子程序ADD1首地址 0110H;

    • 执行ACALL ADD1
    • (PC) = (PC) + 2 = 0102H;先将PC加2,因指令长2字节;
    • (41H) = 02H ;先将PC的低8位放入SP指针内容的空间地址;
    • (42H) = 01H ;先将PC的高8位放入SP指针内容的空间地址,此时(SP) = 42H;
    • (PC) = 0110H;PC指向了子程序ADD1首地址;

    LCALL addr16

    指令名称:长调用指令
    目的:调用64KB范围内的所指定的子程序
    源操作数:16位目的地址

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    ACALL addr11 (PC) + 3 -> PC;(SP) + 1 -> (SP), (PCL) -> (SP),(SP) + 1 -> (SP), (PCH) -> (SP),addr(15~0) -> PC; × × × × 3 2

    • PCL为PC7 ~ 0即PC的低8位值;
    • PCH为PC15 ~ 8即PC的高8位值;
    1. 断点压入栈的过程
      将栈指针SP向下移动一个单元空间(对其加一操作);
      将PC的低8位送入SP的内容指向的单元空间;
      再将栈指针SP向下移动一个单元空间;
      将PC的高8位送入SP的内容指向的单元空间;
    2. 跳转到子程序过程
      将addr15 ~ 0送入PC15 ~ 0,形成16位转移目的地址;
      PC就指向子程序的首地址;
    3. 所调用的子程序首地址可以设置在64KB范围内的ROM中。

    例 (SP) = 07H,(PC) = 0123H,子程序ADD1首地址 5678H;

    • 执行LCALL ADD1
    • (PC) = (PC) + 3 = 0126H;先将PC加3,因指令长3字节;
    • (08H) = 26H ;先将PC的低8位放入SP指针内容的空间地址;
    • (09H) = 01H ;先将PC的高8位放入SP指针内容的空间地址,此时(SP) = 09H;
    • (PC) = 5678H;PC指向了子程序ADD1首地址。

    ACALL是你调用的子程序入口地址距离当前PC所指地址需介于0~2K,LCALL是0~64K


    RET

    指令名称:子程序返回指令
    目的:从子程序返回

    RETI

    指令名称:中断返回指令
    目的:从中断返回

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    RET ((SP)) -> PCH,(SP) - 1 -> SP,((SP)) -> PCL,(SP) - 1 -> SP × × × × 1 2
    RETI ((SP)) -> PCH,(SP) - 1 -> SP,((SP)) -> PCL,(SP) - 1 -> SP × × × × 1 2

    • PCL为PC7 ~ 0即PC的低8位值;
    • PCH为PC15 ~ 8即PC的高8位值;
    1. 当子程序执行此指令表示子程序结束了
    2. 恢复断点过程
      先将(SP)内容执行的地址空间作为PC的高8位;
      SP指向上一个地址空间;
      在将(SP)内容执行的地址空间作为PC的低8位;
      SP指向上一个地址空间;
    3. 此时PC中有返回目的地址的16位;

    例 (SP) = 09H,(09H) = 01H,(08H) = 26H,(PC) = 5678H

    • 在子程序中执行RET
    • (PC) = 0178H;先将(SP)内容执行的地址空间内容作为PC的高8位;
    • (SP) = 08H;将(SP)内容减1;
    • (PC) = 0126H;先将(SP)内容执行的地址空间内容作为PC的低8位;
    • (SP) = 07H;将(SP)内容减1;
    • 此时已经返回到地址为0126H的地址。

    四、位条件转移类指令

    JC英文全称:Jump if the Carry flag is set
    JNC英文全称:Jump if Not Carry
    JB英文全称:Jump if the Bit is set
    JNB英文全称:Jump if the Bit is Not set
    JBC英文全称:Jump if the Bit is set and Clear the bit


    JC rel

    指令名称:判布尔累加器C转移指令
    操作数:8位目的地址

    JNC rel

    指令名称:判布尔累加器C转移指令
    操作数:8位目的地址

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    JC rel (PC) + 2 -> PC,若(C) = 1,则(PC) + rel -> PC;若(C) = 0,则顺序执行 × × × × 2 2
    JNC rel (PC) + 2 -> PC,若(C) = 0,则(PC) + rel -> PC;若(C) = 1,则顺序执行 × × × × 2 2
    1. 累加器C是一个布尔累加器,位累加器;
    2. 根据累加器C中的值进行判断转移。

    JB bit, rel

    指令名称:判位变量转移指令
    操作数:位变量,8位目的地址

    JNB bit, rel

    指令名称:判位变量转移指令
    操作数:位变量,8位目的地址

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    JB bit rel (PC) + 3 -> PC,若(bit) = 1,则(PC) + rel -> PC;若(bit) = 0,则顺序执行 × × × × 3 2
    JNB bit rel (PC) + 3 -> PC,若(bit) = 0,则(PC) + rel -> PC;若(bit) = 1,则顺序执行 × × × × 3 2
    1. 根据位变量bit的值进行判断转移;
    2. JB、JNB相对于JC、JNC,其是对位变量bit进行判断转移,其他性质都一样。

    JBC bit, rel

    指令名称:判位变量并清零转移指令
    操作数:位变量,8位目的地址

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    JBC bit rel (PC) + 3 -> PC,若(bit) = 1,则(PC) + rel -> PC,0 -> CY;若(bit) = 0,则顺序执行 × × × × 3 2
    1. 相比于JB,JBC仅仅是增加CY清零的步骤;
    2. 在位变量bit为1时,不仅仅要跳转,还要CY清零。

    五、空操作指令

    NOP英文全称:No Operation

    NOP

    指令名称:空操作指令

    助记符 功能 对标志位影响 字节数 周期数
    P OV AC CY
    NOP 空操作 × × × × 1 1

    51单片机之系统指令

    51单片机之逻辑运算指令ANL、ORL、XRL等

    51单片机之数据转移指令MOV、MOVX、MOVC等

    51单片机之位操作指令SETB、CPL等

    51单片机之算术运算指令ADDC、SUBB等

    参考


    由本人水平有限,文章难免有错误,望告知

    展开全文
  • 标准51架构的单片机有2个定时器 :T0 和 T1,他们2个的用法几乎一样。下面主要讲T0定时器的用法。   初步认知   定时器 和 计数器 都是单片机中同一个模块。他们的实质都是: 加法存储计数器。对于计数器...

    【C51】单片机定时器介绍http://www.cnblogs.com/lulipro/p/5064099.html

    标准51架构的单片机有2个定时器 :T0  和  T1,他们2个的用法几乎一样。下面主要讲T0定时器的用法。

     

    初步认知

     

    定时器 和 计数器 都是单片机中同一个模块。他们的实质都是: 加法存储计数器。对于计数器很好理解,每来一个信号(信号从P3.4 或者P3.5输入),就加1,以此达到计数的目的。
    对于定时器,每隔1个机器周期 加 1,假如(只是假如)一个机器周期为 1ms , 当加到1000时,我们就认为经过了1s,这就是定时器的原理。

     

    加法存储寄存器THx & TLx

     
    定时器依赖计数,需要把累计增加的那个量存储在某个地方,这就是THx和TLx(x 可以是 0 或者1)2个8位寄存器的的职责。
    T0和T1都拥有一对加法存储寄存器。
    T0 对应:TH0,TL0
    T1 对应 : TH1 , TL1
     
    在reg51.h头文件中我们发现这4个寄存器的定义:
     
    sfr TL0  = 0x8A;              //  TL中的L是LOW的意思,代表低位,同理H代表HIGH高位。
    sfr TL1  = 0x8B;
    sfr TH0  = 0x8C;
    sfr TH1  = 0x8D;
     

     

    他们可以在程序中直接使用,复位值都是 0 。
    当一直累加,使得他们保存不了太大的数据而发生溢出时,就会引发中断(后面讲中断)。并且对应的TFx溢出标志位会置为1,(没有溢出的情况下是0)。
    如果不使用中断去处理溢出这个事件,那么我们就必须通过代码指令让TFx重置为 0 ,并让THx和TLx回归初始值,准备然后进入下一轮周期的计数。
     
     
    复制代码
    ....
    if(TF0==1)    //如果T0 溢出了
    {
         TF0=0;
         //重新初始化 TH0  和 TL0
         //说明过了一个溢出周期了
    }
     
    复制代码

     

     

     2个重要的寄存器:TMOD 和 TCON

     
     

     

    复位时所有位全  为 0

    TFx:溢出标志位。溢出时置1。正常为0。
     
    TRx:计数器/定时器 启动停止控制位 。R是run的意思。  TR0 = 1  开启定时器0,为TR0 = 0 则停止。
     
    低4位与外部中断相关,这里用不到,先不用看。

     

     

     

     

     

    复位时所有位全  为 0

    高4位是定时器T1相关的,低4位是T0 相关的。
    以T0来说明。
     
    GATE:      门控制位
    C/T    :     定时器/计数器切换位。 1为计数器模式, 0 为定时器模式。

     

    ②处 C/T = 0 表示为定时器模式,触发信号为①处的单片机内部时钟信号。(若②处CT = 1,则触发信号为Tn脚,信号从P3.4 或者P3.5输入单片机)
     
    ③处表明,信号能触发使加法计数器加1,还得受④处控制。不然时钟信号是不能让加法计数器累加的。 ④处这个是与门,TRn必须为1,表明我们要开启定时器。同时GATE为0,通过非门后为1,再通过或门,也是1,那么就让③处控制起来了。
     
    (若GATE为1,那么,定时器的启动停止受 TRx和 INTx 共同控制。 )
     
     
    于是我们需要:
    TRn    为 1
    GATE  为 0
    INTn   为 X(X表示任意的意思,do not care)
     
     
     
    加法存储寄存器的工作模式,是由M0和M1共同来决定的
    M1 M0 模式
    0 1 TH和TL2个组成16位计数存储器模式
    1 0 TH负责初始化TL,TL计数。8位重装模式
    0 0 THx的8位和TLx的位5组成13位加法计数器(很少用)
    1 1 基本不用

     

     

     

    时钟周期和机器周期

     
    顺便提一下:标准C51的1个机器周期为12个时钟周期(增强型51单片机的机器周期会短一些,cc2530只有的机器周期只等于1个时钟周期)。
    如果晶振的频率是11.0592MHz,那么时钟周期就是   1 / (11.0592x10^6) 秒   (1MHz = 10^6Hz)

    那么,无论是定时器,还是计数器,每隔1个机器周期 ,加法存储器就1,代表时间经过了  12  x     1 / (11.0592x10^6) 秒。这就是我们衡量的基础依据。

     
     

    为THx和TLx赋初始值

    若TH0 和 TL0 以 16位 模式工作,那它的计数范围为   [0 , 65535 ]  ,  也就是累加 65536次发生溢出。 每累加一次是  12 / (11.0592x10^6) 秒。
    那么从 0 累加到溢出 历时  ≈ 0.071s = 71ms 。
    我们一般需要延时 10的整数倍ms,以便用倍数控制更长的延时时间。所以,我么要给 TH0 和  TL0赋一个初始值,使他们的溢出周期(TH0,TL0从初始值到溢出所用的时间)减少到 10ms,或者1ms。
    就像一个瓶子,开始装了2/3,再来就只能装1/3就溢出了。
     

     12 / (11.0592x10^6) s       -----     1   次

     
     10x 10-3   s                        ------          x  次         (求出 x = 9216次 ,计数9216次后溢出)
     
    65536 - 9216 = 56320  =  二进制( 11011100   00000000)
     
    也就是  TH0 = 11011100 , TL0 = 00000000

     

     

    代码例子验证

     

    复制代码
    #include<reg51.h>
    typedef unsigned int uint; 
    
    
    /**************函数声明******************/
    void delay10ms(uint m) ;
    void delay1ms(uint m) ;
    /********************************/ 
    
    
    /*****************************/
    sbit LED = P0^0; 
    /*****************************/
    
    
    
    void main() 
    { 
         while(1)
         {
             LED = 1;
             delay10ms(100);   // delay1ms(1000)
             LED = 0;
             delay10ms(100);   // delay1ms(1000)
              
             
         }
    } 
    
    
    void delay10ms(uint m)     //溢出周期为10ms
    {
    
      /********************
       使用到的寄存器(位)
       
       TH0   TL0
    
       TCON:  TR0    TF0
       TMOD:
    
      ***********************/
    
    
    
        uint count =0;
        TMOD = 1;        //GATE = 0    C/T =0    M1 = 0  M0 = 1;  16位计数器
        TL0 = 0 ;
        TH0 =220 ;
    
        TR0 = 1;
    
        for(;count<m;)
        {
             if(TF0 == 1)
             {
                  TF0 = 0;
                  TL0 = 0;
                  TH0 = 220;
    
                  ++count;
    
             }
        }
    
        TR0   =  0;   //关闭定时器
        
    }
    
    
    
    void delay1ms(uint m)       //溢出周期为1ms
    {
         uint count=0;
         TMOD = 1;   //计时器0以16为存储计时器工作
         TH0 = 252 ;
         TL0 = 102;
         TR0 = 1;
    
             for(;count<m;)
             {
    
              if(TF0==1)        //发生一次溢出,也就是过了1ms          
              {
                   TF0=0;       //溢出位清零,取消警报
                   TH0 = 252 ;  //重新配置初始值
                   TL0 = 102;
                   count++;     //溢出次数加1 ,溢出1次是1ms,溢出t次就是t ms          
               }
    
    
            }
          
         TR0 = 0;
    
    }
    复制代码

     

     

     

    8位重装模式

    8位重装模式是:只有TL0计数,TH0不变,他只为TL0提供初始值。当TL计数溢出后,TF0就为1,如果继续工作,TH0就把自己的值赋给TL0,再开始计数,如此循环下去。

    上面些写了一个毫秒级的delay函数,下面用8位重装模式写一个控制微秒级别的函数。并控制P0.0的LED实现呼吸灯。

     

    计算方法和上面一样,大家可以自己算

     

    复制代码
    #include<reg51.h>
    typedef unsigned int uint;
    
    
    # define TRUE 1
    # define FALSE 0
    
    /**************函数声明******************/
    void
    delay1ms(uint t); /********************************/ sbit LED = P0^0; void main() { int step = 0; int again = FALSE; while(1) { LED = again?0:1; delay1ms(step); LED = again?1:0;; delay1ms((500-step)); step+=1; if(step>500) { step =0; again = !again; } } } void delay1ms(uint m) //延时t微秒 { int count=0; TMOD = 2; TH0= 255 ; TL0= 255; TR0=1; for(;count!=m;) { if(TF0==1) { TF0=0; //自动重装 count++; } } TR0=0; }
    复制代码

     

     

    值得注意的地方

    我们应该尽量让溢出周期 越长越好。溢出周期为10ms 的优于 1ms 的。因为,在同样的延时时间下,如100ms,溢出周期为10ms 的 只需要溢出10次,为TH0 和 TL0重新赋值10次,而溢出周期为1ms的要溢出100次,为TH0 和 TL0重新赋值100次。减少溢出次数和赋值次数,可以减轻单片机的负担,提高定时的准确性。

     

     

     

    /***************************************************/

     欢迎转载,请注明出处:www.cnblogs.com/lulipro

     为了获得更好的阅读体验,请访问原博客地址。

     代码钢琴家

    /***************************************************/

     

    作者:代码钢琴家 
    出处:http://www.cnblogs.com/lulipro/ 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。为了获得更好的阅读体验,请访问原博客地址。限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

    展开全文
  • 51单片机学习

    2019-04-07 17:57:14
    51单片机指令集 *51指令不区分大小写 1个机器周期=12个时钟振荡周期 只有乘除两条指令的执行时间为4个机器周期 指令由两部分组成:操作码+操作数 指令系统的寻址方式 共7种寻址方式 寄存器寻址方式 MOV A,Rn;n=0~7...

    51单片机指令集

    *51指令不区分大小写

    1个机器周期=12个时钟振荡周期

    只有乘除两条指令的执行时间为4个机器周期

    指令由两部分组成:操作码+操作数

    指令系统的寻址方式

    共7种寻址方式

    1. 寄存器寻址方式

      MOV A,Rn;n=0~7 寄存器Rn的内容传送到累加器A

    2. 直接寻址方式

      MOV A,40H 直接地址传送给累加器A

    3. 寄存器间接寻址方式

      MOV R1,#40H

      MOV A,@Ri 累加器传送到外部RAM

      PUSH(压栈)和POP(出栈)

    4. 立即寻址方式

      MOV A,#40H

      MOV A,#0FFH

      若立即数的首位为A~F,前面还要加零

    5. 基址寄存器加变址寄存器间址寻址方式

      以DPTR或PC作基址寄存器,以累加器A作为变址寄存器。

      MOVC A,@A+DPTR

      MOVC A,@A+PC

      JMP @A+DPTR

      专门针对程序存储器的寻址方式

    6. 位寻址方式、

      MOV C,bit

      MOV C,40H 直接寻址位传送到进位位C

      可寻址位4种表示方法

      1. 直接使用位地址。例如PSW.5的位地址为0D5H。
      2. 用位名称表示。例如PSW.5用F0表示该位。
      3. 单元地址加位数的表示方法。例如PSW.5可表示为(0D0H).5
      4. 特殊功能寄存器符号价位数的表示方法。例如PSW.5。
    7. 相对寻址方式

      目的地址=源地址+2(相对转移指令字节数)+rel

    指令系统分类

    1. 数据传送类(28条)
    2. 算术操作类(24条)
    3. 逻辑运算类(25条)
    4. 控制转移类(17条)
    5. 位操作类(17条)

    指令中符号的意义:

    Rn 当前寄存器区的8个工作寄存器R0~R7。

    Ri 当前选中的寄存器区中可作间接寻址寄存器的2个寄存器R0、R1。

    Direct 直接地址,即8位的内部数据存储器单元或特殊功能寄存器的地址。

    #data 包含在指令中的8位立即数。

    #data16 包含在指令中的16位立即数。

    rel 相对转移指令中的偏移量,为8位的带符号补码数。

    DPTR 数据指针,可用作16位的数据地址寄存器。

    bit 内部RAM或特殊功能寄存器中的直接寻址位。

    C(或Cy) 进位标志位或位处理机中的累加器。

    addr11 11位目的地址

    addr16 16位目的地址

    @ 间接寻址寄存器前缀

    (X)X中的内容

    ((X))由X寻址的单元中的内容

    数据传送类指令

    MOV <目的操作数>,<源操作数>

    1. 以累加器为目的操作数的指令

    MOV A,Rn

    MOV A,@Ri

    MOV A,direct

    MOV A,#data

    2. 以Rn为目的操作数的指令

    MOV Rn,A

    MOV Rn,direct

    MOV Rn,#data

    3. 以直接地址direct为目的操作数的指令

    MOV direct,A

    MOV direct,Rn

    MOV direct1,direct2

    MOV direct,@Ri

    MOV direct,#data

    4. 以寄存器间接地址为目的操作数的指令

    MOV @Ri,A

    MOV @Ri,direct

    MOV @Ri,#data

    5. 16位传送指令

    MOV DPTR,#data16

    DPH:指向高八位

    DPL:指向低八位

    6.堆栈操作指令

    进栈指令

    PUSH direct

    出栈指令

    POP direct

    ----先进后出!!!

    7. 累加器A与外部数据存储器传送指令

    MOVX A,@DPTR

    MOVX A,@Ri

    MOVX @DPTR,A

    MOVX @Ri,A

    8.查表指令

    MOVC A,@A+PC PC中的内容是将要执行的下一条指令的地址

    MOVC A,@A+DPTR

    9. 字节交换指令

    XCH A,Rn

    XCH A,direct

    XCH A,@Ri

    10. 半字节交换指令

    XCHD A,@Ri 累加器的低4位与内部RAM低四位交换

    算数操作类指令

    1. 加法指令

    ADD A,Rn

    ADD A,direct

    ADD A,@Ri

    ADD A,#data

    结果总是放在累加器ACC中

    位7有进位Cy=1,否则置零

    位3有进位Ac=0,否则置零

    位6和位7有且只有一个进位OV=0,否则置零

    A中结果1的位数为奇数个,奇偶校验位P=1,否则置零

    2. 带进位加法指令

    ADDC A,R0

    ADDC A,direct

    ADDC A,@Ri

    ADDC A,#data

    3. 加1指令

    INC A

    INC Rn

    INC direct

    INC @Ri

    INC DPTR

    不影响PSW中的任何标志(Cy,Ac,OV)!

    4. 十进制调整指令

    用于对BCD码十进制数加法运算结果的内容修正

    两个压缩BCD码按二进制相加之后,必须经本指令的调整才能得到正确的和数(仍为压缩BCD码表示)。

    DA A

    应用背景

    ①执行前一般有一条加法指令。

    ②加法指令中的两个家属,应该是用压缩BCD码表示的十进制数,和存放在A中。

    ③执行完DA指令后,A中存放的数是两个加法指令的十进制和,也使用压缩BCD码表示。

    5. 带借位的减法指令

    SUBB A,Rn

    SUBB A,direct

    SUBB A,@Ri

    SUBB A,#data

    位7有借位Cy=1,否则置零

    位3有借位Ac=0,否则置零

    位6和位7有且只有一个借位OV=0,否则置零

    6. 减1指令

    DEC A

    DEC Rn

    DEC direct

    DEC @Ri

    7. 乘法指令

    MUL AB A×B→BA

    如果积大于255,则。如果OV为1,需读B。

    8. 除法指令

    DIV AB A/B→A(商),余数→B

    如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并置“1”溢出标志位OV。

    逻辑运算指令

    1.简单逻辑操作指令

    CLR A 功能是对累加器A清“0”

    CPL A 功能是将累加器A的内容按位逻辑取反

    不影响PSW中的任何标志(Cy,Ac,OV)!

    2. 左环移指令

    RL A 功能室累加器A的8位向左循环移位,位7循环移入位0,不影响标志。

    3. 带进位左环移指令

    RLC A 功能室将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy进入Acc.0,不影响其它标志。

    4. 右环移指令

    RR A

    5. 带进位右环移指令

    RRC A

    6. 累加器半字节交换指令

    SWAP A 将累加器A的高半字节(Acc.7Acc.4)和低半字节(Acc.3Acc.0)互换。

    7.逻辑与指令

    ANL A,Rn

    ANL A,direct

    ANL A,#data

    ANL A,@Ri

    ANL direct,A

    ANL direct,#data

    8.逻辑或指令

    ORL A,Rn

    ORL A,direct

    ORL A,#data

    ORL A,@Ri

    ORL direct,A

    ORL direct,#data

    9. 逻辑异或指令

    XRL A,Rn

    XRL A,direct

    XRL A,#data

    XRL A,@Ri

    XRL direct,A

    XRL direct,#data

    不同为1相同为0

    控制转移类指令

    1. 无条件转移指令

    AJMP addr11

    2. 长跳转指令

    LJMP addr16 addr16→可用程序的标号来代替

    3.相对转移指令

    SJMP rel 处于当前PC值的-128字节——+127字节字节之内

    4.间接跳转指令

    JMP @A+DPTR

    5. 条件转移指令

    JZ rel 如果累加器为"0",则转移

    JNZ rel 如果累加器非"0",则转移

    6. 比较不相等转移指令

    CJNE A,direct,rel

    CJNE A,#data,rel

    CJNE Rn,#data,rel

    CJNE @Ri,#data,rel

    如果第一操作数(无符号整数)小于第二操作数(无符号整数),则进位标志位Cy置"1",否则置"0"

    7. 减1不为0转移指令

    DJNZ Rn,rel

    DJNZ direct,rel

    8. 调用子程序指令

    (1) 短调用指令

    ACALL addr11

    (2) 长调用指令

    LCALL addr11

    该指令执行时,MCS51执行如下操作:

    (1)当前PCL、PCH进栈

    (2)addr 16送入PC

    9. 子程序的返回指令

    RET

    10. 中断返回指令

    RET1

    11. 空操作指令

    NOP

    位操作指令

    1. 数据位传送指令

    MOV C,bit

    MOV bit,C

    2. 位变量修改指令

    CLR C 清零

    CLR bit

    CPL C 求反

    CPL bit

    SETB C 置1

    SETB bit

    3. 位变量逻辑与指令

    ANL C,bit

    ANL C,/bit

    4. 位变量逻辑或指令

    ORL C,bit

    ORL C,/bit

    5. 条件转移类指令

    JC rel Cy位

    JNC rel

    JB bit,rel 直接寻址位

    JNB bit,rel

    JBC bit,rel 直接寻址位=1则转移,并清0直接寻址位

    问答

    1. 如何对SFR中的内容进行读写

    直接寻址方式访问。MOV A,80H或者MOV A,P0

    1. 如何对52系列单片机的高128字节RAM进行读写?

    间接寻址方式访问。

    MOV R0,#80H

    MOV A,@R0

    1. 如何读出片外数据存储器字节地址为2000H中的内容?

    MOV DPTR,#2000H

    MOVX A,@DPTR

    展开全文
  • 51单片机C关键字

    千次阅读 2012-07-03 16:55:02
    关键字 用 途 说 明 auto 存储种类说明 用以说明局部变量,缺省值为此 break 程序语句 退出最内层循环 case 程序语句 Switch语
  • 第5章 8051单片机工作原理

    千次阅读 2017-05-21 17:36:55
    通过前面4位计算机的结构...这一章我们将对Intel公司出品的8051架构单片微型计算机进行讲解,并在后续章节中陆续设计出基于8051单片机的个人计算机,并且为其开发一款简单的操作系统,最终此8051计算机可以运行SD上的应
  • 单片机指令功能及其机器码一览表

    千次阅读 2010-06-04 10:42:00
    助记符 代码 机器码 说明 MOV A,Rn E8~EF 寄存器A MOV A,direct E5 dircet 直接字节送A MOV A,@Ri ER~E7 间接RAM送A MOV A,#data 74 data 立即数送A MOV Rn,A F8~FF A送寄存器 MOV Rn,dircet A8~AF dircet 直接字节...
  • 单片机实验----控制流水灯

    千次阅读 2018-09-29 00:32:35
    单片机实验----控制流水灯 效果: 如图: (上传的gif,好像不太支持) 知识点: 学习MOVC,INC,CJNE,DB指令 学习一种新的编程方法——查表法 代码展示: ORG 0000H MAIN: MOV DPTR,#TAB ;数据指针...
  • 通过ESP8266手机或电脑浏览器网页能控制远程任意组任意路继电器开关,并发送指令给单片机
  • RN4020基于Microchip在传统蓝牙技术方面积累的深厚经验研发而成,新模块通过了全球法规认证以及蓝牙技术联盟(SIG)的认证。集成的蓝牙低功耗(BTLE)协议栈以及对通用SIG低功耗配置文件的板载支持既加速了产品的...
  • 单片机

    2019-01-19 09:49:25
    单片机
  • 单片机外围电路设计之一:电阻 对于电阻,想必大家都觉得简单,没有什么好说的。其实电阻的应该还是非常广泛的,在不同的应用场合其作用是完全不同的。本人将总结其基本用法,及容易被忽略的地方。 1概念 电阻...
  • 单片机指令系统(2) 3.1指令分类 按51单片机指令的功能来进行分类,可分为以下几类 数据传输类指令 29条 算术运算类指令 24条 逻辑操作类指令 24条 控制转移类指令 17条 位操作类指令 17条 3.2指令操作数所表示...
  • 单片机指令的机器码

    2013-10-09 16:58:16
    转载于:http://qishangpan.blog.163.com/blog/static/932108120082219249960/ 助记符 代码 说明 MOV A,Rn E8~EF 寄存器A MOV A,direct
  • 51单片机 (1)总记

    千次阅读 2017-06-21 00:45:11
    1、单片机电路仿真软件Proteus;编程软件Keil; 在Proteus中设计好电路图、在Keil中编写程序编译生成十六进制文件。 在电路图中载入该十六进制文件通过相应的程序控制电路。
  • 本文以AT89C51为例,列举51单片机汇编语言指令集。 AT89C51单片机的汇编指令共有111条,可按功能分为5大类: 数据传送类指令28条; 算数操作类指令24条; 逻辑运算类指令25条; 控制转移类17条; 位操作类17条。 ...
  • 电量检测芯片BQ27510使用心得

    千次阅读 2019-07-16 22:13:03
    最近接触到一款TI的电量检测芯片BQ27510,网上很少有人...SMB,HDQ,三种通信方式,这里我们用的是IIC接口,看了该芯片的数据手册后,感觉控制起来非常方便,只用IIC去读它的寄存器即可,不过唯一麻烦的是,你必须...
  • MCS-51控制转移指令

    千次阅读 2009-06-08 09:01:00
     控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和...
  • 单片机指令功能一览表 助记符 代码 说明 MOV A,Rn E8~EF 寄存器A MOV A,direct E5 dircet 直接字节送A MOV A,@Ri ER~E7 间接RAM送A MOV A,#data 74 data 立即数送A MOV Rn,A F8~FF A送寄存器 MOV Rn,...
1 2 3 4 5 ... 20
收藏数 395
精华内容 158
关键字:

单片机控制rn8209