Diewuxi

Belive tomorrow will be better, love science and technology, support communication and understanding, always ready for thought turn.

Blog / engineering_technology / electronic_electrical / mcu / 8051微控制器笔记

Blog


Article^ Parent

8051微控制器笔记


Date: 2021-03-14 00:00:00
Description: 8051微控制器笔记。
Keywords: 8051, mcs-51,微控制器
Category: engineering_technology/electronic_electrical/mcu
Tag: mcu, MCS-51
Link: https://www.diewuxi.com/blog/article/72.html

Changelog

* 2022-05-21
    * Add: Modify XSTRING, add SP_OUT.
* 2022-05-16
    * Add: Non-power Buzzer.
* 2022-05-16
    * Add: Serial port send string.
* 2022-05-12
    * Modify: Software delay 2 level, type 1 and type 2 re understand.
* 2022-04-09
    * Add: Software delay compute.
* 2022-01-03
    * Add: MPC89LE515 SFR T2
* 2021-12-28
    * Add: Memory structure and memory address map
* 2021-03-16
    * Add: Counter/Timer
* 2021-03-14
    * Add: Asm DELAY time compute.
                        

Memory stucture

Internal RAM(IRAM)

  • First 128 bytes
  • Later 128 bytes

Program memory(PMEM)

Up to 64 KB read-only memory.

External data memory(XRAM)

Special Function Registers(SFR)

Position: MPC89LE515

----------------------------------------------------------------------------------------------------------------------------------
offset  0       1       2       3       4       5       6       7       8       9       A       B       C       D       E       F
----------------------------------------------------------------------------------------------------------------------------------
0x80    P0      SP      DPL     DPH                             PCON    TCON    TMOD    TL0     TL1     TH0     TH1     AUXR
0x90    P1                                                              SCON    SBUF
0xA0    P2              AUXR1                                           IE      SADDR
0xB0    P3                                                      IPH     IP      SADEN
0xC0    XICON                                                   *       T2CON   T2MOD   RCAP2L  RCAP2H          TL2     TH2
0xD0    PSW
0xE0    ACC     WDTCR   IFD     IFADRH  IFADRL  IFMT    SCMD    ISPCR   P4
0xF0    B
----------------------------------------------------------------------------------------------------------------------------------
                        

Content: MPC89LE515

--------------------------------------------------------------------------------------------------------------------
                7       6       5       4       3       2       1       0       Initial value
--------------------------------------------------------------------------------------------------------------------
0x80(P0)                                                                        11111111B
0x81(SP)                                                                        00000111B
0x82(DPL)                                                                       00000000B
0x83(DPH)                                                                       00000000B
0x87(PCON)      SMOD    SMOD0   --      POF     GF1     GF0     PD      IDL     00110000B
0x88(TCON)      TF1     TR1     TF0     TR0     IE1     IT1     IE0     IT0     00000000B
0x89(TMOD)      GATE    C/T     M1      M0      GATE    C/T     M1      M0      00000000B
0x8A(TL0)                                                                       00000000B
0x8B(TL1)                                                                       00000000B
0x8C(TH0)                                                                       00000000B
0x8D(TH1)                                                                       00000000B
0x8E(AUXR)                                                      ERAM    AO      xxxxxx00B
0x90(P1)                                                        T2EX    T2      11111111B
0x98(SCON)      SM0/FE  M1      SM2     REN      TB8    RB8     TI      RI      00000000B
0x99(SBUF)                                                                      xxxxxxxxB
0xA0(P2)                                                                        11111111B
0xA2(AUXR1)                                      GF2                    DPS     xxxx0xx0B
0xA8(IE)        EA              ET2     ES       ET1    EX1     ET0     EX0     00000000B
0xA9(SADDR)                                                                     00000000B
0xB0(P3)        RD      WR      T1      T0       INT1   INT0    TXD     RXD     11111111B
0xB7(IPH)       PX3H    PX2H    PT2H    PSH      PT1H   PX1H    PT0H    PX0H    00000000B
0xB8(IP)                        PT2     PS       PT1    PX1     PT0     PX0     xx000000B
0xB9(SADEN)                                                                     00000000B
0xC0(XICON)     PX3     EX3     IE3     IT3      PX2    EX2     IE2     IT2     00000000B
0xC8(T2CON)     TF2     EXF2    RCLK    TCLK     EXEN2  TR2     C/T2    CP/RL   00000000B
0xC9(T2MOD)                                                     T2OE    DCEN    xxxxxx00B
0xCA(RCAP2L)                                                                    00000000B
0xCB(RCAP2H)                                                                    00000000B
0xCD(TL2)                                                                       00000000B
0xCE(TH2)                                                                       00000000B
0xD0(PSW)       CY      AC      F0      RS1     RS0     OV      -       P       00000000B
0xE0(ACC)                                                                       00000000B
0xE1(WDTCR)     -       -       ENW     CLW     WIDL    PS2     PS1     PS0     xx000000B
0xE2(IFD)                                                                       11111111B
0xE3(IFADRH)                                                                    00000000B
0xE4(IFADRL)                                                                    00000000B
0xE5(IFMT)      -       -       -       -       -       MS2     MS1     MS0     xxxxx000B
0xE6(SCMD)                                                                      xxxxxxxxB
0xE7(ISPCR)     ISPEN   BS      SRST    -       -       ICK2    ICK1    ICK0    000xx000B
0xE8(P4)                                        EBH     EAH     E9H     E8H     xxxx1111B
0xF0(B)                                                                         00000000B
--------------------------------------------------------------------------------------------------------------------
                        

Memory address map

Direct address:

0x00~0x7F   IRAM:0x00~0x7F
0x80~0xFF   SFR:0x80~0xFF
                        

Indirect address:

0x00~0x7F   IRAM:0x00~0x7F
0x80~0xFF   IRAM:0x80~0xFF
                        

MOVC address(MOVC A,@A+DPTR or MOVC A,@A+PC):

0x0000~0xFFFF   PMEM:0x0000~0xFFFF
                        

MOVX address 1(MOVX A,@R0, MOVX A,@R1, MOVX @R0,A, MOVX @R1,A)

0x0000~0x00FF   XRAM:0x0000~0x00FF
                        

MOVX address 2(MOVX A,@DPTR, MOVX @DPTR,A)

0x0000~0xFFFF   XRAM:0x0000~0xFFFF
                        

MPC89LE515

SFR operation

T2

--------------------------------------------------------------------------------------------------------------------
                7       6       5       4       3       2       1       0       Initial value
--------------------------------------------------------------------------------------------------------------------
0xC8(T2CON)     TF2     EXF2    RCLK    TCLK    EXEN2   TR2     C/T2    CP/RL   00000000B
0xC9(T2MOD)                                                     T2OE    DCEN    xxxxxx00B

TF2:    Change to 1 when overflow, except RCLK or TCLK is set.
EXF2:
        Change to 1 when EXEN2=1 and T2EX down eage capture or reload.
        When T2 enable interupt, 1: make cpu execute T2 interupt program.
        When T2 DCEN=1, EXF2 NOT make interupt.
RCLK: 
        1: T2 overflow pulse as serial port mode 1/3 recieve clock.
        0: T1 ...
TCLK:
        1: T2 overflow pulse as serial port mode 1/3 transmit clock.
        0: T1 ...
EXEN2:
        1: T2EX down eage make T2 capture or reload, when T2 NOT as serial port clock
        0: T2EX jump NOT affect T2
TR2:
        1: Start
        0: Stop
C/T2:
        1: External counter, down eage trigged
        0: Internal timer.
CP/RL:
        When RCLK=1 or TCLK=1, T2 is auto reload.
        1: When EXEN2=1, T2EX down eage make capture.
        0: When EXEN2=1, T2 overflow or T2EX down eage make T2 reload.
                        

Counter/Timer

Memery address

  • TCON(88H)

    88H.7: TF1 88H.6: TR1 88H.5: TF0 88H.4: TR0 88H.3: IE1 88H.2: IT1 88H.1: IE0 88H.0: IT0

  • TMOD(89H)

    89H.7: T1 GATE 89H.6: T1 C/T 89H.5: T1 M1 89H.4: T1 M0 89H.3: T0 GATE 89H.2: T0 C/T 89H.1: T0 M1 89H.0: T0 M0

Mode

------------------------------------------------------
M1  M0      Mode    Description
------------------------------------------------------
0   0       0       13 bit
0   1       1       16 bit
1   0       2       8 bit auto reload
1   1       3       C/T0: 2 8 bit counters; C/T1: Stop
------------------------------------------------------
                        

Timer initial value calculation

16-bit timer, target time is t(s), then, initial number n is:

n = 65536 - (t / (1 / (f / 12)))
  = 65536 - (t * f / 12)
                        

16-bit timer, initial number n, then, target time is t(s) is:

t = (1 / (f / 12)) * (65536 - n)
  = (65536 -n) * 12 / f
                        

Timer initial value for baud rate generator calculation

16-bit timer, target frequency is F(bps), then, initial number n is:

n = 65536 - ((f / divd / 16) / F)
                        

16-bit timer, initial number n is, then, target frequency is F(bps):

F = (f / divd / 16) / (65536 - n)
                        

Program functions

Software DELAY

2 level

Code type 1

DELAY:
    MOV R6, {l1}

LOOP:
    MOV R7, {l2}

    {COMD}

    DJNZ R7, $
    DJNZ R6, LOOP

    RET
                        

Used machine cycle number is

n = 1 + ((1 + n_COMD + (2 * l2) + 2) * l1) + 2
  = 1 + (2 * l1 * l2 + (3 + n_COMD) * l1) + 2
                        

Code type 2

DELAY:
    MOV R2, {l1}

LOOP_00:
    MOV R3, {l2}

LOOP_01:
    {COMD}

    DJNZ R3, LOOP_01
    DJNZ R2, LOOP_00

    RET
                        

Used machine cycle number is

n = 1 + ((1 + ((n_COMD + 2) * l2) + 2) * l1) + 2
  = 1 + ((n_COMD + 2) * l1 * l2 + 3 * l1) + 2
                        

Code type 3

DELAY:
    MOV R2, {l1}
    MOV R3, {l2}

LOOP:
    {COMD}
    DJNZ R2, LOOP
    DJNZ R3, LOOP

    RET
                        

Used machine cycle number is

n = 2 + (((n_COMD + 2) * l1) + 2) * l2 + 2
  = 2 + (n_COMD * l1 * l2 + 2 * l1 * l2 + 2 * l2) + 2
                        

COMD is empty:

n_COMD = 0   => n = 2 + (2 * l1 * l2 + 2 * l2) + 2 = 2 * l1 * l2 + 2 * l2 + 4

l1 = 0, l2 = 0 => n = 2 * 256 * 256 + 2 * 256 + 4 = 131588
l1 = 1, l2 = 1 => n = 2 * 1 * 1 + 2 * 1 + 4 = 8

n * 12 / 11.0592 = N

--------------------
N               n
-------         ----

--------------------
                        

3 level

DELAY:
    MOV R5, #50
DLY1:
    MOV R6, #100
DLY2:
    MOV R7, #50
    DJNZ R7, $
    DJNZ R6, DLY2
    DJNZ R5, DLY1

    RET
                        

Delay time:

Tm + ((Tm + ((Tm + Tm * 2 * R7) + Tm * 2) * R6) + Tm * 2) * R5
    = (R5 * (R6 * (R7 + 1) + 1)) * (Tm * 2) + (R5 * (R6 + 1) + 1) * Tm
    = ((R5 * (R6 * ((R7 + 1) * 2 + 1)) + 3) + 1) * Tm
                        

Compute with number:

((50 * (100 * ((50 + 1) * 2 + 1)) +3) + 1) * 1 us
    = 515004 us
                        

Approximation Form:

(R5 * R6 * R7) * (Tm * 2) + (R5 * R6 + R5) * (Tm * 2) + (R5 * R6 + R5 + 1) * Tm
    \sim (R5 * R6 * R7) * (Tm * 2)
                        

Compute with number:

(50 * 100 * 50) * 1 * 2 us
    = 500000 us
                        

Serial port send string

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; @name XSTRING
; @description Output string to serial port, use DPTR to return instead of RET.
;     Call example(need define ESC):
;         LCALL   XSTRING
;         DB      '{string}', CR, LF, ESC
; @depend SP_OUT(ACC)
; @param DB data after called position.
; @return None
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XSTRING:
    POP     DPH
    POP     DPL

    ;
    ; Check first byte.
    ;
    CLR     A
    MOVC    A, @A + DPTR

    CJNE    A, #ESC, XSTRING_1
    LJMP    XSTRING_RET

XSTRING_LOOP:
    LCALL   SP_OUT;(ACC)

    INC     DPTR

    CLR     A
    MOVC    A, @A + DPTR

    CJNE    A, #ESC, XSTRING_LOOP

    LJMP    XSTRING_RET

XSTRING_RET:
    MOV     A, #1
    JMP     @A + DPTR


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; @name SP_OUT
; @description Serial port data send out.
; @depend None
; @param MCU.SFR: A
; @return None
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SP_OUT:
    MOV     SBUF, A

    JNB     TI, $

    CLR     TI

    RET
                        

Non-power buzzer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; @name BEEP_SINGLE
; @description Single beep.
; @depend DELAY(), DELAY100US()
; @param None
; @return void
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BEEP_SINGLE:
    MOV     R4, #5

BEEP_SINGLE_00:
    MOV     R5, #100

BEEP_SINGLE_01:
    SETB    BELL

    LCALL   DELAY100US

    CLR     BELL

    LCALL   DELAY100US

    DJNZ    R5, BEEP_SINGLE_01
    DJNZ    R4, BEEP_SINGLE_00

    ; n = n_R5 * n_R4
    ; t = T * n

    ;
    ; Delay for approximately 1 s.
    ;
    LCALL   DELAY
    LCALL   DELAY
    LCALL   DELAY

    RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; @name BEEP_WARN
; @description Warn beep.
; @depend DELAY100US(), DELAY()
; @param None
; @return void
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BEEP_WARN:
    MOV     R4, #10

BEEP_WARN_00:
    MOV     R5, #100

BEEP_WARN_01:
    SETB    BELL

    LCALL   DELAY100US
    LCALL   DELAY100US
    LCALL   DELAY100US
    LCALL   DELAY100US
    LCALL   DELAY100US

    CLR     BELL

    LCALL   DELAY100US
    LCALL   DELAY100US
    LCALL   DELAY100US
    LCALL   DELAY100US
    LCALL   DELAY100US

    DJNZ    R5, BEEP_WARN_01
    DJNZ    R4, BEEP_WARN_00

    ; n = n_R5 * n_R4
    ; t = T * n


    ;
    ; Delay for approximately 1 s.
    ;
    LCALL   DELAY
    LCALL   DELAY
    LCALL   DELAY

    RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; @name BEEP
;; @description Warn beep.
;; @depend DELAY100US(), DELAY()
;; @param None
;; @return void
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;BEEP_WARN:
;    MOV     R4, #10
;
;BEEP_WARN_00:
;    MOV     R5, #100
;
;BEEP_WARN_01:
;    SETB    BELL
;
;    LCALL   DELAY100US
;    LCALL   DELAY100US
;    LCALL   DELAY100US
;    LCALL   DELAY100US
;    LCALL   DELAY100US
;
;    CLR     BELL
;
;    LCALL   DELAY100US
;    LCALL   DELAY100US
;    LCALL   DELAY100US
;    LCALL   DELAY100US
;    LCALL   DELAY100US
;
;    DJNZ    R5, BEEP_WARN_01
;    DJNZ    R4, BEEP_WARN_00
;
;    ; n = n_R5 * n_R4
;    ; t = T * n
;
;
;    ;
;    ; Delay for approximately 1 s.
;    ;
;    LCALL   DELAY
;    LCALL   DELAY
;    LCALL   DELAY
;
;    RET
                        

Last modified: 2022-05-21

Comments [0]

There is no comments now.

Write comment(* is necessary, and email is not shown to public)


Diewuxi 2017--2024