Documentos de Académico
Documentos de Profesional
Documentos de Cultura
8051/52
Sistemas Embebidos
(8051 Aplicación)
CTRL Timer0
of ROM Timer1
INT RAM Timer2
Interrupts
internal
OSC Control
4 PORTS IO UART
bus
RD WR TxD RxD
P0 P2 P1 P3
Bus Data/Address
Ejemplos de Sistemas Embebidos
Teclados
Impresoras
Video juegos
Reproductores MP3
Memorias integradas para mantener la
información de configuración
Teléfonos Móviles
Aplicaciones Domésticas
Data switches
Control para Automóviles
Componente Básico 8051
4K bytes internal ROM
128 bytes internal RAM
Four 8-bit I/O ports (P0 - P3).
Two 16-bit timers/counters
One serial interface
8952 8k 256 3 8 32 -
891051 1k 64 1 3 16 AC
892051 2k 128 2 6 16 AC
AMD
Analog Devices
Atmel
Cygnal Integrated Products
Cypress
Dallas Semiconductor
Infineon
Intel
MCUs compatibles OKI Semiconductor
Philips
SMC
TDK
TI
Temic Semiconductor
Triscend
ST Microelectronics
Winbond
Hyundai
Diagrama en Bloques 8051
8051
Pinout
P1.0 1 40 Vcc
P1.1 2 39 P0.0(AD0
8051
P1.2 3 38 )P0.1(AD1)
P1.3 4 37 P0.2(AD2
P) 0.3(AD3)
PIN-OUT
P1.4 5 36
P1.5 6 35 P0.4(AD4)
P1.6 7 34 P0.5(AD5)
P1.7 8 33 P0.6(AD6)
RST 9 8051 32 P0.7(AD7)
(RXD)P3.0 10 31 EA/VPP
(TXD)P3.1 11 (8031) 30 ALE/PROG
(INT0)P3.2 12 (8751) 29 PSEN
(INT1)P3.3 13 28 P2.7(A15)
(T0)P3.4 14 (8951) 27 P2.6(A14
(T1)P3.5 15 26 )P2.5(A13
(WR)P3.6 16 25 )P2.4(A12
(RD)P3.7 17 24 )P2.3(A11
XTAL2 18 23 )
P2.2(A10)
XTAL1 19 22 P2.1(A9)
GND 20 21 P2.0(A8)
PINES Importantes (IO Ports)
TB1
Read pin
Estructura de un Puerto I/O
Cadas pines de puertos I/Os
Internamente conectado al bus de la CPU
Un latch D almacena el valor del pin
Escribir en el latch = 1
2 Buffer Tri-state :
TB1: controlado por “lectura del pin”
Read pin = 1 : Lee el dato presente en el pin
TB2: controlled by “Lectura del latch”
Read latch = 1 : Lee el dato en el Llatch
Un transistor M1
Gate=0: abierto
Gate=1: cerrado
Escribiendo “1” a la salida Pin P1.X
TB1
Read pin
Escribiendo “0” al Pin P1.X como
salida
TB1
Read pin
Leyendo un “High” en el Pin como
Entrada
1 1 P1.X pin
Internal CPU bus D Q
P1.X
0 M1
Write to latch Clk Q
TB1
Read pin
3. Read pin=1 Read latch=0
Write to latch=1
Leyendo un “Low” en el Pin de
entrada
Read latch Vcc 2. MOV A,P1
TB2
1. write a 1 to the pin Load(L1) external pin=Low
MOV P1,#0FFH
1 0 P1.X pin
Internal CPU bus D Q
P1.X
0 M1
Write to latch Clk Q
TB1
Read pin
3. Read pin=1 Read latch=0
Write to latch=1
8051 IC
Port 0 con Resistores externos Pullup
Vcc
10 K
P0.0
DS5000 P0.1
Port 0
P0.2
8751 P0.3
8951 P0.4
P0.5
P0.6
P0.7
Pines Importantes
Vcc ( pin 40 ):
Vcc provee la alimentación del MCU.
El voltaje normal es de +5V.
GND ( pin 20 ): Masa
XTAL1 y XTAL2 ( pins 19,18 ):
En estos 2 pines se coloca el clock.
Vía 1 : usando un crista externo
Vía 2: usando un oscilador TTL externo
Conectando un XTAL al 8051
C1
XTAL1
30pF
GND
Como Conectar un oscilador externo TTL
N XTAL2
C
EXTERNAL
OSCILLATOR
SIGNAL XTAL1
GND
Ciclo de Maquina ejercicio
Encontrar el ciclo de máquina para las siguientes:
(a) XTAL = 11.0592 MHz
(b) XTAL = 16 MHz.
Solución:
Vcc
31
EA/VPP
X1
10 uF 30 pF
X2
RST
9
8.2 K
Valores de algunos registros despues del
RESET:
Figura
Multiplexando
direcciones
(byte bajo) y
bus de datos
Multiplexación de direcciones
para memoria externa
Acceder a la memoria de
programa externa
Accediendo a memoria de datos
externa
Interfaz
para RAM
de 1K
Timing para la instrucción MOVX
Memoria de Programa externa
WR
RD
PSEN OE
ALE 74LS373 CS
G
P0.0 A0
D
P0.7 A7
D0
D7
EA
P2.0 A8
P2.7 A15
8051 ROM
Memoria de datos externa
WR WR
RD RD
PSEN
ALE 74LS373 CS
G
P0.0 A0
D
P0.7 A7
D0
D7
EA
P2.0 A8
P2.7 A15
8051 RAM
Superposición de espacios de datos
y código externo
Superposición de espacios de datos y
código externo
WR WR
RD
PSEN RD
ALE 74LS373 CS
G
P0.0 A0
D
P0.7 A7
D0
D7
EA
P2.0 A8
P2.7 A15
8051 RAM
Superposición de espacios de datos y
código externo
Bank 3
Cuatro Bancos de Registos
18
17 Cada banco t iene R0-R7
Seleccionables por los bits
Bank 2 Del registro PSW 2 y 3
10
0F
Bank 1
08
07 R7
06 R6
05 R5
04 R4
03 R3 Bank 0
02 R2
01 R1
00 R0
Memoria direccionable a nivel Bit
2F 7F 78 20h – 2Fh (16 loalizaciones
2E x 8-bits = 128 bits)
2D
2C
Direccionando Bits:
2B
mov C, 1Ah
2A
29
o
28 mov C, 23h.2
27
26
25
24
23 1A
22 10
21 0F 08
20 07 06 05 04 03 02 01 00
Registros de funciones especiales
Registros de DATOS
Registros de CONTROL
Timers
Port Serie
Systema de Interrupciones Direcciones 80h – FFh
Conversor ADC * Direccionamiento
Conversor DAC * directo utilizado para
Etc. acceder a los SFRs
* Solo en los MCU que lo incorporan
RAM direccionable a nivel Bit
Sumario de
la RAM del
8051 sobre
el chip
Ram direccionable a nivel Bit
Registros de
funciones
Especiales
Banco de Registros
Banco activo seleccionable por los bits del regitro PSW
[RS1,RS0]
Permite un rápido“context switching” en la Rutina del
Servicio de Interrupciones (ISR).
Registros de la CPU del 8051
A (Accumulator)
B
PSW (Program Status Word)
SP (Stack Pointer)
PC (Program Counter)
DPTR (Data Pointer)
Usados cuando se
programa en Assembler
Registers
Registros segun el modelo del
programador
A
B
R0
DPTR DPH DPL
R1
R2 PC PC
R3
R6
R7
Modos 0-3
GATE – permite habilitar el pin externo (ej. Pulsos externos)
0: pin INT no usado
1: contador habilitado por pin INT (port 3.2, 3.3)
C/T – indica modo TIMER o modo COUNTER
Regitsro de Control Timer/Counter
(TCON)
TR - habilita timer/counter
TF – flag overflow: puede causar una INT
IE/IT – control de interrupcion externa y tipo
No relacionada al timer/counter
Timer/Counter Mode 0
Mode 0 igual al modo 1, pero usa los 16 bits
Timer/Counter Mode 2
Contador 8-bit, y auto-carga sobre el overflow
Timer/Counter Mode 3
Apliacable tambien al Timer/Counter 0
Da un temporizador extra
Ejemplo Timer Setup
Configuración del Timer usando lenguaje C
TMOD = 0x62; // 01100010;
TCON = 0x50; // 01010000;
TH1 = 246;
TH0 = 6;
IE = 0x8A; // 10001010;
Interrupciones
Permite tareas paralelas
La rutina de interrupciones corre por debajo
“background”
Llama a una fución de forma automática
Facil para programar
Interrupciones del 8051
Serial port
Overflow Timer 0
Overflow Timer 1
Interrupción Externa 0
Interrupción Externa 1
Vector de Interrupciones
Para cada interrupción existe un vector de
interrupción (dirección)
Direcciones de programa bajas
0x00 - Reset PC address
0: 0x03 - External interrupt 0
1: 0x0B - Timer 0
2: 0x13 - External interrupt 1
3: 0x1B - Timer 1
4: 0x23 - Serial line interrupt
COUNT EGU 30
~
~
mov R4, #COUNT
MOV DPTR,#MYDATA
~
~
0RG 200H
MYDATA:DB “IRAN”
Addressing Modes
Register Addressing – either source or
destination is one of CPU register
MOV R0,A
MOV A,R7
ADD A,R4
ADD A,R7
MOV DPTR,#25F5H
MOV R5,DPL
MOV R,DPH
Table Lookup
MOVC only can read internal code memory
Acc Register
A register can be accessed by direct and register mode
immediate addressing
Direct addressing
Op code n n n
070D E8 mov a,r0 ;E8 = 1110 1000
070E E9 mov a,r1 ;E9 = 1110 1001
070F EA mov a,r2 ;EA = 1110 1010
0710 ED mov a,r5 ;ED = 1110 1101
0711 EF mov a,r7 ;Ef = 1110 1111
0712 2F add a,r7
0713 F8 mov r0,a
0714 F9 mov r1,a
0715 FA mov r2,a
0716 FD mov r5,a
0717 FD mov r5,a
8051 Instruction Format
Op code i
mov a, @Ri ; i = 0 or 1
stack pointer
stack
mov C, 67h
mov C, 2ch.7
SFRs that are Bit Addressable
Mnemonic Description
ADD A, byte add A to byte, put result in A
ADDC A, byte add with carry
SUBB A, byte subtract with borrow
INC A increment A
INC byte increment byte in memory
INC DPTR increment data pointer
DEC A decrement accumulator
DEC byte decrement byte
MUL AB multiply accumulator by b register
DIV AB divide accumulator by b register
DA A decimal adjust the accumulator
ADD Instructions
add a, byte ; a a + byte
addc a, byte ; a a + byte + C
These instructions affect 3 bits in PSW:
C = 1 if result of add is greater than FF
AC = 1 if there is a carry out of bit 3
OV = 1 if there is a carry out of bit 7, but not from bit 6, or
visa versa.
Instructions that Affect PSW
bits
ADD Examples
mov a, #3Fh What is the value of
add a, #D3h the C, AC, OV flags
after the second
instruction is
0011 1111 executed?
1101 0011
0001 0010
C = 1
AC = 1
OV = 0
Signed Addition and
Overflow
0111 1111 (positive 127)
2’s complement: 0111 0011 (positive 115)
0000 0000 00 0 1111 0010 (overflow
cannot represent 242 in 8
… bits 2’s complement)
0111 1111 7F 127
1000 1111 (negative 113)
1000 0000 80 -128
1101 0011 (negative 45)
… 0110 0010 (overflow)
1111 1111 FF -1
0011 1111 (positive)
1101 0011 (negative)
0001 0010 (never overflows)
Addition Example
; Computes Z = X + Y
; Adds values at locations 78h and 79h and puts them in 7Ah
;------------------------------------------------------------------
X equ 78h
Y equ 79h
Z equ 7Ah
;-----------------------------------------------------------------
org 00h
ljmp Main
;-----------------------------------------------------------------
org 100h
Main:
mov a, X
add a, Y
mov Z, a
end
The 16-bit ADD example
; Computes Z = X + Y (X,Y,Z are 16 bit)
;------------------------------------------------------------------
X equ 78h
Y equ 7Ah
Z equ 7Ch
;-----------------------------------------------------------------
org 00h
ljmp Main
;-----------------------------------------------------------------
org 100h
Main:
mov a, X
add a, Y
mov Z, a
mov a, X+1
adc a, Y+1
mov Z+1, a
end
Subtract
Example:
SUBB A, #0x4F ;A A – 4F – C
Notice that
There is no subtraction WITHOUT borrow.
Therefore, if a subtraction without borrow is desired,
it is necessary to clear the C flag.
Example:
Clr c
SUBB A, #0x4F ;A A – 4F
Increment and Decrement
INC A increment A
INC byte increment byte in memory
INC DPTR increment data pointer
DEC A decrement accumulator
DEC byte decrement byte
mov a, r2
add a, #1 ; use add rather than increment to affect C
mov r2, a
mov a, r3
addc a, #0 ; add C to most significant byte
mov r3, a
Multiply
When multiplying two 8-bit numbers, the size of the
maximum product is 16-bits
FF x FF = FE01
(255 x 255 = 65025)
MUL AB ; BA A * B
Integer Division
DIV AB ; divide A by B
A Quotient(A/B)
B Remainder(A/B)
DA a ; decimal adjust a
Example:
mov a, #23h
mov b, #29h
add a, b ; a 23h + 29h = 4Ch (wanted 52)
DA a ; a a + 6 = 52
Logic Instructions
00001111
XRL 10101100
10100011
CPL 10101100
01010011
Address Modes with Logic
byte, #constant
a ex: cpl a
CPL – Complement
Uses of Logic Instructions
CLR - clear
RL – rotate left
RLC – rotate left through Carry
RR – rotate right
RRC – rotate right through Carry
SWAP – swap accumulator nibbles
CLR ( Set all bits to 0)
CLR A
CLR byte (direct mode)
CLR Ri (register mode)
CLR @Ri (register indirect mode)
Rotate
Rotate instructions operate only on a
RL a
RR a
mov a, #0A9h ; a A9
add a, #14h ; a BD (10111101), C0
rrc a ; a 01011110, C1
C
RLC a
SWAP a
ANL C, bit
ORL C, bit
CLR C
CLR bit
CPL C
CPL bit
SETB C
SETB bit
Conditional jumps
org 8000h
Start: mov C, p1.6
mov p3.7, C
ljmp Start
end
loop: mov a, P1
jz loop ; if a=0, goto loop,
; else goto next
instruction
mov b, a
if (a = 0) is true
send a 0 to LED
else
send a 1 to LED
jz led_off
Setb P1.6
sjmp skipover
led_off: clr P1.6
mov A, P0
skipover:
More Conditional Jumps
Mnemonic Description
CJNE A, #data <rel addr> Compare A and data, jump
if not equal
CJNE Rn, #data <rel addr> Compare Rn and data,
jump if not equal
CJNE @Rn, #data <rel addr> Compare Rn and memory,
jump if not equal
DJNZ Rn, <rel addr> Decrement Rn and then
jump if not zero
For A = 0 to 4 do For A = 4 to 0 do
{…} {…}
ret ; PC stack
Subroutinas
llamada a la subroutina
Main: ...
acall sublabel
...
...
sublabel: ...
...
La subrutina
ret
Initializando el Stack Pointer
cuadrado: inc a
movc a,@a+pc
ret
tabla: db 0,1,4,9,16,25,36,49,64,81
sqrt: inc a
movc a, @a + PC
subrutina
ret
Sqrs: db 0,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3
dato
end
Que son las Subrutinas?
Las subrutinas nos permiten tener
programas en lenguaje ensamblador
"estructurados".
Esto es útil para dividir un diseño grande en
partes manejables.
Ahorra espacio de código cuando las
subrutinas se pueden llamar muchas veces
en el mismo programa.
Ejemplo de un Delay
org 100h
Main: clr GREEN_LED
Again: acall Delay
main program
cpl GREEN_LED
sjmp Again
djnz R5, $
subroutine
ret
END
Ejemplo
; Movemos un string desde la memoria de
programa a la RAM
org 0
mov dptr,#string
mov r0,#10h
Loop1: clr a
movc a,@a+dptr
jz stop
mov @r0,a
inc dptr
inc r0
sjmp loop1
Stop: sjmp stop
;Memioria de programa embebida usada
para el string
org 18h
String: db ‘this is a string’,0
end
Ejemplo
; p0:input p1:output
mov a,#0ffh
mov p0,a
back: mov a,p0
mov p1,a
sjmp back
setb p1.2
mov a,#45h ;data
Again: jnb p1.2,again ;wait for data
request
mov p0,a ;enable strobe
setb p2.3
clr p2.3
Ejemplo
; duty cycle 50%
back: cpl p1.2
acall delay
sjmp back