Professional Documents
Culture Documents
C.O.M.I.C
.: Computer and Microcontroller Community :.
Powered By:
Presented By:
Divisi Microcontroller
I1 O O1
I2 I O2
U
I3 N O3
T
P CPU
P
U
U
T
In T On
MEMORI
Gambar 1
Sistem Mikroprosesor
Maka secara konseptual suatu Mikroprosesor adalah suatu alat digital yang
menerima data digital dari sejumlah saluran masukan, memproses data menurut
ketentuan-ketentuan program yang disimpan, dan kemudian menghasilkan sejumlah
sinyal keluaran pada outputnya.
Kunci dari keserbagunaan dari miroprosesor adalah bahwa dengan perangkat
keras (hardware) yang sama, dapat digunakan untuk berbagai aplikasi yang berlainan
hanya dengan merubah program yang tersimpan pada sistem memorinya.
Input/Output.
Saluran input terdiri dari beberapa saluran. Begitu juga untuk saluran output,
terdiri dari beberapa saluran. Pada perkembangannya, saluran input dan output ini dapat
disatukan ke dalam satu sistem blok yaitu sistem blok I/O (Input/Output).
Saluran input/output merupakan media penghubung dengan piranti diluar sistem
mikroprosesor. Piranti diluar sistem mikroprosesor dapat terdiri tombol/keyboard,
peralatan-peralatan sensor (transducer), speaker, buzzer, lampu, display peraga, dsb.
Dari metoda penyaluran informasinya, peralatan I/O dapat dibedakan menjadi dua
macam, yaitu peralatan I/O serial dan peralatan I/O paralel. Penyaluran data secara serial
dibedakan lagi menjadi dua yaitu secara synchronous dan asynchronous. Ada banyak
sekali standar-standar komunikasi serial yang telah dikembangkan, diantaranya adalah
standar RS-232 dan RS485. Contoh perangkat yang memanfaatkan penyaluran data
secara serial adalah mouse, monitor, card networking, modem, dsb. Sedangkan contoh
perangkat yang memanfaatkan penyaluran data secara paralel adalah printer, hardisk,
CD-ROM, dsb.
Keuntungan penggunaan komunikasi paralel dibanding serial adalah transfer data
yang lebih cepat. Sedangkan keuntungan penggunaan komunikasi secara serial selain
penggunaan kabel yang ekonomis adalah penggunaan saluran I/O pada mikroprosesor
yang lebih sedikit. Hampir seluruh perangkat telekomunikasi yang ada saat ini
menggunakan komunikasi data secara serial.
CPU.
CPU (Central Processing Unit) didalamnya berisi ALU (Aritmatic Logic Unit),
Control Unit, PC (Program Counter) dan beberapa register (diantaranya adalah register
Accumulator). ALU merupakan pusat pengolahan logika (AND, OR, NOT, Compare,
etc) dan fungsi matematis (tambah, kurang, kali, bagi). Unit Control adalah unit yang
berfungsi untuk mengambil, mengdekode dan melaksanakan urutan instruksi suatu
program yang tersimpan dalam memori. Pelaksanaan dari instruksi dilakukan dengan
cara mengatur sinyal kendali yang diperlukan dalam melakukan suatu operasi. Dapat
disimpulkan bahwa unit control adalah suatu unit yang mengatur urutan operasi seluruh
sistem mikroprosesor.
Program Counter sesuai namanya adalah suatu penghitung (counter) langkah
dalam proses pengambilan baris program dari sistem memori. Setiap selesai proses
pengambilan dan pelaksanaan satu baris program, maka PC akan menunjuk kepada baris
berikutnya dari program yang terdapat di dalam memori.
Register Accumulator adalah suatu register serbaguna karena seluruh proses yang
melibatkan ALU dan I/O akan melalui register ini. Pada dasarnya register adalah suatu
memori, dengan demikian Accumulator memiliki fungsi untuk menyimpan data. Setiap
data yang akan diproses dan data hasil pemrosesan oleh ALU akan disimpan pada
Accumulator. Begitu juga setiap data yang masuk dan keluar melalui perangkat I/O akan
melalui register Accumulator. Selain Accumulator terdapat lagi beberapa register lainnya
(tergantung pada tipe mikroprosesornya), sebagai contoh adalah register B, C, dan D
yang terdapat pada mikroprosesor Intel 8088. Semakin banyak tersedia register, akan
semakin membantu programer dalam menyelesaian tugasnya.
Memori.
Blok Memori pada gambar-1 diatas terhubung dua arah kepada blok CPU. Hal ini
mempunyai arti bahwa CPU dapat melakukan proses penulisan kepada memori maupun
melakukan proses pembacaan pada memori. Sesuatu yang dibaca pada memori biasanya
berupa program, sedangkan sesuatu yang ditulis pada memori biasanya disebut sebagai
data. Jadi perlu dibedakan antara program dengan data. Pada proses pengolahan data
input, CPU memerlukan suatu tempat untuk melakukan “coretan-coretan” kecil. Dapat
dianalogikan seorang manusia yang memerlukan kertas-kertas kerja sebagai tempat
coretan-coretan data sementara sebelum dihasilkan data yang diharapkan. Begitu pula
dengan mikroprosesor memerlukan tempat sementara penyimpanan data sebelum data
sesungguhnya dihasilkan. Tempat penyimpanan sementara pada sistem mikroprosesor
disebut dengan RAM (Random Access Memory) dan tempat penyimpanan program
disebut sebagai ROM (Read Only Memory).
ROM.
Memori ini memiliki sifat non-volatile, artinya data yang tersimpan didalamnya
tidak akan mudah hilang bila power supply dihilangkan. Dengan sifat yang dimilikinya
ini, ROM biasa digunakan sebagai media penyimpan program, bukan data.
Ada beberapa turunan memori ROM, yaitu PROM (Programable ROM). Pada
memori ini, proses penulisan program kedalamnya hanya bisa dilakukan satu kali.
Program didalamnya tidak bisa dihapus. Kemudian ada memori jenis ROM yang bisa
dihapus (EPROM – Erasable PROM) yaitu UV-EPROM dan EE-PROM. Proses
penghapusan pada memori UV-EPROM dilakukan dengan cara mengenakan suatu
cahaya ultra violet pada jendela yang terdapat pada kemasan memori. Sedangkan proses
penghapusan pada memori EE-PROM dilakukan secara elektrikal, yaitu dengan
memberikan suatu standar tegangan, arus dan batas waktu tertentu pada memori.
RAM.
Memori ini memiliki sifat volatile, artinya data yang tersimpan didalamnya akan
hilang bila power supply dihilangkan. Dengan sifat yang dimilikinya ini, RAM tidak
dapat digunakan untuk menyimpan program.
Teknologi pada RAM terbagi dua, yaitu RAM statik dan RAM dinamik. RAM
statik biasanya memiliki kapasitas yang jauh lebih kecil dibanding dengan RAM dinamik,
namun memiliki kelebihan yaitu tidak diperlukan suatu sistem refreshing (penyegaran)
pada data yang tersimpan didalamnya. Sedangkan RAM dinamik memiliki kapasitas jauh
lebih besar daripada RAM statik, namun harus memiliki sistem tambahan yang rumit
untuk proses penyegaran data yang tersimpan agar data tersebut tidak hilang.
TIMER
Internal 0
Interupsi
CPU
4
BUS SERIAL
OSCILLATOR CONTROL
INPUT-OUTPUT
PORT
PORT
P
A R
S E
L S
E A
E T
N P0 P1 P2 P3 TxD RxD
Gambar 2
Blok Diagram Internal
FF
F0 7 6 5 4 3 2 1 0 B
E0 7 6 5 4 3 2 1 0 ACC
D0 7 6 5 4 3 2 1 0 PSW
B8 7 6 5 4 3 2 1 0 IP
B0 7 6 5 4 3 2 1 0 P3
A8 7 6 5 4 3 2 1 0 IE
A0 7 6 5 4 3 2 1 0 P2
90 7 6 5 4 3 2 1 0 P1
Gambar 3
Spesial Function Register.
2. Konfigurasi Pin.
Mikrokontroler AT89C51 dikemas dalam bentuk DIP (Dual In Package) 40 pin
(kaki) dengan penomoran dan penamaan seperti yang terlihat pada gambar 4A. Pada
gambar 4B terlihat bahwa ada 4 buah port input/output (I/O) yang masing-masing diberi
nama P0, P1, P2, dan P3. Masing-masing port memiliki 8 saluran I/O. Penulisan untuk
bit-0 pada P0 ditulis sebagai P0.0, bit-1 ditulis P0.1, bit-2 ditulis P0.2, dst. Demikian
pula untuk penamaan port lainnya ditulis sebagai P1.0 , P1.1 , P1.2 , dst.
Port-0.
Port-0 adalah port I/O 8-bit dua arah dengan output kolektor terbuka. Atau dengan
kata lain, port ini tidak mempunyai resistor pull-up internal. Oleh karena itulah
dibutuhkan suatu resistor eksternal (biasanya berkisar antara 4,7 hingga 10 K Ohm)
diluar chip yang menghubungkan setiap pin pada port-0 dengan VCC (+5 Volt).
Sebagai port output, setiap pin dapat dihubungkan kepada 8 buah input chip TTL
ketika output low (logika ‘0”). Ketika logika ‘1’ ditulis ke port-0, maka pin tersebut dapat
digunakan sebagai input high-impedance.
Selain berfungsi sebagai port I/O, port-0 dapat juga berfungsi sebagai bus alamat
atau bus data byte rendah yaitu saat dilakukan akses memori eksternal, baik akses
memori program maupun memori data. Pada mode ini, P0 memiliki resistor pull-up
internal. Atau dengan kata lain, tidak dibutuhkan resistor pull-up eksternal pada saat
sistem dikonfigurasi untuk mengakses memori eksternal.
P1.0 1 40 VCC
P1.1 2 39 P0.0 (AD0)
P1.2 3 38 P0.1 (AD1)
P1.3 4 37 P0.2 (AD2)
P1.4 5 36 P0.3 (AD3)
P1.5 6 35 P0.4 (AD4)
P1.6 7 34 P0.5 (AD5)
P1.7 8 33 P0.6 (AD6)
RST 9 32 P0.7 (AD7)
(RXD) P3.0 10 31 EA/VPP
(TXD) P3.1 11 30 ALE/PROG
(INT0) P3.2 12 29 PSEN
(INT1) P3.3 13 28 P2.7 (A15)
(T0) P3.4 14 27 P2.6 (A14)
(T1) P3.5 15 26 P2.5 (A13)
(WR) P3.6 16 25 P2.4 (A12)
(RD) P3.7 17 24 P2.3 (A11)
XTAL2 18 23 P2.2 (A10)
XTAL1 19 22 P2.1 (A9)
GND 20 21 P2.0 (A8)
P1 P0
P3 P2
Gambar 4
Penamaan dan Konfigurasi Pin Mikrokontroler AT89C51
Port-0 juga menerima kode-kode bahasa mesin (kode heksa) selama dilakukan
proses pengisian program ke dalam memori program (E-EPROM) dan mengeluarkan
kode heksa (bahasa mesin) saat dilakukan proses verifikasi (pengujian) terhadap kode
heksa yang telah ditulis ke dalam E-EPROM. Resistor pull-up eksternal dibutuhkan saat
dilakukan proses verifikasi.
Port-1.
Port-1 adalah port 8-bit dua arah dengan resistor pull-up di dalamnya.
Penyanggah (buffer) port-1 dapat dihubungkan kepada (maksimum) 4 saluran input chip
TTL. Ketika logika ‘1’ ditulis ke port-1 maka setiap pin pada port-1 akan ditarik menuju
tegangan VCC (+5 Volt) oleh resistor pull-up internal. Sebagai input, port-1 yang secara
eksternal sedang ditarik ke ground oleh resistor pull-down akan menjadi sumber arus
(source current) IIL bagi peralatan luar.
Port-1 sama seperti halnya port-0, dapat berfungsi sebagai bus alamat byte rendah
saat dilakukan proses pengisian dan verifikasi kode heksa ke dalam E-EPROM.
Port-2.
Port-2 adalah port 8-bit dua arah yang memiliki resistor pull-up di dalamnya.
Penyanggah (buffer) port-2 dapat dihubungkan kepada (maksimum) 4 saluran input chip
TTL. Ketika logika ‘1’ ditulis ke port-2 maka setiap pin pada port-2 akan ditarik menuju
tegangan VCC (+5 Volt) oleh resistor pull-up internal. Sebagai input, port-2 yang secara
eksternal sedang ditarik ke ground oleh resistor pull-down akan menjadi sumber arus
(source current) IIL bagi peralatan luar.
Port-2 dapat berfungsi sebagai bus alamat byte tinggi saat dilakukan proses
pengambilan (fetch cycle) instruksi yang berada di memori program eksternal dan selama
mengambil data di dalam memori data dengan menggunakan pengalamatan 16-bit (MOVX
@DPTR). Selama mengakses ke memori data eksternal yang menggunakan pengalamatan
8-bit (MOVX @RI), port-2 memasukkan isi dari register P2 SFR (Special Function
Register).
Port-3.
Port-3 merupakan port 8-bit dua arah yang memiliki resistor pull-up di dalamnya.
Penyanggah (buffer) port-3 dapat dihubungkan kepada (maksimum) 4 saluran input chip
TTL. Ketika logika ‘1’ ditulis ke port-3 maka setiap pin pada port-3 akan ditarik menuju
tegangan VCC (+5 Volt) oleh resistor pull-up internal. Sebagai input, port-3 yang secara
eksternal sedang ditarik ke ground oleh resistor pull-down akan menjadi sumber arus
(source current) IIL bagi peralatan luar.
Selain sebagai port I/O, port-3 juga mempunyai fungsi-fungsi lain yang
merupakan fasilitas khusus yang dimiliki oleh AT89C51, yaitu :
Tabel 1. Fungsi lain dari Port-3
Port Pin Fungsi lain
P3.0 RXD (input port serial)
P3.1 TXD (output port serial)
P3.2 INT0 (eksternal interupsi 0)
P3.3 INT1 (eksternal interupsi 1)
P3.4 T0 (input eksternal timer-0)
P3.5 T1 (input eksternal timer-1)
P3.6 WR (write strobe memori data eksternal)
P3.7 RD (read strobe memori data eksternal)
Port-3 juga menerima beberapa sinyal kendali selama dilakukan proses pengisian
data heksa dan verifikasinya di E-EPROM.
RST.
Input reset. Suatu sinyal high (tegangan 5 Volt) pada pin ini yang diberikan
selama minimum 2 siklus mesin pada saat oscilator sedang bekerja, akan menyebabkan
mikrokontroler AT89C51 di-reset. Atau dengan kata lain sistem AT89C51 memulai
kembali eksekusi programnya pada alamat 000H.
ALE/PROG.
ALE merupakan singkatan dari Address Latch Enable. Pin ALE merupakan pin
output yang mengeluarkan pulsa untuk menyimpan (latching) byte alamat bawah saat
mengakses memori eksternal. Pin ini juga berfungsi sebagai pin input untuk pulsa PROG
saat dilakukan pemrograman AT89C51.
Pada saat operasi normal, ALE mengeluarkan secara konstan suatu pulsa dengan
frekuensi 1/6 dari frekuensi oscilator yang dapat digunakan untuk tujuan pewaktuan dan
sumber detak peralatan eksternal. Catatan : satu pulsa ALE hilang pada setiap akses
memori data eksternal.
Jika diinginkan, operasi ALE dapat dihilangkan (disable) dengan mensetting bit 0
dari SFR pada alamat 8EH. Dan bila bit 0 di set menjadi ‘1’ maka ALE diaktifkan hanya
pada eksekusi instruksi MOVX atau MOVC. Mensetting bit disable ALE tidak akan
berpengaruh kepada sistem jika mikrokontroler difungsikan dengan mode mengakses
memori eksternal.
PSEN.
PSEN merupakan singkatan dari Program Store Enable yang merupakan strobe
untuk membaca memori program eksternal. Ketika AT89C51 sedang mengeksekusi kode
heksa dari memori program eksternal, maka PSEN akan diaktifkan sebanyak 2 kali untuk
setiap siklus mesin. Kecuali pada saat mengakses memori data eksternal, dua sinyal
PSEN dihilangkan.
EA/Vpp.
EA merupakan singkatan dari External Address. Pin EA harus dihubungkan ke
GND (ground) pada saat menginginkan sistem mengambil kode heksa (bahasa mesin)
dari memori program eksternal. Dimana lokasi awal terletak di alamat 0000H hingga
maksimum FFFFH. EA harus dihubungkan ke VCC (5 Volt) jika diinginkan sistem
mengambil kode heksa dari memori program internal.
Pin ini juga berfungsi sebagai tegangan pemrograman (Vpp) pada saat dilakukan
proses pengisian kode heksa ke dalam E-EPROM. Tegangan pemrograman yang
diberikan adalah DC 12-Volt.
XTAL1.
Pin ini merupakan pin input untuk inverting oscilator internal dan dapat juga
berfungsi sebagai input untuk rangkaian detak eksternal.
XTAL2.
Pin ini merupakan pin output dari oscilator.
VCC.
Pin ini dihubungkan dengan sumber tegangan (catu daya) arus searah sebesar 5
Volt.
GND.
Pin ini dihubungkan dengan ground (0 Volt) dari catu daya.
3. Rangkaian Minimal.
Untuk membuat suatu sistem berbasis mikrokontroler AT89C51 diperlukan dua
rangkaian dasar yaitu rangkaian POR (Power On Reset) dan rangkaian On-chip
Oscillator.
Power On Reset.
Sesuai dengan namanya, rangkaian ini berfungsi untuk memberikan sinyal ‘reset’
kepada mikrokontroler AT89C51 pada saat catu-daya dihidupkan. Reset disaat mulai
dihidupkan merupakan keharusan bagi sistem-sistem berbasis mikroprosesor/
mikrokontroler.
Dengan adanya reset maka mikrokontroler memulai mengeksekusi instruksi pada
baris pertama program yang tersimpan di dalam memorinya. Atau dengan kata lain,
adanya POR dapat dipastikan mikrokontroler langsung memulai eksekusi program pada
baris pertama, bukan pada sembarang baris.
Pada kondisi reset, maka isi dari setiap register di dalam SFR akan berubah
seperti tabel dibawah ini :
Tabel 2
Nilai yang terisi pada SFR saat POR
Reg SFR Nilai saat reset
PC 0000H
ACC 00H
B 00H
PSW 00H
SP 07H
DPTR 0000H
P0 - P3 FFH
IP XXX00000B
IE 0XX00000B
TMOD 00H
TCON 00H
TH0 00H
TL0 00H
TH1 00H
TL1 00H
SCON 00H
SBUF Tidak tentu
PCON 0XXX0000B
Adapun rangkaian Power On Reset untuk mikrokontroler Atmel 89C51 dapat
dilihat pada gambar di bawah ini :
VCC
40
VCC
10uF +
/12v AT89C51
9
RST
8K2
20
GND
Gambar 5
Rangkaian POR
Pada saat catu-daya dihidupkan, rangkaian menjaga pin RST pada kondisi high.
Hal ini disebabkan karena muatan pada kapasitor masih kosong sehingga arus dapat
mengalir menuju pin RST. Beberapa mili detik kemudian (tergantung kepada nilai
kapasitor dan nilai resistor), pada saat muatan pada kapasitor penuh maka arus tidak lagi
dapat mengalir menyebrang kapasitor. Sehingga pin RST saat ini ditarik ke bawah
(ground) melalui resistor pull-down 8K2.
Untuk memastikan sinyal reset yang valid, maka pin RST harus dijaga pada
kondisi high sampai rangkaian On-chip Oscillator bekerja plus dua siklus mesin. Dalam
hal ini pin RST minimal dijaga pada kondisi high selama 10 ms. Waktu start-up untuk
On-chip Oscillator tergantung kepada frekuensi kristal. Bila digunakan kristal 10 MHz,
maka waktu untuk start-up selama 1 ms. Untuk kristal 1 MHz, waktu untuk start-up
selama 10 ms.
On-chip Oscillator.
Sesuai dengan namanya, rangkaian ini berfungsi untuk membangkitkan sinyal
detak (clock) kepada sistem mikrokontroler AT89C51. Hampir seluruh rangkaian
Oscilator terletak di dalam mikrokontroler AT89C51, kecuali 3 komponen yang perlu
ditambahkan di luar chip AT89C51. Ketiga komponen tersebut adalah 2 buah kapasitor
30 pF dan 1 buah kristal. Lihat gambar 6.
AT89C51
30 pF
19
XTAL1
XTAL
18
XTAL2
30 pF
Gambar 6
On-chip Oscillator
Frekuensi kristal dapat dipilih antara 1 Mhz hingga 20 MHz tergantung kepada
spesifikasi yang tertera pada tulisan di body chip AT89C51. Frekuensi kristal akan
mempengaruhi siklus mesin (machine cycle) dan menentukan baud-rate pada saat
berkomunikasi melalui serial port. Pembahasan mengenai baud-rate ada pada topik
mengenai port serial.
AT89C51
Konektor
PORT-1
Port 1
ON-CHIP XTAL1
OSCILLATOR XTAL2
Konektor
PORT-2
Port 2
Konektor
INTERFACE TX PORT-3
PC Port 3
TTL - RS232 RX
P2.0
Speaker
Gambar 7
Blok diagram rangkaian modul kontroler
Organisasi Memori.
Memori pada mikrokontroler AT89C51 dipisah atas dua bagian, yaitu memori
untuk program yang tersimpan di dalam EEPROM (Electronically Erasable
Programmable ROM) dan memori untuk data yang tersimpan di dalam RAM (Random
Access Memory). EEPROM bersifat non-volatile yang artinya program yang tersimpan
di dalamnya tidak akan mudah hilang bila catu-data dimatikan. Sedangkan RAM bersifat
volatile yang artinya data akan hilang bila catu-daya dimatikan.
Memori program secara total dapat menyimpan program hingga mencapai 64 Kilo
Byte (64 KB) pada memori eksternal. Namun secara internal mikrokontroler AT89C51
hanya mampu menyimpan program sebesar 4 KB. Untuk dapat mengakses memori
program eksternal maka digunakan sinyal PSEN (Program Store Enable) dan sinyal EA
(Enable Address), lihat pin pada gambar-4. Instruksi yang diperlukan untuk mengakses
memori eksternal adalah MOVX.
Memori data pada AT89C51 juga mampu mengalamati hingga mencapai 64 Kilo
Byte (64 KB) pada memori eksternal. Namun secara internal mikrokontroler AT89C51
hanya mampu menyimpan data sebesar 128 byte ditambah 128 byte untuk SFR (Special
Function Register). Lihat gambar 10. Untuk dapat mengakses memori data eksternal
maka digunakan sinyal Rd (Read) dan Wr (Write).
FFFF FFFF
60KB
Eksternal
64KB
Eksternal
Atau
1000
0FFF
4KB Internal
0000 0000
PSEN EA = 1 PSEN EA = 0
Gambar 8
Struktur Program Memori
FFFF
INTERNAL
64KB
FF Eksternal
128 Bytes SFR
(Pengalamatan
Langsung)
80
DAN
7F
128 Bytes RAM
(Pengalamatan
Langsung dan
Tidak Langsung
00 0000
RD WR
Gambar 9
Struktur Data Memori
Pada gambar 9 diatas terlihat bahwa 128 byte SFR hanya dapat diakses dengan
cara pengalamatan langsung (direct addressing), yaitu dengan menggunakan instuksi
MOV data,alamat. Sedangkan 128 byte RAM selain dapat diakses secara langsung, dapat
juga diakses secara tidak langsung (indirect addressing), yaitu dengan menggunakan
instruksi MOV @Ri.
A Akumulator
R0 … R7 Register serbaguna
DPTR Data pointer. Register 16 bit
PC Program counter. Register 16 bit yang berisi alamat
Instruksi berikutnya yang akan dijalankan
C Carry flag
AB Akumulator/register B. Pasangan register untuk proses
perkalian dan pembagian.
Pengalamatan Langsung.
Pengalamatan langsung dilakukan dengan memberikan nilai ke suatu register
secara langsung. Untuk melaksanakan hal tersebut digunakan tanda #.
MOV A,#01H ; Isi akumulator dengan bilangan 01H
MOV DPTR,#19AB ; Isi register DPTR dengan bilangan 19ABH
Pengalamatan data langsung dari 0 sampai 127 akan mengakses RAM internal,
sedangkan pengalamat 128 sampai 255 akan mengakses register perangkat keras.
MOV P3,A ; Pindahkan isi akumulatort ke alamat data B0H
; (B0H adalah alamat Port 3).
INC 50 ; Naikkan isi suatu alamat 50 pada memori
LOKASI RAM
SERBAGUNA
30
2F
LOKASI
PENGALAMATAN
BIT
20
1F
Bank 3
18
17
Bank 2
10
0F
Bank 1
08
07 Default register bank
00 for R0 - R7
Gambar 10
Peta Memori RAM AT89C51
Bila dilihat dari Perangkat Instruksi (Instruction Set) yang dimiliki oleh
mikrokontroler AT89C51, instruksi-instruksi dapat digolongkan menjadi lima (5)
kategori, yaitu : Operasi Aritmatika, Operasi Logika, Transfer Data, Manipulasi Boolean
dan Pencabangan Program.
Baiklah mari kita bahas satu persatu instruksi yang dikenal oleh mikrokontroler
AT89C51 berdasarkan 5 kategori diatas.
1. Instruksi Operasi Aritmatika.
Instruksi operasi aritmatika meliputi seluruh operasi matematis (jumlah, kurang,
kali, bagi) dan operasi increment dan decrement.
1.1.Operasi Penjumlahan.
Terdapat 2 kelompok utama instruksi penjumlahan yaitu penjumlahan tanpa bit
carry dan penjumlahan bersama bit carry.
1.1.1. Penjumlahan tanpa bit carry.
Sintaks : ADD A, <source-byte>
Deskripsi : Instruksi ADD akan menjumlahkan suatu nilai byte dengan isi register A
dan menyimpan hasil penjumlahan itu ke dalam register A. Flag bit carry
dan bit auxiliary carry akan diset (bersesuaian) jika terjadi limpahan pada
bit 7 atau bit 3. Jika tidak terjadi limpahan, kedua bit tersebut akan di-
clear.
Field Source Byte dapat berupa pengalamatan: register, langsung, tidak
langsung atau immediate.
Varian : ADD A, Rn
ADD A, direct
ADD A, @Ri
ADD A, #data
Varian : ADDC A, Rn
ADDC A, direct
ADDC A, @Ri
ADDC A, #data
1.2.Operasi Pengurangan.
Sintaks : SUBB A, <source-byte>
Fungsi : Mengurangi beserta bit Borrow
Deskripsi : Instruksi SUBB akan mengurangi suatu nilai byte beserta bit carry dengan
isi register A dan menyimpan hasil pengurangan itu ke dalam register A.
Flag bit carry (borrow) akan diset apabila operasi itu membutuhkan suatu
‘pinjaman’ (borrow) pada bit ke 7 dan akan meng-clear C jika tidak terjadi
‘pinjaman’. Bit AC akan diset (bersesuaian) jika dibutuhkan pinjaman
pada bit ke 3 atau akan di-clear jika tidak dibutuhkan pinjaman.
Field Source Byte dapat berupa pengalamatan: register, langsung, tidak
langsung atau Immediate.
Varian : SUBB A, Rn
SUBB A, direct
SUBB A, @Ri
SUBB A, #data
1.3.Operasi Perkalian.
Sintaks : MUL AB
Fungsi : Melakukan proses perkalian
Deskripsi : Instruksi MUL AB akan mengalikan suatu nilai byte yang berada di dalam
register A dan B. 8-bit bobot terendah dari 16 bit hasil perkalian akan
disimpan di dalam register A, dan 8 bit bobot tertinggi akan disimpan di
dalam register B. Jika hasil perkalian lebih besar dari 255 (0FFH), maka
flag bit overflow akan diset. Begitu pula sebaliknya jika lebih kecil dari
255, flag bit overflow akan di-clear.
1.4.Operasi Pembagian.
Sintaks : DIV AB
Fungsi : Melakukan proses pembagian
Deskripsi : Instruksi DIV AB akan membagi suatu nilai byte yang berada di dalam
register A dengan nilai byte yang terkandung di dalam register B. Register
A akan menyimpan hasil pembagian dan register B akan menyimpan sisa
dari proses pembagian. Bit carry dan overflow di-clear.
Pengecualian : Jika B mengandung 00H, maka suatu nilai yang tidak
terdefinisi akan mengisi register A dan B. Namun bit overflow akan diset
dan bit carry di-clear.
1.5.Operasi Increment.
Sintaks : INC <Byte>
Fungsi : Menambah satu (menaikkan) isi suatu variabel/register
Deskripsi : Instruksi INC akan menaikkan suatu nilai byte pada variabel yang
ditunjuk. Suatu nilai 0FFH akan overflow ke 00H. Tidak ada flag yang
dipengaruhi oleh instruksi ini.
Field Byte dapat berupa pengalamatan: register, direct, langsung, tidak
langsung.
Varian : INC A
INC Rn
INC direct
INC @Ri
INC DPTR
1.6.Operasi Decrement.
Sintaks : DEC <Byte>
Fungsi : Mengurangi satu (menurunkan) isi suatu variabel/register
Deskripsi : Instruksi DEC akan menurunkan suatu nilai byte pada variabel yang
ditunjuk. Suatu nilai 00H akan underflow ke 0FFH. Tidak ada flag yang
dipengaruhi oleh instruksi ini.
Varian : DEC A
DEC Rn
DEC direct
DEC @Ri
Contoh lainnya :
ANL P1,#01110011B akan meng-clear bit 7, 3 dan 2 dari port P1.
Varian : ANL A, Rn
ANL A, direct
ANL A, @Ri
ANL A, #data
ANL direct, A
ANL direct, #data
2.2.Operasi OR Logic.
Sintaks : ORL <dest-byte>,<source-byte>
Fungsi : Melakukan operasi OR antara dua byte suatu variabel/register
Deskripsi : Instruksi ORL membentuk operasi bit logika OR antara dua variabel
(destination-byte dan source-byte) dan menyimpan hasilnya di dalam
variabel destination. Tidak ada flag yang berubah dengan operasi ini.
Pola bit yang akan di-set oleh operasi ini ditentukan oleh byte penghalang
(mask), yang bisa berupa data tetap ataupun variabel
Varian : ORL A, Rn
ORL A, direct
ORL A, @Ri
ORL A, #data
ORL direct, A
ORL direct, #data
Varian : XRL A, Rn
XRL A, direct
XRL A, @Ri
XRL A, #data
XRL direct, A
XRL direct, #data
Sintaks : RLC A
Fungsi : Menggeser satu bit ke kiri isi register A dan flag carry
Deskripsi : Delapan bit di dalam register A digeser satu bit ke kiri. Bit 7 register A
masuk ke flag (bit) carry dan isi flag carry pindah ke register A pada
posisi bit 0.
Contoh : Register A=0C5H (11000101B) dan C=0, maka dengan instruksi RLC A
akan menyebabkan register A=8BH (10001011B) dan C=1.
Sintaks : RR A
Fungsi : Menggeser satu bit ke kanan isi register A.
Deskripsi : Delapan bit di dalam register A digeser satu bit ke kanan. Bit 0 dirotasi ke
posisi bit 7. Tidak ada flag yang dipengaruhi oleh instruksi ini.
Contoh : Register A=0C5H (11000101B), maka dengan instruksi RR A akan
menyebabkan register A=0E2H (11100010B). Flag carry tidak berubah.
Sintaks : RRC A
Fungsi : Menggeser satu bit ke kanan isi register A dan flag carry
Deskripsi : Delapan bit di dalam register A digeser satu bit ke kanan. Bit 0 register A
masuk ke flag (bit) carry dan isi flag carry pindah ke register A pada
posisi bit 7.
Contoh : Register A=0C5H (11000101B) dan C=0, maka dengan instruksi RRC A
akan menyebabkan register A=62H (01100010B) dan C=1.
Sintaks : SWAP A
Fungsi : Menukar posisi 4 bit nibel bawah (bit 0-3) dengan 4 bit nibel atas (4-7).
Deskripsi : Instruksi ini menukar posisi bit 0-3 dengan posisi bit 4-7 data yang
terdapat di dalam register A. Tidak ada flag yang dipengaruhi oleh operasi
ini.
Contoh : Register A=0C5H (11000101B) maka dengan instruksi SWAP A akan
menyebabkan register A=5CH (01011100B).
3.1.Operasi MOV.
Terdapat 5 kelompok utama instruksi transfer data yaitu transfer data 8-bit,
transfer data 1-bit, transfer data 16-bit, transfer data berbentuk tabel dan transfer data dari
memori eksternal.
Instruksi ini berguna untuk membuat suatu tabel data (konstanta). Tidak
ada flag yang berubah.
Contoh : Suatu nilai antara 0 dan 3 berada di dalam A. Instruksi berikut akan
merubah nilai yang berada di dalam A sesuai dengan satu atau empat nilai
yang didefinisikan oleh instruksi direktif DB (define byte) :
REL_PC INC A
MOVC A,@A+PC
RET
DB 66H, 77H
DB 88H, 99H
Jika contoh subrutin diatas dijalankan dimana register A berisi 01H, maka
pemanggilan subrutin tersebut akan menghasilkan A=77H. Instruksi INC
A sebelum instruksi MOVC diperlukan untuk mengambil data berikutnya
dari tabel. Data harus diletakkan tepat setelah instruksi RET. Setiap pindah
baris harus diawali dengan instruksi direktif DB. Setiap akhir baris, tanpa
diberikan tanda ‘,’
3.3.Operasi MOVX.
Sintaks : MOVX <dest-byte>, <source-byte>
Fungsi : Memindahkan 1 byte kode ke alamat eksternal
Deskripsi : Instruksi ini akan mentransfer data antara register A dengan memori data
eksternal. Itulah sebabnya mengapa ‘X’ digandeng dengan MOV.
Contoh : Suatu chip memori data eksternal (RAM) sebesar 256 byte terhubung
dengan bus data dan bus alamat yang terhubung pada P0 dan P3 berfungsi
sebagai bus kendali untuk RAM eksternal. Register R0 berisi 12H dan R1
berisi 34H. Alamat 34H dari RAM Eksternal menyimpan 56H. Urutan
instruksi berikut akan menyalin nilai 56H ke dalam register A dan RAM
eksternal pada lokasi 12H
MOVX A, @R1 ; A = 56H
MOVX @R0, A ;RAM(12) = 56H
3.4.Operasi PUSH.
Sintaks : PUSH direct
Fungsi : Mendorong (menyimpan) data direct ke dalam RAM melalui proses stack.
Deskripsi : Isi register SP (Stack Pointer) ditambah satu. Dan isi suatu register
pengalamatan langsung (operand direct) disalin ke dalam lokasi RAM
internal yang dialamati oleh register SP. Tidak ada flag yang dipengaruhi
oleh operasi ini.
Contoh : Saat masuk ke dalam rutin interupsi, register SP berisi 09H dan register
Data Pointer (DPTR) menyimpan 0123H. Maka dengan 2 instruksi
dibawah ini :
PUSH DPL
PUSH DPH
akan menyebabkan SP=0BH dan menyimpan 23H dan 01H di dalam
RAM internal pada lokasi 0AH dan 0BH.
3.5.Operasi POP.
Sintaks : POP direct
Fungsi : Mengeluarkan data melalui proses stack.
Deskripsi : Isi suatu lokasi di dalam RAM internal yang dialamati oleh register SP
dibaca dan disalin ke dalam suatu register yang ditunjuk oleh operand
direct. Isi register SP (Stack Pointer) dikurangi satu. Tidak ada flag yang
dipengaruhi oleh operasi ini.
Contoh : Register SP menyimpan nilai 32H, dan lokasi RAM internal 30H hingga
32H menyimpan data 20H, 23H dan 01H. Maka instruksi dibawah ini :
POP DPH
POP DPL
akan menyebabkan SP=30H dan mengisi register DPTR dengan data
0123H. Pada posisi ini, instruksi berikut : POP SP akan mengisi register
SP dengan data 20H. Dalam contoh ini khusus ini, isi SP sebelumnya telah
dikurangi menjadi 2FH dan kemudian diisi dengan 20H.
Varian : XCH A, Rn
XCH A, direct
XCH A, @Ri
Deskripsi : Saling menukar isi data nibel bawah (bit 3 hingga bit 0) register A, yang
secara umum berupa data heksadesimal atau BCD, dengan nibel bawah
dari suatu lokasi RAM yang dialamati secara tidak langsung oleh operand
kedua.
Contoh : Tiga baris program dibawah ini akan men-set bit carry jika, P1.0 = 1,
ACC.7 = 1 dan OV=0 :
ANL C,P1.0 ;Pindahkan status P1 bit 0 ke bit carry
ANL C,ACC.7 ;AND antara C dengan Akumulator bit 7
ANL C,/OV ;AND antara C dengan flag Overflow yang
;telah dikomplemen sebelumnya
Varian : ANL C, bit
ANL C, /bit
Contoh : Tiga baris program dibawah ini akan men-set bit carry jika, P1.0 = 1,
ACC.7 = 1 dan OV=0 :
ANL C,P1.0 ;Pindahkan status P1 bit 0 ke bit carry
ANL C,ACC.7 ;AND antara C dengan Akumulator bit 7
ANL C,/OV ;AND antara C dengan flag Overflow yang
;telah dikomplemen sebelumnya
Varian : ANL C, bit
ANL C, /bit
Varian : CLR C
CLR bit
Contoh : Flag carry di-clear. Output P1 telah ditulis dengan nilai 34H (00110100B).
Instruksi berikut akan men-set flag carry menjadi ‘1’ dan merubah output
data pada P1 menjadi 35H (00110101B).
Varian : SETB C
SETB bit
Varian : CPL C
CPL bit
Contoh : Flag Carry diset ‘1’. Data yang hadir pada P3 adalah 11000101B (0C5H).
Data yang ditulis sebelumnya ke P1 adalah 35H (00110101B).
Tiga baris instruksi diatas akan membuat bit (flag) carry menjadi ‘0’ dan
merubah P1 menjadi 39H (00111001B)
Contoh : Flag C=0. Urutan instruksi dibawah ini menyebabkan C=1 dan program
melompat ke alamat yang ditunjuk oleh LABEL2.
JC LABEL1
CPL C
JC LABEL2
Contoh : Flag C=1. Urutan instruksi dibawah ini menyebabkan C=0 dan program
melompat ke alamat yang ditunjuk oleh LABEL2.
JNC LABEL1
CPL C
JNC LABEL2
Contoh : Data yang hadir pada port input adalah 11001010B dan A=56H
(01010110B). Maka instruksi dibawah ini akan membuat program
mengeksekusi instruksi yang terdapat di LABEL2.
JB P1.2, LABEL1
JB ACC.2, LABEL2
Contoh : A menyimpan data 56H (01010110B). Maka instruksi dibawah ini akan
membuat program mengeksekusi instruksi yang terdapat di LABEL2 dan
akumulator dimodifikasi menjadi 52H (01010010B).
5. Instruksi Pencabangan.
5.1.Pemanggilan (pencabangan) Subrutin.
5.1.1. Absolute Call (Pencabangan berjangkuan 2 Kilo).
Sintaks : ACALL addr11
Fungsi : Memanggil (lompat ke) suatu subrutin berjarak maksimum 2K
Deskripsi : Instruksi ini dengan tanpa persyaratan apapun akan melompat ke suatu
subrutin yang terletak pada lokasi yang ditunjuk oleh suatu label. Instruksi
ini akan menambah 2 isi register PC untuk membentuk alamat kembali ke
program utama, lalu mem-push alamat kembali tersebut ke dalam stack
(byte terendah terlebih dulu yg di push), dan menaikkan isi register SP
tersebut 2 kali. Program akan bercabang (melompat) ke suatu alamat yang
dibentuk oleh gabungan 5 bit tertinggi PC dengan byte kedua yang
dikandung oleh instruksi. Subrutin yang dipanggil harus dalam jangkauan
2 Kilo ruang program memori dari tempat dimana subrutin itu dipanggil.
Tidak ada flag yang berubah oleh instruksi ini.
Contoh : Isi register SP pada saat sebelum terjadi pencabangan adalah 07H. Label
SUBRTN berada pada program memori dengan alamat 0345H. Setelah
mengeksekusi instruksi berikut (terletak di alamat 0123H) : ACALL
SUBRTN
SP berubah menjadi 09H, lokasi RAM alamat 08H dan 09H akan berisi
25H dan 01H, dan PC berisi 0345H (alamat awal subrutin itu berada).
Contoh : Isi register SP pada saat sebelum terjadi pencabangan adalah 07H. Label
SUBRTN berada pada program memori dengan alamat 3456H. Setelah
mengeksekusi instruksi berikut (terletak di alamat 0123H) : ACALL
SUBRTN
SP berubah menjadi 09H, lokasi RAM alamat 08H dan 09H akan berisi
26H dan 01H, dan PC berisi 3456H (alamat awal subrutin itu berada).
Contoh : Isi register SP berisi 0BH. Lokasi internal RAM 0AH dan OBH
menyimpan nilai 23H dan 01H. Instruksi berikut : RET menyebabkan
SP berisi 09H dan program melanjutkan eksekusi instruksi pada lokasi
0123H.
Contoh : Isi register SP berisi 0BH. Ketika interupsi terdeteksi, suatu instruksi
terakhir selesai dieksekusi pada alamat 0122H. Lokasi internal RAM 0AH
dan OBH menyimpan nilai 23H dan 01H. Instruksi berikut : RETI
menyebabkan SP berisi 09H dan program melanjutkan eksekusi instruksi
pada lokasi 0123H.
Contoh : Label JMPADR berada pada program memori dengan alamat 0123H.
Instruksi berikut (terletak di alamat 0345H) : AJMP JMPADR
akan menyebabkan PC diisi dengan nilai 0123H.
Contoh : Label JMPADR berada pada program memori dengan alamat 1234H.
Instruksi berikut (terletak di alamat 0345H) : LJMP JMPADR
akan menyebabkan PC diisi dengan nilai 1234H.
5.4.Lompat bersyarat.
5.4.1. Lompat jika Akumulator = 0.
Sintaks : JZ rel
Fungsi : Lompat ke suatu alamat tertentu jika isi register A=0.
Deskripsi : Jika seluruh bit di dalam register Akumulator adalah ‘0’, instruksi JZ
membuat program melompat ke suatu alamat yang ditunjuk oleh Label rel.
Namun jika Akumulator tidak sama dengan 0, maka program akan
melanjutkan instruksi berikutnya dibawah instruksi ini.
Contoh : Register Akumulator berisi 01H. Maka Instruksi berikut secara berurutan :
JZ LABEL1
DEC A
JZ LABEL2
akan merubah isi register A menjadi 00H dan menyebabkan program
melanjutkan mengeksekusi instruksi yang ditunjuk oleh LABEL2.
Contoh : Register Akumulator berisi 00H. Maka Instruksi berikut secara berurutan :
JNZ LABEL1
INC A
JNZ LABEL2
akan merubah isi register A menjadi 01H dan menyebabkan program
melanjutkan mengeksekusi instruksi yang ditunjuk oleh LABEL2.
Contoh : Lokasi RAM internal beralamat 40H, 50H dan 60H menyimpan data 01H,
70H dan 15H. Maka Instruksi berikut secara berurutan :
DJNZ 40H, LABEL1
DJNZ 50H, LABEL2
DJNZ 60H, LABEL3
menyebabkan program melompat ke instruksi yang berada pada LABEL2
dimana lokasi RAM 40H, 50H dan 60H berubah menjadi 00H, 6FH dan
15H. Baris pertama instruksi diatas tidak melompat ke LABEL1
disebabkan hasil pengurangan satu telah mencapai nol.
MOV R2, #8
TOGGLE CPL P1.7
DJNZ R2, TOGGLE
Tiga baris instruksi diatas akan mengkomplemen (toggle) port satu bit 7
(P1.7) sebanyak delapan kali dan sekaligus menghasilkan 4 pulsa output.
Tiap pulsa membutuhkan 3 siklus mesin (2 siklus untuk DJNZ dan 1
siklus untuk CPL)
Varian : DJNZ Rn, rel
DJNZ direct, rel
5.4.4. Lompat jika hasil perbandingan tidak sama.
Sintaks : CJNE <dest-byte>,<source-byte>, rel
Fungsi : Membandingkan 2 operand dan lompat jika tidak sama.
Deskripsi : CJNE membandingkan 2 operand dan melompat jika kedua nilai operand
tersebut tidak sama. Alamat pencabangan ditunjuk oleh operand ketiga
(rel). Flag carry diset jika operand ke-1 lebih ‘<’ (lebih kecil) daripada
operand ke-2. Dan flag carry tidak akan diset bila kedua operand adalah
‘=’ atau ‘>’. Isi dari kedua operand tidak berubah oleh instruksi ini. Dua
operand pertama menyebabkan adanya 4 kombinasi mode pengalamatan.
Contoh : Diasumsikan register A sedang menyimpan data 34H dan R7 menyimpan
56H. Lihat instruksi-instruksi dibawah ini :
CJNE R7, #60H, NOT_EQ
….. ……. ;R7=60H
NOT_EQ JC REQ_LOW ;Jika R7<60H
….. ……. ;R7>60H
Baris pertama instruksi diatas akan membuat bit C=1 dan program
melompat ke instruksi yang diberi label NOT_EQ. Dengan menguji flag
carry, instruksi ini akan menentukan kondisi R7 apakah lebih besar atau
lebih kecil dari 60H. Jika lebih kecil, maka program melompat ke label
REQ_LOW. Jika lebih besar, program akan melanjutkan eksekusi di baris
berikutnya.
Jika A=04H ketika memulai urutan instruksi diatas, maka program akan
melompat pada LABEL2. Lompat ke LABEL0 terjadi bila A=0, lompat ke
LABEL1 terjadi bila A=2, lompat ke LABEL 2 terjadi bila A=4 dan
lompat ke LABEL3 terjadi bila A=6. Hal ini disebabkan karena instruksi
AJMP adalah instruksi yang panjangnya 2 byte di dalam program
memori.
5.6. No Operation.
Sintaks : NOP
Fungsi : Memberikan waktu tunda (time delay) selama 1 siklus mesin.
Deskripsi : Tidak ada register dan flag yang dipengaruhi oleh instruksi ini. Instruksi
ini berguna untuk memberikan waktu tunda yang sederhana kepada
program.
Contoh : Pulsa output yang menuju ‘0’ pada bit ke-7 port 2 akan memiliki lebar
secara tepat sebesar 5 siklus mesin. Dengan instruksi sederhana
SETB/CLR urutan program dibawah ini menghasilkan satu pulsa,
sehingga 4 instruksi NOP harus disisipkan untuk dapat menghasilkan 5
siklus mesin.
CLR P2.7
NOP
NOP
NOP
NOP
SETB P2.7
6. END
Instruksi assembler direktif END digunakan sebagai tanda bahwa tidak ada lagi
program assembly yang perlu di-assembled.
---oOo ---
BAB 3
MEMULAI MEMPROGRAM
I. Perangkat Modul Pelatihan.
Percobaan-percobaan yang akan dilakukan membutuhkan 3 modul yang dirangkai
menjadi satu diatas papan acrylic. Lihat gambar dibawah.
L1
L2
L3 SG4 SG3 SG2 SG1
74240
L4
L5
L6
L7 7447 POWER SUPPLY
L8
DESIMAL
S4 S3 S2 S1 D C B A
LSB MSB +
PORT 0 PORT 2
0 7 + 7 0
PWR
R
S
2
3
2
AT89C51
MAX232
PIN-1
V G
C N
C D
+
KEYPAD DIP-SW
PWR
PUSH
ON
BUTTON
123 456 78
8 4
1 2 3
4 5 6 7 3
7 8 9
6 2
0
* #
5 1
Gambar 1
Papan Percobaan
1. Modul Kontroler.
Seperti sudah dibahas sedikit pada sessi-1, bahwa diperlukan minimal 2 rangkaian
dasar pada modul kontrolernya yaitu rangkaian POR dan rangkaian On-chip Oscillator.
Modul ini terletak di tengah, diantara modul peraga dan modul input. Lihat gambar 1.
Modul ini dibuat universal dengan cara mengeluarkan seluruh port melalui suatu
konektor. Melalui 4 buah port inilah, berbagai peralatan input dan output dapat
dihubungkan.
Terlihat pada gambar 2 dibawah ini, ada dua rangkaian tambahan selain
rangkaian POR dan On-chip Oscillator. Yaitu berupa chip interface TTL-RS232 dan
rangkaian interface speaker. Dg adanya rangkaian interface TTL-RS232 maka modul ini
dapat dihubungkan ke peralatan PC (Personal Computer). Dan dengan adanya rangkaian
AT89C51
Konektor
PORT-1
Port 1
ON-CHIP XTAL1
OSCILLATOR XTAL2
Konektor
PORT-2
Port 2
Konektor
INTERFACE TX PORT-3
PC Port 3
TTL - RS232 RX
P2.0
Speaker
2. Modul input.
Modul input berisi 3 macam saklar/switch yang berfungsi untuk mensimulasikan
pemasukan data ke dalam mikrokontroler AT89C51. Ketiga macam saklar tersebut
adalah Push button, Keypad dan DIP-Switch.
Resistor
VCC
Pull-up
Switch
SISTEM SISTEM
DIGITAL DIGITAL
Switch
Resistor
Pull-down
(i) ( ii )
Resistor Pull-up Resistor Pull-down
Gambar 3
(i) Resistor Pull-up
(ii) Resistor Pull-down
Konektor Konektor
Push Button DIP-SW
S1 SW1
S2 SW2
S3 SW3
S4 SW4
S5 SW5
S6 SW6
S7 SW7
S8 SW8
(i) ( ii )
Rangkaian Saklar Rangkaian Saklar
Push Button DIP-Switch
Gambar 4
Rangkaian saklar Push-button dan DIP-switch
Dari gambar diatas terlihat bahwa kedua rangkaian untuk saklar push-button
maupun DIP-Switch sama persis. Yang membedakannya hanya nama dari konektornya.
Untuk saklar push-button konektor yang terhubung kepadanya dinamakan konektor
PUSH-BUTTON. Sedangkan untuk saklar DIP-Switch, konektornya dinamakan konektor
DIP-SW.
Penggunaan saklar push-button maupun dip-switch berfungsi untuk
mensimulasikan pemasukan data ke dalam mikrokontroler AT89C51. Ada suatu instruksi
pada AT89C51 yang dapat mengalamati data dalam ukuran ‘bit’. Dengan demikian dapat
dilakukan suatu simulasi pemasukan data baik dalam ukuran 1 byte data maupun 1 bit
data. Data 1 bit dapat berupa 1 titik sensor, 1 buah level switch, dsb.
Terdapat 1 macam saklar lagi yang terdapat pada modul input, yaitu keypad.
Berbeda dengan saklar push button dan dip-switch yang bersifat independen antara satu
saklar dengan saklar lain, setiap switch pada keypad tidak independen. Dalam arti bahwa
saklar-saklar yang tersusun pada keypad saling terhubung secara matrik (baris dan
kolom).
Keypad.
Keypad adalah salah satu dari sekian banyak jenis saklar/switch yang ada di
pasar. Berbeda dengan push button atau dip-switch, masing-masing saklar yang terdapat
pada keypad saling terhubung secara matrik (disusun berdasarkan baris dan kolom). Ada
dua macam keypad yang tersedia di pasar, yaitu keypad 4x3 dan keypad 4x4. Pada modul
input ini digunakan jenis keypad 4x3. Lihat gambar 5 dibawah ini.
PORT 1
0 1 2 3 4 5 6
GND
C1 C2 C3 B1 B2 B3 B4 COM
C1 C2 C3
B1
1 2 3
1 2 3
B2
4 5 6
4 5 6
B3 7 8 9
7 8 9
0 #
B4
* 0 # *
(i) ( ii )
Gambar 5
(i) Rangkaian dalam keypad 4x3
(ii) Koneksi Keypad 4x3 ke Port 1 pada modul percobaan
Tabel 1
Pola biner penekanan switch pada keypad
Switch DATA PADA PORT 1
yang
ditekan
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
1 1 1 1 1 0 1 1 0
2 1 1 1 1 0 1 0 1
3 1 1 1 1 0 0 1 1
4 1 1 1 0 1 1 1 0
5 1 1 1 0 1 1 0 1
6 1 1 1 0 1 0 1 1
7 1 1 0 1 1 1 1 0
8 1 1 0 1 1 1 0 1
9 1 1 0 1 1 0 1 1
0 1 0 1 1 1 1 1 0
* 1 0 1 1 1 1 0 1
# 1 0 1 1 1 0 1 1
Dengan melakukan pembandingan bit yang masuk pada port 1, maka
mikrokontroler dapat mengenali tombol/switch mana yang ditekan. Lalu hasil pengenalan
tersebut diolah sesuai dengan kebutuhan sistem yang diinginkan.
V
+5v
2,4v
0v t
Gambar 6
Switch bounching
Hal yang perlu diperhatikan pada saat pendeteksian saklar atau switch adalah
terjadinya apa yang dikenal sebagai switch bounching (getaran saklar). Getaran saklar
adalah suatu kondisi dimana terjadi suatu pulsa liar yang dapat mengakibatkan terjadinya
kesalahan pembacaan data. Lihat gambar 6.
Pada tepi positif, getaran terjadi hingga mencapai level yang bukan lagi sebagai
logika ‘1’. Sehingga mikrokontroler menganggap peralihan ini terdiri dari banyak pulsa.
Padahal misalnya diharapkan hanya ada satu peralihan pulsa yaitu dari ‘0’ menuju ‘1’.
Begitu juga pada tepi negatif, yaitu peralihan dari ‘1’ menuju ‘0’ dapat terjadi bounching
yang tidak diharapkan.
Ada 2 cara untuk menghindari kesalahan pembacaan saklar akibat dari bounching
ini, yaitu dengan menambahkan flip-flop RS pada setiap switch dan atau secara software.
Secara software switch bounching dapat dihilangkan dengan memberi suatu delay
minimal 20 mili detik sebelum status switch/saklar dibaca oleh mikrokontroler. Dengan
adanya delay tersebut diharapkan status logika sudah mencapai kondisi stabil, sehingga
efek bounching tersebut dapat dihilangkan.
VCC
Konektor VCC
L1 L2 L3 L4 L5 L6 L7 L8
LED 20
17 3
15 5
13 7
11 9
8 74240 12
6 14
4 16
2 18
19 10 1
Gambar 7
Rangkaian 8 buah LED
Terlihat pada gambar 7, bahwa setiap LED terhubung dengan resistor yang
besarnya masing-masing 240 Ohm. Resistor ini berfungsi untuk membatasi arus yang
diijinkan untuk mengalir melalui LED. LED akan menyala apabila input pada driver yang
bersesuai mendapat logika ‘1’. Sebagai contoh apabila pin 17 IC 74240 mendapat logika
‘1’ maka LED L1 menyala. Dan apabila mendapat logika ‘0’ maka LED akan padam.
Susunan delapan buah LED mewakili 1 byte data yang dikirim oleh
mikrokontroler AT89C51. Ada suatu instruksi pada AT89C51 yang dapat mengalamati
data dalam ukuran ‘bit’. Dengan demikian dapat dilakukan suatu simulasi pengeluaran
data baik dalam ukuran 1 byte data maupun 1 bit data. Data 1 bit dapat dianggap berupa
penggerak kontak relay, penggerak katup solenoid, dsb.
Led 7-Segmen.
Pada modul training terdapat display led yang bernama led 7-segmen. Dinamakan
7-segmen karena display tersebut terdiri atas 7 buah led, yang disusun sedemikian rupa
sehingga mampu menampilkan angka dari 0 sampai dengan angka 9. Lihat gambar 8
dibawah ini.
+5
(i)
a b c d e f g a
f b
g
e c
a b c d e f g d
(ii) (iii)
Gambar 8
Led 7-Segmen
Dilihat dari cara menyusun 7 buah led, led 7 segmen dapat dibedakan menjadi 2
jenis yaitu common anoda dan common catoda. Disebut common anoda karena seluruh
kaki anoda pada setiap led disatukan menjadi satu kaki dan pada penggunaannya harus
dihubungkan kepada positif catu daya. Lihat gambar (i). Sedangkan apabila seluruh kaki
katoda pada setiap led disatukan maka led 7-segmen tersebut dikatakan jenis common
catoda. Pada saat digunakan, kaki common catoda ini harus dihubungkan ke ground dari
catu daya. Lihat gambar (ii).
Posisi led ‘a’ sampai dengan led ‘g’ diletakkan sedemikian rupa seperti tampak
pada gambar (iii). Apabila diinginkan terperaga angka 1, maka led ‘b’ dan ‘c’ yang harus
dinyalakan. Apabila diinginkan terperaga angka 2, maka led ‘a’, ‘b’, ‘e’, ‘d’ dan ‘g’.
Led 7-segmen dapat langsung digerakkan oleh port AT89C51 melalui suatu
pembatas arus (resistor) yang diletakkan secara seri pada setiap segmen. Nilai resistor
tersebut berkisar antara 180 ohm hingga 300 ohm, tergantung dengan kecerahan yang
diinginkan. Apabila digerakkan langsung oleh port, maka secara software kita harus
mendefinisikan pola penyalaan led yang diinginkan ke dalam suatu tabel. Dimisalkan
segmen ‘a’ terhubung ke port 2.0,
segmen ‘b’ terhubung ke port 2.1,
segmen ‘c’ terhubung ke port 2.2,
segmen ‘d’ terhubung ke port 2.3,
segmen ‘e’ terhubung ke port 2.4,
segmen ‘f’ terhubung ke port 2.5,
segmen ‘g’ terhubung ke port 2.6,
Maka secara software dibuat suatu tabel yang berisi pola penyalaan seperti yang
diinginkan. Adapun algoritma tabel tersebut adalah sebagai berikut :
Apabila angka ‘1’ terperaga maka Port 2 = 0000 0110
Apabila angka ‘2’ terperaga maka Port 2 = 0101 1011
Apabila angka ‘3’ terperaga maka Port 2 = 0100 1111
Apabila angka ‘4’ terperaga maka Port 2 = 0110 0110
dan seterusnya.
Untuk mempermudah menampilkan angka pada led 7-segmen dan sekaligus dapat
menghemat penggunaan port, maka perlu ditambahkan chip TTL 7447 yang berfungsi
sebagai dekoder BCD (Binary Code Decimal) To 7-Segment. Chip ini memiliki 4 jalan
masukan BCD yaitu A,B,C,D ; 3 buah pin kendali (LT, BI, RBI) dan 7 buah pin yang
langsung terhubung pada setiap katoda led 7-segmen. Lihat gambar 9 dibawah ini.
a
f
g b
e c
+5 +5
h g e d c b a
VCC LT
BCD TO 7-SEGMEN
BI
TTL 7447
GND RBI
A B C D
Gambar 9
Decoder BCD To 7-Segmen
Dari gambar diatas terlihat bahwa pin data yang dibutuhkan hanya 4 bit untuk
dapat mendisplaykan angka-angka. Ke-empat pin BCD chip 7447 dapat langsung
dihubungkan ke salah satu port pada AT89C51. Angka yang ingin ditampilkan pada led
7-segmen dikirim secara software oleh AT89C51 melalui port yang tersedia. Data biner
yang dikirim sesuai dengan angka yang akan ditampilkan. Sebagai contoh apabila ingin
ditampilkan angka ‘3’ maka dikirim data biner xxxx 0011 melalui Port 2 (apabila P2.0
s/d P2.3 dihubungkan ke pin A s/d D pada chip 7447).
Tiga buah pin kendali, yaitu LT, BI dan RBI dapat diabaikan dengan cara
menghubungkan ketiga pin tersebut ke positif catu daya. Pembahasan ketiga pin dapat
anda baca sendiri pada buku-buku data IC-TTL yang banyak tersedia dipasaran.
Ada kalanya seorang desainer membutuhkan lebih dari satu buah led 7-segmen
sebagai display dari alat yang dirancangnya. Dengan melihat deskripsi yang telah
dijelaskan diatas, maka dapat dipilih satu dari dua cara dibawah ini :
1. Memasang 1 buah chip 7447 untuk setiap led 7-segmen. Dengan demikian apabila
dibutuhkan 10 buah peraga 7-segmen, maka akan dibutuhkan sebanyak 10 buah chip
7447.
2. Cukup memasang 1 buah chip 7447 untuk berapapun banyaknya led 7-segmen yang
dibutuhkan. Apabila dibutuhkan 10 buah peraga 7-segmen, maka cukup 1 buah chip
7447 saja yang dipakai.
Pada cara pertama diatas, jelas dibutuhkan biaya yang besar untuk dapat
menggerakkan 10 buah led 7-segmen. Disamping itu, semakin banyak jumlah chip yang
digunakan dalam suatu sistem, maka konsumsi daya sistem tersebut semakin besar.
Dengan kata lain penggunaan 10 chip akan memboroskan energi yang terpakai pada
sistem tersebut.
Selain kerugian diatas, terdapat kerugian lainnya yaitu dibutuhkan jumlah port
pada mikrokontroler sebanyak : 4 bit x 10 peraga = 40 bit. Suatu jumlah port yang tidak
mungkin tersedia pada mikrokontroler AT89C51.
Mari kita lihat cara kedua. Pada cara kedua cukup digunakan 1 buah chip 7447
untuk sekian banyak 7-segmen yang diinginkan. Bagaimana hal tersebut dapat dilakukan
?
Jawaban dari pertanyaan diatas adalah karena digunakan metode yang dinamakan
scanning (penyapuan). Setiap 7-segmen secara bergantian dinyalakan oleh
mikrokontroler. Hanya ada satu display saja yang menyala pada waktu tertentu untuk
menampilkan data yang diinginkan. Lihat gambar 10.
Dimisalkan data yang akan ditampilkan adalah “9765”. Maka pada langkah
pertama mikrokontroler akan menyalakan display pertama (SG1) dan mematikan display
lain dengan mengirim data biner 1110 pada P2.7 s/d P2.4. Lalu data biner 0101 (desimal
5) dikirim melalui P2.3 s/d P2.0 ke chip TTL 7447 (sebagai data input BCD) sehingga
display SG1 akan mendisplay angka “5”. Langkah kedua mikrokontroler menyalakan
SG2 dan mematikan display lain dengan mengirim data biner 1101 pada P2.7 s/d P2.4.
Lalu data biner 0110 (desimal 6) dikirim melalui P2.3 s/d P2.0 ke chip TTL 7447
sehingga display SG2 akan mendisplaykan angka “6”.
P2.4
P0
P2.5
P2.6
P1 AT89C51
+5 +5 +5 +5
P3
P2.7
P2.3 P2.2 P2.1 P2.0
A h g e d c b a
B
BCD TO 7-SEGMEN
C TTL 7447
D
Gambar 10
Scanning Pada Display 7-segmen
Demikian seterusnya mikrokontroler menggilir (scanning) penyalaan display
dengan data BCD tertentu. Karena mikrokontroler melakukan proses scanning ini dalam
waktu yang cepat, maka proses mati dan padamnya display tidak terlihat oleh mata.
Adapun rincian pola biner yang harus dikirim (melalui port 2 ) bila angka 9765
ingin ditampilkan pada display 7-segmen dapat dilihat pada tabel berikut :
Tabel 2
Pola biner untuk menampilkan angka ‘9765’
4. Prosedur Percobaan.
Untuk menghubungkan antara dua modul dibutuhkan kabel penghubung. Total
terdapat 4 buah kabel penghubung berupa kabel pita berinti 8 dan 2 buah kabel
penghubung berinti 2. Kabel penghubung berinti 2 merupakan kabel catu daya yang
menyalurkan tegangan catu dari modul kontroler kepada modul input dan modul display.
Perlu diperhatikan pada saat melakukan suatu percobaan, petunjuk mengenai
hubungan antara satu konektor dengan konektor lain. Adakalanya hubungan konektor
dipindahkan ke konektor lainnya. Bacalah baik-baik langkah-langkah percobaan.
Adapun beberapa hal yang perlu diperhatikan saat menggunakan modul
praktikum adalah :
1. Matikan power supply modul praktikum saat memasang atau mencabut chip
AT89C51 ke/dari soketnya.
2. Matikan juga power supply saat memindahkan kabel penghubung dari satu konektor
ke konektor lainnya.
3. Hati-hati jangan sampai terbalik saat memasang chip AT89C51 ke soketnya pada
modul kontroler karena akan menyebabkan kerusakan pada chip. Pin satu terletak di
bawah. Lihat gambar 1.
4. Hati-hatilah saat mencabut dan memasang chip ke soketnya pada sub-modul kontroler
karena dapat menyebabkan pin pada chip bengkok/patah.
II. Penulisan Program dan Compiling.
Program ditulis dengan menggunakan aplikasi yang dimiliki oleh Windows yaitu
Notepad atau Wordpad. Dapat juga digunakan editor teks lainnya seperti editor pascal
dan basic. Namun dalam percobaan-percobaan yang akan dilakukan kita menggunakan
Notepad.
Program yang ditulis harus mengikuti aturan-aturan dan sintaks yang disyaratkan
oleh suatu compiler. Compiler adalah suatu program yang berfungsi merubah bahasa
asembler menjadi bahasa mesin. Proses merubah bahasa asembler menjadi bahasa mesin
disebut sebagai kompilasi. Program Compiler yang digunakan adalah 51XASM.EXE.
Tampilan program 51XASM adalah sebagai berikut :
Gambar 11
Tampilan Compiler 51XASM
Aturan dan Sintaks Penulisan Program.
Untuk membuat sebuah program, anda hanya harus mengikuti dua peraturan:
1. LABEL harus dimulai di column SATU(1)
2. Setiap OPERAND/VARIABLE harus dipisahkan dari operand/variable lainnya dengan
sedikitnya SATU(1) SPACE.
Angka NEGATIVE anda akan disimpan dalam bentuk/format yang standard, yaitu
dalam format TWO'S COMPLEMENT. Semua definisi/features 51XASM mengikuti
standard industri; jadi program assembly anda bisa di-assembled oleh CROSS
ASSEMBLER yang lain yang juga industri standard.
Prosedur Compiling.
Program asembler yang ditulis dengan Notepad harus di-save dengan extension
*.H51. Program tidak akan bisa dicompile bila tidak di-save dengan extension H51. Lalu
ikuti prosedur kompilasi sebagai berikut :
1. Aktifkan program 51XASM dengan cara double click.
2. Tulislah nama file yang akan dicompile pada baris terbawah (misalnya coba.h51)
3. Perhatikan pada saat proses kompilasi sedang dilakukan, terbentuk 2 file baru yang
masing-masing berextension *.PRN dan *.HEX. File dengan extension PRN adalah
file report untuk mencari letak kesalahan aturan dan sintaks program. Sedangkan File
dengan extension HEX adalah file yang berisi bahasa mesin dengan standard format
INTEL yang akan kita download ke dalam chip mikrokontroler.
4. Diakhir proses kompilasi, apakah ada pesan error yang terjadi akibat adanya
kesalahan sintaks penulisan program. Jika tidak ada pesan error, langsung menuju
langkah 6.
5. Jika ada pesan error, buka file yang berextension *.PRN (coba.prn). Gunakan
fasilitas find yang terdapat pada menu search program Notepad. Tulis kata kunci “e r
r” untuk mencari dengan cepat di baris mana letak terjadinya kesalahan aturan dan
sintaks penulisan program. Lakukan perbaikan, dan simpan kembali. Lakukan
kembali langkah 1.
6. Program bahasa mesin (coba.hex) siap untuk di-download atau ditulis ke dalam chip
mikrokontroler dengan menggunakan alat yang bernama programmer atau writer.
Prosedur download/writing.
Program yang sudah dicompile dan bersih dari error siap untuk ditulis ke dalam
chip mikrokontroler. Programmer yang digunakan adalah ALL-11 Programmer
Pada sessi memulai program sudah dibahas berbagai teori mengenai Keypad dan
Led 7-segmen. Mulai saatnya kita mencoba membuat suatu program sederhana yang
menggunakan kedua komponen ini.
Berhubung ada 4 digit angka yang akan diperagakan, maka kita perlu membuat
suatu tempat penampungan data (buffer) di dalam RAM dengan menggunakan instruksi
assembler direktif EQU. Ada 4 buffer yang kita deklarasikan yaitu BUFF_1, BUFF_2,
BUFF_3, BUFF_4.
Selanjutnya adalah mengisi keempat buffer diatas dengan angka yang akan
ditampilkan. MSB (Most Significant Bit) berada pada buffer BUFF_4 dan LSB (Least
Significant Bit) pada bufffer BUFF_1. Lihat program Utama dibawah ini.
3. Program memasukkan data melalui keypad dan menggeser data pada peraga
7-segmen.
Dari cuplikan program utama diatas terlihat ada 4 baris instruksi untuk menggeser
data yang penekanan tombol keypad yang tersimpan di suatu buffer ke buffer lainnya.
Terlihat bahwa data yang digeser pertama kali dimulai dari buffer MSB (BUFF_4
BUFF_3). Lalu setelah proses penggeseran selesai, dilakukan proses menampilkan data
ke peraga 7-segmen.
Selain itu terdapat pula flag penanda untuk menandakan ada-tidak-nya tombol
keypad yang ditekan. Flag penanda itu dideklarasikan dengan 2 baris instruksi :
FLAG EQU 24H
NO_CHANGE BIT FLAG.0
Lalu pada program utama dan subrutin CHECK_CEK disisipkan instruksi untuk men-set
dan meng-clear flag untuk memberi tanda bahwa ada/tidak tombol keypad yang ditekan.
Bila ada tombol yang ditekan maka diprogram utama dilakukan proses penggeseran data
di dalam buffer. Namun bila tidak ada tombol yang ditekan maka proses yang dilakukan
hanyalah proses memperagakan data (CALL DISP) dan pembacaan keypad (CALL
CHECK_CEK).
Hal lain yang perlu diperhatikan adalah perlunya memodifikasi program utama
untuk menyisipkan instruksi sebelum instruksi JMP, yang berfungsi untuk mendeteksi
lepasnya penekanan tombol pada keypad. Hal ini diperlukan agar program tidak ‘liar’
yang dengan cepat mengeksekusi baris demi baris seluruh program.
Adapun subrutin CHECK_KEY dapat dilihat dibawah ini. Sedangkan untuk
subrutin DISP tidak ada yang perlu dimodifikasi.
CHECK_KEY: MOV A,P1 ;Baca data dari port 1
CJNE A,#0F6H,NXT_2 ;Cek tombol ‘1’ ditekan
MOV A,#0E1H ; BUFF_1 = 0E1H
SETB NO_CHANGE
NXT_2 CJNE A,#0F5H,NXT_3 ;Cek tombol ‘2’ ditekan
MOV A,#0E2H ; BUFF_1 = 0E2H
SETB NO_CHANGE
LAST RET