Board logo

标题: M51单片机汇编小讲座开始了!希望大家关注 [打印本页]

作者: 13013963877    时间: 2009-8-2 10:23     标题: M51单片机汇编小讲座开始了!希望大家关注

本帖最后由 13013963877 于 2011-5-22 11:54 编辑

*************************************
*M51汇编语言程序详细介绍与使用事项***
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
*声明:由于大量的文字工作,下属文章难免有错误之处,讲座*
*      准备给大家详细讲解30个小程序,本着从易到难的原则    *
*      由于小讲座是连贯性的,希望大家不涉及讲座的回帖及     *
*      灌水帖子不要在此回帖跟帖,否则一律扣金币10个。        *
*      小讲座为了照顾初学编程序学员,只讲解M51汇编程序     *
*      有学习M51汇编程序的学员,自己制作单片机最小系统     *
*      此次讲座不涉及C语言编程,真诚的希望大家在此谅解!     *
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
*汇编语言文件名注意:                                                              *
*    1,采用记事本形式的程序文件后缀名必须是.ASM              *
*  2、ASM文件名不得使用以下字符:/  \ :* ? < > |+-,      *
*       否则编译程序会出错提示。                                              *
*    3,各个程序中的《,》不能采用其它符号,否则编译程序    *
*       会出错提示。                                                                   *
*    4,程序后面如果加有注释则必须采用《;》半角分号隔开    *
*    5,所有程序中使用的标点符号必须是半角,否则编译程     *
*       序会出错提示。                                                               *
*    6,初学程序编译器建议大家采用南京《伟福编译器》。     *
*    7,由于采用宏晶公司的STC89C51(2)单片机,不涉及使用*
*       编程器,只需要采用MAX232串入芯片写入。                   *
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
;硬件:CPU:STC89C51(2)
;端口设置:
;P0、P1、P2、P3口(负逻辑)
;即输出低电平有效(高电平输出是弱上拉)
;               【STC89C51】
;                  ┏━┓┏━┓
;    T2 P1.0 ┫1 ┗┛40┣ Vcc━与宏晶公司的下载软件接一开关做握手信号
;T2EXP 1.1 ┫2        39┣ P0.0
;         P1.2 ┫3        38┣ P0.1
;         P1.3 ┫4        37┣ P0.2
;         P1.4 ┫5        36┣ P0.3
;         P1.5 ┫6        35┣ P0.4
;         P1.6 ┫7        34┣ P0.5
;         P1.7 ┫8        33┣ P0.6
;     RESET ┫9        32┣ P0.7
; RXD P3.0 ┫10      31┣ -EA/VP 置1
;  TXD P3.1 ┫11     30┣ ALE/-P
;-INT0 P3.2 ┫12     29┣ -PSEN
;-INT1 P3.3 ┫13     28┣ P2.7
;  T0   P3.4 ┫14     27┣ P2.6
;  T1   P3.5 ┫15     26┣ P2.5  
;-WR  P3.6 ┫16     25┣ P2.4
; -RD  P3.7 ┫17     24┣ P2.3
;      XTAL2 ┫18     23┣ P2.2
;      XTAL1 ┫19     22┣ P2.1
;         GND ┫20     21┣ P2.0
;                 ┗━━━━┛
[主电源及时钟引脚]  
◎ [40脚] Vcc:
    正常运行、烧录、较验时,接 +5V电源。
◎ [20脚] Vss:
    接地。
◎ [19脚] XTAL1:
    反向放大器输入,外接晶振。
◎ [18脚] XTAL2:
    反向放大器输出,外接晶振。
[控制或其它电源复用引脚]
◎ [9脚] RST/VPD:
    运行时,高电平将使 CPU复位,并且正常运行时,要保证低于0.5V的低电平;
    掉电期间,此引脚可以在Vcc低于规值时,而VPD在 5V士0.5V时,就能保持
    RAM内的数据不被丢失。
◎ [10脚] RXD;
   串行输入,这次小讲座使用程序下载接到MAX232  12脚R1OUT
◎ [11脚] TXD;
   串行输出,这次小讲座使用程序下载接到MAX232  11脚T1IT
◎ [30脚] ALE/-PROG:
    ALE 访问外部地址锁存允许;-PROG 片内 EEPROM 编程脉冲输入。
◎ [29] -PSEN:
    外部存储器读选通信号。
◎ [31脚] -EA/VP(Vpp):
    使用片内 ROM程序存储器 时,-EA/VP 引脚必须接高电平,当程序计数器PC
    超出片内ROM程序存储器地址编码范围时,才转到外部ROM中取指令。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  【 附录1:MCS-51单片机指令表】
  (按字母排序)
指令         指令功能              用途、说明
ACALL addr11   ;PC←(PC)+2, SP←(SP)+1;
             ;(SP)←(PC)7~0, SP←(SP)+1;
             ;(SP)←(PC)15~8,PC10~0←addr11
               绝对调用,寻址空间只可在同一2KB空间内使用。
ADD A, direct  ;A←(A)+ (direct)      ;直接寻址。
ADD A,Rn       ;A←(A)+(Rn)           ;寄存器寻址。
ADD A,#data   ;A←(A)+data           ;立即寻址。
ADD A,@Ri    ;A←(A)+((Ri))         ;寄存器间址。
ADDC A,#data   ;A←(A)+data+(c)       ;立即寻址。
ADDC A,@Ri     ;A←(A)+((Ri))+(C)     ;寄存器间址。
ADDC A,direct  ;A←(A)+(direct)+(C)   ;直接寻址。
ADDC A,Rn      ;A←(A)+(Rn)+(C)       ;寄存器间址。
AJMP addr11    ;PC←(PC)+2, PC10~0←addr11;
                       绝对转移,寻址范围只可在同一2KB内。
ANL A,#data    ;A←(A)^(data)         ;立即寻址。
ANL A,@Ri      ;A←(A)^((Ri))         ;寄存器间址。
ANL A,direct   ;A←(A)^(direct)       ;直接寻址。
ANL A,Rn       ;A←(A)^(Rn)           ;寄存器寻址。
ANL C, bit     ;C←(C)^(bit)
ANL C, /bit    ;C←(C)^(-bit)
ANL direct, #data ; direct←(direct)^(data)
ANL direct, A     ;direct←(direct)^(A)
CJNE @Ri, #data, rel;
  若data<((Ri)),则PC←(PC)+3+rel,且Cy←0;
  若data>((Ri)),则PC←(PC)+3+rel,且Cy←1;
  若data=((Ri)),则PC←(PC)+3。
CJNE A, #data, rel;
  若(A)>data,则PC←(PC)+3+rel,且Cy←0;
  若(A)<data,则PC←(PC)+3+rel,且Cy←1;
  若data=(A),则PC←(PC)+3。
CJNE A, direct, rel;
  若(direct)<(A),则PC←(PC)+3+rel,且Cy←0;
  若(direct)>(A),则PC←(PC)+3+rel,且Cy←1;
  若(direct)=(A),则PC←(PC)+3。
CJNE Rn, #data, rel;
  若data<(Rn),则PC←(PC)+3+rel,且Cy←0;
  若data>(Rn),则PC←(PC)+3+rel,且Cy←1;
  若data=(Rn),则PC←(PC)+3。
CLR A             ;A←00H         ; 清0
CLR bit            ;dit←0         ; 清0
CLR C             ;C←0           ; 清0
CPL A             ; A←(-A)       ;取反
CPL bit             ;(bit)←(-bit)  ;取反
CPL C             ; C←(-C)       ;取反
DA A       ;BCD码十进制调整,紧跟在ADD和ADDC之后。
DEC @Ri     ;Ri←((Ri))- 1        ;减1
DEC A        ;A←(A)- 1            ;减1
DEC direct  ;direct←(direct)- 1  ;减1
DEC Rn      ;Rn←(Rn)- 1          ;减1
DIV A B      ;(A) / (B)            ;A除以B
              ;任何一个参与要除以和被除以的数据都要送入
              ;A  B之中,程序除法仅有这一条
DJNZ direct,rel     ;direct=(direct)- 1;
                    若(direct)=0,则 PC←(PC)+3;
                    若(direct)≠0,则 PC←(PC)+3+rel 。
DJNZ Rn,rel         ;Rn=(Rn)- 1;
                    若(Rn)=0,则 PC←(PC)+2;
                    若(rN)≠0,则 PC←(PC)+2+rel。
INC @Ri     ;Ri←((Ri))+1。
INC A       ;A←(A)+1。
INC direct  ;direct←(direct)+1。
INC DPTR    ;DPTR←(DPTR)+1。
INC Rn      ;Rn←(Rn)+1。
JB bit,rel    ;
  若(bit)=1,则PC←(PC) +3 +rel;
  若(bit)=0,则PC←(PC) +3。
JBC bit,rel   ;
   若(bit)=1,则PC←(PC) +3 +rel,且dit←0;
  若(bit)=0,则PC←(PC) +3。
JC rel        ;
  若(C)=1,则PC←(PC) +2 +rel;
  若(C)=0,则PC←(PC) +2。
JMP @A+DPTR   ;
  PC=(PC)+rel, 其中rel=(A)
JNB bit,rel   ;
  若(bit)=0,则PC←(PC) +3 +rel;
  若(bit)=1,则PC←(PC) +3。
JNC rel       ;
  若(C)=0,则PC←(PC) +2 +rel;
  若(C)=1,则PC←(PC) +2。
JNZ rel       ;
  若(A)≠0,则PC←(PC) +2 +rel;
  若(A)=0,则PC←(PC) +2。
JZ rel        ;
  若(A)=0,则PC←(PC) +2 +rel;
  若(A)≠0,则PC←(PC) +2。
LCALL addr16  ;PC←(PC) +3, SP←(SP)+1
              (SP)←(PC)7~0, SP←(SP)+1
              (SP)←(PC)15~8, PC15~0←adde16
LJMP addr16     ;PC←addr15~0
MOV bit,C      ;bit←(C)
MOV C, bit       ;C←(bit)
MOV @Ri,#data   ;(Ri)←data
MOV @Ri,A     ;(Ri)←(A)
MOV @Ri,direct  ;(Ri)←direct
MOV A,#data      ;A←data
MOV A,@Ri          ;A←((Ri))
MOV A,direct       ;A←(direct)
MOV A,Rn           ;A←(Rn)
MOV direct,#data    ;direct←data
MOV direct,@Ri      ;direct←((Ri))
MOV direct,A        ;direct←(A)
MOV direct,Rn       ;direct←(Rn)
MOV direct1,direct2 ;direct←direct
MOV DPTR,#data16  ;DPTR→data16
MOV Rn,#data   ;Rn←data
MOV Rn,A       ;Rn←(A)
MOV Rn,direct    ;Rn←(direct)
MOVC A,@A+DPTR    ;A←((A)+(DPTR))
MOVC A,@A+PC     ;PC←(PC)+1, A←((A)+(PC))
MOVX @PDTR,A     ;(DPTR)←(A)
MOVX @Ri,A       ;(Ri)←(A)
MOVX A,@DPTR    ;A←((DPTR))
MOVX A, @Ri       ;A←((Ri))
MUL AB          ;BA←(A)×(B)
                  ;任何一个参与要乘数和被乘数的数据都要送入
                  ;A  B之中,程序乘法仅有这一条
NOP             ;PC←(PC)+1 空操作
ORL A,#data   ;A←(A)ˇdata   
ORL A,@Ri     ;A←(A)ˇ((Ri))
ORL A,direct  ;A←(A)ˇ(direct)
ORL A,Rn      ;A←(A)ˇ(Rn)
ORL C, bit    ;C←(C)ˇ(bit)
ORL C, /bit   ;C←(C)ˇ(-bit )
ORL direct,#data ;direct←(direct)ˇ(data)
ORL direct,A  ;direct←(direct)ˇ(A)
POP  direct   ;(direct)←((SP)), SP←(SP)-1
              ;出堆栈
PUSH direct   ;SP←(SP)+1, (SP)←(direct)
              ;压堆栈
RET           ;返回只能在子程序或其它程序结束使用,不可所以RETI
  PC15~8←((SP)), SP←(SP)-1
  PC7~0←((SP)), SP←(SP)-1
RETI          ;中断返回只能在中断程序中使用,如果使用RET程序出错
  PC15~8←((SP)), SP←(SP)-1
  PC7~0←((SP)), SP←(SP)-1
RL  A         ;
  an+1←(an)
  (n=0~6), a0←a7
RLC A          ;  
  an+1←(an)
  (n=0~6), a0←(Cy) ,Cy←(a7)
RR  A         ;
  an←(an+1)
  (n=0~6), a7←(a0)
RRC A         ;
  an←(an+1)
  (n=0~6), a7←(Cy) ,Cy←(a0)
SETB bit  ;bit←1
SETB C      ;C←1
SJMP rel  ;PC←(PC)+2
      ;短跳转,取值范围:-128~+127
SUBB A,#data   ;A←(A)- (data)- (C)
SUBB A,@Ri   ;A←(A)- ((Ri))- (C)
SUBB A,direct ;A←(A)- (direct)- (C)
SUBB A.Rn    ;A←(A)- (Rn)- (C)
SWAP A       ;(A)3~0←→(A)7~4
XCH A,@Ri      ;(A)←→((Ri))
XCH A,direct   ;(A)←→(direct)
XCH A,Rn       ;(A)←→(Rn)
XCHD A,@Ri     ;(A)3~0←→((Ri))3~0
XRL A,#data  ;A←(A){ˇ}(data)
XRL A,@Ri    ;A←(A){ˇ}((Ri))
XRL A,direct ;A←(A){ˇ}(direct)
XRL A,Rn     ;A←(A){ˇ}(Rn)
XRL direct,#data ;
  direct←(direct){ˇ}data
XRL direct,A     ;
    direct←(direct){ˇ}(A)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  【 附录2:MCS-51单片机指令表】
  (按功能排序)
————————————————————————————————————
数据传输指令  指令功能
[片内RAM传送指令]
MOV A,Rn      ;A←Rn
MOV A,direct  ;A←(direct)
MOV A,@Ri     ;A←(Ri)
MOV A,#data   ;A←data
MOV Rn,A       ;Rn←A
MOV Rn,direct   ;Rn←(direct)
MOV Rn,#data    ;Rn←data
MOV direct,A      ;direct←A
MOV direct,Rn     ;direct←Rn
MOV direct1,direct2 ;direct←direct
MOV direct,@Ri    ;direct←(Ri)
MOV direct,#data   ;direct←data
MOV @Ri,A       ;(Ri)←(A)
MOV @Ri,direct  ;(Ri)←direct
MOV @Ri,#data   ;(Ri)←data
MOV DPTR,#data16  ;DPTR→data16
[片外 RAM数据 传送]
MOVX A,@Ri      ;A←((Ri))
MOVX A,@DPTR  ;A←((DPTR))
MOVX @Ri,A     ;(Ri)←A
MOVX @PDTR,A   ;(DPTR)←A
[片外 ROM数据 传送]
MOVC A,@A+DPTR ;A←((A)+(DPTR))
MOVC A,@A+PC  
    ;PC←(PC)+1, A←((A)+(PC))
[交换指令]
SWAP A      ;(A)3~0←→(A)7~4
XCHD A,@Ri  ;(A)3~0←→((Ri))3~0
XCH  A,Rn   ;(A)←→(Rn)
XCH  A,direct ;(A)←→(direct)
XCH  A,@Ri    ;(A)←→((Ri))
[堆栈操作]
PUSH direct
  ;SP←(SP)+1, (SP)←(direct)
  ;压堆栈
POP direct
  ;(direct)←((SP)), SP←(SP)-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
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)
DA A  ;BCD码十进制调整,紧跟在ADD和ADDC之后。
[算术减法]
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)
INC A         ;A←(A)+1
[算术 加1]
INC Rn      ;     Rn←(Rn)+1
INC direct  ; direct←(direct)+1
INC @Ri     ;     Ri←((Ri))+1  
INC DPTR    ;   DPTR←(DPTR)+1
[算术 减1]
DEC A      ;      A←(A)- 1
DEC Rn     ;     Rn←(Rn)- 1
DEC direct ; direct←(direct)- 1
DEC @Ri    ;     Ri←((Ri))- 1
MUL AB     ;     BA←(A)×(B)
DIV AB     ;    (A) / (B)
————————————————————————————————————
逻辑运算指令  指令功能
[逻缉与]
ANL A,Rn     ; A←(A)^(Rn)  
ANL A,direct ;A←(A)^(direct)  
ANL A,@Ri    ;A←(A)^((Ri))
ANL A,#data  ;A←(A)^(data)
ANL direct, A;
  direct←(direct)^(A)
ANL direct, #data ;
  direct←(direct)^(data)
[逻辑或]
ORL A,Rn    ;A←(A)ˇ(Rn)
ORL A,direct;A←(A)ˇ(direct)
ORL A,@Ri   ;A←(A)ˇ((Ri))
ORL A,#data ;A←(A)ˇdata
ORL direct,A;direct←(direct)ˇ(A)
ORL direct,#data ;
  direct←(direct)ˇ(data)
[逻辑异或]
XRL A,Rn    ;A←(A){ˇ}(Rn)
XRL A,direct;A←(A){ˇ}(direct)
XRL A,@Ri   ;A←(A){ˇ}((Ri))
XRL A,#data ;A←(A){ˇ}(data)  
XRL direct,A;direct←(direct){ˇ}(A)
XRL direct,#data ;
  direct←(direct){ˇ}data
[逻辑左移]
RL A      ;an+1←(an)
  (n=0~6), a0←a7
[逻辑右移]
RR A      ;an←(an+1)
  (n=0~6), a7←(a0)
[逻辑左移(带进位C)]
RLC A     ;an+1←(an)
  (n=0~6), a0←(Cy) ,Cy←(a7)
[逻辑右移(带进位C)]
RRC A     ;an←(an+1)
  (n=0~6), a7←(Cy) ,Cy←(a0)
[逻缉清零]
CLR A     ;A←00H
[逻缉求反]
CPL A     ;A←(-A)
————————————————————————————————————
控制指令  指令功能
LJMP addr16 ;
  PC←addr15~0
  ;长跳转:可寻址64K空间。
AJMP addr11 ;
  PC←(PC)+2,PC10~0←addr11
  ;绝对跳转,寻址范围:限于同一2KB空间
SJMP rel    ;
  PC←(PC)+2
  ;短跳转,取值范围:-128~+127
JMP @A+DPTR ;
  PC=(PC)+rel
  ;其中rel=(A)
JZ rel      ;
  若(A)=0,则PC←(PC) +2 +rel
  若(A)≠0,则PC←(PC) +2
JNZ rel     ;
  若(A)≠0,则PC←(PC) +2 +rel
  若(A)=0,则PC←(PC) +2
  
CJNE A, direct, rel;
  若(direct)<(A),则PC←(PC)+3+rel,且Cy←0  ;CJNE比较指令
  若(direct)>(A),则PC←(PC)+3+rel,且Cy←1
  若(direct)=(A),则PC←(PC)+3
CJNE A, #data, rel;
  若data<(A),则PC←(PC)+3+rel,且Cy←0;
  若data>(A),则PC←(PC)+3+rel,且Cy←1;
  若data=(A),则PC←(PC)+3。
CJNE Rn, #data, rel;
  若data<(Rn),则PC←(PC)+3+rel,且Cy←0;
  若data>(Rn),则PC←(PC)+3+rel,且Cy←1;
  若data=(Rn),则PC←(PC)+3。
CJNE @Ri, #data, rel;
  若data<((Ri)),则PC←(PC)+3+rel,且Cy←0;
  若data>((Ri)),则PC←(PC)+3+rel,且Cy←1;
  若data=((Ri)),则PC←(PC)+3。
DJNZ Rn,rel          ;
  Rn=(Rn)- 1
  若(Rn)=0,则 PC←(PC)+2
  若(rN)≠0,则 PC←(PC)+2+rel
DJNZ direct,rel      ;
  direct=(direct)- 1
  若(direct)=0,则 PC←(PC)+3
  若(direct)≠0,则 PC←(PC)+3+rel
ACALL addr11         ;
  PC←(PC)+2, SP←(SP)+1
  (SP)←(PC)7~0, SP←(SP)+1
  (SP)←(PC)15~8,PC10~0←addr11
LCALL addr16         ;
  PC←(PC) +3, SP←(SP)+1
  (SP)←(PC)7~0, SP←(SP)+1
  (SP)←(PC)15~8, PC15~0←adde16
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
NOP                  ;
  PC←(PC)+1
————————————————————————————————————
位操作指令   指令功能
MOV bit,C    ;bit←(C)
  ;其中A的位用ACC.n表示。
MOV C, bit    ;C←(bit)
ANL C, bit   ;C←(C)^(bit)
ANL C, /bit  ;C←(C)^(-bit)
ORL C, bit   ;C←(C)ˇ(bit)
ORL C, /bit  ;C←(C)ˇ(-bit )
CPL C        ;C←(-C)
CPL bit        ;(bit)←(-bit)
CLR C        ;C←0
CLR bit      ;dit←0
SETB C        ;C←1
SETB bit      ;bit←1
JC rel         ;
  若(C)=1,则PC←(PC) +2 +rel
  若(C)=0,则PC←(PC) +2
JNC rel        ;
  若(C)=0,则PC←(PC) +2 +rel
  若(C)=1,则PC←(PC) +2
JB bit,rel     ;
  若(bit)=1,则PC←(PC) +3 +rel 
  若(bit)=0,则PC←(PC) +3
JNB bit,rel    ;
  若(bit)=0,则PC←(PC) +3 +rel
  若(bit)=1,则PC←(PC) +3
JBC bit,rel    ;
   若(bit)=1,则PC←(PC) +3 +rel,且dit←0
  若(bit)=0,则PC←(PC) +3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  【CPU的结构】
运算器:
??1、算术/逻辑部件ALU:用以完成+、-、*、/ 的算术运算及布尔代数的逻辑运算,
       并通过运算结果影响程序状态寄存器PSW的某些位,从而为判断、转移、十进制
       修正和出错等提供依据。
??2、累加器A:在算术/逻辑运算中存放一个操作数或结果,在与外部存储器和I/O
       接口打交道时,进行数据传送都要经过A来完成。
??3、寄存器B:在 *、/ 运算中要使用寄存器B 。乘法时,B用来存放乘数以及积的
       高字节;除法时,B用来存放除数及余数。不作乘除时,B可作通用寄存器使用。
??4、程序状态标志寄存器PSW:用来存放当前指令执行后操作结果的某些特征,以便
       为下一条指令的执行提供依据。
PSW  (D0H)  
D7  D6  D5  D4  D3  D2  D1  D0
Cy  AC  F0  RS1 RS0 OV  —  P
??Cy:进位标志。有进位或借位,则Cy=1,否则Cy=0 ;在布尔运算时,Cy(简称C)
        作为布尔处理器。
??AC:辅助进位标志位。
??F0:用户标志位:用户可用软件对F0置位“1”或清“0”,以决定程序的流向。
??OV:溢出标志位:当运算结果溢出时,OV为“1”,否则为“0”。
??D.1:未定义。
??P:奇偶校验位:当累加器A中的“1”的个数为奇数时,P置“1”,否则P置“0”。
??RS1、RS0:工作寄存区选择位:
————————————————————————————————————
  【片内工作寄存器组】
·RS1、RS0与片内工作寄存器组Rn的对应关系:
RS1 RS0 寄存 片内      通用
        器区 RAM地址   寄存器名称
0   0   0    00H~07H  R0~R7
0   1   1  08H~0FH  R0~R7
1   0   2    10H~17H  R0~R7
1   1   3  18H~1FH  R0~R7
控制器:
??1、指令寄存器IR和指令译码器。
??2、程序计数器:存放CPU执行下一条指令的地址。是一个16位寄存器,可寻址64KB 。
??3、堆栈指针SP:用于子程序调用和中断处理。【机器复位后,SP←#07H ,因此压栈
       的第一个数据在08H单元中】。
??4、数据指针寄存器DPTR:16位的寄存器,也可以作为两个8位寄存器DPH和DPL 。
       DPTR 主要作外部数据指针,可对64KB外部RAM进行间接寻址。
————————————————————————————————————  
??MCS-51由包括PC在内的22个特殊功能寄存器,它们除有各自的名称外,还有唯一的
    地址,离散的分布在片内RAM中的80H~FFH共128个存储单元中。在这128个储存单元
    构成的SFR块中,未被占用的单元不可使用!
  【21个特殊功能寄存器SFR<具体STC89S51参见发帖的STC宏晶公司资料>】
特殊         
功能
寄                           复位后
存器   功能名称         地址 的状态
B *  寄存器         F0H  00H
A *  累加器           E0H  00H
PSW * 程序状态         D0H  00H
       标志寄存器
IP *  中断优先级      B8H XXX00000B
       控制器
P3 *  P3口数据寄存器    B0H  FFH
IE *  中断允许      A8H 0XX00000B
       控制寄存器
P2 *  P2口数据寄存器    A0H   FFH
SBUF  串行口发送      99H   不定
       /接收缓冲器
SCON * 串行口控制寄存器  98H    00H
P1 *  P1口数据寄存器    90H    FFH
TL1  T1计数器低8位     8BH  00H
TL0  T0计数器低8位     8AH  00H
TH1  T1计数器高8位     8DH  00H
TH0  T0计数器高8位     8CH  00H
TMOD  定时器/计数器  89H  00H
       方式控制寄存器
TCON * 定时器控制寄存器 88H  00H
PCON  电源控制寄存器  87H  00H
DPL  地址寄存器低8位   82H  00H
DPH  地址寄存器高8位   83H  00H
SP   堆栈指针寄存器  81H  07H
P0 *   P0口数据寄存器  80H  FFH
PC   程序计数器      无地址 0000H
??注:“*”表示可位寻址。
————————————————————————————————————
【SER块中具有位寻址功能寄存器的位地址<具体STC89S51参见发帖
                                         的STC宏晶公司资料>】
    即可用地址,也可用()内的名称。
地址 位地址名称              寄存器
F0H  F7 F6 F5 F4 F3 F2 F1 F0  B
E0H  E7 E6 E5 E4 E3 E2 E1 E0  A
D0H  D7 D6 D5 D4 D3 D2 D1 D0 PSW
B8H  — — — BC(PS) BB(PT1) BA(PX1) B9(PT0) B8(PX0)  IP
B0H  B7 B6 B5 B4 B3 B2 B1 B0  P3
A8H  AF(EA) — — AC(ES) AB(ET1) AA(EX1) A9(ET0) A8(EX0)  IE
A0H  A7 A6 A5 A4 A3 A2 A1 A0  P2
98H  9F(SM0) 9E(SM1) 9D(SM2) 9C(REN) 9B(TB8) 9A(RB8) 99(TI) 98(RI)  SCON
90H  97 96 95 94 93 92 91 90  P1
88H  8F(TF1) 8E(TR1) 8D(TF0) 8C(TR0) 8B(IE1) 8A(IT1) 89(IE0) 88(IT0)  TCON
80H  87 86 85 84 83 82 81 80  P0
————————————————————————————————————
  【存储器<具体STC89S51参见发帖的STC宏晶公司资料>】
1、数据存储器(即RAM)
??MCS-51系列有128B内部数据存储器(片内ARM),分3部分:
7FH┓
   ┣ 数据缓冲区:30H~7FH
30H┛      8字字长 x80个。
    存放数据或是作为堆栈区。
2FH┓  
   ┣ 位寻址区:00H~2FH (128点)
20H┛
    这(61×8)128位的为地址为00H~7FH,其中每位占用一个位地址。
  这些位地址名可以并只能在位操作指令中使用。
  例:MOV C, 30H; 其中的30H是指位地址名,而不是寄存器30H,要特别注意。
1FH┓
   ┣ 寄存器3区┓
18H┛        ┃
17H┓        ┃
   ┣ 寄存器2区┃
10H┛        ┣ 4个寄存器区
0FH┓        ┃ R0~R7 x4组
   ┣ 寄存器1区┃
08H┛        ┃
07H┓        ┃
   ┣ 寄存器0区┛
00H┛
  4个寄存器区占用内部RAM的00H~1FH共31个单元。
  其中每区8个寄存器为R0~R7,参见上述“工作寄存器组”。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
       %%%%%%%%%%%%%%%%%%%%%%
     %   汇编指令集   %
     %%%%%%%%%%%%%%%%%%%%%%
  伪指令  
————————————————————————————————————
定位伪指令:
格式:ORG n
??规定紧接其后的程序或数据块的起始地址。
??ORG n规定紧接其后的程序或数据块从n开始存放。
??n可以是十进制数也可以是十六进制数(一般使用十六进制数)。
;下面程序从1000H开始存放。
;(此程序是将30H~37H中的数移到40H~47H中去)
ORG 1000H    ;以下程序从1000H开始存放
      MOV R2,#08H ;R2存放操作次数(为8/2次,)
      MOV R0,30H  ;R0用作源指针
      MOV R1,40H  ;R1用作目的指针
LOOP:MOV A,@R0   ;此程序是将30H~37H中的字节数
      MOV @R1,A  ;送至40H~47H单元中
      INC R0     ;R0←(R0)-1
      INC R      ;R1←(R1)-1
      DJNZ R2,LOOP ;若R2←(R2)-1≠0,则转向LOOP。
      END  
————————————————————————————————————
定义字节指令:
格式:标号B X1,X2,X3,……Xn
??此伪指令是把Xi系列数据存放在从标号开始的连续单元中。
??此伪指令常用来建立常数表,其中Xi为8位数据(包括2位压缩BCD码)
    或ASCII码,表示ASCII码时,应使用单引号' '。
  当Xi为数值常数时,取值范围为00~FFH;为字符串时,其长度不应超过80个字符。
  【注:字符串常数即ASCII码】
ORG 1000 ;定义数据(标号)从1000H开始存放
                          DB 20H,21H,22H
     ;此时(1000H)=20H,
        ; (1001H)=21H,
        ; (1002H)=22H。
————————————————————————————————————
定义双字节指令:
格式:标号W  X1,X2,X3,……Xn
??此伪指令是把Xi系列数据存放在从标号开始的连续单元中。
??此伪指令常用来建立常数表,其中Xi为16位数常数,16位常数占用两个存储单元,
    先存高8位,再存低8位。
ORG 1200H
  ;定义数据(标号)从1200H开始存放
  DW 1226H,0562H
  ;此时(1200)=12H,(1201)=26H,
      ;(1202)=05H,(1203)=62H。
————————————————————————————————————
预留存储区伪指令:
格式:DS n
  此伪指令的功能是从标号指定的单元开始,预留n个单元的储存区。
………………………………………………
ORG 1000H
  DS 06H
   ;此伪指令从1000H单元预留6个单元
  DB 21H,22H
   ;此时(1006)=21H, (1007)=22H
………………………………………………——————————————————
赋值指令:
格式:字符名称x EQU n
  此伪指令的功能是将数据或地址n赋给字符名称。使x与n等值。
  其中n可以是单字节数据,也可以是双字节数据,还可以是工作寄存器,以及直接地址。
………………………………………………
  LG EQU 10H ;LG与10H等值
  DE EQU R0  ;DE与R0的内容即(R0)等值
  MOV A,LG   ;A←10H
  MOV R1,DE  ;R1←(R0)
………………………………………………??
使用赋值伪指令给程序的编制、调试、修改带来方便。如果程序中需要多次使用某一数据,
可以使用EQU指令将该数据赋给一个字符名,一旦此数据发生变化,只要改变EQU指令的
数据即可。若不使用EQU指令,则要装所有涉及这一数据的指令进行修改。
??使用EQU指令,必需先赋值后使用。
————————————————————————————————————
结束汇编伪指令:
格式:END
  此伪指令的功能是指示源程序到此结束,常将其放在汇编语言源程序的末尾。
————————————————————————————————————
程序实例:
    END     ;程序结束
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  【MCS-51单片机的中断系统<具体STC89S51参见发帖的STC宏晶公司资料>】
  MCS-51有5个中断源,其中 2个外部中断源-INT0、-INT1,3个内部中断源T0、T1和
     串行口中断源。
  〖MCS-51中断系统结构图〗
————————————————————————————————————
ITx  TCON  ???IE  ?IP
中断标志 源允许 总允许  优先级
???  ┏━┓  ┏━┓┏━━━━━━┓┏━━━┓
-INT0  →IT0=0__→IE0  →EX0  →EA  →PX0  →高优先级
  IT0=1↓  →低优先级
T0———————→TF0  →ET0  →EA  →PT0  →高优先级
   →低优先级
-INT1?→IT1=0__→IE1  →EX1  →EA  →PX1  →高优先级
  IT1=1↓  →低优先级
T1———————→TF1  →ET1  →EA  →PT1  →高优先级
   →低优先级
TX———————→TI  →ES  →EA  →PS  →高优先级
RX———————→RI  →低优先级
————————————————————————————————————
◎ 中断系统的内部结构:
1、外部中断:
  外部中断源-INT0、-INT1是是由外部输入的两个中断源,它直接触发寄存器TCON 的
                                                    IE0、IE1,产生中断标志。
触发方式有两种:
  1、下沿脉冲触发;
  2、低电平触发。
  外部中断触发方式由 TCON 寄存器中的 IT0、IT1 来决定。
TCON (88H)
D7  D6  D5  D4  D3  D2  D1  D0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
8F  8E  8D  8C  8B  8A  89  88
位地址^
IE0:外部中断-INT0请求标志位。
  当-INT0引脚上出现中断请求信号(低电平或脉冲下沿)时,硬件自动将IE0置“1”,
    产生中断请求标志。
IT0:外部中断-INT0触发方式控制位。
  有软件来置1或清零;
  IT0=0时,为低电平触发;
  IT0=1时,为脉冲下沿触发。
IE1:外部中断-INT1 请求标志位。
  功能与IE0相同。
IT1:外部中断-INT1 请求标志位。
  功能与IT0相同。
IF0:定时器T0溢出 中断标志位。
IF1:定时器T1溢出 中断标志位。
————————————————————————————————————
2、内部中断源:
  内部中断源包括2个定时器 T0、T1 溢出中断源,及 1 个串行口发送/接收中断源。
  MCS-51内部有两个定时/计数器,分别为 T0、T1 ,它们内部都有各自的计数器。
    当计数器溢出时,分别产生溢出中断,使各自的标志位 TF0、TF1
置“1”,产生中断请求标志。TF0、TF1 占用 TCON 寄存器中的D5、D7两个位。(见上栏)
  串行口发送/接收中断占用 SCON 寄存器的2位,分别是发送中断请求标志位TI和接收
     请求中断标志位 RI 。
SCON  (98)
D7  D6  D5  D4  D3  D2  D1  D0
MS0 SM1 SM2 REN TB8 RB8 TI  RI
9F  9E  9D  9C  9B  9A  99  98
位地址^
TI:串行口内部发送中断请求标志位。
  当串行口发送完一个字符后,由内部硬件使发送中断标志TI置位(1),产生中断请求标志。
RI:串行口内部接收中断请求标志位。
  当串行口接收到一个字符后,由内部硬件使接收中断标志RI置位(1),产生中断请求标志。
————————————————————————————————————
中断允许寄存器IE:
  中断允许寄存器IE的作用是控制所有中断源的开放或禁止,以及每个中断源是否被允许。
MSC-51单片机复位后,IE中的每一位均被清零,即禁止所有的中断。要使用哪些中断,就要开放
IE中的对应的中断允许位以及总允许位EA 。
IE  (A8)
D7  D6  D5  D4  D3   D2   D1   D0
EA  —  —  ES  ET1  EX1  ET0  XE0
EA:中断总允许位。
  EA=1 ,CPU开放中断;
  EA=0 ,CPU禁止所有的中断请求。
  总允许好比一个总开关。
ES:串行中断允许位。
  ES=1 ,允许串行口中断;
  ES=0 ,禁止串行口中断。
ET1:T1溢出中断允许位。
  ET1=1,允许T1中断;
  ET1=0,禁止T1中断。
EX1:外部中断-INT1允许位。
  EX1=1 ,允许外部中断INT1中断;
  EX1=0 ,禁止外部中断INT1中断。
ET0:T0溢出中断允许位。
  ET0=1,允许T1中断;
  ET0=0,禁止T0中断。
ET0:外部中断-INT0允许位。
  EX1=1 ,允许外部中断INT0中断;
  EX1=0 ,禁止外部中断INT0中断。
  MSC-51单片机复位后,IE中的每一位均被清零,即禁止所有的中断。要使用哪些中断,
就要开放IE中的对应的中断允许位以及总允许位EA 。
————————————————————————————————————
中断优先寄存器IP:
?一、中断优先寄存器IP的位格式及优先级的设定。MCS-51具有两个中断优先级。
MCS-51单片机复位后,IP寄存器低5位全部被清零,将所有中断源设为低优先级中断。
IP  (B8)
D7  D6  D5  D4  D3   D2   D1   D0
—  —  —  PS  PT1  PX1  PT0  PX0
PS:串行口中断优先级控制位。
  PS=1,设定串行口为高优先级中断;
  PS=0,设定串行口为低优先级中断。
PT1:T1中断优先级控制位。
  PT1=1,设定T1为高优先级中断;
  PT1=0,设定T1为低优先级中断。
PX1:外部中断-INT1优先级控制位。
  PX1=1,设定外部中断-INT1为高优先级中断;
  PX1=0,设定外部中断-INT1为低优先级中断。
PT0:T0中断优先级控制位。
  PT0=1,设定T1为高优先级中断;
  PT0=0,设定T0为低优先级中断。
PX0:外部中断-INT0优先级控制位。
  PX0=1,设定外部中断-INT0为高优先级中断;
  PX0=0,设定外部中断-INT0为低优先级中断。
??二、不同优先级中断请求同时发生时 CPU的优先响应。在执行中断程序时,
    高优先级中断源可中断正在执行的低优先级中断服务程序,
    而同级或低级的中断源不能中断正在执行的中断服务程序。
  三、自然优先顺序。同优先级中断请求同时发生时的顺序:
  外部中断-INT0;
  定时器T0中断;
  外部中断-INT1;
  定时器Y1中断;
  串行口中断;
————————————————————————————————————
  〖中断相应与中断返回<具体STC89S51参见发帖的STC宏晶公司资料>〗
1、中断相应条件:
??①中断源有请求。
??②寄存器IE的总允许位EA=1,且IE相应的中断允许位为“1”。
??③无同级或高级中断正在服务。
??④现行指令行完成最后一个周期。
??一般这4个条件满足,单片机就相应中断。但是若指令行是RETI ,或需要访问
    寄存器IE、寄存器IP的指令,则要执行完现行指令,还要执行完紧跟
    其后的一条指令,单片机才会相应中断。
2、中断相应与中断返回:
??由一条中断返回指令“RETI”来完成。
??CPU中断相应后,会自动清除定时器溢出标志位TF0、TF1,以及下沿触发下的尾部
    中断标志位IE0、IE1 。但串行口的发送、接收标志位TI、RI不会自动清零,只有
    由用户用软件清零。对于低电平触发下的外部中断标志EI0、EI1,CPU无法直接干预,
    需要在引脚处外加硬件电路(如D触发器),使其撤消外部中断请求。
——————————————————  
中断源及对应的矢量地址:
┏━━━━━━━━━━━━━━━━┓
┃中断源              中断矢量地址┃
┠───────────────—┨
┃外部中断0(-INT0)  0003H       ┃
┃定时器T0中断        000BH       ┃
┃外部中断1(-INT1)  0013H       ┃
┃定时器T1中断        001BH       ┃
┃串行口中断          0023H       ┃
┗━━━━━━━━━━━━━━━━┛
??取中断向量是指CPU将对应的中断向量地址装入程序计数器PC,使程序转向该中断
    矢量单元。此单元中往往存放一条无条件转移指令LJMP(或AJMP),转去执行中断
   服务程序。这样中断服务程序便可以灵活的安排在程序存储器(ROM)的任何位置。
………………………………………………
ORG 0003H  ;0003H是-INT0的中断地址。
  AJMP INT0  ;PC(程序)指向中断标号为INT0的地址。
………………………………………………
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
         【定时器/计数器】
一、定时器/计数器的结构:
振荡器→ ÷ 12→ C/-T=0 →◎
T0(或T1)引脚→ C/-T=1 →◎
    ◎ → MUX控制开关 →加1计数器→TFx→中断。
??16位的定时器/计数器的核心部分是一个加1计数器。每个定时器/计数器分别由
     两个8位的专用寄存器组成,T0由TH0、TL0组成,T1由TH1、TL1组成。这两个
     寄存器用来存放定时或计数的初值。
  【注:TLx和THx只能用赋值的方法清零,不可以“CLR THx”之类的语句】
??当工作在定时方式时,是对机器周期进行计数,所计的数值乘以机器周期便是所
     需要的定时时间。此时转换开关MUX与振荡器12分频信号接通。
??当工作在计数方式时,对外部输入信号进行计数。此时,多路转换开关MUX与T0
   (或T1)引脚接通。T0即P3.4口、T1即P3.5口。计数器对外部信号所计数据保存在
    计数器中。外部数据的高低电平宽度不应小于两个机器周期,这是由硬件决定的。
————————————————————————————————————  
1、定时器/计数器的工作方式寄存器:
[TMOD]:
  (不可位寻址,即M1、M2、GATE、C/-T均不可位寻址)
??其低4位决定 T0 的工作方式,高4位决定 T1 的工作方式。(T0、T1可寻址用字节
    方式设置位)
  【不可位寻址,可对 T0、T1 字节寻址。如:将 TMOD 各位均置0,则
    “MOV TMOD,#00H”】
TMOD (89H)  定时/计数方式控制寄存器
D7  D6    D5   D4  D3    D2   D1  D0
M1  GATE  C/T  M0  GATE  C/T  M1  M0
┗━━━━━━┛  ┗━━━━━━┛
  定时/计数器1  定时/计数器0
??1、M1、M0为工作方式控制位:
M1 M0   工作方式  说明
0  0  方式0  13位计数器;
0  1  方式1  16位计数器;
1  0  方式2  自动装入8位计数器;
1  1  方式3  定时器0:分为两个8位计数器;定时器1:对外部停止计数。
??2、C/-T定时器/计数器方式选择位:
??C/-T=0,设置为定时方式,对机器周期进行计数;
??C/-T=1,设置为计数方式,对外部信号进行计数,外部信号由T0(P3.4)、
                                            T1(P3.5)引脚送入CPU 。
??3、GATE门控位:
??GATE=0,只要用软件使TR0(或TR1)置1就能启动定时器T0(或T1);
??GATE=1,只有在-INT0(或-INT1)引脚为高电平的情况下,且由软件使TR0
     (或TR1)置1时,才能启动定时器T0(或T1)工作。
??
??【工作方式寄存器TMOD的地址为89H,不能对它进行位寻址,只能用字节的方式
                                                            设置工作方式。】
————————————————————————————————————  
2、定时器/计数器的控制寄存器TCON。
??设定好定时器/计数器的工作方式后,要使它进入工作状态,还要通过设置
    TCON的某些位来实现。
??当定时器/计数器满溢出、或有外部中断时,TCON能标明溢出和中断情况。
TCON  (88H)  定时/计数控制寄存器。
D7  D6  D5  D4  D3  D2  D1  D0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
??TF1:定时器T1 溢出标志位。
  当T1溢出时,由硬件自动使TF1置1,并向CPU申请中断,CPU相应中断后,自动对TF1
                                                    清零。TF1也可以用软件清零。
??TR1:定时器T1 运行控制位。
  由软件置1(或清零)来启动(或关闭)定时器T1,使定时器T1开始计数(或停止计数)。
    用指令  SETB TR1  (或  CLR TR1  )使TR1置1(或清零)。
??TF0:定时器T0 溢出标志位。功能与TF1相同。
??TR0:定时器T0 运行控制位。功能与TR0相同。
??IE1:外部中断1 请求标志位。
??IT1:外部中断1 触发方式控制位。
??IE0:外部中断0 请求标志位。
??IT0:外部中断0 触发方式控制位。
————————————————————————————————————
二、定时器/计数器的工作方式
??1、工作方式0【MOV TMOD,#00H  ;设定T0为工作方式0】
  ①定时工作方式:
  ·计数器T0在工作前,应先对13位计数器赋初值。
  ·C/-T=0:计数器T0通过转换开关与12分频输出端接通。
  ·定时器T0(T1)在初值的基础上进行加1计数。
  ·定时时间 t=((2^13)- T0初值)×机器周期;机器周期=振荡周期×12 。
  注:2^13 = 2000B = 8192
  ②计数工作方式:
  ·C/-T=1:定时器T0通过转换开关与T0(P3.3口)输入端接通。13位计数器
      对外部输入信号进行加1计数。
  ·GATE=0:-INT0被封锁,此时仅由TR0便可控制T0的开启和关闭。
  ·GATE=1:定时器T0的开启和关闭取决于-INT0和TR0相“与”的结果,只有-INT0=1 和
TR0=1时,定时器T0才被开启。当-INT0由0变为1时,开始计数;-INT0由1变为0时,停止计数。
这样可以测量在-INT0端出现的正脉冲宽度(此功能可用于A/D转换)。
  【定时器T0工作方式0结构】
  TMOD
┏━━┓
TMOD0 M0=0 振荡器→÷12 ┐C/-T=0  TCON
TMOD1 M1=0  ↓ ?┏━┓中断
TMOD2 C/-T──(控制)──→┨MUX──开关─→TL0(5位)TH0(8位) ─→TF0 ──→
  ↑  ↑ ┌←TR0
T0引脚 ─┘C/-T=1? │  │
TMOD3 GATE ┐  A  │ │
  └→非门 →或门─→与门 ────┘ │
  -INT0引脚─→ ┌→ B │
│ │
└───────────────┘
  
————————————————————————————————————
??2、工作方式1【MOV TMOD,#01H  ;设定T0为工作方式0】
??定时器T0工作方式1与工作方式0类同,差别在于其中计数器的位数。
??工作方式0以13位计数器参与计数;
??工作方式1则以16位计数器参与计数。
  ①工作方式1定时时间t=((2^16)- T0初值)×机器周期。
  注:2^16=10000B = 65536
  ②工作方式1是16位的计数器,这是工作方式1与工作方式0在计数方式时唯一的差别。
  【定时器T0工作方式1结构】
  TMOD
???┏━━┓
TMOD0  M0=1  振荡器→÷12 ───┐C/-T=0  TCON
TMOD1  M1=0  ↓  ┏━┓中断
TMOD2  C/-T─────────→┨MUX──→开关→TL0(8位)TH0(8位) →TF0──→
  控制    ↑  ↑  ┌←TR0
  T0引脚 ──┘C/-T=1│  │
TMOD3  GATE ┐  A  │   │
   └→非门→或门 →与门─────┘   │
  ??-INT0引脚→   ┌→  B   │
    │  │
    └──────────────────┘
————————————————————————————————————
??3、工作方式2
??定时器T0在工作方式2时,16位计数器分成了两个独立的8位计数器TH1、TH0。
??此时,定时器T0构成了一个能重复置入初值的8位计数器。
??其中,TL0用作8位计数器;TH0用来存储计数的初值,当HL0计满溢出时,自动将TH0 存储
     的初值再次装入TL0 。
  ①工作方式2的定时时间t=((2^8)- T0初值)×机器周期。
  注:2^8 = 100B=256
  工作方式2常用于重复定时计数,省去了方式0、方式1重新装入初值的麻烦。
  ②工作方式2是一个8位的计数器,这是工作方式2与工作方式0在计数方式时唯一的差别。
?  【定时器T0工作方式2结构】
  TMOD
???┏━━┓
TMOD0  M0=0  振荡器─→÷12──┐C/-T=0   TCON
TMOD1  M1=1    ↓  ┏━┓中断
TMOD2  C/-T──(控制)───→┨MUX─→开关─→TL0(8位) ──→ TF0 ──→
    ↑    ↑  ┗━━━┛   ┌←TR0
  T0引脚──┘C/-T=1│控制?↑TF0=1时│
TMOD3  GATE ┐   A    │  ┏━━━┓   │
   └→非门→  或门 →与门────┘  TH0(8位)  │
  ??-INT0引脚→    ┌→  B   │
    │   │
    └────────────────┘
————————————————————————————————————
??4、工作方式3
??工作方式3仅对定时器T0有效。
??当定时器T0工作在工作方式3时,将16位的计数器分为两个独立的8位计数器TH0、TL0
。其中,TL0利用定时器T0本身的控制位C/-T、GATE、TR0、-INT0和TF0
,其操作情况与方式1、方式2类似。此时,TH0只能用作定时器,对机器周期进行计数。另外
TH0还借用了定时器1的控制位TR1、TF1 ,即占用了定时器1的运行标志位TR1和中断标志位TF1。
??当定时器T0工作在方式3时,定时器T1只能工作在方式0~方式2
,并且工作在不需要中断的场合。在一般情况下,当定时器T1用作串行口波特发生器时,
  定时器T0才设为工作方式3 ,此时常把定时器T1设置为方式2 ,用作波特率发生器,如图:
  【定时器T0 工作方式3 结构】
  TCON
   控制   ┏━┓
  TMOD    ┌←───────← TR1 中断
???┏━━┓  振荡器─→÷12 ───┬───开关──────→TF1──→
TMOD0  M0=1   │C/-T=0  
TMOD1  M1=1   ↓  ??  
TMOD2  C/-T──(控制)────→┨MUX──→开关→TL0(8位)  ──→TF0 中断
   ↑    │   ┌←  TR0──→
   T0引脚───┘C/-T=1 ↑   │  
  │控制   │
TMOD3  GATE ┐   A    │   │
   └→非门→  或门 → 与门 ─────┘   │
 -INT0引脚──→ ┌─→  B   │
   │   │
   └─────────────────┘
??当定时器T0工作在方式3时,定时器T1只能工作在方式0~方式2 ,并且工作在不需要
中断的场合。在一般情况下,当定时器T1用作串行口波特发生器时,
定时器T0才设为工作方式3 ,此时常把定时器T1设置为方式2
,用作波特率发生器,如图:
  【定时器T1 工作方式2 结构】
  振荡器─→÷12───┐
  │C/-T=0
  ↓  ??  串行口
  ??MUX──→开关──→  TL0(8位)───→  
  ↑  ↑
  T1(P3.5)引脚───┘C/-T=1  │重新装入
   TH1(8位)
————————————————————————————————————
一般情况下,定时计数器的操作控制次序为:
  
  ①确定工作方式,写入TMOD定时计数器工作方式寄存器;
  ②计算定时/计数器初值,装入THx及TLx。
  ③置位TRx以启动计数。
  ④置位ETx以允许定时/计数器x中断(若需要,不需要可以省略)
  ⑤置位EA以使CPU开放中断,即接收中断信号。
————————————————————————————————————
  【定时器/计数器2】
  定时/计数器2只有52子系列单片机拥有。是一个具有16位自动重装载或捕获能力的
定时/计数器,特殊功能寄存器T2CON是它的控制寄存器。定时/计数器2具有两种工作方式:
  定时计数器工作方式和波特率发生器方式。
1、定时/计数器工作方式:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  【串行接口与应用】
————————————————————————————————————
串行接口的基本知识:
??1、异步通信:
  (1)起始位;
  (2)数据位;
  (3)奇偶校验位;
  (4)停止位。
??2、同步通信:略。
??3、波特率:是数据传输的速率,之每秒传送二进制数据的位数,
        单位是 位/秒(bit/s)。
  假设数据传输速率是240字符/秒,而每个字符包含10个数据位,则传送波特率为:
  10×240=2400 bit/s
??每一位代码的传送时间T为波特率的倒数:
  Td=1/2400=0.4165ms
??异步通信的波特率一般在50~64000bit/s之间。
————————————————————————————————————
【MCS-51单片机串行接口的结构与工作方式】
??MCS-51有一个可编程的全双工串行通信接口,可作为通用异步接收/发送器UART,
    也可作为异步移位寄存器。它的帧格式有8位、10位和11位,可以设置为固定波特率
                                    和可改变波特率,给使用者带来很大的灵活性。
??MCS-51串行接口内部有一个发送/接收数据缓冲器,简称串行数据缓冲器,
                                                   共用一个地址99H 。
??一个串行口控制寄存器SCON ,用来选择串行口工作方式、控制数据接收和发送,
                                                 并标示串行口的工作状态等。
??PXD(P3.0)串行数据接收端。
??PXD(P3.1)串行数据发送端。
??PCON中有一位是波特率倍增位。
————————————————————————————————————
1、串行口控制寄存器SCON
SCON (98H)
D7  D6  D5  D4  D3  D2  D1  D0
MS0 MS1 SM2 REN TB8 RB8 TI  RI
??MS0、SM1:串行口工作方式控制位,对应4中工作方式如下:
SM0 SM1 工作方式 说明 波特率
0   0   方式0 同步移位寄存器,
              fosc/12。
0   1   方式1 10位移位收发器,
              由定时器控制。
1   0   方式2 11位移位收发器,
              fosc/32或fosc/64。
1   1   方式3 11位移位收发器,
              由定时器控制。
MS2:多级通信控制位。
  主要用于工作方式2和工作方式3。
  若SM2=1,则允许多级通信。
REN:允许接收控制位。
  当REN=1时,允许接收;当REN=0时,进制接收。
  此位由软件置“1”或清零。
TB8:在方式2或方式3中,此位为接收数据的第9位。
  在多机通信中作发送地址帧或数据帧的标志位。
  TB8=1,说明发送帧为地址帧;
  TB8=0,说明该发送帧为数据帧。
  在许多通讯协议中,它可作为奇偶校验位。此位由软件置“1”或清零。
                                      在方式0或方式1中,此位未使用。
RB8:接收数据的第9位。
  在方式2或方式3中,接收到的第9位数据放置在 RB8 中。
  它或是奇偶校验位,或是约定的地址/数据校验标志位。在方式2或方式3多机
    通信中,若SM2=1且RB8=1,说明收到的数据为地址帧。
TI:发送中断标志位。
  在一帧数据发送完时置位。
  TI=1,申请中断,说明发送缓冲器SBUF已空,CPU可以发送下一帧数据。中断
    相应后,TI不会自动清零,必需由软件清零。
RI:接收中断标志位。
  在接收到一帧有效数据后,由硬件置位。
  RI=1,申请中断,表示一帧数据接收结束,并以装入缓冲器SBUF中,CPU相应
                          中断,取走数据。RI不会自动清零,必需由软件清零。
??串行口发送中断标志TI和接收中断标志RI,共用一个中断源。因此,CPU接收到
          中断请求后,不知道是发送中断TI还是接收中断RI,必需由软件来判别。
??单片机复位后,串行控制寄存器SCON的各位均清零。
————————————————————————————————————
2、电源控制寄存器 PCON
PCON (87H)
D7   D6  D5  D4  D3  D2  D1  D0
SMOD GF1 GF0 PD  IDL
??SMOD:波特率倍增位。
  串行口在方式1、方式2、方式3 时,
  若SMOD=1,则波特率提高一倍;
  若SMOD=0,则波特率不提高。
??单片机复位时,SMOD=0。
————————————————————————————————————
波特率设计:
??1:方式0的波特率:波特率的频率是固定的,为振荡频率的1/12,不受PCON、
                            SMOD的影响。(仅适用于串—并方式转换功能)
  【方式0的波特率=fosc/12】
??2:方式2的波特率:当SMOD=0时,Fbit=fosc1/64,当SMOD=1时,Fbit=fbit1/32。
???(由于波特率较高,所以使用于近距离通讯)
  【方式2的波特率=((2^SMOD)/64)×focs】
??3:方式1和方式3的波特率:由定时器T1的溢出速率决定,同时出也受SMOD值控制。
  【方式1、方式3的波特率=((2^SMOD)/32)×T1的溢出速率】
??其中,T1的溢出速率取决于T1的计数T1的计数速率(在定时方式时,计数速率=
     fosc/12)和T1的预置初值。定时器T1作波特率发生器时,通常选定T1工作在方式2
,并使其工作在定时方式(即C/-T=0)。此时T1的计数频率为focs/12(这是禁止T1中断)。
??设定定时器初值为X,则每过“256-X”个机器周期,定时器产生一次溢出。
??公式为:
  【T1的溢出速率=(focs/12)/(256-X)】
??当给出波特率后,定时器T1在工作方式2的初值为:(即 TH1=TL1=X)
  【【X=256-(focs×(SMOD+1))/(384×波特率)】】
??为了使初值为整数,系统频率选用focs=11.0592MHz,从而产生精确的波特率。
————————————————————————————————————
  【串行口的4种方式】
1、串行口工作方式0:
??在工作方式0时,串行口为同步移位寄存器的输入或输出方式,主要用于扩展
                                                      并行输入或输出口。
??数据由RXD(P3.0)端输入或输出,同步移位脉冲由TXD(P3.1)端输出,发送和
    接收是8位数据,低位在先,高位在后。其波特率是固定的,为focs/12。
??①串行口用于扩展并行输出口:
??只要接收一条对接收缓冲器SBUF的写指令,数据便开始从RXD端串行发送,
    在同步移位脉冲TXD的作用下,一位一位的移入8位移位寄存器74LS164中。
【方式0 串行口用于扩展并行输出口】
?STC89C51  ??74LS164
┏━━┓????┏━━━━━━┓
P3.0(RXD)─┬─→A(2)  Q0(13)→
  ? └─→B(2)  Q1(12)→
P3.1(TXD)───→CLK(8)  Q2(11)→
P1.0 ─────→CLR(9)  Q3(10)→
   Q4(6) →
   Q5(5) →
   Q6(4) →
   Q7(3) →
【工作方式0发送时序】
??┌┐
??││写入SBUF
──┘└─────────────────────
??S5P2
──────┬─┬─┬─┬─┬─┬─┬─┬─┬──
  RXD ???│D0│D1│D2│D3│D4│D5│D6│D7│
(数据)??└─┴─┴─┴─┴─┴─┴─┴─┘
-──────┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌───
?TXD ?? ?││││││││││││││││
(移位脉冲) └┘└┘└┘└┘└┘└┘└┘└┘
??????????????????????┌──
?TI(中断标志)??????????????│
──────────────────────┘
??一帧数据发送完毕后,则发送中断标志TI置“1”,向CPU请求中断。
     TI=1,说明接收缓冲器SBUE已空,可以再接收数据。中断相应后,TI不会自动
                                                   清零,必需由软件清零。
??②串行口用于扩展并行输入口:
??在满足REN=1、RI=0的条件下,会启动一次接收过程。
??此时RXD为串行输入端,TXD为同步移位脉冲输出端。74LS165一位一位的通过
    RXD端进入接收缓冲器SBUF中。
【方式0 串行口用于扩展并行输入口】
?STC89C51  ??74LS165
┏━━┓????┏━━━━━━┓
P3.0(RXD)←───QH(9)  Q0(13)←
   Q1(12)←
P3.1(TXD)───→B(2)  Q2(11)←
P1.0 ─────→S/-L(1) Q3(10)←
   Q4(6) ←
   Q5(5) ←
   Q6(4) ←
   Q7(3) ←
【工作方式0接收时序】
??┌┐
??││REN=1 RI=0
──┘└──────────────────────
───┐?????????????????┌────
?RI?│?????????????????│
???└─────────────────┘
??????┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐
──────┤├┤├┤├┤├┤├┤├┤├┤├────
??????└┘└┘└┘└┘└┘└┘└┘└┘
??????? D0?D1?D2?D3?D4?D5?D6?D7
──────┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌────
??TXD ??││││││││││││││││
(移位脉冲)└┘└┘└┘└┘└┘└┘└┘└┘
??一帧数据发送完毕后,则发送中断标志RI置“1”,向CPU请求中断。
     RI=1,说明接收缓冲器SBUE已空,可以再接收数据。中断相应后,
      RI不会自动清零,必需由软件清零。
2、串行口工作方式1:
??方式1真正用于串行发送或接收数据,是10位异步通信接口。
??TXD为发送端,RXD为接收端。
??格式为:1位起始位、8位数据位(低位在前)、1位停止位。
??①方式1发送数据
??数据由TXD端输出。只要CPU对接收缓冲器SBUF执行一条写指令,
    就启动串行口TXD 开始发送数据。发送波特率由内部定时器T1控制。
    一帧数据发送完毕后,则发送中断标志 TI置“1”,向 CPU请求中断。
【工作方式1接收时序】
??┌┐
??││写入SBUF
──┘└───────────────────────
?????起始位?????????????? ?停止位
─────┐?┌─┬─┬─┬─┬─┬─┬─┬─┬───
  RXD ??│?│D0│D1│D2│D3│D4│D5│D6│D7│
(数据)?└─┴─┴─┴─┴─┴─┴─┴─┴─┘
?????????????????????????┌─
TI????????????????????????│
─────────────────────────┘
??②方式2接收数据
??数据由RXD端输出。当接收允许位REN置“1”后,接收器便以波特率的16倍
    速率采样接收RXD的电平。如果检测到起始位(即在RXD上检测到1至0的跳变),
                                                        就启动接收器接收。
??计数器的16个状态,将接收每一位的时间等分成16份,并在地7、8、9三个状态
    时采样RXD端的电平,即每一位数值在中间时刻采样三次。为使接收准确无误,
    至少两次同样的值才被认可。如果起始位确实有效,则开始接收本帧的其余数据。
    在RI=0的状态下,接收到停止位为“1”(或SM2=1)时,将停止位送入RB8中,
    8位数据进入接收缓冲器SBUF,并置中断标志位RI=1。
??在方式1的接收中,同时满足以下两个条件:
??·RI=0;
??·SM2=0或接收到停止位=1。
??接收数据有效,装载SBUF、RB8及RI置1。如果上述条件不同时满足,接收的数据
    不能装入SBUF,该数据丢失。
【工作方式1接收时序】
??????起始位??????????????? 停止位
──────┐?┌─┬─┬─┬─┬─┬─┬─┬─┬───
  RXD ???│?│D0│D1│D2│D3│D4│D5│D6│D7│
(数据)??└─┴─┴─┴─┴─┴─┴─┴─┴─┘
位检测器采样 ||| ||| ||| ||| ||| ||| ||| ||| |||
────────────────────────────
??????????????????????????┌─
RI?????????????????????????│
──────────────────────────┘
3、串行口工作方式2和工作方式3
??串行口工作方式2和工作方式3均为11位异步通信接口,由TXD和RXD发送与接收数据。
     这两种工作方式除波特率不同外,其他操作均相同。
??收发一帧数据格式为:1位起始位、8位数据位(低位在前)、1位可编程的第9数据位、
    1位停止位。发送时第9数据位(TB8)可以设置为 1 或
0,也可以将奇偶位装入TB8中,进行奇偶校验;接收时,第9位数据进入SCON的RB8中。
??①方式2和方式3发送数据。
??方式2和方式3发送数据前,先根据通信协议由软件设置TB8,以认定TB8是作奇偶
    校验位还是作多机通信的地址/数据位,然后将要发送的数据写入SBUF,启动发送过程。
    串行口能自动把TB8取出,并装入到第9位数据的位置,再逐一发送出去。数据发送完毕,
    置发送中断标志TI=1,向CPU申请中断。
【方式2和方式3的发送时序】
??┌┐
??││写入SBUF
──┘└───────────────────────
─────┐?????????????????┌───
?????│SEND???????????????│
?????└─────────────────┘
??起始位?????????????? ?停止位
───┐?┌─┬─┬─┬─┬─┬─┬─┬─┬───
  RXD ??│?│D0│D1│D2│D3│D4│D5│D6│D7│
(数据)?└─┴─┴─┴─┴─┴─┴─┴─┴─┘
?????????????????????????┌─
TI????????????????????????│
─────────────────────────┘
??②方式2和方式3接收数据
??方式2和方式3接收数据时,应首先使SCON中的REN=1,允许接收。当检测到起始位时,
                        开始接收9位数据(D0~D8和TB8,未包括起始位和停止位)。
??当满足RI=0且SM2=0或接收到的地址9数据位为1时,前8位数据装入SBUF,第9位数据
        装入SCON中的RB8,并置RI=1,向CPU申请中断;否则,该次接收无效,不将RI置1。
【方式2和方式3接收时序】
???  起始位              停止位
————┬─┬─┬─┬─┬─┐
  RXD ?│?│D0│D1丨…│D7│
(数据)└─┴─┴─┴─┴─┴─
位检测       ||| |||  … |||
器采样
????    ┌─———─────
RI───——┘?????????
————————————————————————————————————
  主从式多机通信
一、主从式多机通信:
??MCS-51单片机具有多机通信动能,串行口工作方式2、方式3均可实现多机通信。
                                   串行控制寄存器SCON中的SM2、和TB8、RB8
配合可以完成主从式多机通信。
??多机通信规定:第9位数据位1(即RB8=1),说明本帧数据为地址帧;第9位数据位0
   (即RB8=0),则本帧数据为数据帧。若SM2=1时,则仅当从机接收到的第9位数据为1时,
    数据才装入接收缓冲器SBUF,并置RI=1,向CPU申请中断;如果第9位数据为0,则不置位
                                                      中断标志RI,该帧数据丢失。
??主从式多机通信中,一台是主机,其余为从机,从机要服从主机的调度和分配。
二、多机通信协议:
??·使所有从机的SM2=1,出于只接收地址帧的状态。
??·主机向从机发出一帧地址信息,其中包括8位地址,且第9位为1,表示发送的是地址
                                                         数据帧,中断所有从机。
??·从机接收。
??在多机通信时,一个为主机,所有从机的SM2都必需置1。主机首先发送一帧地址数据,
    中断所有从机。从机接收到地址后,判断主机发送的地址是否是本机地址,若是本机
    地址,则将SM2清零,进入正式通信状态,把本机的地址发送回主机作为应答信号,
    然后开始接收主机发来的数据或指令信息。其他从机由于地址不符,其SM2=1保持不变,
    不与主机通信,从中断返回。
??·主机接收从机发回的应答地址信号后,与其发送的地址信息进行比较,如果相符,
     则使TB8=0,正式发送数据;如果不符,则发送错误信息。
??·通信的各机之间必需以相同的格式及波特率进行通信
**********************************************************************************
*学习单片机汇编程序是很枯燥无味的,但是汇编语言通俗易懂,还望大家看看这方面的教材*
*!!!!!!大家的支持就是我的动力!!!!!!下次发帖详细告知30个程序清单,如果大家需要什么*
*实用的程序,我在编辑过程中调整,可能有的程序需要编写,希望大家支持!共同进步!!!!!*
**********************************************************************************
作者: xiaogu    时间: 2009-8-2 10:55

沙发我坐。
作者: 学员5701-01    时间: 2009-8-4 15:18

大家需要的资料,先收藏了!
作者: 姚迪    时间: 2009-8-5 08:52

想从最基础的学起,先谢谢曹老师不辞辛苦为大家讲解.
作者: 技工@    时间: 2009-8-7 13:16

学习学习
有点深度啊
作者: 流行飞电    时间: 2009-8-7 13:28

学习中呀。多谢了
作者: 电子空空    时间: 2009-8-7 13:41

学习中!这些对我还有些深度!有些看不懂 !因为,自己基础太差,以后要多向曹师傅请教请教
作者: 整全    时间: 2009-8-9 06:01

学习中,感谢版主
作者: 家乐多    时间: 2009-8-9 12:38

感谢曹老师,有了前进的方向。
作者: 远航家电    时间: 2009-8-9 12:42

:y:
作者: 周森华    时间: 2009-8-10 18:47

学习中,感谢版主
作者: xinyucc    时间: 2009-8-12 15:03

好好学习,天天向上。
作者: 家乐多    时间: 2009-8-14 23:41

是曹老师的头像吗,比想象中年轻、帅气、儒雅。感谢曹老师给我们学习的动力。。。。。。。。
作者: 贾天鸿    时间: 2009-8-24 18:13

版主辛苦了
作者: 贾天鸿    时间: 2009-8-28 18:35

学习了不少,但老多英文符号不知道什么意思
作者: 万昌    时间: 2009-8-28 18:47

谢谢老师,辛苦啦,要是有讲解视频就更好啦。




欢迎光临 『家电维修论坛 163DZ.COM』 (http://xn--wwwdz-eha65fq9w.163dz.com/bbs/) Powered by Discuz! 7.0.0