Creo que he leído todo sobre la UART de 8051 pero no puedo entender qué es lo que va mal, incluso en este ejemplo más simple. De acuerdo con la literatura en el modo 0, la MCU transmite un byte solo cuando lo escribimos en SBUF, y solo allí se producen 8 impulsos de reloj en la línea TXD; La MCU lee el byte cuando cambia el voltaje TXD.
En este ejemplo (solo el indicador está conectado a P1) no escribo nada en SBUF, pero pediédicamente TI, luego se produce la interrpupt RI, el voltaje TXD cambia constantemente y recibo constantemente 0.
La frecuencia de reloj es de 12 MHz. ¿Qué puede ser una razón?
¡Gracias a todos por cualquier esfuerzo!
;====================================================================
; MCU: 80C51
; Compiler: ASEM-51 (Proteus)
;====================================================================
$NOMOD51
$INCLUDE (8051.MCU)
;====================================================================
; RESET AND INTERRUPT VECTORS
;====================================================================
; Reset vector
org 0000h
jmp Init
; Serial port interrupt vector
org 0023h
call SERIAL_PORT_HANDLER
reti
;====================================================================
; MAIN CODE BLOCK
;====================================================================
org 0150h
Init:
setb ES
setb EA
mov SCON, #00010000b ; UART Mode 0,
; accept messages with any 9th bit,
; enable recieving,
; don't recieve 9th bit,
; clear interrupt flags
Loop:
jmp Loop
;====================================================================
; SERIAL PORT INTERRUPT HANDLER
;====================================================================
SERIAL_PORT_HANDLER:
jb TI, _SENT
_RECEIVED:
mov P1, SBUF ; Move to indicator
clr RI
jmp _AFTER_SERIAL_PORT_HANDLING
_SENT:
clr TI
_AFTER_SERIAL_PORT_HANDLING:
ret
;====================================================================
END