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.