Sistem Kendali Pintu Berbasis 8051
Disusun Oleh
1.Ahmad Ainur Rofiq
2.Firda Nurisifa
3.Galih Fajar Nugrahanto
4.Ramzy Dimas Satriawan
5.Siti Andika Putri Bihaqqilani
Latar belakang
sistem keamanan pintu berbasis mikrokontroler 8051 didorong oleh kebutuhan mendasar akan keamanan dan privasi yang lebih baik di berbagai ruangan, serta keterbatasan sistem kunci manual tradisional.
Berikut adalah poin-poin penting yang membentuk latar belakang tersebut:
Kebutuhan Keamanan yang Meningkat
Keamanan dan Privasi: Pintu merupakan akses utama keluar masuk ruangan, sehingga sistem keamanan yang efektif sangat penting untuk menjaga aset dan privasi penghuni.
Keterbatasan Kunci Manual: Sistem kunci konvensional memiliki kelemahan seperti risiko kunci patah, duplikasi kunci yang tidak sah, dan proses membuka/menutup yang memakan waktu.
Otomatisasi: Perkembangan teknologi mendorong otomatisasi untuk menggantikan peran manusia dalam menjaga pintu terus-menerus, sehingga diperlukan alat atau mesin yang dapat mengontrol akses secara terprogram.
Peran Mikrokontroler 8051
Penggunaan Luas dalam Pendidikan dan Industri: Mikrokontroler 8051 (dan turunannya seperti AT89S51) adalah salah satu jenis mikrokontroler 8-bit yang sangat populer dan telah digunakan sejak lama dalam dunia pendidikan dan sistem tertanam sederhana. Hal ini membuatnya menjadi pilihan yang umum untuk proyek-proyek perancangan sistem keamanan pintu.
Karakteristik Teknis: 8051 memiliki fitur-fitur dasar yang diperlukan untuk aplikasi kontrol akses, seperti RAM internal 128 byte, ROM 4KB, port paralel, dan port serial, yang memadai untuk memproses data input (misalnya dari keypad atau sensor) dan mengontrol output (seperti solenoid door lock).
Basis Pembelajaran: Karena arsitekturnya yang relatif sederhana dan terdokumentasi dengan baik, 8051 sering dipilih sebagai platform pembelajaran untuk perancangan sistem kontrol sebelum beralih ke mikrokontroler yang lebih canggih.
Program :
Org 0000h
RS Equ P1.3 ; Pin RS LCD dihubungkan ke P1.3
E Equ P1.2 ; Pin Enable LCD dihubungkan ke P1.2
; R/W* dihubungkan ke 0V, jadi LCD selalu dalam mode tulis (write only)
; ---------------------------------- Program Utama -------------------------------------
Main:
Clr RS ; RS=0 ? memilih register instruksi LCD (bukan data)
;------------------------- Set Instruksi LCD ------------------------------
Call FuncSet ; Atur fungsi LCD (mode 4-bit, jumlah baris, ukuran font)
Call DispCon ; Nyalakan tampilan LCD dan aktifkan kursor
Call EntryMode ; Atur mode entri: kursor bergeser ke kanan setiap kali karakter ditulis
SetB RS ; RS=1 ? memilih register data LCD (untuk menulis karakter)
Mov DPTR,#LUT1 ; Arahkan DPTR ke tabel string "Enter PIN:" (pesan awal)
Again: Clr A
Movc A,@A+DPTR ; Ambil karakter dari LUT1 sesuai alamat DPTR
Jz Next ; Jika karakter = 0 (akhir string), lompat ke label Next
Call SendChar ; Kirim karakter ke LCD untuk ditampilkan
Inc DPTR ; Geser DPTR ke karakter berikutnya
Jmp Again ; Ulangi proses sampai semua karakter ditampilkan
Next: Mov R4,#00h ; Register R4 dipakai sebagai penghitung jumlah pemindaian keypad
Mov R5,#00h ; Register R5 dipakai sebagai penghitung jumlah input PIN yang benar
Mov DPTR,#LUT4 ; Arahkan DPTR ke tabel string PIN yang disimpan (referensi PIN)
;----------------------------------- Ambil Input ----------------------------------
Iterate: Call ScanKeyPad ; Panggil subrutin untuk memindai tombol keypad
SetB RS ; RS=1 ? memilih register data LCD (siap menulis karakter)
Clr A ; Kosongkan akumulator (A=0)
Mov A,#'*' ; Masukkan karakter '*' ke akumulator
Call SendChar ; Tampilkan tanda bintang di LCD untuk setiap tombol yang ditekan
;------------------- Periksa jumlah kode yang benar dimasukkan -------------------
Clr A
Movc A,@A+DPTR ; Ambil data PIN dari tabel referensi (LUT4)
Call CheckInput ; Periksa apakah input sesuai dengan PIN yang benar
Inc DPTR ; Geser pointer ke digit PIN berikutnya
Inc R4 ; Tambah penghitung jumlah digit yang sudah dicek
Cjne R4,#04h,Iterate ; Jika belum 4 digit, kembali ke proses input
Cjne R5,#04h,Wrong ; Jika jumlah digit benar tidak sama dengan 4, lompat ke Wrong
Right: Call CursorPos ; Pindahkan kursor ke baris berikutnya di LCD
SetB RS ; RS=1 ? pilih register data LCD (untuk menulis karakter)
Call Granted ; Panggil subrutin untuk menampilkan pesan "PASSWORD BENAR"
Jmp EndHere ; Lompat ke akhir program
Wrong: Call CursorPos ; Pindahkan kursor ke baris berikutnya di LCD
SetB RS ; RS=1 ? pilih register data LCD
Call Denied ; Panggil subrutin untuk menampilkan pesan "PASSWORD SALAH"
EndHere: Jmp $ ; Berhenti di sini (loop tak berujung, program selesai)
;------------------------------ *Akhir Dari Main* ---------------------------------
;----------------- Catatan: Gunakan nilai 7 untuk Update Frequency di EdSim51 -----
;-------------------------------- Subrutin ---------------------------------------
; ------------------------- Pengaturan Fungsi -------------------------------------
FuncSet: Clr P1.7 ; |
Clr P1.6 ; |
SetB P1.5 ; | bit 5=1
Clr P1.4 ; | (DB4)DL=0 ? mengatur LCD ke mode 4-bit
Call Pulse
Call Delay ; tunggu sampai BF (Busy Flag) selesai
Call Pulse
SetB P1.7 ; P1.7=1 (N) ? LCD menggunakan 2 baris
Clr P1.6
Clr P1.5
Clr P1.4
Call Pulse
Call Delay
Ret
;------------------------------------------------------------------------------
;------------------------------- Kontrol Display ON/OFF ------------------------
; Tampilan LCD dinyalakan, kursor dinyalakan
DispCon: Clr P1.7 ; |
Clr P1.6 ; |
Clr P1.5 ; |
Clr P1.4 ; | set nibble tinggi (0H - hex)
Call Pulse
SetB P1.7 ; |
SetB P1.6 ; | Nyalakan seluruh tampilan LCD
SetB P1.5 ; | Kursor ON
SetB P1.4 ; | Kursor berkedip ON
Call Pulse
Call Delay ; tunggu sampai BF selesai
Ret
;--------------------------------------------------------------------------------
;----------------------------- Pengaturan Entry Mode (4-bit mode) ----------------
; Atur agar alamat bertambah satu dan kursor bergeser ke kanan
EntryMode: Clr P1.7 ; |P1.7=0
Clr P1.6 ; |P1.6=0
Clr P1.5 ; |P1.5=0
Clr P1.4 ; |P1.4=0
Call Pulse
Clr P1.7 ; |P1.7 = '0'
SetB P1.6 ; |P1.6 = '1'
SetB P1.5 ; |P1.5 = '1'
Clr P1.4 ; |P1.4 = '0'
Call Pulse
Call Delay ; tunggu sampai BF selesai
Ret
;--------------------------------------------------------------------------------
;------------------------------------ Pulse --------------------------------------
Pulse: SetB E ; |*P1.2 terhubung ke pin 'E' pada modul LCD*
Clr E ; | menghasilkan tepi negatif pada pin E
Ret
;---------------------------------------------------------------------------------
;------------------------------------- KirimKarakter ------------------------------
SendChar: Mov C, ACC.7 ; |
Mov P1.7, C ; |
Mov C, ACC.6 ; |
Mov P1.6, C ; |
Mov C, ACC.5 ; |
Mov P1.5, C ; |
Mov C, ACC.4 ; |
Mov P1.4, C ; | set nibble tinggi
;Jmp $
Call Pulse
Mov C, ACC.3 ; |
Mov P1.7, C ; |
Mov C, ACC.2 ; |
Mov P1.6, C ; |
Mov C, ACC.1 ; |
Mov P1.5, C ; |
Mov C, ACC.0 ; |
Mov P1.4, C ; | set nibble rendah
Call Pulse
Call Delay ; tunggu sampai BF selesai
Mov R1,#55h
Ret
;--------------------------------------------------------------------------------
;------------------------------------- Delay ------------------------------------
Delay: Mov R0, #50
Djnz R0, $ ; Decrement dan lompat jika belum nol
Ret
;--------------------------------------------------------------------------------
;--------------------------- Subrutin Pemindaian Keypad --------------------------
;------------------------------- Pindai Baris ------------------------------------
ScanKeyPad: CLR P0.3 ; Bersihkan Baris3 (Row3 = 0)
CALL IDCode0 ; Panggil subrutin untuk memindai kolom
SetB P0.3 ; Set Baris3 kembali ke 1
JB F0,Done ; Jika F0 sudah diset (tombol ditemukan), akhiri pemindaian
; Pindai Baris2
CLR P0.2 ; Bersihkan Baris2
CALL IDCode1 ; Panggil subrutin untuk memindai kolom
SetB P0.2 ; Set Baris2 kembali ke 1
JB F0,Done ; Jika F0 sudah diset, akhiri pemindaian
; Pindai Baris1
CLR P0.1 ; Bersihkan Baris1
CALL IDCode2 ; Panggil subrutin untuk memindai kolom
SetB P0.1 ; Set Baris1 kembali ke 1
JB F0,Done ; Jika F0 sudah diset, akhiri pemindaian
; Pindai Baris0
CLR P0.0 ; Bersihkan Baris0
CALL IDCode3 ; Panggil subrutin untuk memindai kolom
SetB P0.0 ; Set Baris0 kembali ke 1
JB F0,Done ; Jika F0 sudah diset, akhiri pemindaian
JMP ScanKeyPad ; Ulangi lagi dari Baris3
Done: Clr F0 ; Bersihkan flag F0 sebelum keluar
Ret
;--------------------------------------------------------------------------------
;---------------------------- Subrutin Pemindaian Kolom --------------------------
IDCode0: JNB P0.4, KeyCode03 ; Jika Kolom0 Baris3 = 0 ? tombol ditemukan
JNB P0.5, KeyCode13 ; Jika Kolom1 Baris3 = 0 ? tombol ditemukan
JNB P0.6, KeyCode23 ; Jika Kolom2 Baris3 = 0 ? tombol ditemukan
RET
KeyCode03: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'3' ; Simpan kode '3'
RET
KeyCode13: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'2' ; Simpan kode '2'
RET
KeyCode23: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'1' ; Simpan kode '1'
RET
IDCode1: JNB P0.4, KeyCode02 ; Jika Kolom0 Baris2 = 0 ? tombol ditemukan
JNB P0.5, KeyCode12 ; Jika Kolom1 Baris2 = 0 ? tombol ditemukan
JNB P0.6, KeyCode22 ; Jika Kolom2 Baris2 = 0 ? tombol ditemukan
RET
KeyCode02: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'6' ; Simpan kode '6'
RET
KeyCode12: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'5' ; Simpan kode '5'
;Mov P1,R7 ; (opsional) tampilkan tombol yang ditekan
RET
KeyCode22: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'4' ; Simpan kode '4'
RET
IDCode2: JNB P0.4, KeyCode01 ; Jika Kolom0 Baris1 = 0 ? tombol ditemukan
JNB P0.5, KeyCode11 ; Jika Kolom1 Baris1 = 0 ? tombol ditemukan
JNB P0.6, KeyCode21 ; Jika Kolom2 Baris1 = 0 ? tombol ditemukan
RET
KeyCode01: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'9' ; Simpan kode '9'
RET
KeyCode11: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'8' ; Simpan kode '8'
RET
KeyCode21: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'7' ; Simpan kode '7'
RET
IDCode3: JNB P0.4, KeyCode00 ; Jika Kolom0 Baris0 = 0 ? tombol ditemukan
JNB P0.5, KeyCode10 ; Jika Kolom1 Baris0 = 0 ? tombol ditemukan
JNB P0.6, KeyCode20 ; Jika Kolom2 Baris0 = 0 ? tombol ditemukan
RET
KeyCode00: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'#' ; Simpan kode '#'
RET
KeyCode10: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'0' ; Simpan kode '0'
RET
KeyCode20: SETB F0 ; Tombol ditemukan ? set F0
Mov R7,#'*' ; Simpan kode '*'
RET
;--------------------------------------------------------------------------------
;--------------------------------- Periksa Input --------------------------------
CheckInput:
Cjne A,07H,Exit ; Bandingkan A dengan R7 (07H = register R7 berisi tombol yang ditekan)
Inc R5 ; Jika sama, tambah penghitung jumlah input benar
Exit:
Ret
;--------------------------------------------------------------------------------
;----------------------------------- Posisi Kursor -------------------------------
CursorPos: Clr RS
SetB P1.7 ; Set alamat DDRAM
SetB P1.6 ; Set alamat ? mulai dari '1'
Clr P1.5 ; '0'
Clr P1.4 ; '0'
; nibble tinggi
Call Pulse
Clr P1.7 ; '0'
Clr P1.6 ; '0'
Clr P1.5 ; '0'
Clr P1.4 ; '0'
; nibble rendah
Call Pulse
Call Delay ; tunggu sampai BF selesai
Ret
;--------------------------------------------------------------------------------
;------------------------------ Pesan Jika Benar ---------------------------------
Granted: Mov DPTR,#LUT2 ; Arahkan DPTR ke tabel string "PASSWORD BENAR"
GoBack: Clr A
Movc A,@A+DPTR ; Ambil karakter dari LUT2
Jz Home ; Jika karakter = 0 (akhir string), lompat ke Home
Call SendChar ; Kirim karakter ke LCD
Inc DPTR ; Geser ke karakter berikutnya
Jmp GoBack ; Ulangi sampai selesai
Home: Ret ; Kembali ke program utama
;--------------------------------------------------------------------------------
;------------------------------ Pesan Jika Salah ---------------------------------
Denied: Mov DPTR,#LUT3 ; Arahkan DPTR ke tabel string "PASSWORD SALAH"
OneMore: Clr A
Movc A,@A+DPTR ; Ambil karakter dari LUT3
Jz BackHome ; Jika karakter = 0, lompat ke BackHome
Call SendChar ; Kirim karakter ke LCD
Inc DPTR ; Geser ke karakter berikutnya
Jmp OneMore ; Ulangi sampai selesai
BackHome: Ret ; Kembali ke program utama
;--------------------------------- Akhir Subrutin -------------------------------
;------------------------------ Tabel String (LUT) ------------------------------
;---------------------------------- Pesan ---------------------------------------
Org 0200h
LUT1: DB 'E','n','t','e','r',' ','P','I','N',':',0 ; Pesan awal: "Enter PIN:"
LUT2: DB 'P','A','S','S','W','O','R','D',' ','B','E','N','A','R',0 ; Pesan jika benar
LUT3: DB 'P','A','S','S','W','O','R','D',' ','S','A','L','A','H',0 ; Pesan jika salah
;--------------------------------------------------------------------------------
;------------------------------------- PIN --------------------------------------
Org 0240h
LUT4: DB '1', '2', '3', '4',0 ; PIN yang disimpan (default: 1234)
;--------------------------------------------------------------------------------
;--------------------------------- Akhir Program --------------------------------
Stop: Jmp $ ; Berhenti di sini (loop tak berujung)
End ; Akhiri program
Blok Diagram

.jpeg)
Komentar
Posting Komentar