Anda di halaman 1dari 42

PAPER

MIKROKONTROLER
NAMA : OFANI RIZQI ANDUA
NIM : 1420031027
S1 TEKNIK ELEKTRO

BAB 1
PENDAHULUAN

1.1 Sejarah Mikrokontroler


Mikrokontroler adalah sebuah sistem komputer fungsional dalam sebuah chip. Di dalamnya
terkandung sebuah inti prosesor, memori (sejumlah kecil RAM, memori program, atau keduanya), dan
perlengkapan input output. Dengan kata lain, mikrokontroler adalah suatu alat elektronika digital yang
mempunyai masukan dan keluaran serta kendali dengan program yang bisa ditulis dan dihapus dengan
cara khusus, cara kerja mikrokontroler sebenarnya membaca dan menulis data. Sekedar contoh,
bayangkan diri Anda saat mulai belajar membaca dan menulis, ketika Anda sudah bisa melakukan hal
itu Anda bisa membaca tulisan apapun baik buku, cerpen, artikel dan sebagainya, dan Andapun bisa
pula menulis hal-hal sebaliknya. Begitu pula jika Anda sudah mahir membaca dan menulis data maka
Anda dapat membuat program untuk membuat suatu sistem pengaturan otomatik menggunakan
mikrokontroler sesuai keinginan Anda. Mikrokontroler merupakan komputer didalam chip yang
digunakan untuk mengontrol peralatan elektronik, yang menekankan efisiensi dan efektifitas biaya.
Secara harfiahnya bisa disebut “pengendali kecil” dimana sebuah sistem elektronik yang sebelumnya
banyak memerlukan komponen-komponen pendukung seperti IC TTL dan CMOS dapat
direduksi/diperkecil dan akhirnya terpusat serta dikendalikan oleh mikrokontroler ini.
Mikrokonktroler digunakan dalam produk dan alat yang dikendalikan secara automatis, seperti
sistem kontrol mesin, remote controls, mesin kantor, peralatan rumah tangga, alat berat, dan mainan.
Dengan mengurangi ukuran, biaya, dan konsumsi tenaga dibandingkan dengan mendesain
menggunakan mikroprosesor memori, dan alat input output yang terpisah, kehadiran mikrokontroler
membuat kontrol elektrik untuk berbagai proses menjadi lebih ekonomis. Dengan penggunaan
mikrokontroler ini maka :
 Sistem elektronik akan menjadi lebih ringkas
 Rancang bangun sistem elektronik akan lebih cepat karena sebagian besar dari sistem adalah
perangkat lunak yang mudah dimodifikasi
 Pencarian gangguan lebih mudah ditelusuri karena sistemnya yang kompak

Namun demikian tidak sepenuhnya mikrokontroler bisa mereduksi komponen IC TTL dan CMOS
yang seringkali masih diperlukan untuk aplikasi kecepatan tinggi atau sekedar menambah jumlah
saluran masukan dan keluaran (I/O). Dengan kata lain, mikrokontroler adalah versi mini atau mikro dari
sebuah komputer karena mikrokontroler sudah mengandung beberapa periferal yang langsung bisa
dimanfaatkan, misalnya port paralel, port serial, komparator, konversi digital ke analog (DAC), konversi
analog ke digital dan sebagainya hanya menggunakan sistem minimum yang tidak rumit atau kompleks.
Agar sebuah mikrokontroler dapat berfungsi, maka mikrokontroler tersebut memerlukan komponen
eksternal yang kemudian disebut dengan sistem minimum. Untuk membuat sistem minimal paling tidak
dibutuhkan sistem clock dan reset, walaupun pada beberapa mikrokontroler sudah menyediakan
sistem clock internal, sehingga tanpa rangkaian eksternal pun mikrokontroler sudah beroperasi.
Untuk merancang sebuah sistem berbasis mikrokontroler, kita memerlukan perangkat keras dan
perangkat lunak, yaitu:
 sistem minimal mikrokontroler
 software pemrograman dan kompiler, serta downloader

Yang dimaksud dengan sistem minimal adalah sebuah rangkaian mikrokontroler yang sudah dapat
digunakan untuk menjalankan sebuah aplikasi. Sebuah IC mikrokontroler tidakakan berarti bila hanya
berdiri sendiri. Pada dasarnya sebuah sistem minimal mikrokontroler AVR memiliki prinsip yang sama,
yang terdiri dari 4 bagian, yaitu :
1. prosesor, yaitu mikrokontroler itu sendiri
2. rangkaian reset agar mikrokontroler dapat menjalankan program mulai dari awal
3. rangkaian clock, yang digunakan untuk memberi detak pada CPU
4. rangkaian catu daya, yang digunakan untuk memberi sumberdaya

Pada mikrokontroler jenis2 tertentu (AVR misalnya), poin2 pada no 2 ,3 sudah tersedia didalam
mikrokontroler tersebut dengan frekuensi yang sudah diseting dari vendornya (biasanya
1MHz,2MHz,4MHz,8MHz), sehingga pengguna tidak perlu memerlukan rangkaian tambahan, namun
bila ingin merancang sistem dengan spesifikasi tertentu (misal ingin komunikasi dengan PC atau
handphone), maka pengguna harus menggunakan rangkaian clock yang sesuai dengan karakteristik PC
atau HP tersebut, biasanya menggunakan kristal 11,0592 MHz, untuk menghasilkan komunikasi yang
sesuai dengan baud rate PC atau HP tersebut.
Mikrokontroler pertama kali dikenalkan oleh Texas Instrument dengan seri TMS 1000 pada tahun
1974 yang merupakan mikrokontroler 4 bit pertama. Mikrokontroler ini mulai dibuat sejak 1971.
Merupakan mikrokomputer dalam sebuah chip, lengkap dengan RAM dan ROM. Kemudian, pada tahun
1976 Intel mengeluarkan mikrokontroler yang kelak menjadi populer dengan nama 8748 yang
merupakan mikrokontroler 8 bit, yang merupakan mikrokontroler dari keluarga MCS 48. Sekarang di
pasaran banyak sekali ditemui mikrokontroler mulai dari 8 bit sampai dengan 64 bit, sehingga
perbedaan antara mikrokontroler dan mikroprosesor sangat tipis. Masing2 vendor mengeluarkan
mikrokontroler dengan dilengkapi fasilitas2 yang cenderung memudahkan user untuk merancang
sebuah sistem dengan komponen luar yang relatif lebih sedikit.
Saat ini mikrokontroler yang banyak beredar dipasaran adalah mikrokontroler 8 bit varian
keluarga MCS51(CISC) yang dikeluarkan oleh Atmel dengan seri AT89Sxx, dan mikrokontroler AVR yang
merupakan mikrokontroler RISC dengan seri ATMEGA8535 (walaupun varian dari mikrokontroler AVR
sangatlah banyak, dengan masing2 memiliki fitur yang berbeda2). Dengan mikrokontroler tersebut
pengguna (pemula) sudah bisa membuat sebuah sistem untuk keperluan sehari-hari, seperti pengendali
peralatan rumah tangga jarak jauh yang menggunakan remote control televisi, radio frekuensi, maupun
menggunakan ponsel, membuat jam digital, termometer digital dan sebagainya.

1.2 Jenis-jenis Mikrokontroler


Secara teknis, hanya ada 2 macam mikrokontroller. Pembagian ini didasarkan pada kompleksitas
instruksi-instruksi yang dapat diterapkan pada mikrokontroler tersebut. Pembagian itu yaitu RISC dan
CISC.
 RISC merupakan kependekan dari Reduced Instruction Set Computer. Instruksi yang dimiliki
terbatas, tetapi memiliki fasilitas yang lebih banyak.
 Sebaliknya, CISC kependekan dari Complex Instruction Set Computer. Instruksi bisa dikatakan
lebih lengkap tapi dengan fasilitas secukupnya.

1. Keluarga MCS51
Mikrokontroler ini termasuk dalam keluarga mikrokontroler CISC. Sebagian besar instruksinya
dieksekusi dalam 12 siklus clock. Mikrokontroler ini berdasarkan arsitektur Harvard dan meskipun
awalnya dirancang untuk aplikasi mikrokontroler chip tunggal, sebuah mode perluasan telah
mengizinkan sebuah ROM luar 64KB dan RAM luar 64KB diberikan alamat dengan cara jalur
pemilihan chip yang terpisah untuk akses program dan memori data. Salah satu kemampuan dari
mikrokontroler 8051 adalah pemasukan sebuah mesin pemroses boolean yang mengijikan operasi
logika boolean tingkatan-bit dapat dilakukan secara langsung dan secara efisien dalam register
internal dan RAM. Karena itulah MCS51 digunakan dalam rancangan awal PLC (programmable Logic
Control).

2. AVR
Mikrokontroler Alv and Vegard’s Risc processor atau sering disingkat AVR merupakan
mikrokonktroler RISC 8 bit. Karena RISC inilah sebagian besar kode instruksinya dikemas dalam satu
siklus clock. AVR adalah jenis mikrokontroler yang paling sering dipakai dalam bidang elektronika
dan instrumentasi. Secara umum, AVR dapat dikelompokkan dalam 4 kelas. Pada dasarnya yang
membedakan masing-masing kelas adalah memori, peripheral dan fungsinya. Keempat kelas
tersebut adalah keluarga ATTiny, keluarga AT90Sxx, keluarga ATMega dan AT86RFxx.

3. PIC
Pada awalnya, PIC merupakan kependekan dari Programmable Interface Controller. Tetapi
pada perkembangannya berubah menjadi Programmable Intelligent Computer. PIC termasuk
keluarga mikrokonktroler berarsitektur Harvard yang dibuat oleh Microchip Technology. Awalnya
dikembangkan oleh Divisi Mikroelektronik General Instruments dengan nama PIC1640. Sekarang
Microhip telah mengumumkan pembuatan PIC-nya yang keenam PIC cukup popular digunakan oleh
para developer dan para penghobi ngoprek karena biayanya yang rendah, ktersediaan dan
penggunaan yang luas, database aplikasi yang besar, serta pemrograman (dan pemrograman ulang)
melalui hubungan serial pada komputer.

1.3 Mikrokontroler vs Mikroprosesor


Sebuah mikrokontroler berbeda dengan sebuah mikroprosesor dalam beberapa hal. Pertama dan
yang terpenting adalah fungsionalitasnya. Agar mikroprosesor dapat bekerja, masih dibutuhkan
komponen lain seperti memori. Walaupun mikroprosesor dianggap sebagai piranti canggih untuk
komputasi, titik kelemahannya ada pada tidak dirancangnya kemampuan komunikasi (antarmuka)
dengan piranti-piranti periferal (memori, I/O da lain sebagainya) secara khusus.

Mikrokontroler dirancang sebagai satu kesatuan utuh gambar tersebut. Tidak memerlukan
komponen-komponen eksternal seperti ditunjukkan dalam gabar untuk perancangan aplikasi, dengan
demikian waktu dan biaya bisa dihemat.

Tidak seperti sistem komputer, yang mampu menangani berbagai macam program aplikasi
(misalnya pengolah kata, pengolah angka dan lain sebagainya), mikrokontroler hanya bisa digunakan
untuk suatu aplikasi tertentu saja (hanya satu program saja yang bisa disimpan). Perbedaan lainnya
terletak pada perbandingan RAM dan ROM. Pada sistem komputer perbandingan RAM dan ROM-nya
besar, artinya program-program pengguna disimpan dalam ruang RAM yang relatif besar, sedangkan
rutin-rutin antarmuka perangkat keras disimpan dalam ruang ROM yang kecil. Sedangkan pada
mikrokontroler, perbandingan ROM dan RAM-nya yang besar, artinya program kontrol disimpan dalam
ROM (bisa Masked ROM atau Flash PEROM) yang ukurannya relatif lebih besar, sedangkan RAM
digunakan sebagai tempat penyimpan sementara, termasuk register-register yang digunakan pada
mikrokontroler yang bersangkutan.

1.4 Tipe dan Aplikasi Mikrokontroler


1. Mikrokontroler ATMEL
Mikrokontroler keluaran ATMEL dapat dikatakan sebagai mikrokontroler terlaris dan termurah
saat ini. Chip mikrokontroler ini dapat diprogram menggunakan port paralel atau serial. Selain itu,
dapat beroperasi hanya dengan satu chip dan beberapa komponen dasar seperti kristal, resistor,
dan kapasitor.

2. Mikrokontroler PIC
PIC merupakan keluarga mikrokontroler tipe RISC buatan Microchip Technology yang
bersumber dari PIC1650 yang dibuat oleh Divisi Mikroelektronika General Instruments. Teknologi
Microchip tidak menggunakan PIC sebagai akronim, melainkan nama brandnya, yaitu PICmicro. Hal
ini karena PIC singkatan dari Peripheral Interface Controller sedangkan General Instruments
mempunyai akronim PIC1650 sebagai Programmable Intelligent Computer.
PIC pada awalnya dibuat menggunakan teknologi General Instruments 16 bit CPU, yaitu
CP1600. PIC dibuat pertama kali pada tahun 1975 untuk meningkatkan perfoma sistem pada I/O.
Saat ini PIC telah dilengkapi dengan EPROM dan komunikasi serial, UAT, kernel, control motor, dan
lain – lain serta memori program dari 512 word hingga 32 word. Satu word dalam hal ini sama
dengan satu instruksi bahasa assembly yang bervariasi dari 12 hingga 16 bit, tergantung dari tipe
PICmicro tersebut.
3. Mikrokontroler Maxim
Maxim merupakan salah satu produsen chip yang fokus pada komponen digital dan
komunikasi, seperti mikrokontroler, akuisisi data, dan komponen RF (Radio Frekuensi). Maxim
cukup inovatif dengan meluncurkan mikrokontroler yang mendukung jaringan komputer antara
lain, 80C400 dengan kecepatan tinggi.

Mikrokontroler dan prosesor sering digunakan sebagai penngendalli oven microwave, kulkas,
televise dan VCR, radio tape stereo, komputer dan perlengkapan komputer, seperti laser printer,
modem dan disk drive. Penerapan lainnya, antara lain pada automobile, pengendali lingkungan,
instrumentasi, robotika, aerospace, dan climate control. Mikrokontroler pada umumnya digunakan
dimana kemampuan prosesnya tidak begitu penting (tidak dibutuhkan kecepatan yang sangat tinggi)
dibandingkan mikroprosesor yang mampu bekerja dengan kecepatan tinggi.
BAB 2
Clock dan CPU Timing

2.1 Arsitektur Mikrokontroler


1. Arsitektur Von Neumann
Arsitektur Von Neumann adalah arsitektur komputer yang menempatkan program (ROM=Read
Only Memory) dan data (RAM=Random Access Memory) dalam peta memori yang sama.
Arsitektur ini memiliki address dan data bus tunggal untuk mengalamati program (instruksi) dan
data. Contoh dari mikrokontroler yang memakai arsitektur Von Neumann adalah keluarga 68HC05
dan 68HC11 dari Motorola.

2. Arsitektur Harvard
Arsitektur Harvard memiliki dua memori yang terpisah satu untuk program (ROM) dan satu untuk
data (RAM). Intel 80C51, keluarga Microchip PIC16XX, Philips P87CLXX dan Atmel AT89LSXX adalah
contoh dari mikroprosesor yang mengadopsi arsitektur Harvard.

2.2 Fungsi Pin-pin pada Mikrokontroler


A. Port 0
Merupakan dual-purpose port (port yang memiliki dua kegunaan). Pada desain yang minimum
(sederhana) digunakan sebagai port I/O (Input/Output).Port 0 terdapat pada pin 32-39.
B. Port 1
Merupakan port yang hanya berfungsi sebagai port I/O, kecuali pada IC 89S52 yang menggunakan
P1.0 dan P1.1 sebagai input eksternal untuk timer ketiga (T3). Port 1 terdapat pada pin 1-8.
C. Port 2
Merupakan dual-purpose port. Pada desain minimum digunakan sebagai port I/O. Pada desain
lebih lanjut Port ini digunakan untuk mengirim byte alamat bila pengaksesan dilakukan pada
memori eksternal. Port 2 terdapat pada pin 21-28.
D. Port 3
Merupakan dual-purpose port. Selain sebagai port I/O juga mempunyai fungsi khusus yang
ditunjukkan pada tabel berikut.
E. PSEN (Program Store Enable)
PSEN atau Program Store Enable adalah sinyal baca pada saat menjalankan program dari memori
eksternal. Di dalam aplikasi, PSEN akan dihubungkan dengan sinyal RD memori program eksternal
(EEPROM).PSEN terdapat pada pin 29.
F. ALE (Address Latch Enable)
ALE atau Addres Latch Enable adalah pulsa keluaran latch pada proses pengaksesan memori
eksternal (program maupun data). Di dalam aplikasi, ALE biasanya dihubungkan dengan masukan
latch enable dari IC latch, misalnya 74373.. ALE terdapat pada pin 30.
G. EA (External Access)
EA atau External Access Enable menentukan apakah alamat awal memori program berada di
memori eksternal atau internal. Bila dihubungkan dengan GND, alamat awal program memori
akan berada di memori eksternal, sebaliknya bila dihubungkan dengan VCC, maka alamat awal
memori program AT89S52 akan berada di memori internal. EA terdapat pada pin 31.
H. RST (Reset)
RST pada pin 9 merupakan pin reset. Jika pada pin ini diberi masukan 1 selama minimal 2 machine
cycle maka system akan di-reset dan register-register internal akan berisi nilai default tertentu
dan program kembali mengeksekusi dari alamat paling awal.
I. XTAL2 dan XTAL1
XTAL2 merupakan keluaran dari rangkaian penguat osilator internal. Sedangkan XTAL1 merupakan
masukan ke penguat osilator internal. Sebuah kristal dan dua buah kapasitor yang dihubungkan
ke pin ini sudah cukup untuk menyediakan sinyal detak (clock) untuk mikrokontroler.
J. Koneksi Power
VCC dan GND merupakan pin untuk tegangan DC. Mikrokontroler AT89S52 membutuhkan
tegangan DC sebesar 5 volt agar bisa bekerja dengan baik (standar TTL). Pin Vcc terdapat pada pin
40 sedangkan ground terdapat pada pin 20.

2.3 Clock
Peran clock bagi mikrokontroler ibarat jantung bagi manusia. Manusia tanpa detak jantung tidak
akan hidup. Mikrokontroler tanpa ‘detak’ clock juga tidak akan berfungsi. Pulsa clock mengambil peran
penting dalam menentukan kecepatan dan sikronisasi kerja Central Processing Unit (CPU)
mikrokontroler.

2.4 Reset
Proses Reset merupakan proses untuk mengembalikan sistem ke kondisi semula. Reset tidak
mempengaruhi internal program memory. Reset terjadi jika pin RST bernilai high selama minimal 2
machine cycle lalu kembali bernilai low.
Power-on reset merupakan proses reset yang berlangsung secara otomatis pada saat sistem
pertama kali diberi daya. Proses ini mempengaruhi semua register dan internal data memory.
Rangkaian reset sama fungsinya dengan rangkaian reset pada komputer. Fungsi reset di
mikrokontroler yaitu untuk merestart program, sehingga kembali ke program awal. Penggunaan reset
pada mikrokontroler opsional, bisa di pake atau nggak tergantung si pengguna.
BAB 3
ARSITEKTUR MIKROKONTROLER

3.1 Arsitektur
Arsitektur mikrokontroler MCS-51 diotaki oleh CPU 8 bit yang terhubung melalui satu jalur bus dengan
memori penyimpanan berupa RAM dan ROM serta jalur I/O berupa port bit I/O dan port serial. Selain
itu terdapat fasilitas timer/counter internal dan jalur interface address dan data ke memori eksternal.

3.2 Blok Diagram

Gambar Blok Diagram MCS-51

3.3 Peta Memori


Memori program hanya bisa dibaca saja karena bersifat sebagai ROM. Memori ini disimpan dalam
Flash PEROM. Memori program yang bisa diakses langsung hingga 64 Kbyte. Pada gambar memori
program terdapat strobe (tanda) untuk akses memori program eksternal melalui sinyal PSEN (Program
Strobe Enable).
Memori data menempati ruang alamat terpisah. Memori eksternalnya dapat diakses secara
langsung hingga 64 Kbyte. CPU akan memberikan sinyal baca RD dan tulis WR selama mengakses
memori data eksternal.
BAB 4
INTERRUPT PADA MIKROKONTROLER

Interrupt adalah suatu kejadian atau peristiwa yang menyebabkan mikrokontroler berhenti sejenak untuk
melayani interrupt tersebut. Program yang dijalankan pada saat melayani interrupt disebut Interrupt
Service Routine. Analoginya adalah sebagai berikut, seseorang sedang mengetik laporan, mendadak
telephone berdering dan menginterrupsi orang tersebut sehingga menghentikan pekerjaan mengetik dan
mengangkat telephone. Setelah pembicaraan telephone yang dalam hal ini adalah merupakan analogi dari
Interrupt Service Routine selesai maka orang tersebut kembali meneruskan pekerjaanya mengetik.

MCS-51 mengenal lima sumber interrupt, yaitu :


 External Interrupt 0
 Timer/Counter 0
 External Interrupt 1
 Timer/Counter 1
 Serial Port
User dapat mengaktifkan interrupt melalui SFR Interrupt Enable (IE)

Berikut ini adalah penjelasan masing-masing bit IE:


- EA
bernilai ‘0’ untuk mematikan semua interrupt. Jika EA bernilai ‘1’, aktivasi interrupt akan diatur oleh
bit masing-masing.
- ES
bernilai ‘1’ untuk mengaktifkan interrupt dari komunikasi serial.
- ET1
bernilai ‘1’ untuk mengaktifkan interrupt dari Timer/counter 1.
- EX1
bernilai ‘1’ untuk mengaktifkan interrupt dari External Interrupt 1.
- ET0
bernilai ‘1’ untuk mengaktifkan interrupt dari Timer/Counter 0
- EX0
bernilai ‘1’ untuk mengaktifkan interrupt dari External Interrupt 0.
BAB 5
KENDALI PEWAKTUAN DAN PENCACAHAN
Pada dasarnya timer dan counter merupakan sistem yang sama-sama menambahkan diri hingga
overflow. Timer dapat digunakan untuk menghitung suatu periode waktu antara kejadian, sebagai jarak
waktu antara kejadian, dan menghasilkan baud rate untuk komunikasi serial. Counter dapat digunakan
untuk menghitung jumlah munculnya suatu kejadian.
Misalkan terdapat sebuah ban berjalan yang memasukkan sejumlah permen ke dalam masing-masing
kantung plastik. Jika diinginkan sebuah kantung diisi dengan permen sebanyak 100 buah, maka sistem
tersebut dapat menggunakan counter untuk menghitung banyaknya permen. Jika diinginkan sebuah
kantung diisi dengan permen selama dua detik tanpa mempedulikan jumlah permen yang diisikan ke dalam
kantung, maka sistem tersebut dapat menggunakan timer untuk menghitung waktu pengisian kantung.
Register yang digunakan untuk mengatur timer/counter terdapat pada Timer Mode (TMOD) dan Timer
Control (TCON).

Berikut ini adalah penjelasan masing-masing bit TMOD:


- GATE
Jika GATE dan TRx (TR0 atau TR1 pada TCON) diberi nilai ‘1’ oleh user, maka Timer/Counter hanya
beroperasi jika pin INTx bernilai high. Jika GATE bernilai ‘0’, maka Timer/Counter hanya beroperasi
jika TRx bernilai ‘1’
- C/T
C/T harus diberi nilai ‘1’ oleh program user untuk menjalankan mode counter dan diberi nilai ‘0’
untuk menjalankan mode timer.
- M1 & M0
Ml dan MO merupakan dua bit pemilih mode operasi timer/counter,
Berikut ini adalah penjelasan masing-masing bit TCON yang berkaitan dengan timer/counter:
- TF1
diberi nilai ‘1’ secara hardware saat nilai Timer/Counter 1 (TH1 dan TLI) mengalami overflow. TF1
akan diberi nilai ‘0’ secara hardware saat mikrokontroler melompat ke Interrupt Service Routine.
- TR1
harus diberi nilai ‘1’ oleh program user untuk menjalankan Timer 1.
- TF0
diberi nilai ‘1’ secara hardware saat nilai Timer/Counter 0 (TH0 dan TL0) mengalami overflow. TF0
akan diberi nilai ‘0’ secara hardware saat mikrokontroler melompat ke Interrupt Service Routine.
- TR0
harus diberi nilai ‘1’ oleh program user untuk menjalankan Timer 0.

Timer/Counter memiliki 4 mode operasi. Setiap mode memiliki karakteristik tersendiri. User harus
benar-benar memahami masing-masing mode agar dapat memilih mode yang tepat dalam program yang
dibuat.

- MODE 0.
Mode 0 adalah timer/counter 13 bit. Mode ini disediakan terutama untuk menjaga
kompatibilitas dengan prosesor 8048. Pada mode 0, register TLx (TL0 atau TL1) hanya digunakan 5
bit terendah saja sedangkan register THx (TH0 atau TH1) tetap selebar 8 bit. TLx akan bertambah
hingga bernilai 1Fh. Saat ada perubahan nilai TLx dari 1Fh ke 00h, THx akan bertambah 1. Nilai
maksimal THx dan TLx adalah FF1Fh (THx = FFh dan TLx = 1Fh). Overflow akan terjadi jika ada
perubahan dari FF1Fh ke 0000h. Nilai THx dan TLx dapat diubah oleh user setiap saat dalam
program.
Gambar Timer/Counter mode 0

- MODE 1
Mode 1 pada dasarnya serupa dengan mode 0. Namun pada mode 1 semua bit TLx digunakan,
sehingga mode 1 merupakan timer/counter 16 bit. TLx akan bertambah hingga bernilai FFh. Saat
ada perubahan nilai TLx dari FFh ke 00h, THx akan bertambah 1. Nilai maksimal THx dan TLx adalah
FFFFh (THx = FFh dan TLx = FFh). Overflow akan terjadi jika ada perubahan dari FFFFh ke 0000h.
Nilai THx dan TLx dapat diubah oleh user setiap saat dalam program.

Gambar Timer/Counter mode 1

- MODE 2
Mode 2 adalah timer/counter 8 bit dengan fasilitas auto reload. TLx bertindak sebagai
timer/counter 8 bit. Sedangkan THx berisi suatu nilai tertentu. Auto reload adalah fasilitas dimana
nilai TLx setelah overflow tidak kembali ke 00h namun nilai TLx akan diambil dari nilai THx.
Misalkan THx berisi 47h dan TLx berisi FFh. Jika ada overflow pada TLx, nilai TLx akan berubah dari
FFh ke 47h, sesuai dengan nilai THx. Proses tersebut dikerjakan secara otomatis secara hardware
sehingga user tidak perlu memeriksa apakah nilai TLx sudah overflow dan tidak perlu mengisi ulang
dengan nilai yang baru. Mode 2 ini juga digunakan untuk menghasilkan baud rate.

Gambar Timer/Counter mode 2


- MODE 3
Pada mode 3, Timer/Counter 0 akan menjadi dua timer/counter 8 bit, sedangkan
Timer/Counter 1 akan berhenti. TL0 akan menjadi timer/counter 8 bit yang dikendalikan oleh bit
kontrol Timer/Counter 0 (meliputi GATE, C/T , TR0, INT0, dan TF0). TH0 akan menjadi timer 8 bit
(bukan counter) yang dikendalikan oleh bit kontrol Timer/Counter 1 (meliputi TR1 dan TF1). Jadi
TR1 mengendalikan TH0 dan Timer/Counter 1 secara bersamaan.

Gambar Timer/Counter mode 3

Timer/Counter 1 masih dapat dioperasikan dalam mode selain mode 3. Umumnya


Timer/counter 1 dioperasikan dalam mode 2 dan berfungsi sebagai penghasil baud rate. Jika user
ingin menghentikan Timer/Counter 1 tanpa menghentikan TH0, user dapat memindahkan
Timer/Counter 1 ke dalam mode 3.

Proses inisialisasi adalah proses menentukan nilai semua register yang berkaitan dengan
Timer/Counter yang akan digunakan agar Timer/Counter dapat berfungsi sebagaimana yang dikehendaki.
Register yang harus diatur terlebih dahulu meliputi :

1. TMOD dan TCON


Langkah pertama adalah menentukan mode yang akan digunakan (mode 0, 1, 2, atau 3) fungsi
yang dipilih (sebagai timer atau counter), dan jenis kontrol (external control melalui pin INTx atau
internal control melalui TRx). Pengaturan TCON dilakukan untuk menjalankan timer. Misalnya
Timer/Counter 0 digunakan sebagai timer dalam mode 2 dengan external control dan
Timer/Counter 1 digunakan sebagai counter dalam mode 1 dengan internal control, maka
instruksinya adalah sebagai berikut :
MOV TMOD, #01011010b
atau
MOV TMOD, #5Ah

Sedangkan untuk menjalankan kedua timer, instruksinya adalah sebagai beikut :


MOV TCON, #01010000b
atau
MOV TCON, #50h
atau
SETB TR0
SETB TR1
2. THx dan/atau TLx
Jika diperlukan, inisialisasi atau perubahan terhadap nilai THx dan/ atau TLx dapat dilakukan
denga cara mengisikan nilai tertentu ke dalam register tersebut. Misalnya register Timer/Counter 0
diisi dengan nilai 814Ah dan register Timer/Counter 1 diisi dengan nilai 0CF32h, maka instruksinya
adalah sebagai berikut :
MOV TH0, #81h
MOV TL0, #4Ah
MOV TH1, #0CFh
MOV TL1, #32h

3. IE dan/atau IP
Jika Timer/Counter yang diprogram akan digunakan sebagai sumber interrupt, maka IE
dan/atau IP juga harus diatur. Misalnya kedua Timer/Counter digunakan sebagai sumber interrupt
dengan prioritas Timer/Counter 1, maka instruksinya adalah sebagai berikut :
MOV IP, #00001000b
MOV IE, #10002020b
atau
MOV IP, #08h
MOV IE, #8Ah
atau
SETB PT1
SETB ET1
SETB ET0
SETB EA

Pembacaan nilai Timer/Counter dapat dilakukan dengan dua cara, pembacaan register Timer/Counter
(THx dan/atau TLx) secara langsung dan mendeteksi overflow.
Cara ini dilakukan dengan membaca register THx dan/atau TLx secara langsung. Jika Timer/Counter
dioperasikan dalam mode 2 atau mode 3, cara ini cukup mudah karena register yang dibaca hanya TLx
dan/atau THx yang masing-masing selebar 8 bit. Karena register MCS-51 secaraumum juga selebar 8 bit,
maka proses pembacaan satu nilai dapat dilakukan dalam satu instruksi.
Masalah mulai muncul jika Timer/Counter dioperasikan dalam mode 0 atau mode 1. Dalam kedua
mode tersebut THx dan TLx bersama-sama membentuk satu nilai selebar 13 bit atau 16 bit dan keduanya
tidak dapat dibaca sekaligus.
Jika TLx dibaca pada saat TLx bernilai 255 atau FFh lalu THx yang dibaca pada instruksi selanjutnya
bernilai 8, maka user akan mendapat nilai THx dan TLx sebesar 08FFh. Padahal yang terjadi sesungguhnya
adalah pada pembacaan pertama (pembacaan TLx), nilai THx dan TLx adalah 07FFh dan pada pembacaan
kedua (pembacaan THx), nilai THx dan TLx adalah 0800h (jika diasumsikan jarak antara kedua instruksi
adalah 1
machine cycle dan Timer/Counter difungsikan sebagai timer). Pada kasus yang sama, jika dilakukan
pembacaan terhadap THx terlebih dahulu sebelum pembacaan TLx, maka user akan mendapat nilai akhir
0700h (sebelum TLx overflow, THx bernilai 07h dan setelah TLx overflow, TLx bernilai 00h).
Hal ini dapat diatasi dengan cara melakukan pembacaan THx sebanyak dua kali, yaitu sebelum dan
sesudah pembacaan TLx. Dengan cara ini user dapat mengetahui apakah pembacaan register THx dan TLx
dilakukan pada saat TLx overflow atau tidak. Jika pembacaan pertama THx bernilai 07h, pembacaan TLx
bernilai 00h, dan pembacaan kedua THx bernilai 08h, maka user akan mengetahui bahwa kondisi yang
dibaca adalah pada saat THx dan TLx bernilai 07FFh, 0800h, dan 0801h (jika diasumsikan jarak antara
instruksi pembacaan adalah 1 machine cycle dan Timer/Counter difungsikan sebagai timer).
Cara yang lebih sering digunakan adalah dengan mendeteksi overflow. Cara ini digunakan jika user
tidak perlu mengetahui nilai sebenarnya dari THx dan TLx namun lebih membutuhkan saat terjadinya
overflow. Adanya overflow ditandai oleh nilai ‘1’ pada TFx (TCON.7 dan/atau TCON.5). Cara ini digunakan
jika user ingin menggunakan timer sebagai sebuah delay yang berdurasi tetap. Misalnya delay yang
dibutuhkan adalah 0,05 detik atau 50 milidetik dan diasumsikan 1 machine cycle membutuhkan waktu 1
mikrodetik (dengan menggunakan frekuensi kristal 12 MHz). Hal ini berarti timer harus bertambah dari 0
hingga 50000 untuk satu durasi delay. Karena overflow tidak terjadi pada nilai 50000 melainkan pada saat
nilai THx dan TLx kembali ke 0000h atau 65536 machine cycle dari nilai 0000h sebelumnya (dalam mode
1,16 bit), maka nilai awal THx dan TLx yang harus dimasukkan adalah 65536 - 50000 - 15536 atau 3CB0h.
Timer/Counter yang dioperasikan sebagai timer dapat digunakan untuk menghitung waktu dari sebuah
kejadian. Nilai timer bertambah tiap machine cycle (12 pulsa clock) sehingga kecepatan bertambahnya
adalah 1/12 dari frekuensi osilator.
Untuk mengukur durasi sebuah kejadian, user hanya pcrlu mengaktifkan timer pada saat kejadian
tersebut dimulai. Jika kejadian tersebut berakhir, user dapat menghentikan timer. Dengan cara ini user
mendapatkan sebuah nilai timer yang dapat digunakan sebagai dasar untuk menghitung lama waktu yang
sesungguhnya.
Timer/Counter yang dioperasikan sebagai counter dapat digunakan untuk menghitung jumlah kejadian
yang muncul. Karena counter membutuhkan transisi dari ‘1’ ke ‘0’ sebagai trigger, maka counter
membutuhkan waktu 2 machine cycle (24 pulsa clock) sebelum nilainya bertambah. Jadi counter mampu
membaca trigger dengan frekuensi 1/24 dari frekuensi osilator.
Counter sebenarnya dapat diaplikasikan dengan menggunakan general purpose I/O seperti port 1,
namun program harus terus-menerus memeriksa kondisi port 1. Jika kondisi port 1 tidak diperiksa terus-
menerus, pasti ada kejadian yang terlewat.
Dengan menggunakan Timer/Counter sebagai counter, maka MCS-51 akan selalu menghitung
munculnya kejadian yang ditandai dengan adanya trigger. User hanya perlu memeriksa nilai counter pada
saat yang ditentukan.
BAB 6
PEMROGRAMAN PADA MIKROKONTROLER

6.1 Dasar Pemrograman MCS51 (AT89C51, AT89S51, AT89C2051)


Program pengendali mikrokontroler disusun dari kumpulan instruksi, instruksi tersebut setara
dengan kalimat perintah bahasa manusia yang hanya terdiri atas predikat dan objek. Dengan demikian
tahap pertama pembuatan program pengendali mikrokontroler dimulai dengan pengenalan dan
pemahaman predikat (kata kerja) dan objek apa saja yang dimiliki mikrokontroler.

Objek dalam pemrograman mikrokontroler adalah data yang tersimpan di dalam memori, register
dan input/output. Sedangkan ‘kata kerja’ yang dikenal pun secara umum dikelompokkan menjadi
perintah untuk perpindahan data, arithmetik, operasi logika, pengaturan alur program dan beberapa
hal khusus. Kombinasi dari ‘kata kerja’ dan objek itulah yang membentuk perintah pengatur kerja
mikrokontroler.

Intruksi MOV A,$7F merupakan contoh sebuah intruksi dasar yang sangat spesifik, MOV
merupakan ‘kata kerja’ yang memerintahkan peng-copy-an data, merupakan predikat dalam kalimat
perintah ini. Sedangkan objeknya adalah data yang di-copy-kan, dalam hal ini adalah data yang ada di
dalam memori nomor $7F di-copy-kan ke Akumulator A.

Penyebutan data dalam MCS51


Data bisa berada diberbagai tempat yang berlainan, dengan demikian dikenal beberapa cara
untuk menyebut data (dalam bahasa Inggris sering disebut sebagai ‘Addressing Mode’), antara lain
sebagai berikut:

Penyebutan data konstan (immediate addressing mode): MOV A,#$20. Data konstan merupakan
data yang berada di dalam instruksi. Contoh instruksi ini mempunyai makna data konstan $20 (sebagai
data konstan ditandai dengan ‘#’) di-copy-kan ke Akumulator A. Yang perlu benar-benar diperhatikan
dalam perintah ini adalah bilangan $20 merupakan bagian dari instruksi.

Penyebutan data secara langsung (direct addressing mode), cara ini dipakai untuk menunjuk data
yang berada di dalam memori dengan cara menyebut nomor memori tempat data tersebut berada :
MOV A,$30. Contoh instruksi ini mempunyai makna data yang berada di dalam memori nomor $30 di-
copy-kan ke Akumulator. Sekilas intruksi ini sama dengan instruksi data konstan di atas, perbedaannya
instruksi di atas memakai tanda ‘#’ yang menandai $20 adalah data konstan, sedangkan dalam
instruksi ini karena tidak ada tanda ‘#’ maka $30 adalah nomor dari memori.

Penyebutan data secara tidak langsung (indirect addressing mode), cara ini dipakai untuk
menunjuk data yang berada di dalam memori, kalau memori penyimpan data ini letaknya berubah-
rubah sehingga nomor memori tidak disebut secara langsung tapi di-‘titip’-kan ke register lain : MOV
A,@R0. Dalam instruksi ini register serba guna R0 dipakai untuk mencatat nomor memori, sehingga
instruksi ini mempunyai makna memori yang nomornya tercatat dalam R0 isinya di-copy-kan ke
Akumulator A. Tanda ‘@’ dipakai untuk menandai nomor memori disimpan di dalam R0. Bandingkan
dengan instruksi penyebutan nomor memori secara langsung di atas, dalam instruksi ini nomor
memori terlebih dulu disimpan di R0 dan R0 berperan menunjuk memori mana yang dipakai, sehingga
kalau nilai R0 berubah memori yang ditunjuk juga akan berubah pula. Dalam instruksi ini register serba
guna R0 berfungsi dengan register penampung alamat (indirect address register), selain R0 register
serba guna R1 juga bisa dipakai sebagai register penampung alamat.

Penyebutan data dalam register (register addressing mode): MOV A,R5. Instruksi ini mempunyai
makna data dalam register serba guna R5 di-copy-kan ke Akumulator A. Instruksi ini membuat register
serba guna R0 sampai R7 sebagai tempat penyimpan data yang sangat praktis yang kerjanya sangat
cepat.
Data yang dimaksud dalam bahasan di atas semuanya berada di dalam memori data (termasuk
register serba guna letaknya juga di dalam memori data). Dalam penulisan program, sering-sering
diperlukan tabel baku yang disimpan bersama dengan program tersebut. Tabel semacam ini
sesungguhnya merupakan data yang berada di dalam memori program! Untuk keperluan ini, MCS51
mempunyai cara penyebutan data dalam memori program yang dilakukan secara indirect (code
indirect addressing mode) : MOVC A,@A+DPTR. Perhatikan dalam instruksi ini MOV digantikan dengan
MOVC, tambahan huruf C tersebut dimaksud untuk membedakan bahwa instruksi ini dipakai di
memori program. (MOV tanpa huruf C artinya instruksi dipakai di memori data). Tanda ‘@’ dipakai
untuk menandai A+DPTR dipakai untuk menyatakan nomor memori yang isinya di-copy-kan ke
Akumulator A, dalam hal ini nilai yang tersimpan dalam DPTR (Data Pointer Register - 2 byte) ditambah
dengan nilai yang tersimpan dalam Akumulator A (1 byte) dipakai untuk menunjuk nomor memori
program.

Kata kerja (instruksi) dalam MCS51


Secara keseluruhan AT89Cx051 mempunyai sebanyak 255 macam instruksi, yang dibentuk dengan
mengkombinasikan ‘kata kerja’ dan objek. “Kata kerja’ tersebut secara kelompok dibahas sebagai
berikut :

1. KELOMPOK PENG-COPY-AN DATA


Kode dasar untuk kelompok ini adalah MOV, singkatan dari MOVE yang artinya
memindahkan, meskipun demikian lebih tepat dikatakan perintah ini mempunyai makna peng-
copy-an data. Hal ini bisa dijelaskan berikut : setelah instruksi MOV A,R7 dikerjakan, Akumulator A
dan register serba guna R7 berisikan data yang sama, yang asalnya tersimpan di dalam R7.
Perintah MOV dibedakan sesuai dengan jenis memori AT89Cx051. Perintah ini pada memori
data dituliskan menjadi MOV, misalkan :
MOV A,$20
MOV A,@R1
MOV A,P1
MOV P3,A

Untuk pemakaian pada memori program, perintah ini dituliskan menjadi MOVC, hanya ada 2
jenis instruksi yang memakai MOVC, yakni:

MOVC A,@A+DPTR ; DPTR sebagai register indirect


MOVC A,@A+PC ; PC sebagai register indirect

Selain itu, masih dikenal pula perintah MOVX, yakni perintah yang dipakai untuk memori data
eksternal (X singkatakan dari External). Perintah ini hanya dimiliki oleh anggota keluarga MCS51
yang mempunyai memori data eksternal, misalnya AT89C51 dan lain sebagainya, dan jelas tidak
dikenal oleh kelompok AT89Cx051 yang tidam punya memori data eksternal. Hanya ada 6 macam
instruksi yang memakai MOVX, instruksi-instruksi tersebut adalah:

MOVX A,@DPTR
MOVX A,@R0
MOVX A,@R1
MOVX @DPTR,A
MOVX @R0,A
MOVX @R1,A

2. KELOMPOK ARIMATIK (ADD, ADDC, SUBB, DA, MUL dan DIV)


Perintah ADD dan ADDC
Isi Akumulator A ditambah dengan bilangan 1 byte, hasil penjumlahan akan ditampung
kembali dalam Akumulator. Dalam operasi ini bit Carry (C flag dalam PSW – Program Status Word)
berfungsi sebagai penampung limpahan hasil penjumlahan. Jika hasil penjumlahan tersebut
melimpah (nilainya lebih besar dari 255) bit Carry akan bernilai ‘1’, kalau tidak bit Carry bernilai ‘0’.
ADDC sama dengan ADD, hanya saja dalam ADDC nilai bit Carry dalam proses sebelumnya ikut
dijumlahkan bersama.
Bilangan 1 byte yang ditambahkan ke Akumulator, bisa berasal dari bilangan konstan, dari
register serba guna, dari memori data yang nomor memorinya disebut secara langsung maupun
tidak langsung, seperti terlihat dalam contoh berikut :

ADD A,R0 ; register serba guna


ADD A,#$23 ; bilangan konstan
ADD A,@R0 ; no memori tak langsung
ADD A,P1 ; no memori langsung (port 1)

Perintah SUBB
Isi Akumulator A dikurangi dengan bilangan 1 byte berikut dengan nilai bit Carry, hasil
pengurangan akan ditampung kembali dalam Akumulator. Dalam operasi ini bit Carry juga
berfungsi sebagai penampung limpahan hasil pengurangan. Jika hasil pengurangan tersebut
melimpah (nilainya kurang dari 0) bit Carry akan bernilai ‘1’, kalau tidak bit Carry bernilai ‘0’.

SUBB A,R0 ; A = A - R0 - C
SUBB A,#$23 ; A = A - $23
SUBB A,@R1
SUBB A,P0

Perintah DA
Perintah DA (Decimal Adjust) dipakai setelah perintah ADD; ADDC atau SUBB, dipakai untuk
merubah nilai biner 8 bit yang tersimpan dalam Akumulator menjadi 2 buah bilangan desimal yang
masing-masing terdiri dari nilai biner 4 bit.

Perintah MUL AB
Bilangan biner 8 bit dalam Akumulator A dikalikan dengan bilangan biner 8 bit dalam register
B. Hasil perkalian berupa bilangan biner 16 bit, 8 bit bilangan biner yang bobotnya lebih besar
ditampung di register B, sedangkan 8 bit lainnya yang bobotnya lebih kecil ditampung di
Akumulator A.
Bit OV dalam PSW (Program Status Word) dipakai untuk menandai nilai hasil perkalian yang
ada dalam register B. Bit OV akan bernilai ‘0’ jika register B bernilai $00, kalau tidak bit OV bernilai
‘1’.

MOV A,#10
MOV B,#20
MUL AB

Perintah DIV AB
Bilangan biner 8 bit dalam Akumulator A dibagi dengan bilangan biner 8 bit dalam register B.
Hasil pembagian berupa bilangan biner 8 bit ditampung di Akumulator, sedangkan sisa pembagian
berupa bilangan biner 8 bit ditampung di register B.
Bit OV dalam PSW (Program Status Word) dipakai untuk menandai nilai sebelum pembagian
yang ada dalam register B. Bit OV akan bernilai ‘1’ jika register B asalnya bernilai $00.
3. KELOMPOK LOGIKA (ANL, ORL dan XRL)
Kelompok perintah ini dipakai untuk melakukan operasi logika mikrokontroler MCS51,
operasi logika yang bisa dilakukan adalah operasi AND (kode operasi ANL), operasi OR (kode
operasi ORL) dan operasi Exclusive-OR (kode operasi XRL). Data yang dipakai dalam operasi ini bisa
berupa data yang berada dalam Akumulator atau data yang berada dalam memori-data, hal ini
sedikit berlainan dengan operasi aritmatik yang harus melihatkan Akumulator secara aktip. Hasil
operasi ditampung di sumber data yang pertama.

 Operasi logika AND banyak dipakai untuk me-‘0’-kan beberapa bit tertentu dari sebuah
bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data
konstan yang di-ANL-kan bilangan asal. Bit yang ingin di-‘0’-kan diwakili dengan ‘0’ pada
data konstan, sedangkan bit lainnya diberi nilai ‘1’, misalnya Instruksi ANL P1,#%01111110
akan mengakibatkan bit 0 dan bit 7 dari Port 1 (P1) bernilai ‘0’ sedangkan bit-bit lainnya
tetap tidak berubah nilai.
 Operasi logika OR banyak dipakai untuk me-‘1’-kan beberapa bit tertentu dari sebuah
bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data
konstan yang di-ORL-kan bilangan asal. Bit yang ingin di-‘1’-kan diwakili dengan ‘1’ pada
data konstan, sedangkan bit lainnya diberi nilai ‘0’, misalnya Instruksi ORL A,#%01111110
akan mengakibatkan bit 1 sampai dengan bit 6 dari Akumulator bernilai ‘1’ sedangkan bit-
bit lainnya tetap tidak berubah nilai.
 Operasi logika Exclusive-OR banyak dipakai untuk membalik nilai (complement) beberapa
bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan
biner 8 bit sebagai data konstan yang di-XRL-kan bilangan asal. Bit yang ingin dibalik-nilai
diwakili dengan ‘1’ pada data konstan, sedangkan bit lainnya diberi nilai ‘0’, misalnya
Instruksi XRL A,#%01111110 akan mengakibatkan bit 1 sampai dengan bit 6 dari
Akumulator berbalik nilai, sedangkan bit-bit lainnya tetap tidak berubah nilai.

Pada dasarnya program dijalankan intruksi demi instruksi, artinya selesai menjalankan satu
instruksi mikrokontroler langsung menjalankan instruksi berikutnya, untuk keperluan ini
mikrokontroler dilengkapi dengan Program Counter yang mengatur pengambilan intruksi secara
berurutan. Meskipun demikian, program yang kerjanya hanya berurutan saja tidaklah banyak
artinya, untuk keperluan ini mikrokontroler dilengkapi dengan instruksi-instruksi untuk mengatur
alur program.

Secara umum kelompok instruksi yang dipakai untuk mengatur alur program terdiri atas
instruksi-instruksi JUMP (setara dengan statemen GOTO dalam Pascal), instruksi-instruksi untuk
membuat dan memakai sub-rutin/modul (setara dengan PROCEDURE dalam Pascal), instruksi-
instruksi JUMP bersyarat (conditional Jump, setara dengan statemen IF .. THEN dalam Pascal). Di
samping itu ada pula instruksi PUSH dan POP yang bisa memengaruhi alur program.
Karena Program Counter adalah satu-satunya register dalam mikrokontroler yang mengatur
alur program, maka kelompok instruksi pengatur program yang dibicarakan di atas, semuanya
merubah nilai Program Counter, sehingga pada saat kelompok instruksi ini dijalankan, nilai
Program Counter akan tidak akan runtun dari nilai instruksi sebelumnya.
Selain karena instruksi-instruksi di atas, nilai Program Counter bisa pula berubah karena
pengaruh perangkat keras, yaitu saat mikrokontroler di-reset atau menerima sinyal interupsi dari
perangkat input/output. Hal ini akan dibicarakan secara detail dibagian lagi.

4. Kelompok Instruksi JUMP


Mikrokontroler menjalankan intruksi demi instruksi, selesai menjalankan satu instruksi
mikrokontroler langsung menjalankan instruksi berikutnya, hal ini dilakukan dengan cara nilai
Program Counter bertambah sebanyak jumlah byte yang membentuk instruksi yang sedang
dijalankan, dengan demikian pada saat instruksi bersangkutan dijalankan Program Counter selalu
menyimpan nomor memori-program yang menyimpan instruksi berikutnya.
Pada saat mikrokontroler menjalankan kelompok instruksi JUMP, nilai Program Counter yang
runtun sesuai dengan alur program diganti dengan nomor memori-program baru yang dikehendaki
programer.
Mikrokontroler MCS51 mempunyai 3 macam intruksi JUMP, yakni instruksi LJMP (Long
Jump), instruksi AJMP (Absolute Jump) dan instruksi SJMP (Short Jump). Kerja dari ketiga instruksi
ini persis sama, yakni memberi nilai baru pada Program Counter, kecepatan melaksanakan ketiga
instruksi ini juga persis sama, yakni memerlukan waktu 2 periode instruksi (jika MCS51 bekerja
pada frekuensi 12 MHz, maka instruksi ini dijalankan dalam waktu 2 mikro-detik), yang berbeda
dalam jumlah byte pembentuk instruksinya, instruksi LJMP dibentuk dengan 3 byte, sedangkan
instuksi AJMP dan SJMP cukup 2 byte.

5. Instruksi LJMP
Kode untuk instruksi LJMP adalah $02, nomor memori-program baru yang dituju dinyatakan
dengan bilangan biner 16 bit, dengan demikian instruksi ini bisa menjangkau semua memori-
program MCS51 yang jumlahnya 64 KiloByte. Instruksi LJMP terdiri atas 3 byte, yang bisa
dinyatakan dengan bentuk umum 02 aa aa, aa yang pertama adalah nomor memori-program bit 8
sampai dengan bit 15, sedangkan aa yang kedua adalah nomor memori-program bit 0 sampai
dengan bit 7.
Pemakaian instruksi LJMP bisa dipelajari dari potongan program berikut :

LJMP TugasBaru

ORG $2000
TugasBaru:
MOV A,P3.1

Dalam potongan program di atas, ORG adalah perintah pada assembler agar berikutnya
assembler bekerja pada memori-program nomor yang disebut di belakang ORG (dalam hal ini
minta assembler berikutnya bekerja pada memori-program nomor $2000). TugasBaru disebut
sebagai LABEL, yakni sarana assembler untuk menandai/ menamai nomor memori-program.
Dengan demikian, dalam potongan program di atas, memori-program nomor $2000 diberi nama
TugasBaru, atau bisa juga dikatakan bahwa TugasBaru bernilai $2000. (Catatan : LABEL ditulis
minimal satu huruf lebih kiri dari instruksi, artinya LABEL ditulis setelah menekan tombol Enter,
tapi instruksi ditulis setelah menekan tombol Enter, kemudian diikuti dengan 1 tombol spasi atau
tombol TAB). Dengan demikian intruksi LJMP TugasBaru di atas, sama artinya dengan LJMP $2000
yang oleh assembler akan diterjemahkan menjadi 02 20 00 (heksadesimal).

6. Instruksi AJMP
Nomor memori-program baru yang dituju dinyatakan dengan bilangan biner 11 bit, dengan
demikian instruksi ini hanya bisa menjangkau satu daerah memori-program MCS51 sejauh 2
KiloByte. Instruksi AJMP terdiri atas 2 byte, byte pertama merupakan kode untuk instruksi AJMP
(00001b) yang digabung dengan nomor memori-program bit nomor 8 sampai dengan bit nomor
10, byte kedua dipakai untuk menyatakan nomor memori-program bit nomor 0 sampai dengan bit
nomor 7. Berikut ini adalah potongan program untuk menjelaskan pemakaian instruksi AJMP:

ORG $800
AJMP DaerahIni
AJMP DaerahLain
ORG $900
DaerahIni:
...
ORG $1000
DaerahLain:
...

Potongan program di atas dimulai di memori-program nomor $800, dengan demikian


instruksi AJMP DaerahIni bisa dipakai, karena nomor-memori $800 (tempat instruksi AJMP
DaerahIni) dan LABEL DaerahIni yang terletak di dalam satu daerah memori-progam 2 KiloByte
yang sama dengan. (Dikatakan terletak di dalam satu daerah memori-program 2 KiloByte yang
sama, karena bit nomor 11 sampai dengan bit nomor 15 dari nomor memorinya sama).
Tapi AJMP DaerahLain akan di-salah-kan oleh Assembler, karena DaerahLain yang terletak di
memori-program nomor $1000 terletak di daerah memori-program 2 KiloByte yang lain.
Karena instruksi AJMP hanya terdiri dari 2 byte, sedangkan instruksi LJMP 3 byte, maka
memakai instruksi AJMP lebih hemat memori-program dibanding dengan LJMP. Hanya saja karena
jangkauan instrusksi AJMP hanya 2 KiloByte, pemakaiannya harus hati-hati.
Memori-program IC mikrokontroler AT89C1051 dan AT89C2051 masing-masing hanya 1
KiloByte dan 2 KiloByte, dengan demikian program untuk kedua mikrokontroler di atas tidak perlu
memakai instruksi LJMP, karena program yang ditulis tidak mungkin menjangkau lebih dari 2
KiloByte memori-program.

7. Instruksi SJMP
Nomor memori-program dalam instruksi ini tidak dinyatakan dengan nomor memori-
program yang sesungguhnya, tapi dinyatakan dengan ‘pergeseran relatip’ terhadap nilai Program
Counter saat instruksi ini dilaksanakan.
Pergeseran relatip tersebut dinyatakan dengan 1 byte bilangan 2’s complement, yang bisa
dipakai untuk menyakatakan nilai antara –128 sampai dengan +127. Nilai minus dipakai untuk
menyatakan bergeser ke instruksi-instruksi sebelumnya, sedangkan nilai positip untuk menyatakan
bergeser ke instruksi-instruksi sesudahnya.
Meskipun jangkauan instruksi SJMP hanya –128 sampai +127, tapi instruksi ini tidak dibatasi
dengan pengertian daerah memori-program 2 KiloByte yang membatasi instruksi AJMP.

ORG $0F80
SJMP DaerahLain
...
ORG $1000
DaerahLain:

Dalam potongan program di atas, memori-program $0F80 tidak terletak dalam daerah
memori-program 2 KiloByte yang sama dengan $1000, tapi instruksi SJMP DaerahLain tetap bisa
dipakai, asalkan jarak antara instruksi itu dengan LABEL DaerahLain tidak lebih dari 127 byte.
Kelompok Instruksi untuk sub-rutin
Instruksi-instruksi untuk membuat dan memakai sub-rutin/modul program, selain melibatkan
Program Counter, melibatkan pula Stack yang diatur oleh Register Stack Pointer.
Sub-rutin merupakan suatu potong program yang karena berbagai pertimbangan dipisahkan
dari program utama. Bagian-bagian di program utama akan ‘memanggil’ (CALL) sub-rutin, artinya
mikrokontroler sementara meninggalkan alur program utama untuk mengerjakan instruksi-
instruksi dalam sub-rutin, selesai mengerjakan sub-rutin mikrokontroler kembali ke alur program
utama.
Satu-satunya cara membentuk sub-rutin adalah memberi instruksi RET pada akhir potongan
program sub-rutin. Program sub-rutin di-’panggil’ dengan instruksi ACALL atau LCALL.
Agar nantinya mikrokontroler bisa meneruskan alur program utama, pada saat menerima
instruksi ACALL atau LCALL, sebelum mikrokontroler pergi mengerjakan sub-rutin, nilai Program
Counter saat itu disimpan dulu ke dalam Stack (Stack adalah sebagian kecil dari memori-data yang
dipakai untuk menyimpan nilai Program Counter secara otomatis, kerja dari Stack dikendalikan
oleh Register Stack Poiner).
Selanjutnya mikrokontroler mengerjakan instruksi-instruksi di dalam sub-rutin sampai
menjumpai instruksi RET yang berfungsi sebagai penutup dari sub-rutin. Saat menerima instruksi
RET, nilai asal Program Counter sebelum mengerjakan sub-rutin yang disimpan di dalam Stack,
dikembalikan ke Program Counter sehingga mikrokontroler bisa meneruskan pekerjaan di alur
program utama.
Instruksi ACALL dipakai untuk me-‘manggil’ program sub-rutin dalam daerah memori-
program 2 KiloByte yang sama, setara dengan instruksi AJMP yang sudah dibahas di atas.
Sedangkan instruksi LCALL setara dengan instruksi LCALL, yang bisa menjangkau seluruh memori-
program mikrokontroler MCS51 sebanyak 64 KiloByte. (Tapi tidak ada instrusk SCALL yang setara
dengan instruksi SJMP).
Program untuk AT89C1051 dan AT89C2051 tidak perlu memakai instruksi LCALL.
Instruksi RET dipakai untuk mengakhiri program sub-rutin, di samping itu masih ada pula
instruksi RETI, yakni instruksi yang dipakai untuk mengakhiri Program Layanan Interupsi (Interrupt
Service Routine), yaitu semacam program sub-rutin yang dijalankan mikrokontroler pada saat
mikrokontroler menerima sinyal permintaan interupsi.
Catatan : Saat mikrokontroler menerima sinyal permintaaan interupsi, mikrokontroler akan
melakukan satu hal yang setara dengan intruksi LCALL untuk menjalankan Program Layanan
Interupsi dari sinyal interupsi bersangkutan. Di samping itu, mikrokontroler juga me-‘mati’-kan
sementara mekanisme layanan interupsi, sehingga permintaan interupsi berikutnya tidak dilayani.
Saat menerima instruksi RETI, makanisme layanan interusi kembali diaktipkan dan mikrokontroler
melaksanakan hal yang setara dengan instruksi RET.

8. Kelompok Instruksi Jump Bersyarat


Instruksi Jump bersyarat merupakan instruksi inti bagi mikrokontroler, tanpa kelompok
instruksi ini program yang ditulis tidak banyak berarti. Instruksi-instruksi ini selain melibatkan
Program Counter, melibatkan pula kondisi-kondisi tertentu yang biasanya dicatat dalam bit-bit
tertentu yang dihimpun dalam Register tertentu.
Khusus untuk keluarga mikrokontroler MCS51 yang mempunyai kemampuan menangani
operasi dalam level bit, instruksi jump bersyarat dalam MCS51 dikaitkan pula dengan kemampuan
operasi bit MCS51.
Nomor memori-program baru yang harus dituju tidak dinyatakan dengan nomor memori-
program yang sesungguhnya, tapi dinyatakan dengan ‘pergeseran relatip’ terhadap nilai Program
Counter saat instruksi ini dilaksanakan. Cara ini dipakai pula untuk instruksi SJMP.
Instruksi JZ / JNZ
Instruksi JZ (Jump if Zero) dan instruksi JNZ (Jump if not Zero) adalah instruksi JUMP
bersyarat yang memantau nilai Akumulator A.

MOV A,#0
JNZ BukanNol
JZ Nol
...
BukanNol:
...
Nol :
...

Dalam contoh program di atas, MOV A,#0 membuat A bernilai nol, hal ini mengakibatkan
instruksi JNZ BukanNol tidak akan pernah dikerjakan (JNZ artinya Jump kalau nilai A<>0, syarat ini
tidak pernah dipenuhi karena saat instruksi ini dijalankan nilai A=0), sedangankan instruksi JZ Nol
selalu dikerjakan karena syaratnya selalu dipenuhi.
Instruksi JC / JNC
Instruksi JC (Jump on Carry) dan instruksi JNC (Jump on no Carry) adalah instruksi jump
bersyarat yang memantau nilai bit Carry di dalam Program Status Word (PSW).
Instruksi JB / JNB / JBC
Instruksi JB (Jump on Bit Set), instruksi JNB (Jump on not Bit Set) dan instruksi JBC (Jump on
Bit Set Then Clear Bit) merupakan instruksi Jump bersyarat yang memantau nilai-nilai bit tertentu.
Bit-bit tertentu bisa merupakan bit-bit dalam register status maupun kaki input mikrokontroler
MCS51.
Kelompok Instruksi proses dan test
Instruksi-instruksi Jump bersyarat yang dibahas di atas, memantau kondisi yang sudah terjadi
yang dicatat MCS51. Ada dua instruksi yang melakukan dulu suatu proses baru kemudian
memantau hasil proses untuk menentukan apakah harus Jump. Kedua instruksi yang dimaksud
adalah instruksi DJNZ dan instruksi CJNE.
Instruksi DJNZ
Instruksi DJNZ (Decrement and Jump if not Zero), merupakan instruksi yang akan mengurangi
1 nilai register serbaguna (R0..R7) atau memori-data, dan Jump jika ternyata setelah pengurangan
1 tersebut hasilnya tidak nol.
Contoh berikut merupakan potongan program untuk membentuk waktu tunda secara
sederhana :

MOV R0,#$23
DJNZ R0,$

Instruksi MOV R0,#$23 memberi nilai $23 pada R0, selanjutnya setiap kali instruksi DJNZ R0,$
dikerjakan, MCS51 akan mengurangi nilai R0 dengan ‘1’, jika R0 belum menjadi nol maka MCS51
akan mengulang instruksi tersebut (tanda $ dalam instruksi ini maksudnya adalah kerjakan kembali
instruksi ini). Selama mengerjakan 2 instruksi di atas, semua pekerjaan lain akan tertunda, waktu
tundanya ditentukan oleh besarnya nilai yang diisikan ke R0.

Instruksi CJNE
Instruksi CJNE (Compare and Jump if Not Equal) membandingkan dua nilai yang disebut dan
MCS akan Jump kalau kedua nilai tersebut tidak sama!

MOV A,P1
CJNE A,#$0A,TidakSama
...
SJMP EXIT
;
TidakSama:
...

Instruksi MOV A,P1 membaca nilai input dari Port 1, instruksi CJNE A,#$0A,Tidaksama
memeriksa apakah nilai Port 1 yang sudah disimpan di A sama dengan $0A, jika tidak maka Jump
ke Tidak Sama.

Operasi Bit dengan MCS51


Pada umumnya mikrokontroler mengolah data 8 bit sekali gus, misalnya mengisi akumulator
dengan data 8 bit sekali gus, isi akumulator yang 8 bit dijumlahkan dengan isi memori yang 8 bit dan
lain sebagainya. MCS51 dilengkapi kemampuan mengolah data per bit, untuk keperluan ini bit Carry
dalam PSW diperlakukan sebagai ‘akumulator bit’, dan dilengkapi dengan beberapa instruksi khusus
untuk operasi Boolean.

Objek operasi Bit


Seperti sudah dibahas dibagian depan, memori-data nomor $20 sampai $2F bisa dipakai
menampung informasi dalam level bit. Setiap byte memori di daerah ini bisa menampung 8 bit
informasi yang masing-masing dinomori tersendiri, misalkan bit 0 dari memori-data nomor $20 bisa
disebut sebagai bit nomor 0, bit 1 memori-data nomor $20 disebut sebagai bit nomor 1… seterusnya
bit 0 dari memori-data nomor $21 disebut sebagai bit nomor 8, bit 7 memori-data nomor $21 disebut
sebagai bit nomor 15 dan seterusnyanya.
Dengan demikian memori-data nomor $20 sampai dengan nomor $2F sebanyak 16 byte memori
bisa dipakai untuk menyimpan 128 bit (16 x 8 bit) data Boolean yang dinomori dengan bit nomor $00
sampai $7F.
Di samping itu, operasi bit bisa pula belaku di memori-data nomor $80 sampai dengan $FF yang
biasa disebut sebagai Special Function Register (SFR). Hanya SFR dengan nomor memori-data yang
diakhiri dengan angka heksa-desimal 0 atau 8 yang bisa dipakai untuk operasi bit, bit pada memori-
data daerah ini sebanyak 128 bit, mendapat nomor dari $80 sampai dengan $FF.

6.2 Program Flow


Secara default, MCS-51 akan selalu memulai dari alamat 0000h dan kemudian Pogram Counter (PC)
akan bertambah sesuai dengan instruksi yang diproses. Program-program sederhana umumnya hanya
memiliki satu alur dimana program akan dimulai dari alamat terendah ke alamat berikutnya yang lebih
besar secara berurutan, hingga program diakhiri pada alamat tertentu. Program yang lebih secara
kompleks akan memiliki alur dimana PC tidak selalu berurutan. Di dalam program akan terdapat
instruksi untuk melompat ke alamat-alamat tertentu.

1. DIRECT JUMP
Merupakan proses dimana program akan melompat ke alamat tertentu. Alamat ini dapat berlokasi
sebelum ataupun sesudah alamat saat ini. Direct Jump ini umumnya digunakan untuk melompat
daerah Interrupt Vector Address atau melompat ke awal rutin loop.
Contoh :
AJMP Start
Start: MOV …,#.....
MOV …,# ......h
MOV …,#.....h

2. CONDITIONAL BRANCHING
Merupakan proses dimana sebuah program memiliki dua pilihan alur dimana alur yang melewati
tergantung dari persyaratan yang diperiksa. Jika persyaratan terpenuhi, program akan melompat
ke
suatu alamat tertentu. Jika persyaratan tidak terpenuhi, program akan berlanjut ke baris
berikutnya atau melompat ke suatu alamat lain.
Contoh:
CJNE R7, #60H, NOT_EQ
; …… ;R7=60H
NOT_EQ: JC REG_LOW
; …… ;R7>60H
REG_LOW: …… ;R7<60H

3. DIRECT CALL
Adalah proses memanggil sebuah subrutin pada alamat tertentu. Saat MCS-51 mengeksekusi
Direct Call, PC akan disimpan ke dalam stack dan program melompat ke subrutin yang di panggil
untuk di proses subrutin tersebut.
Contoh:
ACALL Delay
Delay: ………….h
PUSH 06h
PUSH 05h
MOV ….,#........h

4. RETURN FROM SUBROUTINE


Merupakan pasangan dari Direct Call. Proses ini merupakan proses dimana program akan keluar
dari subrutin untuk melanjutkan proses selanjutnya yang tertunda oleh Direct Call. Instruksi untuk
proses ini adalah RET. Saat MCS-51 mengeksekusi RET, PC akan diambil dari stack dan program
kembali ke baris setelah baris yang mengeksekusi Direct Call.
Contoh:
ACALL Delay
ACALL …………
Delay: ………… h
PUSH 06h
PUSH 05h
RET

5. INTERRUPT
Adanya Interrupt membuat program utama terhenti sebentar untuk menjalankan Interrupt Service
Rountine. Pada dasarnya proses mengeksekusi interrupt sama dengan melakukan Direct Call ke
Interrupt Vector Addres dan Return From Subroutine pada akhirnya Interrupt Service Routine.
Perbedaannya adalah pada penggunaan RETI dan bukan RET.
Contoh:
INTER0: MOV P1,#0H
SETB P1.0
LCALL LDELAY
CLR P1.0
RETI

6.3 Perulangan
1. IF… THEN
Dengan pernyataan ini kita dapat menguji sebuah kondisi tertentu dan kemudian
menentukan tindakan yang sesuai dengan kondisi yang diinginkan. Sintak penulisannya adalah
sebagai berikut:

IF <Syarat Kondisi> THEN <Pernyataan>

Sintak diatas digunakan jika hanya ada satu kondisi yang diuji dan hanya melakukan satu
tindakan. Jika melakukan lebih dari satu tindakan maka sintaknya harus ditulis sebagai berikut:

IF <Syarat kondisi> THEN

<Pernyataan ke-1>

<Pernyataan ke-2>

<Pernyataan ke-n>

END IF

2. SELECT… CASE

Perintah ini akan mengeksekusi beberapa blok pernyataan tergantung dari nilai variabelnya.
Perintah ini mirip dengan perintah IF... THEN, namun perintah ini memiliki kelebihan yaitu
kemudahan pada penulisannya. Sintaknya adalah sebagai berikut:
SELECT CASE Variabel

CASE test1 : statement

CASE test2 : statement

CASE ELSE : statement

END SELECT

3. WHILE… WEND

Perintah ini mengeksekusi sebuah pernyataan secara berulang ketika masih menemukan
kondisi yang sama. Perintah ini akan berhenti jika ada perubahan kondisi dan melakukan perintah
selanjutnya. Sintaknya sebagai berikut:

WHILE <Syarat kondisi>

<Pernyataan>

WEND

4. DO… LOOP

Perintah Do... Loop digunakan untuk mengulangi sebuah blok pernyataan terus menerus.
Untuk membatasi pengulangannya dapat ditambahkan sebuah syarat kondisi agar perulangan
berhenti dan perintahnya menjadi Do... loop Until. Sintak penggunaan perintah ini adalah sebagai
berikut:

Do

<Blok pernyataan>

Loop

Yang menggunakan perintah Do Loop Until

Do

<Blok pernyataan>

Loop Until <syarat kondisi>

5. FOR… NEXT

Perintah ini digunakan untuk mengeksekusi sebuah blok pernyataan secara berulang.
Perintah ini hampir sama dengan perintah Do... Loop, namun pada perintah For... Next ini nilai
awal dan akhir perulangan serta tingkat kenaikan atau turunnya bisa ditentukan.

Penggunaannya sebagai berikut:


For var = start To/Downto end [Step value]

<Blok pernyataan>

Next

Untuk menaikan nilai perulangan gunakan To dan untuk menurunkan gunakan Downto. Tingkat
kenaikan merupakan pilihan, jadi bisa digunakan ataupun tidak. Jika nilai kenaikan tidak ditentukan
maka secara otomatis BASCOM akan menentukan nilainya yaitu 1.

6. EXIT
Perintah ini digunakan untuk keluar secara langsung dari blok program For... Next, Do... Loop,
Sub... Endsub, While... Wend. Sintak penulisannya adalah sebagai berikut:

Exit [Do] [For] [While] [Sub]

Sintak selanjutnya setelah EXIT bisa bermacam-macam tergantung perintah exit itu berada
dalam perintah apa. Jika dalam perintah Do... Loop maka sintaknya menjadi Exit Do.

7. GOSUB
Dengan perintah GOSUB program akan melompat ke sebuah label dan akan menjalan-kan
program yang ada dalam rutin tersebut sampai menemui perintah Return. Perintah Return akan
mengembalikan program ke titik setelah perintah Gosub.

8. GOTO
Perintah GOTO digunakan untuk melakukan percabangan, perbedaannya dengan GOSUB
ialah Perintah GOTO tidak memerlukan perintah Return sehingga programnya tidak akan kembali
lagi ke titik dimana perintah GOTO itu berada. Berikut ini adalah sintak perintah GOTO:

GOTO label

Label:

Panjang label maksimal ialah 32 karakter.


BAB 7
ADDRESSING MODE DAN INSTRUKSI PADA MIKROKONTROLER

7.1 Addressing Mode


Addressing adalah proses mengakses sebuah lokasi memori, baik untuk pembacaan ataupun
penulisan. Cara untuk mengakses lokasi memori dapat digolongkan ke dalam beberapa kelompok,
antara lain : direct, indirect, dan immediate.

1. Register Addressing
Register Addressing adalah proses mengakses memori dengan label antara R0 hingga R7
Contoh : MOV A, R1
Jika register bank yang digunakan adalah register bank 0, maka nilai pada alamat 01h (R1) akan
diisika ke Accumulator.

2. Direct Addressing
Sesuai dengan namanya, Direct Addressing adalah mengakses sebuah lokasi memori secara
langsung dengan menggunakan alamatnya.
Contoh : MOV A, 47h
Isi dari alamat 47h akan langsung dipindah ke Accumulator.

3. Indirect Addressing
Indirect Addressing adalah proses mengakses alamat secara tak langsung.
Contoh: MOV A, @R0
Misalkan R0 berisi 35h dan alamat 35h berisi 60h. Pada saat instruksi tersebut diproses. CPU akan
memeriksa isi R0. Karena R0 berisi 35h, maka CPU akan mengambil isi dari alamat 35h tersebut
kemudian diisikan ke Accumulator. Di akhir proses Accumulator akan menyimpan nilai 60h.

4. Immediate Addressing
Immediate Addressing adalah proses mengisi suatu alamat memori dengan suatu nilai tertentu.
Contoh : MOV A, #30h
Nilai 30h akan langsung diisikan ke dalam Accumulator.

5. Relative Addressing
Relative Addressing digunakan pada instruksi untuk melompat ke alamat tertentu. Pada Relative
Addressing. sebuah Relative Address atau Offset selebar 8 bit akan dijumlahkan dengan Program
Counter sehingga menjadi alamat yang dituju. Karena Relative Address hanya selebar 8 bit, maka
Relative-Addressing hanya dapat dipakai untuk melompat dalam jangkauan 128 byte ke belakang
hingga 127 byte ke depan (-l28 s/d+ 127).
Contoh : SJMP SINI
sedangkan alamat label SINI adalah 1120h. Setelah instruksi tersebut diproses, PC meniadi bernilai
1102h. Berarti Relative Address-nya bernilai Fh (1102h + 000Fh = 1120h). Jika alamat label SINI
10F2h, maka Relative Address-nya bernilai -16 atau F0h. Dalam perhitungannya F0h akan diubah
dalam 16 bit
hingga menjadi FFF0h (1102h + FFF0h = 10F2h).
Relative Addressing lebih fleksibel dipakai karena tidak terpengaruh oleh lokasi memori, namun
jangkauannya terbatas.

6. Absolute Addressing
Absolute Addressing adalah melompat atau memanggil alamat yang dituju dengan menyatakan
lokasi alamatnya secara langsung (tidak menggunakan offset). Absolute Addresing hanya
digunakan dalam AJMP dan ACALL. Kapasitas internal program memory sebesar 64 KB dibagi
menjadi 32 pages dengan kapasitas masing-masing page sebesar 2 KB (0000h - 07FFh, 0800h -
0FFFh, dst.). Alamat yang dituju langsung dinyatakan dalam 16 bit dimana 5bit teratas
menunjukkan 2 KB page dan 11 bit terbawah menunjukkan alamat dalam 2 KB page tersebut. Saat
Absolute Addressing digunakan, bagian yang berubah hanyalah 11 bit terbawah, sedangkan 5 bit
teratas tetap.
Contoh : AJMP SINI
Misalkan alamat instruksi tersebut berada pada 1810h (0001100000010000b) dan 1811h
(0001100000010001b) sedangkan alamat label SINI adalah 1F1Fh (0001111100011111b). Semua
alamat memiliki 5 bit teratas yang sama (00011) sedangkan l1 bit sisanya bernilai sesuai alamat
yang dituju, yaitu 11100011111. Jangkauan Absolute Addressing lebih jauh dari pada Relative
Addressing, namun jangkauannya hanya dalam 2 KB page yang sama. Oleh karena itu Absolute
Addressing tidak dapat digunakan untuk melompat dari alamat 07F0h (0000011111110000b) ke
alamat 0810h (0000100000010000b) meskipun jarak keduanya hanya sebesar 20h.

7. Long Addressing
Long Addressing adalah melompat atau memanggil alamat yang dituju dengan menyatakan
lokasi alamatnya secara langsung (tidak menggunakan offset). Long Addressing hanya digunakan
dalam LJMP dan LCALL. Alamat yang dituju dinyatakan dalam 16 bit yang dapat dipakai semuanya
sehingga dapat melompat sejauh mungkin dalam jangkauan 64 KB.
Contoh : LJMP SINI

Jangkauan Long Addressing paling jauh daripada Relative atau Absolute Addressing, namun
instruksi Long Addressing memiliki lebar 3 byte sedangkan Relative dan Absolute Addressing
masing-masing hanya selebar 2 byte.Untuk program-program yang memiliki ruang program
memori terbatas, akan lebih baik jika Long Addressing hanya digunakan untuk melompat ke lokasi
yang berada di luar jangkauan Relative dan Absolute Addressing.

8. Indexed Addressing
Indexed Addressing adalah proses mengakses suatu alamat dengan menggunakan indeks dan
register basis (berupa DPTR atau PC). Instruksi yang menggunakan Indexed Addressing adalah :
MOVC A, @A+<register basis> dan JMP @A+DPTR.
Contoh : MOVC A, @A+DPTR

Misalkan DPTR berniat 1000h, Accumulator bemilai 2h, dan alamat 1002h menyimpan nilai
FFh. Saat instruksi tersebut diproses, CPU akan mengambil data pada alamat 1002h (1000h + 2h)
dan mengisikannya ke Accumulator. Diakhir proses, Accumulator akan menyimpan nilai FFh.
Indexed Addressing ini umumnya digunakan untuk mengakses lookup table. Dengan menetapkan
nilai register basis terlebih dahulu, user hanya perlu mengubah nilai Accumulator untuk
mendapatkan nilai-nilai dalam tabel.

7.2 Instruksi Pada Mikrokontroler


1. MOV
Perintah ini digunakan untuk operasi pertambahan
contoh :

 Mov a, p3 : menyalin isi data pada port 3 ke dalam akumulator


 Mov p3, r5 :menyalin isi data yang nilainya yang terdapat pada register5 ke dalam port 3
 MOV CX, 0Ah :mengisikan jumlah loop yang ingin dilakukan denganperincian 0-9 terdiri dari 10
angka
 MOV DL,30h : bilangan ASCII yang sama dengan 30 hexa adalah ‘0’ yang akan dicetak dahulu
dan dimasukkan ke dalam DLsesuai dengan Int 21 hexa service 02 hexa
 MOV AH,02 h :AH diisi dengan service number dari interrupt
2. INC
Perintah yang digunakan untuk melakukan penambahan 1
Contoh :

 INC A : Meningkatkan Akumulator sebesar 1 bit


 INC Rn : Meningkatkan Register
 INC DL : Menambahkan DL dengan 1
 INC @R1 : Data pada alamat R1 ditambah 1
 INC @Ri : Meningkatkan RAM tidak langsung

3. JMP (JUMP)
Perintah yang digunakan untuk melompat ke suatu label yang dituju
Contoh :

 Sjmp anda : lompat atau jalankan langsung program pada label anda
 Sjmp proses : lompat atau jalankan langsung program pada label proses
 Ljmp 500h : lompat atau jalankan langsung program pada alamat memori 100h
 JMP 0203 : lompat ke arah lokasi memori offset:0203
 CMP BX,0230 : membandingjan BX dengan 0230

4. ADD
Perintah yang digunakan untuk operasi penambahan
Contoh :

 ADD A,Rn : menambahkan register ke akumulator


 ADD A,@Ri : menambahkan RAM tidak langsung ke akumulator
 ADD A, #DATA : menambahkan data segera ke akumulator
 ADDC A, Rn : menambahkan register ke akumulator dengan carry
 ADDC A, @Ri : menambahkan RAM tidak langsung ke akumulator dengan carry

5. SUB
Perintah yang digunakan untuk pengurangan
Contoh :

 SUBB A, Rn : mengurangi register dari akumulator dengan borrow


 SUBB A, @Ri : mengurangi RAM tidak langsung dari akumulator dengan borrow
 SUBB A, #DATA : mengurangi data segera dari akumulator dengan borrow
 SUBB A, langsung : mengurangi byte langsung dari akumulator dengan borrow
 SUB A, 00H : mengurangi data pada alamat memori 00H dengan borrow

6. DEC
Perintah yang digunakan untuk melakukan pengurangan 1
Contoh :

 DEC A : Menurunkan akumulator


 DEC Rn : Menurunkan Register
 DEC LANGSUNG : Menurunkan RAM langsung
 DEC @Ri : Menurunkan RAM tidak langsung
 DEC 06H : 06H – 1 = 05H

7. MUL
Perintah yang digunakan untuk melakukan operasi perkalian
Contoh :

 MUL AB : Mengalikan A & B


 MUL BL : mengalikan nilai register BL dengan nilai register AL dandisimpan di register AX
 MUL BX : Mengalikan nilai register BX dengan nilai register AX dandisimpan di register DX
 MUL BC : Mengalikan nilai register BC dengan nilai register AC dandisimpan di register DC
 MUL BZ : Mengalikan nilai register BZ dengan nilai register AZ dandisimpan di register DZ
 MUL BD : Mengalikan nilai register BD dengan nilai register AD dandisimpan di register DD

8. DIV
Perintah yang digunakan untuk melakukan operasi pembagian
Contoh :

 DIV A,B : membagi nilai A dengan B


 DIV B,C : membagi nilai B dengan C
 DIV C,D : membagi nilai C dengan D
 DIV D,E : membagi nilai D dengan E
 DIV E,F : membagi nilai E dengan F

9. ANL
Perintah yang digunakan untuk operasi logika AND
COntoh :

 ANL A,05H : Proses AND terhadap A ke 05H


 ANL A,@R0 : Proses AND terhadap A ke RAM
 ANL A,#50H : Proses AND terhadap A ke data pada alamat memori 50H
 ANL 07H, A : Proses AND terhadap 07H ke Akumulator
 ANL 07H, #02H : Proses AND terhadap 07H ke 02H

10. ORL
Perintah yang digunakan untuk operasi logika OR
Contoh:

 ORL A, 07H : proses OR terhadap Akumulator ke 07H


 ORL A, @R0 : Proses OR terhadap A ke RAM
 ORL A,#60H : Proses OR terhadap A ke data pada alamat memori 60H
 ORL 08H, A : Proses OR terhadap 08H ke Akumulator
 ORL 09H, #03H : Proses OR terhadap 09H ke 03H

11. XRL
Perintah yang digunakan untuk operasi logika XOR
Contoh:

 XRL A, 07H : proses XOR terhadap Akumulator ke 07H


 XRL A, @R0 : Proses XOR terhadap A ke RAM
 XRL A,#60H : Proses XOR terhadap A ke data pada alamat memori 60H
 XRL 08H, A : Proses XOR terhadap 08H ke Akumulator
 XRL 09H, #03H : Proses XOR terhadap 09H ke 03H

12. CLR
Perintah yang digunakan untuk mereset data
Contoh:
 CLR A : Proses untuk menghapus data A
 CLR B : Proses untuk menghapus data B
 CLR C : Proses untuk menghapus data C
 CLR D : Proses untuk menghapus data D
 CLR E : Proses untuk menghapus data E

13. CPL
Perintah yang digunakan untuk mengkomplemenkan data
Contoh:

 CPL A : Menentukan komplemen A


 CPL B : Menentukan komplemen B
 CPL C : Menentukan komplemen C
 CPL D : Menentukan komplemen D
 CPL E : Menentukan komplemen E

14. RR/RL
Perintah yang digunakan untuk menggeser posisi sebanyak 1 bit
Contoh:

 RR A : geser ke kanan 1 bit pada akumulator


 RL A : geser ke kiri 1 bit pada akumulator
 RR rx : geser ke kanan 1 bit pada isi register x
 RL rx : geser ke kanan 1 bit pada isi register x

15. SETB
Perintah yang digunakan untuk memberikan logika 1 pada suatu port
Contoh:

 SETB P1.0 : memberikan logika 1 pada port 1.0


 SETB P1.3 : memberikan logika 1 pada port 1.3
 SETB P2.3 : memberikan logika 1 pada port 2.3
 SETB P1.8 : memberikan logika 1 pada port 1.8
 SETB P1.1 : memberikan logika 1 pada port 1.1

16. JB/ JNB


Perintah yang digunakan untuk lompat ke label subprogram bila nilai port x.y berlogika LOWatau
mempunyai nilai nol
Contoh :

 Jnb p1.0, go : ke label subprogram bila nilai port 1.0 berlogika LOW
 Jnb p2.0, go : ke label subprogram bila nilai port 2.0 berlogika LOW
 Jnb p3.0, go : ke label subprogram bila nilai port 3.0 berlogika LOW
 Jnb p4.0, go : ke label subprogram bila nilai port 4.0 berlogika LOW
 Jnb p5.0, go : ke label subprogram bila nilai port 5.0 berlogika LOW

17. JZ/JNZ
Perintah yang digunakan untuk mengurangi nilai isi data pada register x dan bila nilainya
belumtercapai maka akan dilakukan lompatan ke label subprogram
Contoh:
 Mov B,#00H : Jika Nilai akumulator A adalah 00H Jump Ke alamat untuk eksekusi Mov
B,#00H
 JNZ R7, gaul : kurangi nilai isi data pada register R7 dan bila nilainya belumtercapai 0 maka
dilakukan lompatan subprogram dengan label GAUL
 JNZ R10, coba : kurangi nilai isi data pada register R10 dan bila nilainyabelum tercapai 0
maka dilakukan lompatan subprogram dengan label COBA
 JNZ R12, klik : kurangi nilai isi data pada register R12 dan bila nilainya belumtercapai 0
maka dilakukan lompatan subprogram dengan label KLIK
 JNZ R3, pilih : kurangi nilai isi data pada register R3 dan bila nilainya belumtercapai 0 maka
dilakukan lompatan subprogram dengan label PILIH

18. CJNE
perintah yang digunakan untuk membandingkan apakah nilai data sama dengan nilai xyz ,
bilanilainya tidak sama maka lompat ke label subprogram
Contoh:

 CJNE RV, XYZ, YUK : perintah yang digunakan untuk membandingkan apakahnilai register v
sama dengan nilai xyz , bila nilainya tidak sama maka lompat ke labelsubprogram YUK
 CJNE RX, XYZ, MARI : perintah yang digunakan untuk membandingkan apakahnilai register
v sama dengan nilai xyz , bila nilainya tidak sama maka lompat ke labelsubprogram MARI
 CJNE RZ, XYZ, COBA : perintah yang digunakan untuk membandingkan apakahnilai register
v sama dengan nilai xyz , bila nilainya tidak sama maka lompat ke labelsubprogram COBA
 CJNE R2, XYZ, RUN : perintah yang digunakan untuk membandingkan apakah nilairegister v
sama dengan nilai xyz , bila nilainya tidak sama maka lompat ke labelsubprogram RUN
 CJNE R5, XYZ, OUT : perintah yang digunakan untuk membandingkan apakah nilairegister v
sama dengan nilai xyz , bila nilainya tidak sama maka lompat ke labelsubprogram OUT

19. NOP
Perintah yang digunakan untuk Melakukan Penundaan pada program sebesar 1 cycle (1
microdetik).
CONTOH
 Ajmp Lompatan1Mov A,#05HLompatan1 :NOPNOPMov R0,#00H
BAB 8
KOMUNIKASI SERIAL PADA MIKROKONTROLER

8.1 Komunikasi Serial


MCS-51 memiliki kemampuan untuk berkomunikasi secara serial melalui pin RXD dan TXD. Satu hal
yang perlu diingat adalah tingkat tegangan komunikasi kedua pin serial menggunakan tingkat tegangan
TTL. Pada prinsipnya, komunikasi serial adalah komunikasi dimana transmisi data dilakukan per bit.
Interface serial hanya membutuhkan jalur yang sedikit (umumnya hanya 2 jalur), sehingga lebih
menghemat pin jika dibandingkan dengan interface paralel.
Komunikasi serial ada dua macam, asynchronous serial dan synchronous serial.

1. Synchronous serial adalah komunikasi dimana hanya ada satu pihak pengirim atau penerima) yang
menghasilkan clock dan mengirimkan clock tersebut bersama-sama dengan data. Contoh
pengunaan synchronous serial terdapat pada transmisi data keyboard.
2. Asynchronous serial adalah komunikasi dimana kedua pihak (pengirim dan penerima) masing-
masing menghasilkan clock namun hanya data yang ditransmisikan, tanpa clock. Agar data yang
dikirim sama dengan data yang diterima, maka kedua frekuensi clock harus sama dan harus
terdapat sinkronisasi. Setelah adanya sinkronisasi, pengirim akan mengirimkan datanya sesuai
dengan frekuensi clock pengirim dan penerima akan membaca data sesuai dengan frekuensi clock
penerima. Contoh penggunaan asynchronous serial adalah pada Universal Asynchronous Receiver
Transmitter (UART) yang digunakan pada serial port (COM) komputer. MCS-51 mendukung
komunikasi secara asinkron, bahkan tiga dari empat serial mode yang dimiliki MCS-51 kompatibel
dengan UART.

MCS-51 memiliki 4 mode komunikasi serial. Mode 0 berupa synchronous serial (shift register),
sedangkan tiga mode yang lain berupa asynchronous serial (UART). Pada semua mode, pengiriman
dilakukan jika ada instruksi yang mengisi nilai register SBUF. Sedangkan pada saat penerimaan, data
yang diterima akan disimpan pada register SBUF.

1. MODE 0
Mode 0 adalah 8 bit shift register dimana data dikirimkan dan diterima melalui pin RXD sedangkan
clock dikirimkan dan diterima melalui pin TXD. Pengiriman data 8 bit dilakukan dengan
mengirimkan Least Significant Bit (LSB) terlebih dahulu. Pada mode 0, baud rate yang gunakan
adalah sebesar 1/12 dari frekuensi osilator.
2. MODE 1
Pada mode 1, jumlah data yang dikirimkan sebanyak 10 bit yang terdiri dari start bit, 8 bit data
(LSB terlebih dahulu), dan stop bit. Ada proses penerimaan, nilai stop bit akan dimasukkan ke RB8
secara otomatis. Pada proses pengiriman, stop bit akan diberi nilai ‘1’ secara otomatis. Pada mode
1, baud rate yang digunakan dapat diatur melalui Timer 1.

3. MODE 2
Pada mode 2, jumlah data yang dikirimkan sebanyak 11 bit yang terdiri dari start bit, 8 bit data
(LSB terlebih dahulu), bit ke-9, dan stop bit. Pada proses pengiriman, nilai bit ke 9 dapat diatur
dengan mengisi nilai TB8. Pada proses penerimaan, bit ke 9 akan dimasukkan ke RB8 secara
otomatis.
Pada mode 2, baud rate yang dapat digunakan adalah sebesar 1/64 frekuensi osilator atau 1/32
frekuensi osilator jika SMOD bernilai ‘1’.

4. MODE 3
Mode 3 hampir sama dengan mode 2. Perbedaannya terdapat pada baud rate yang digunakan.
Jika mode 2 menggunakan baud rate yang pasti, mode 3 menggunakan baud rate yang dihasilkan
oleh Timer 1.
8.2 Aplikasi Komunikasi Serial
Komunikasi serial merupakan komunikasi data dengan pengiriman data secara satu per satu
dengan menggunakan satu jalur kabel data. Sehingga komunikasi serial hanya menggunakan 2 kabel
data yaitu kabel data untuk pengiriman yang disebut transmit dan kabel data untuk penerimaan yang
disebut receive.
Kelebihan dari komunikasi serial adalah jarak pengiriman dan penerimaan dapat dilakukan dalam
jarak yang cukup jauh dibandingkan dengan komunikasi secara parallel. Tetapi kekurangannya adalah
kecepatan yang lebih lambat bila dibandingkan komunikasi parallel.
Untuk saat ini sedang dikembangkan teknologi serial baru yang dinamakan USB atau Universal
Serial Bus. USB ini memiliki kecepatan pengiriman dan penerimaan data lebih cepat disbanding serial
biasa. Contoh jenis komunikasi serial yang terkenal adalah RS-232 dan RS-489.
BAB 9
INTERFACING MIKROKONTROLER

9.1 ADC, DAC, Dan Analog Comparator


1. ADC
Fungsi ADC adalah merubah besaran analog (biasanya tegangan) ke bilangan digital.
Mikrokontroler dengan fasilitas ini dapat digunakan untuk aplikasi-aplikasi yang memerlukan
informasi analog (misalnya voltmeter, pengukur suhu dll).
Terdapat beberapa tipe dari ADC sbb:

 Succesive Approximation A/D converters.


 Single Slope A/D converters.
 Delta-Sigma A/Ds converters.
 Flash A/D.

2. DAC
Fungsi DAC adalah merubah besaran digital (biasanya tegangan) ke bilangan analog.
Kebalikan dari ADC seperti diatas

3. Analog Comparator
Komparator analog atau komparator tegangan adalah suatu devais yang dapat
membandingkan dua tegangan input. Komparator analog dapat digunakan sebagai alarm angin
puting beliung/tornado jika salah satu inputnya dihubungkan dengan anemometer. Komparator
analog juga dapat digunakan sebagai pengukur waktu pengisian muatan pada kapasitor jika
dihubungkan dengan sebuah mikrokontroler.
Komparator analog pada dasarnya adalah suatu Op-Amp (Operational Amplifier).
Sepertihalnya Op-Amp, komparator analog memiliki pin input tak membalik (non-inverting input),
input membalik (inverting input), output, voltase sumber positif (V+) dan sumber negatif (V-).
Input tak membalik (+) berfungsi sebagai voltase referensi (Vref), sedangkan voltase input (Vin)
dihubungkan dengan pin input membalik (-). Jika (+) > (-), voltase output (Vo) akan mendekati V+.
Dan sebaliknya jika (+) < (-), Vo bernilai di sekitar V.
Eksperimen ini menggunakan LF353P (Texas Instrument) yang merupakan dua buah unit Op-
Am yang dikemas dalam sebuah chip. Menurut datasheet, voltase sumber positif (V+) yang
dibutuhkan adalah 3.5V-18V. Sedangkan V- dihubungkan dengan 0 V (ground). Eksperimen
inibertujuan untuk mengetahui karakteristik komparator analog LF353P pada tegangan kerja, yaitu
V+.

9.2 Minimum Sistem


Proses perancangan minimum system merupakan tahap yang harus dikuasai agar sistem yang
dirancang dapat berfungsi sebagaimana mestinya.
Langkah pertama dalam merancang sistem adalah menentukan mikrokontroler yang akan digunakan.
Varian yang sering digunakan dalam minimum system adalah 89C51. IC 89C51 memiliki kemampuan
dan fasilitas yang cukup lengkap untuk aplikasi sederhana dan umum. Namun tidak menutup
kemungkinan 89C51 digunakan untuk aplikasi yang jauh lebih rumit asalkan sistem yang digunakan
memiliki komponen pendukung yang lengkap.
Setelah menentukan mikrokontroler yang akan digunakan, IC tersebut harus dilengkapi dengan
komponen dasar seperti sumber clock dan rangkaian reset. Minimum system yang sering digunakan
untuk berkomunikasi secara serial dangan protokol UART umumnya menggunakan crystal oscillator
dengan frekunesi 11,0592 MHz. Rangkaian reset pada pembahasan tentang reset dapat diaplikasikan.
Namun rangkaian tersebut dapat digantikan dengan sebuah IC reset. IC reset yang sering digunakan
adalah DS1812.
Jumper pada.rangkaian gambar diatas digunakan untuk memilih sumber reset. Jika jumper
menghubungkan pin 1 dan 2, maka minimum system berada pada mode download dimana sumber
reset bukan dari DS 1812 melainkan dari sumber di luar minimum system. Jika jumper
menghubungkan pin 2 dan 3, maka minimum system berada dalam mode stand alone dimana proses
reset akan dilakukan oleh DS 1812 dan minimum system akan langsung mengeksekusi program yang
telah di-download.
Minimum system yang baik memiliki kemampuan untuk mengakses external memory. Untuk
menghubungkan antara mikrokontroler dan memori dibutuhkan sebuah IC latch. Komponen yang
sering digunakan sebagai latch adalah 74L5573.
Selain itu, minimum system juga memiliki rangkaian overlap. Hal ini bertujuan untuk mempermudah
proses pengembangan program dan menghemat waktu karena program lebih mudah dituliskan ke
external memory daripada dituliskan ke dalam 89C51. Untuk menuliskan program ke dalam 89C51
user masih harus melepas IC tersebut. Sedangkan untuk menuliskan program ke external memory,
user tidak perlu melepas IC apapun. Komponen yang sering digunakan sebagai overlap adalah 74LS08.

Address decoding menentukan berapa pembagian ruang external memory dan berapa kapasitas
masing-masing ruang. Sistem address decoding yang sering digunakan adalah membagi 64 KB external
memory menjadi 8 ruang yang masing-masing berkapasitas 8 KB. Komponen yang sering digunakan
untuk membagi external memory menjadi 8 bagian adalah 74LS138.
Address decoding berkaitan erat dengan memory mapping. Memory Mapping adalah pemetaan
semua external memory yang digunakan dalam minimum system. Hal ini penting karena berkaitan
dengan proses pemrograman, alokasi program memori dan data memori, serta penambahan
peripheral. Peripheral dasar yang dibutuhkan minimum system adalah memori sebagai penyimpan
program dan data, serta Programmable Peripheral Interface. (PPI). Memori yang sering digunakan
adalah EEPROM 28C64B. Sedangkan PPI 82C55 dibutuhkan sebagai jalur input/output untuk
menggantikan port 0 dan port 2 89C51 yang digunakan sebagai address dan data bus.
BAB 10
CONTOH APLIKASI DAN PROGRAM MIKROKONTROLER

10.1 Led / Jam Digital / Seven Segmen


Seven Segment adalah tujuh segmen-segmen yang digunakan menampilkan angka. Seven
segment merupakan display visual yang umum digunakan dalam dunia digital. Seven segment sering
dijumpai pada jam digital, penujuk antrian, diplay angka digital dan termometer digital. Penggunaan
secara umum adalah untuk menampilkan informasi secara visual mengenai data-data yang sedang
diolah oleh suatu rangkaian digital.
Seven segmen ini tersusun atas 7 bbuah LED yang disusun membentuk angka 8 yang penyusunnya
menggunakan diberikan lebel dari ‘a’ sampai ‘g’ dan satu lagi untuk dot point (DP). Setiap segmen ini
terdiri dari 1 atau 2 Light Emitting Diode ( LED ). salah satu terminal LED dihubungkan menjadi satu
sebagai kaki common.

Jenis-jenis Seven Segment :


1. Common Anoda
Semua anoda dari LED dalam seven segmen disatukan secara parallel dan semua itu dihubungkan ke
VCC, dan kemudian LED dihubungkan melalui tahanan pembatas arus keluar dari penggerak LED.
Karena dihubungkan ke VCC, maka COMMON ANODA ini berada pada kondisi AKTIF LOW (led akan
menyala/aktif bila diberi logika 0).

2. Common Katoda
Merupakan kebalikan dari Common Anoda. Disini semua katoda disatukan secara parallel dan
dihubungkan ke GROUND. Karena seluruh katoda dihubungkan ke GROUND, maka COMMON KATODA
ini berada pada kondisi AKTIF HIGH (led akan menyala/aktif bila diberi logika 1).

Prinsip Kerja :
Prinsip kerja seven segmen ialah input biner pada switch dikonversikan masuk ke dalam decoder, baru
kemudian decoder mengkonversi bilangan biner tersebut menjadi decimal, yang nantinya akan
ditampilkan pada seven segment.
Seven segment dapat menampilkan angka-angka desimal dan beberapa karakter tertentu melalui
kombinasi aktif atau tidaknya LED penyusunan dalam seven segment. Untuk memudahkan
penggunaan seven segment, umumnya digunakan sebuah decoder( mengubah/ mengkoversi input
bilangan biner menjadi decimal) atau seven segment driver yang akan mengatur aktif tidaknya led-led
dalam seven segment sesuai dengan nilai biner yang diberikan.
Dekoder BCD ke seven segment digunakan untuk menerima masukan BCD 4-bit dan memberikan
keluaran yang melewatkan arus melalui segmen untuk menampilkan angka desimal. Jenis dekoder BCD
ke seven segment ada dua macam yaitu dekoder yang berfungsi untuk menyalakan seven segment
mode common anoda dan dekoder yang berfungsi untuk menyalakan seven segment mode common
katoda. Contoh IC converter BCD to Seven Segment untuk 7-segment Common Anoda pake decoder IC
TTL 7447 untuk Common Katoda pakai IC TTL 7448.

Program Jam Sederhana dengan Seven Segmen


#include <mega8.h>
#include <delay.h>
//-------------------7seg-------------------------------
#define set PORTD
//-------------------enable-----------------------------
#define enable1 PORTC.2
#define enable2 PORTC.3
#define enable3 PORTC.4
#define enable4 PORTC.5
//-------------------tombol----------------------------
#define tombol1 PINB.1
#define tombol2 PINB.3
//-------------------kondisi---------------------------
#define mati 1
#define nyala 0

unsigned char x=5,a ,y,detik,sat_mnt,pul_mnt,sat_jam,pul_jam,hit[10]={0b01111111, 0b00011100,


0b10111011, 0b10111110, 0b11011100, 0b11101110, 0b11100111, 0b00111100, 0b11111111,
0b11111110}; //common katoda

void rolling()
{
enable4=1;enable1=0;
set=hit[sat_mnt];
delay_ms(x);
if(sat_mnt>9){sat_mnt=0;pul_mnt++;}
enable1=1;enable2=0;
set=hit[pul_mnt];
delay_ms(x);
if(pul_mnt>5){pul_mnt=0;sat_jam++;}
enable2=1;enable3=0;
set=hit[sat_jam];
delay_ms(x);
if(sat_jam>9){sat_jam=0;pul_jam++;}
enable3=1; enable4=0;
set=hit[pul_jam];
delay_ms(x);
if(pul_jam>=4&&sat_jam==2){sat_jam=0;pul_jam=0;}

void setting()
{
while(1)
{
if (tombol1==0)
{
delay_ms(200);
while(tombol1==0);
a++;

if(a==1)
{ for(;;)
{
enable4=1;enable1=0;;set=hit[sat_mnt];
if(tombol2==0){ delay_ms(200); while(tombol2==0);sat_mnt+
+;if(sat_mnt>9)sat_mnt=0;}
else if(tombol1==0){break;};
};
}
else if(a==2)
{ for(;;)
{
enable1=1;enable2=0;;set=hit[pul_mnt];
if(tombol2==0){ delay_ms(200); while(tombol2==0);pul_mnt+
+;if(pul_mnt>5)pul_mnt=0;}
else if(tombol1==0){break;};
};
}
else if(a==3)
{ for(;;)
{
enable2=1;enable3=0;;set=hit[sat_jam];
if(tombol2==0){ delay_ms(200); while(tombol2==0);sat_jam+
+;if(sat_jam>9)sat_jam=0;}
else if(tombol1==0){break;};
};
}
else if(a==4)
{ for(;;)
{
enable3=1; enable4=0;;set=hit[pul_jam];
if(tombol2==0){delay_ms(200); while(tombol2==0);pul_jam+
+;if(pul_jam>2)pul_jam=0;}
else if(tombol1==0){break;};
};
}
else if(a>4){a=0;goto lanjut;};
}

else if(a==0)break;

lanjut:

void jalan()
{
for (detik=1;detik<60;detik++)
{
DDRB.4=DDRB.5=1;
PORTB.5=1;
PORTB.4=1;
for (y=0;y<=24;y++)
{
rolling();
setting();

};
PORTB.4=0;
PORTB.5=0;
for (y=0;y<=24;y++)
{
rolling();
setting();
};

};
sat_mnt++;

void main(void)
{

PORTB=0xFF;
DDRB=0x00;

PORTC=0xFF;
DDRC=0xFF;

PORTD=0x00;
DDRD=0xFF;

set=hit[0];
delay_ms(10);

while(1)
{ jalan(); }

10.2 PWM (Pulse Width Modulation)


PWM adalah singkatan dari Pulse Width Modulation, merupakan suatu metode yang digunakan
untuk mengontrol daya yang berkaitan dengan power supply, contohnya pada power supply PC. Selain
fungsi PWM yang digunakan untuk mengontrol daya power supply, PWM juga dapat difungsikan
sebagai pengatur gerak perangkat elektronika, misalnya pada motor servo.

Sesuai dengan namanya Pulse Width Modulation, maka dalam penerapannya sinyal tegangan-lah
yang di rubah lebarnya. Sistem pengontrolan dengan PWM ini merupakan sistem digital, yang jauh
lebih efisien jika dibandingkan dengan sistem konfensional.

Komponen yang biasa digunakan untuk membangkitkan sinyal PWM adalah sejenis IC digital yaitu
IC 555 atau mikrokontroler.

Aplikasi PWM berbasis mikrokontroler biasanya berupa, pengendalian kecepatan motor DC,
Pengendalian Motor Servo, Pengaturan nyala terang LED. Oleh karena itu diperlukan pemahaman
terhadap konsep PWM itu sendiri.

Konsep Dasar
Sinyal PWM pada umumnya memiliki amplitudo dan frekuensi dasar yang tetap, namun memiliki
lebar pulsa yang bervariasi. Lebar Pulsa PWM berbanding lurus dengan amplitudo sinyal asli yang
belum termodulasi. Artinya, Sinyal PWM memiliki frekuensi gelombang yang tetap namun duty cycle
bervariasi (antara 0% hingga 100%)
Pulse Width Modulation (PWM) merupakan salah satu teknik untuk mendapatkan signal analog
dari sebuah piranti digital. Sebenarnya Sinyal PWM dapat dibangkitkan dengan banyak cara, dapat
menggunakan metode analog dengan menggunakan rankaian op-amp atau dengan menggunakan
metode digital.
Dengan metode analog setiap perubahan PWM-nya sangat halus, sedangkan menggunakan
metode digital setiap perubahan PWM dipengaruhi oleh resolusi dari PWM itu sendiri. Resolusi adalah
jumlah variasi perubahan nilai dalam PWM tersebut. Misalkan suatu PWM memiliki resolusi 8 bit
berarti PWM ini memiliki variasi perubahan nilai sebanyak 2 pangkat 8 = 256 variasi mulai dari 0 – 255
perubahan nilai yang mewakili duty cycle 0 – 100% dari keluaran PWM tersebut

Anda mungkin juga menyukai