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



    
Flow Chart 




Komentar

Postingan populer dari blog ini

AIR TEMPERATURE SWITCHING AND MONITORING SYSTEM DENGAN MENGGUNAKAN SENSOR LM35 BERBASIS ATMEGA 16

RANCANG BANGUN KALKULATOR DIGITAL OPERASI KALI DAN BAGI BERBASIS MIKROKONTROLER AT89C51

SISTEM LAMPU LALU LINTAS PERTIGAAN BERBASIS AT89s51 DENGAN SENSOR INFRAMERAH