MIKROKONTROLER
NAMA : OFANI RIZQI ANDUA
NIM : 1420031027
S1 TEKNIK ELEKTRO
BAB 1
PENDAHULUAN
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. 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.
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.
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. 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.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.
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.
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.
- 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.
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 :
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
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 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.
Untuk pemakaian pada memori program, perintah ini dituliskan menjadi MOVC, hanya ada 2
jenis instruksi yang memakai MOVC, yakni:
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
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.
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:
...
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.
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.
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
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:
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:
<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
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:
<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
Do
<Blok pernyataan>
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.
<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:
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:
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.
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 :
5. SUB
Perintah yang digunakan untuk pengurangan
Contoh :
6. DEC
Perintah yang digunakan untuk melakukan pengurangan 1
Contoh :
7. MUL
Perintah yang digunakan untuk melakukan operasi perkalian
Contoh :
8. DIV
Perintah yang digunakan untuk melakukan operasi pembagian
Contoh :
9. ANL
Perintah yang digunakan untuk operasi logika AND
COntoh :
10. ORL
Perintah yang digunakan untuk operasi logika OR
Contoh:
11. XRL
Perintah yang digunakan untuk operasi logika XOR
Contoh:
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:
14. RR/RL
Perintah yang digunakan untuk menggeser posisi sebanyak 1 bit
Contoh:
15. SETB
Perintah yang digunakan untuk memberikan logika 1 pada suatu port
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
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
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+.
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
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.
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(); }
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