Close
0%
0%

8051 Alarm Clock

Based on a 8052 we designed an alarm clock in the most similar way to the basic commercial clocks.

Similar projects worth following
Alarm clock specifications:
1. The clock must be exact.
2. The system must show the time (actual or alarm time) in the HH: MM: SS format in 7 segment displays.
3. The system must be able to be on time.
4. The system should show the time 12:00:00 after a reset. The alarm time will initialize it at 00:00:00
5. The system must have a switch to display the real time or the alarm time.
6. The system must have a switch (or two) to make the time (real or alarm) to be set up in time from the minute if a switch is used or the hours and minutes if They use two switches.
7. The system must always show the time (real or alarm), even when it is being updated.
8. The system should sound a buzzer for one minute if the alarm is activated.

THEORY

The main objective of this practice is that we start as a sudden, is that we are able to work with an 8952 microcontroller, that we are able to work with the assembly language and that we are able to combine everything we know about timers and interruptions.

The original idea of the practice was to finish in the first 12 hours of work, however, for reasons of understanding and hard work, as well as stress and lack of sleep was assigned another delivery date of this.

Among the fundamental parts of this practice was to make us work as a team, as well as to make us work under pressure, something that has not stopped doing for many errors that arise and problems that have to be solved.

DESIGN

The main objective of the practice is to make a digital clock where we can assign an alarm at the time we want and also buzzer so that this is the closest thing to an alarm clock.

To be as similar as possible to an alarm clock, we must use 7 segment displays, the numbers must be distributed in a way HH, MM, SS.

The circuit must have external interruptions, to change in the displays between the clock and the alarm, as well as to adjust alarm or time.


SCHEMATIC

repentina.txt

Alarm Clock Code in assembly language

plain - 7.92 kB - 10/15/2018 at 03:10

Download

  • 2 × Protoboard
  • 1 × AT89S52 Microprocessors, Microcontrollers, DSPs / Microcontrollers (MCUs)
  • 6 × 7 segment displays
  • 6 × Transistors
  • 6 × Resistors for power up of the display

View all 10 components

  • 1
    Assembly Code

    ROA EQU 7FH ;es Reloj o es Alarma

    USR EQU 50H ;Unidades de Segundos del Reloj

    DSR EQU 51H ;Decenas de Segundos del Reloj

    UMR EQU 52H ;Unidades de Minutos del  Reloj

    DMR EQU 53H ;Decenas de Minutos del  Reloj

    UHR EQU 54H ;Unidades de Horas del Reloj

    DHR EQU 55H ;Decenas de Horas del Reloj

    AIR EQU 56H ;Alarma es Igual al Reloj (0 <= AIR <= 4)

    ;Registros para guardar valores de alarma

    USA EQU 57H ;Unidades de Segundos del Alarma

    DSA EQU 58H ;Decenas de Segundos del Alarma

    UMA EQU 59H ;Unidades de Minutos del  Alarma

    DMA EQU 5AH ;Decenas de Minutos del  Alarma

    UHA EQU 5BH ;Unidades de Horas del Alarma

    DHA EQU 5CH ;Decenas de Horas del Alarma

    ;Para multiplexor se usa el valor 20h de la memoria

    ORG 0000H

    SJMP inicio

    ORG 0003H ;VECTOR DE INTERRUPCIÓN EXTERNA 0

    CPL ROA ;Cambio entre alarma y reloj

    CPL P0.0

    RETI

    ORG 000BH ;Vector de interrupción Temp0

    JMP INTT0

    ORG 0013H ;Vector de interrupción Ext1

    SETB INT1 ;Apaga la interrupción uno para evitar múltiples cambios de minutos

    JMP INTEX1

    ORG 0040H

    INICIO: MOV TMOD, #00100010 B ;Inicia los dos temporizadores en modo 2, disparados por software y como temporizadores

    MOV TH0, #-250 ;Recarga del temporizador de inicio (250us)

    ;Inicialización de registros y variables

    SETB ROA ;INICIA EN MODO RELOJ

    SETB TR0 ;ACTIVA EL TEMPORIZADOR 0

    SETB IT1 ;INT EXTERNA 1

    SETB IT0 ;INT EXTERNA 0

    CLR A

    MOV P1, #0FEH ;MANDA AL PUERTO 1 (MULTIPLEXOR) UN 11111110b

    SETB P2.7 ;MANDA 5V AL BUZZER

    ;Inicia el reloj en 12:00:00

    MOV R2, #5

    MOV R3, #5

    MOV R4, #6

    MOV R5, #5

    MOV R6, #23

    NOP

    MOV A, AIR

    CLR A

    MOV AIR, A

    ;Inicia el reloj en 12:00:00

    MOV USR, #0

    MOV DSR, #0

    MOV UMR, #6

    MOV DMR, #5

    MOV UHR, #3

    MOV DHR, #2

    ;TABLA DECODIFIDORA

    ; gfedcba

    MOV 60H,#1000000B ;0

    MOV 61H,#1111001B ;1

    MOV 62H,#0100100B ;2

    MOV 63H,#0110000B ;3

    MOV 64H,#0011001B ;4

    MOV 65H,#0010010B ;5

    MOV 66H,#0000010B ;6

    MOV 67H,#1111000B ;7

    MOV 68H,#0000000B ;8

    MOV 69H,#0011000B ;9

    ;Inicia la alarma en 18:00:00

    MOV USA, #0

    MOV DSA, #0

    MOV UMA, #9

    MOV DMA, #5

    MOV UHA, #9

    MOV DHA, #1

    SETB P2.5

    MOV 20h, #0FEH

    MOV IP, #05H ;Da prioridad a las interrupciones externas

    MOV IE, #87H ;Habilita interrupciones (EA, EX1, ET0, EX0)

    JMP $

    ;Inicia el conteo

    INTT0: INC R1

    CJNE R1,#8,REGRESAR ;Mientras R1 != 8 regresa

    ACALL MULT ;Si no, Manda a llamar al multiplexor

    INC R2 ;Incrementa los segundos

    ACALL COMP

    MOV A, R1 ;MUEVE R1 AL ACUMULADOR *

    CLR A ;Pone A n ceros

    MOV R1, A ;Mueve A a R1

    CJNE R2,#23,REGRESAR

    INC R3

    MOV R2, #1

    CJNE R3,#20,REGRESAR ;CONTADOR DE 1 SEGUNDO

    MOV AIR, #0 ;Reinicializa la variable del contador

    ACALL DISP ;Subrutina para obtener el valor de cada display

    ACALL ALARMA ;Subrutina para activar la alarma

    MOV R3, #0

    INC R4

    CJNE R4,#60,REGRESAR ;CONTADOR DE 60 SEG O 1 MIN

    MOV R4, #0

    INC R5

    SETB P0.1 ;Después de un minuto apaga por completo la alarma

    ; ACALL INTEX1

    CJNE R5,#60,REGRESAR ;CONTADOR DE 60 MIN O 1 HORA

    MOV R5, #0

    INC R6

    CJNE R6,#25,REGRESAR

    MOV R6, #1

    REGRESAR: RETI

    ;Subrutina para el multiplexor

    MULT: MOV A, 20h

    RL A ;Mueve el bit en 0 a la derecha

    MOV 20h, A

    MOV P1, 20h ;Envia el valor de 20h al puerto 1

    JNB 00h, MUS ;Muestra Unidades de Segundos

    JNB 01h, MDS ;Muestra Decenas de Segundos

    JNB 02h, MUM ;Muestra Unidades de Minutos

    JNB 03h, MSM ;Muestra Decenas de Minutos

    JNB 04h, MUH ;Muestra Unidades de Horas

    JNB 05h, MDH ;Muestra Decenas de Horas

    EPRT: RET

    ;ROA = 0 -> alarma, ROA =1  -> reloj

    MUS: JNB ROA, MSUA ;Mostrar Segundos Unidades Alarma

    MOV A, USR

    JMP PRINT

    MSUA: MOV A, USA

    JMP PRINT

    MDS: JNB ROA, MSDA ;Mostrar Segundos Decenas Alarma

    MOV A, DSR

    JMP PRINT

    MSDA: MOV A, DSA

    JMP PRINT

    MUM: JNB ROA, MMUA ;Mostrar Minutos Unidades Alarma

    MOV A, UMR

    JMP PRINT

    MMUA: MOV A, UMA

    JMP PRINT

    MSM: JNB ROA, MMDA ;Mostrar Minutos Decenas Alarma

    MOV A, DMR

    JMP PRINT

    MMDA: MOV A, DMA

    JMP PRINT

    MUH: JNB ROA, MHUA ;Mostrar Horas Unidades Alarma

    MOV A, UHR

    JMP PRINT

    MHUA: MOV A, UHA

    JMP PRINT

    MDH: JNB ROA, MHDA ;Mostrar Horas Decenas Alarma

    MOV A, DHR

    JMP PRINT

    MHDA: MOV A, DHA

    JMP PRINT

    ;Suma al valor del acomulador (Un número del uno al nueve) 60H, dirección

    ;donde se encuentran los segmentos de cada número

    PRINT: ADD A, #60H ;Inicio de Tabla

    MOV R0, A ;Mueve ese valor a R0

    MOV P2, @R0 ;Mueve el contenido de R0 a P2

    JMP EPRT

    DISP: MOV A, R4 ;Mueve los segundos al acomulador

    MOV B, #10

    DIV AB ;Divide A entre B, como B es 10 convierte el numero de dos dígitos en

    ; un cociente de uno y un residuo de uno

    MOV USR, B ;B es la parte Unidades de los segundos (Residuo)

    MOV DSR, A ;A es la parte alta de los segundos (Cociente)

    MOV A, R5 ;Mueve los minutos al acomulador

    MOV B, #10

    DIV AB ;Divide A entre B, como B es 10 convierte el número de dos dígitos en

    ; un cociente de uno y un residuo de uno

    MOV UMR, B ;B es la parte baja de los minutos (Residuo)

    MOV DMR, A ;A es la parte alta de los minutos (Cociente)

    MOV A, R6 ;Mueve las horas al acomulador

    MOV B, #10

    DIV AB ;Divide A entre B, como B es 10 convierte el número de dos dígitos en

    ; un cociente de uno y un residuo de uno

    MOV UHR, B ;B es la parte baja de las horas (Residuo)

    MOV DHR, A ;A es la parte alta de las horas (Cociente)

    RET

    ALARMA: MOV A, UMA

    CJNE A, UMR, UMAR ;Sí minutos es igual en alarma y reloj incrementa AIR

    INC AIR

    UMAR: MOV A, DMA

    CJNE A, DMR, DMAR ;Sí minutos es igual en alarma y reloj incrementa AIR

    INC AIR

    DMAR: MOV A, UHA

    CJNE A, UHR, UHAR ;Si horas es igual en alarma y reloj incrementa AIR

    INC AIR

    UHAR: MOV A, DHA

    CJNE A, DHR, DHAR ;Si horas es igual en alarma y reloj incrementa AIR

    INC AIR

    DHAR: MOV A, AIR

    CJNE A, #4, REG ;Si todas las comparaciones fueron correctas, AIR debe valer 4

    CPL P0.1 ;Enciende el buzzer

    ;MOV A, DHR

    ;CJNE A, #2, REG

    ;MOV A, UHR

    ;CJNE A, #3, REG

    ;MOV A, DMR

    ;CJNE A, #5, REG

    ;MOV A, UMR

    ;CJNE A, #9, REG

    ;MOV A, DSR

    ;CJNE A, #5, REG

    ;MOV A, USR

    ;CJNE A, #9, CERO

    ;CALL INTEX1

    REG: RET

    INTEX1: JNB ROA, INTEX1A ;Si ROA es cero, cambia a una subrutina para aumentar la alarma

    MOV A, R5

    CJNE A, #59, INC0 ;Si los minutos NO son 59, llama a una subrutina para aumentarlos en 1

    MOV R5, #0 ;Si son 59, los cambia a 0, e intenta aumentar horas

    MOV A, R6

    CJNE A, #23, INC1 ;Si las horas NO son 23, llama a una subrutina para aumentarlos en 1

      ;CJNE A, #24, INC1

    MOV R6, #0 ;Si son 23 los vuelve 0

    JMP REGR

    INC0: ADD A, #1 ;Aumenta una minuto

    ;ADD A, #1

    MOV R5, A

    JMP REGR

    INC1: MOV A, R6

    ADD A, #1 ;Aumenta una hora

    MOV R6, A

    JMP REGR

    INTEX1A: MOV A, UMA

    CJNE A, #9, INC4 ;se sigue con el siguiente valor

    MOV UMA, #0

    MOV A, DMA

    CJNE A, #5, INC5

    MOV DMA, #0

    NOP

    MOV A, UHA

    CJNE A, #9, INC6

    MOV UHA, #0

    MOV A, DHA

    CJNE A, #2, INC7

    MOV A, UHA

    INC4: ADD A, #1 ;Incrementa UNIDADESvde los minutos

    MOV UMA, A

    JMP REGR

    INC5: ADD A, #1 ;Incrementa DECENAS de los minutos

    MOV DMA, A

    JMP REGR

    INC6: MOV A, DHA

    CJNE A, #2, INC8 ;Cambio para las 24 hrs

    MOV A, UHA

    CJNE A, #3, INC8

    MOV DHA, #0

    MOV UHA, #0

    JMP REGR

    INC7: MOV A, DHA ;Incrementa las unidades de horas

    ADD A, #1

    MOV DHA, A

    JMP REGR

    INC8: MOV A, UHA ;Incrementa las decenas de horas

    ADD A, #1

    MOV UHA, A

    REGR: RETI

    CERO:

    MOV DHR,#2

    MOV UHR,#3

    MOV DMR,#5

    MOV UMR,#9

    MOV DSR,#5

    MOV USR,#9

    MOV R6, #0

    RETI

    COMP: CJNE R6,#24,NADA

    JMP CERO

    RETI

    NADA: RETI

    END

View all instructions

Enjoy this project?

Share

Discussions

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates