
Program Assembly Alarm Dengan Lampu Flip-Flop

Schematic Alarm Dengan Lampu Flip-Flop
Part 1
;- BAB4_04.ASM -------------------------------------------------------------------
;
; Alarm dan lampu flip-flop dengan Selang waktu menggunakan interupsi timer 1
; Speaker dipasang pada P1.0 sedangkan
; Lampu flip-flop (LED) dipasang pada Port 0 bit 1,2,4 dan 5
;
;---------------------------------------------------------------------------------
Org 0h
;
ljmp Mulai
org 1Bh ; alamat untuk interupsi timer 1
ljmp timer_1 ; karena subrutin ini panjang pindahkan
; ke lain tempat dengan LJMP
;--------------------------------------------------------------------------------
; sub rutin delay pendek DELAY
;--------------------------------------------------------------------------------
Delay: Mov R6,#0
Delay1: Nop ; 1 siklus
Djnz R6,Delay1 ; 2 siklus
Ret
;
;--------------------------------------------------------------------------------
; sub rutin delay panjang LDELAY
;--------------------------------------------------------------------------------
ldelay:
Mov R7,#0
ld1: acall delay
acall delay
acall delay
Djnz R7,ld1 ; ulangi sebanyak 256x
Ret
;
; --------------------------------------------------------------------------------
; subrutin interupsi timer 1
; Penghasil pulsa pada Port 1 bit ke 0
; --------------------------------------------------------------------------------
timer_1:
clr TR1 ; Hentikan Timer 1
cjne R0,#0,Tone1 ; apakah status keluaran (R0) = low
setb P1.0 ; YA! buat P1.0 berlogika 1
mov R0,#1 ; ubah status keluaran -> high
sjmp Tone2 ; bunyikan nada 750/500 Hz
Tone1:
clr P1.0 ; TIDAK! buat P1.0 berlogika 0
mov R0,#0 ; ubah status keluaran -> low
;
Tone2:
cjne R1,#0,Tone3 ; apakah pola penyalaan mode-1?
mov TL1,#LOW (-655) ;YA! Tone 750 Hz = pulsa per 655 ud
mov TH1,#HIGH (-655)
sjmp Tone4
Tone3:
mov TL1,#LOW (-1000) ;TIDAK! Tone 500 Hz = pulsa per 1000 ud
mov TH1,#HIGH (-1000)
Tone4:
setb TR1 ; hidupkan Timer-1
reti
; --------------------------------------------------------------------------------
; Awal dari program
; --------------------------------------------------------------------------------
Mulai:
clr A ; nolkan akumulator
mov IE,A ; matikan semua interupsi
setb IE.7 ; aktifkan semua interupsi
setb IE.3 ; aktifkan interupsi timer 1
mov TCON,A ; bersihkan TCON
mov TMOD,#11h ; mode timer 16 bit
setb TR1 ; jalankan timer 1
;
tunggu:
mov R1,#0 ; R1 sebagai tanda untuk tone 750 Hz
setb P1.6
setb P1.7
clr P1.4
clr P1.5
lcall ldelay
mov R1,#1 ; R1 sebagai tanda untuk tone 500 Hz
setb P1.4
setb P1.5
clr P1.6
clr P1.7
lcall ldelay
sjmp tunggu ; ulangi terus menerus
;
End
Part 2
;- BAB6_01.ASM -------------------------------------------------------------------
;
; Aplikasi sistem alarm yang diaktifkan melalui interupsi
; JIka dideteksi INT0 (1 ke 0) akan menghasilkan alarm 400 Hz selama 1 detik
;
;---------------------------------------------------------------------------------
ORG 0H
;
LJMP UTAMA ; ke program utama
LJMP EX0RLI ; ke layanan interupsi INT0
ORG 0BH
LJMP T0RLI ; vektor interupsi timer 0
ORG 1BH
LJMP T1RLI ; vektor interupsi timer 1
;---------------------------------------------------------------------------------
; program utama
;
ORG 30H
UTAMA: SETB IT0 ; interupsi pemicu sisi negatif (1 ke 0)
MOV TMOD,#11H ; mode pewaktu timer 0 dan 1 16-bit
MOV IE,#81H ; aktifkan INT0 saja
SJMP $ ; kalang forever...
;---------------------------------------------------------------------------------
; rutin layanan interupsi eksternal 0
;
EX0RLI:
MOV R7,#20 ; 20 x 50000 ud = 1 detik
SETB TF0 ; paksa terjadi interupsi timer 0
SETB TF1 ; paksa terjadi interupsi timer 1
SETB ET0 ; aktifkan interupsi timer 0
SETB ET1 ; dan timer 1
RETI
;---------------------------------------------------------------------------------
; rutin layanan interupsi timer 0
;
T0RLI:
CLR TR0 ; hentikan timer 0
DJNZ R7,LAGI ; apakah sudah 20 kali pengulangan?
CLR ET0 ; YA! matikan interupsi timer 0
CLR ET1 ; dan timer 1
LJMP SELESAI ; selesai
LAGI: MOV TH0,#HIGH (-50000) ; TIDAK! isi kembali dengan data awal
MOV TL1,#LOW (-50000) ; pencacahan (-500000)
SETB TR0 ; hidupkan timer 0
SELESAI:
CLR P1.0 ; matikan alarm
RETI
;---------------------------------------------------------------------------------
; rutin layanan interupsi timer 1
;
T1RLI: CLR TR1 ; hentikan timer 1
MOV TH1,#HIGH (-1250) ; isi kembali dengan data awal nada
MOV TL1,#LOW (-1250) ; sebesar -1250
CPL P1.0 ; lakukan komplemen P1.0
SETB TR1 ; hidupkan timer 1
RETI
;
END
Semoga bermanfaat & selamat belajar!