-
DiktatSistem Mikrokontroler
Page 1 | Politeknik Jambi Irwan Kurniawan, ST
PENGENALAN MIKROKONTROLER
Mikrokontroler, jika diterjemahkan secara harfiah, berarti
pengendali yang berukuran mikro. Sekilas mikrokontroler hampir sama
dengan mikroprosesor. Namun mikrokontroler memiliki banyak komponen
yang terintegrasi didalamnya, misalnya timer/counter.Sedangkan pada
mikroprosesor, komponen tersebut tidak terintegrasi. Mikroprosesor
umumnya terdapat pada komputer dimana tugas dari mikroprosesor
adalah untuk memproses berbagai macam data input maupun output dari
berbagai sumber. Mikrokontroler lebih sesuai untuk tugas-tugas yang
lebih spesifik
Gambar 1 Perbedaan mikrokontroler dengan mikroprosesor
MCS-51 pertama kali dikembangkan oleh Intel Corporation pada
tahun 70-an sehingga dapat dibilang usia MCS-51 sudah lebih dari
23-tahun. MCS-51 merupakan salah satu keluarga mikrokontroler yang
sampai sekarang masih banyak dikembangkan oleh berbagai produsen
semacam Atmel Corp., Philips Semiconductors, Cygnal Integrated
Products, Inc., dan Winbond Electronics Corp. Beberapa contoh
mikrokontroler yang
merupakan keluarga MCS-51, yaitu AT89C51, AT89C52, dll.
Gambar 2. Arsitektur MCS51
-
DiktatSistem Mikrokontroler
Page 2 | Politeknik Jambi Irwan Kurniawan, ST
REGISTER DAN MEMORI INTERNAL MCS-51
Memori Internal MCS51 terdiri dari 3 bagian yaitu ROM, RAM,
SFR
ROM/Read Onli Memory adalah adalah memori tempat menyimpan
program / source code. Sifat ROM adalah non-volatile, data /
program tidak akan hilang walaupun tegangan supply tidak ada.
Kapasitas ROM tergantung dari tipe mikrokontroler. Untuk MCS-51
kapasitas ROM adalah 4 Kbyte yang menempati address 0000 s/d 0FFF.
RAM/Random Acces Memoryadalah memori tempat menyimpan data
sementara. Sifat RAM adalah volatile, data akan hilang jika
tegangan supply tidak ada. RAM pada
MCS-51 memiliki kapasitas 128 byte yang menempati alamat
(00h-7Fh). Yang dapat diakses dengan pengalamatan langsung(direct)
maupun tidak langsung (indirect). Contoh:
>>direct mov 30h,#120 ;pindahkan data 120 ke alamat 30h
>>indirect mov R0, #30h ;isi register R0 dengan 30h mov @R0,
#120 ;isikan data 120 ke alamat sesuai isi R0
SFR/Special Function Registeradalah register dengan fungsi
tertentu menempati alamat (80h-FFh). Penjelasan SFR akan dipaparkan
pada bagian lain dari modul ini. Peta Memori Internal MCS-51
Gambar 3. Peta Memori Internal MCS51
Berdasarkan penggunaannya ROM disebut sebagai Program Memory,
sedangkan RAM dan SFR disebut sebagai Data Memory. Program Memori
digunakan untuk menyimpan
program / source code dari user. Sedangkan data memori digunakan
untuk menyimpan data. Internal Program Memory Program Memory
berfungsi untuk menyimpan kode program user yang akan dijalankan.
User dapat menggunakan internal program memory yang tertanam dalam
IC MCS-51 dan external program memory. Internal Program Memory
selain berisi instruksi user,
juga memiliki beberapa alamat khusus yang ditujukan untuk reset
address (alamat yang dituju saat pertama kali mikrokontroler
bekerja) dan interrupt vector address.
-
DiktatSistem Mikrokontroler
Page 3 | Politeknik Jambi Irwan Kurniawan, ST
Alamat Reset dan Interrupt Vektor
0023h Serial Interrupt
001Bh Timer 1 Interrupt
0013h External Interrupt 1
000Bh Timer 0 Interrupt
0003h External Interrupt 0
0000h Reset
Internal Data Memory Untuk internal data memory meliputi : -
Register Banks - Bit-addressable RAM - General Purpose RAM (Stratch
Pad Area) - Special Function Registers (SFR)
Organisasi Internal data Memory
80h-FFh Special Function Register
30h-7Fh General Purpose RAM
20h-2Fh Bit-addressable RAM
00h-1Fh Register Banks
General Purpose RAM (30h-7Fh)
General Purpose RAM atau sering disebut juga sebagai Stratch Pad
Area adalah ruang data memory yang bebas digunakan user sebagai
tempat penyimpanan variabel atau sebagai alamat inisialisasi Stack
Pointer.General Purpose RAM hanya dapat diakses per byte.
Bit-Addressable RAM (20h-2Fh)
Bit-addressable RAM memiliki fungsi yang sama dengan General
Purpose RAM. User juga dapat menggunakan ruang ini untuk menyimpan
variabel atau alamat inisialisasi Stack Pointer.Berbeda dengan
General Purpose RAM, Bit-addressable RAM tidak hanya dapat diakses
per byte namun juga dapat diakses per bit.
Register Banks (00h-1Fh)
Internal data memory memuat 4 register banks, yaitu: Register
Bank0, Register Bank 1, Register Bank 2, Register Bank 3. Register
Banks ini digunakan sebagai alamat untuk menampung delapan register
selebar 1 byte yang diberi nama R0, R1, dan seterusnya hingga R7.
Secara default, kedelapan register ini akan menempati Register Bank
0.
Pembagian Register Bank
00h-007h Register Bank 0
08h-0Fh Register Bank 1
10h-17h Register Bank 2
18h-1Fh Register Bank 3
Special Function Register
SFR merupakan sejumlah register khusus yang mencakup alamat
port, Accumulator, register B, timer, dan sejumlah register
kontrol. Beberapa dari SFR juga dapat diakses per bit
(bit-addressable).
80h P0 Port 0
81h SP Stack Pointer
-
DiktatSistem Mikrokontroler
Page 4 | Politeknik Jambi Irwan Kurniawan, ST
82h DPL Data Pointer Low Byte
83h DPH Data Pointer High Byte
87h PCON Power Control
88h TCON Time Control
89h TMOD Time Mode
8Ah TL0 Register Timer 0 Low Byte
8Bh TL1 Register Timer 1 Low Byte
8Ch TH0 Register Timer 0 High Byte
8Dh TH1 Register Timer 0 High Byte
90h P1 Port 1
98h SCON Serial Port Control
99h SBUF Serial Port Buffer
A0h P2 Port 2
A8h IE Interrupt Enable
B0h P3 Port 3
B8h IP Interrupt Periority
D0 PSW Program Status Word
E0 ACC Accumlator
F0 B Register B
Program Status Word
Program Status Word (PSW) selebar 1 byte mencakup status bit
dengan
konfigurasi dari Most Significant Bit (MSB) hingga Least
Significant Bit (LSB)
Alokasi Bit PSW
CY AC F0 RS1 RS0 OV - P
7 6 5 4 3 2 1 0
Keterangan : CY
Carry Flag bernilai 1 jika sebuah penjumlahan menghasilkan nilai
lebih dari 255 atau FFh. Carry flag juga akan bernilai 1 jika
sebuah pengurangan menghasilkan nilai kurang dari 0. Selain itu,
carry flag juga dapat diakses oleh user secara langsung.
AC Auxiliary carry flag bernilai 1 jika penjumlahan Binary Coded
Decimal (BCD) menghasilkan nilai lebih dari 9.
F0 Flag 0 merupakan general purpose flag yang dapat digunakan
untuk aplikasi user. RS0 RS1 Register bank select digunakan untuk
menentukan register bank yang aktif untuk
R0 hingga R7.contoh: 00(RS1=0, RS0=0) register bank 0 ,
01(RS1=0, RS0=1) register bank 1 dst. OV Overflow flag bernilai 1
jika ada penambahan atau pengurangan signed number yang
menghasilkan nilai lebih dari +127 atau kurang dari -128. Jika
proses penambahan atau pengurangan tidak menggunakan signed number,
maka
perubahan OV dapat diabaikan.
-
DiktatSistem Mikrokontroler
Page 5 | Politeknik Jambi Irwan Kurniawan, ST
P Parity Flag digunakan untuk menggenapi jumlah bit yang
bernilai 1 pada accumulator. Parity flag bernilai 1 jika jumlah bit
yang bernilai 1 pada accumulator berjumlah ganjil dan bernilai 0
jika jumlah bit yang bernilai 1 pada accumulator berjumlah genap.
Register ACC (Accumulator)
Register Accumulator (ACC) banyak digunakan dalam berbagai
instruksi. ACC
bersama dengan register B dalam proses perkalian dan pembagian.
ACC akan
menyimpan hasil perkalian 8 bit terbawah (low byte) dan hasil
bagi. Selain itu
register ACC juga merupakan general purpose register selebar 8
bit yang dapat
digunakan untuk aplikasi user.
Register B
Register B digunakan bersama dengan Accumulator dalam proses
perkalian dan
pembagian. Register B akan menyimpan hasil perkalian 8 bit
teratas (high byte)
dan sisa pembagian. Selain itu register B juga merupakan general
purpose
register selebar 8 bit yang dapat digunakan untuk aplikasi
user.
Stack Pointer Stack Pointer (SP) merupakan register 8 bit yang
berisi lokasi dimana data alamat stack teratas disimpan. Instruksi
PUSH, LCALL, proses interrupt, dan sejenisnya akan menambah nilai
pada SP. Sedangkan instruksi POP, RET, RETI, dan sejenisnya akan
mengurangi nilai pada SP.
Data Pointer Data Pointer (DPTR) merupakan register 16 bit yang
terdiri dari 8 bit Data Pointer High (DPH) dan 8 bit Data Pointer
Low (DPL). DPTR umumnya digunakan untuk mengakses alamat pada
memori eksternal. Port Register (P0,P1,P2 dan P3) Port register
merupakan register yang mewakili alamat port. Register input/output
ini meliputi Port 0 (P0), Port 1 (P1), Port 2 (P2), dan Port 3
(P3).
Timer Register Timer Register merupakan register yang digunakan
untuk mengatur operasi timer. Register ini meliputi Timer 1 High
Byte (TH1), Timer 0 High Byte (TH0), Timer 1 Low Byte (TL1), Timer
0 Low Byte (TL0), Timer Mode (TMOD), dan Timer Control (TCON).
Serial Port Register
Serial Port register merupakan register yang digunakan dalam
proses komunikasi serial. Register ini meliputi Serial Data Buffer
(SBUFF) dan Serial Port Control (SCON).
Interrupt Register
Interrupt register merupakan register yang digunakan untuk
mengatur proses interrupt. Register ini meliputi Interrupt Enable
(IE) dan Interrupt Priority (IP).
-
DiktatSistem Mikrokontroler
Page 6 | Politeknik Jambi Irwan Kurniawan, ST
PIN OUT MCS-51
Pin adalah kaki fisik dari sebuah IC MCS-51. Masing-masing pin
memiliki fungsi dan karakteristik tersendiri yang harus
diperhatikan oleh user. MCS-51 memiliki beberapa
pin, ada yang berfungsi sebagai jalur input/output (I/O), ada
ang berfungsi sebagai jalur kontrol, dan ada juga yang berfungsi
sebagai address bus atau data bus.
Gambar 4. Pin Out IC AT89C51
Keterangan:
Port 0 merupakan salah satu port yang berfungsi sebagai general
purpose I/O dengan lebar 8 bit. Port 0 terdiri dari P0.0, P0.1,
hingga P0.7. Selain sebagai jalur I/O, port 0 juga berfungsi
sebagai multiplexed address(A0-A7)/data(D0-
D7) bus.
Port 1 merupakan salah satu port yang berfungsi sebagai general
purpose I/O dengan lebar 8 bit. Port 0 terdiri dari P1.0, P1.1,
hingga P1.7. Port 1 tidak memiliki fungsi lain.
Port 2 merupakan salah satu port yang berfungsi sebagai general
purpose I/O
dengan lebar 8 bit. Port 2 terdiri dari P2.0, P2.1, hingga P2.7.
Selain sebagai jalur I/O, port 2 juga berfungsi sebagai high byte
(A8-A15) address bus.
Port 3 merupakan salah satu port yang berfungsi sebagai general
purpose I/O
dengan lebar 8 bit. Port 3 terdiri dari P3.0, P3.1, hingga P3.7.
Selain sebagai jalur I/O, port 0 juga berfungsi sebagai jalur
penerimaan/pengiriman data pada komunikasi serial, external
interrupt, timer/counter, dan external data memory write/read
strobe.
-
DiktatSistem Mikrokontroler
Page 7 | Politeknik Jambi Irwan Kurniawan, ST
Bit Nama Fungsi Lain
P3.0 RXD Jalur penerimaan data pada komunikasi serial
P3.1 TXD Jalur pengiriman data pada komunikasi serial
P3.2 External Interrupt 0
P3.3 External Interrupt 1
P3.4 T0 Timer/Counter 0 External Input
P3.5 T1 Timer/Counter 1 External Input
P3.6 External data memory write strobe
P3.6 External data memory read strobe
PSEN
Program Store Enable ( PSEN) merupakan jalur kontrol untuk
mengakses external program memory. PSEN umumnya dihubungkan dengan
output enable pada external memory. PSEN akan bernilai low pada
saat pembacaan program dari external memory. PSEN akan bernilai
high pada saat pembacaan program dari internal memory.
ALE Address Latch Enable (ALE) berfungsi sebagai demultiplexer
pada saat port 0 bekerja sebagai multiplexed address/data bus.
EA External Access ( EA) merupakan pin yang berfungsi sebagai
input kontrol.
Jika EA bernilai low, maka program hanya akan dijalankan dari
external program memory. Jika EA bernilai high, maka program akan
dijalankan dari internal program memory.
RST Pin ini berfungsi sebagai input untuk melakukan reset
terhadap MCS-51. Jika RST bernilai high selama minimal 2 machine
cycle, MCS-51 akan di-reset dan nilai internal register akan
dikembalikan seperti keadaan awal pada saat MCS-51 baru mulai
bekerja.
OSC (On-Chip Oscillator) Koneksi dengan on-chip oscillator
terdiri dari dua pin yaitu XTAL1 dan XTAL2. Pin XTAL1 merupakan
input bagi inverting oscillator amplifier yang terdapat dalam IC
MCS-51. Pin XTAL2 merupakan output dari inverting oscillator
amplifier tersebut. Dalam mikrokontroler dikenal istilah Machine
Cycle (MC) / Siklus Mesin, dimana : 1 MC= 6 state = 12 periode
clock. Jika frekuensi crystal yang digunakan adalah 12 MHz maka 1
MC = 12/frekuensi crystal = 12/12 MHz =1uS
-
DiktatSistem Mikrokontroler
Page 8 | Politeknik Jambi Irwan Kurniawan, ST
SISTEM MINIMUM MIKROKONTROLER MCS51
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.
Minimum system yang baik memiliki kemampuan untuk mengakses
external
memory atau perangkat I/O dengan alamat maksimum selebar 16 bit
(A0-A15). Untuk menghubungkan antara mikrokontroler dan memori atau
pun perangakat i/o lainnya
dibutuhkan sebuah IC latch pada proses de-multipleks alamat/data
(AD0-AD7). Komponen yang sering digunakan sebagai latch adalah
74LS373.
Gambar 5. Sistem Minimum MCS51
Untuk proses de-multipleks address dan data dilakukan melalui
sinyal kontrol ALE (pin ALE) yang terhubung ke IC Latch 74LS373.
Ketika MCS51 mengeluarkan alamat melalui pin P0.0-P0.7, sinyal ALE
akan diset ke kondisi 1 sehingga IC latch akan melewatkan alamat
(A0-A7) ke bus alamat. Selama ALE berada pada kondisi 0 maka alamat
pada keluaran IC Latch akan tertahan atau tidak berubah. Ketika
MCS51
mengeluarkan data (D0-D7) maka sinyal akan ALE diset ke kondisi
0.
-
DiktatSistem Mikrokontroler
Page 9 | Politeknik Jambi Irwan Kurniawan, ST
PENDEKODEAN ALAMAT MEMORI DAN I/O Agar MCS51 dapat
mengirim/membaca data dari sebuah lokas memori atau port I/O maka
diperlukan alamat atau lokasi data dari perangkat yang terhubung
baik memori
atau port I/O. Kemudian perpindahan data disebut valid jika
nilai alamat yang dikeluarkan oleh MCS51 hanya terhubung ke satu
perangkat memori atau port I/O saja. Artinya alamat tersebut hanya
untuk satu lokasi data saja apakah itu dari memori atau dari port
I/O. Penulisan/pembacaan data dilakukan melalui bus data. Agar
alamat yang digunakan hanya terhubung ke satu lokasi data saja,
maka perlu dilakukan pendekodean alamat memori dan port I/O. Dalam
proses pendekodean alamat memori pemetaan lokasi memori dan port
I/O harus digabung.
IC yang sering digunakan pada pendekodean alamat memori / port
I/O adalah IC
dekoder 74LS138. Keluaran dari Y0-Y7 akan aktif (low) sesuai
dengan data yang
diinputkan pada pin A,B,C, dengan ketentuan input E1,E2,E3
diberi kondisi sesuai logika
pengaktifnya yaitu E1=1, E2=0 dan E3=0.
Gambar 7. IC Dekoder 74LS138
Perhatikan contoh berikut !
Sistem dirancang dengan pemetaan alamat seperti berikut:
Alamat Perangkat
30h-37h 8 buah PORT I/O
800h s/d FFFh 1 Buah RAM 2 KB (11 bit Alamat)
Pada pemetaan diatas ketika MCS51 mengakses alamat 800h maka
data yang terhubung ke Bus data adalah data dari/ke perangkat
memori. Misalkan MCS51 mengeluarkan
alamat 800h dan data 40h maka data 40h tersebut akan dikirimkan
ke perangkat
-
DiktatSistem Mikrokontroler
Page 10 | Politeknik Jambi Irwan Kurniawan, ST
memori bukan port I/O. Contoh lainya, misalkan MCS51
mengeluarkan alamat 35h dan data 23h maka data 23h tersebut akan
dikeluarkan melalui Port I/O (8 LED) bukan ke perangkat lain.
Pendekodean alamat akses memori: Pada kasus ini alamat memori yang
digunakan 800h s/d FFFh
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 800h
0 0 0 0 1 x x x x x X x x x x x s/d
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 FFFh
x => 0 atau 1
Perhatikan bit alamat A0-A10 mengalami perubahan jika MCS 51
mengakses lokasi alamat dari 800h sampai FFFh. Sehingga bit alamat
A11-A15 yang digunakan untuk proses pendekodean alamat.
A15 A14 A13 A12 A11
0 0 0 0 1
Ketika MCS51 mengeluarkan alamat dengan kondisi A11-A15 seperti
pada tabel maka MCS51 akan mengakses data dari memori dengan lokasi
sesuai nilai alamat yang ditunjukan oleh A0-A10. Proses pendekodean
alamat memori dilakukan dengan memperhatikan bit A11-A15. Bit-bit
alamat ini diinputkan ke rangkaian pendekodean yang dirancang
sedemikian rupa agar ketika bit alamat A11-A15 pada kondisi seperti
tabel diatas, maka keluaran dari
rangkaian decoder akan meng-aktifkan IC memori yang terhubung
melalui pin CE atau CS atau OE tergantung IC memori yang
digunakan.
Pendekodean alamat untuk akses Port I/O:
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 30h
0 0 0 0 0 0 0 0 0 0 1 1 0 x x x s/d
0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 37h
x => bisa 0 atau 1
Sama seperti pendekodean alamat akses memori, dari tabel diatas
terlihat bit alamat A4 A15 tidak berubah ketika MCS51 mengakses 8
Port I/O.
Sehingga bit penentu alamat akses memori dan 8 Port I/O tersebut
dapat dilihat pada tabel berikut: A15 A14 A13 A12 A11 A10 A9 A8 A7
A6 A5 A4 A3 A2 A1 A0
0 0 0 0 0 0 0 0 0 0 1 1 0 - - - 30h-37h
0 0 0 0 1 - - - - - - - - - - - 800h- FFFh
Perhatikan nomor bit alamat yang dilingkari, bit A11-A13
digunakan untuk membedakan pengaksesan memori 800h-FFFh (001) atau
pengaksesan Port 30h-37h (000) sedangkan bit A0-A2 digunakan
menentukan Port mana yang dipilih dari 8 buah port yang ada
(000-111) yaitu port 30h s/d 37h. Sementara itu bit lainnya
dihubung ke gerbang logika atau dihubungkan langsung ke IC dekoder
74LS138. Bentuk rangkaiannya dapat dilihat pada gambar berikut:
-
DiktatSistem Mikrokontroler
Page 11 | Politeknik Jambi Irwan Kurniawan, ST
Gambar 8 Rangkaian dekoder memori dan port I/O
-
DiktatSistem Mikrokontroler
Page 12 | Politeknik Jambi Irwan Kurniawan, ST
ANTARMUKA / INTERFACING MEMORI DAN PORT I/O
Untuk melakukan interfacing antara MCS51 dengan memori RAM
dibutuhkan sinyal
kontrol RD /WR sebagai sinyal baca/ sinyal tulis dan sinyal Chip
Enable(CE), alamat
yang digunakan untuk mengakses memori akan berpengaruh pada pin
CE (Chip Enable),
ketika alamat yang diakses berada dalam range lokasi memori yang
telah dirancang
sebelumnya, maka pin CE diinputkan sinyal aktif (LOW). Pin CE
dihubungkan langsung
ke rangkaian pendekodean alamat memori, seperti yang telah
dijelaskan sebelumnya.
Pin hubungan alamat pada memori (misalnya A0-A10 2KB) terhubung
ke bus alamat
A0-A10 dari MCS51, sedangkan bus data terhubung ke hubungan data
(D0-D7) dari
perangkat memori .perhatikan gambar berikut:
Gambar 9. Contoh Antarmuka MCS51 dengan Memori RAM 2 KB
Pin CE terhubung ke keluaran CS-RAM dari rangkaian pendekodean
alamat memori. Pin
OE (Output Enable) terhubung ke pin RD dari MCS51 sebagai sinyal
baca (aktif low). Pin
WE (Write Enable) terhubung ke pin WR dari MCST51 sebagai sinyal
tulis (aktif low).
Untuk melakukan antar muka PORT I/O ke MCS51 sebagai jalur
input, biasanya
digunakan sebuah IC Buffer Bidireksional 74LCS245. Prinsip kerja
IC ini adalah
melewatkan data dari A ke B atau sebaliknya. Arah perpindahan
data ditentukan dari pin
input AB/BA. Jika pin ini diberi logika 0 maka arah perpindahan
data adalah dari B ke A,
sebaliknya jika pin ini diberi logika 1 maka arah data adalah
dari A ke B. Pin CE
digunakan sebagi pengaktif chip (Chip Enable) ketika CE bernilai
0 maka IC 74LS245
dapat berfungsi, jika CE bernilai 1 maka IC 74LS245 tidak
berfungsi (non-aktif).
Perhatikan gambar berikut :
-
DiktatSistem Mikrokontroler
Page 13 | Politeknik Jambi Irwan Kurniawan, ST
Gambar 10. Antarmuka Port Input
Pin CE dan AB/BA dihubungkan ke keluaran gerbang OR dari
CS-PORT-35H dan sinyal
kontrol RD sebagai sinyal pembacaan data input.
Untuk antarmuka MCS51 dengan PORT sebagai jalur Output, dapat
menggunakan IC
Latch 74LS373, IC ini berfungsi sebagai penyangga data. Data
keluaran akan tertahan
selama sinyal LE(Latch Enable) berlogika 0 dan akan berubah
ketika diberikan sinyal LE
(Latch Enable) logika 1. Perhatikan gambar dibawah ini:
Gambar 11. Antarmuka Port Output
Sinyal LE diperoleh dari keluaran gerbang NOR yang dihubungkan
dengan sinyal CS-
PORT dan sinyal WR sebagai sinyal write dari MCS51. Ketika MCS51
ingin mengeluarkan
data pada alamat PORT tersebut, sinyal CS-PORT akan berlogika 0
dimana sinyal CS-
PORT adalah keluaran dari rangkaian pendekodean alamat PORT.
Pada selang waktu
berikutnya sinyal WR akan berlogika 0 yang menandakan MCS51
melakukan proses
penulisan data ke alamat PORT tersebut. Sehingga keluaran dari
gerbang NOR adalah
logika 1 yang kemudian mengaktifkan Latch Enable dari IC 74LS373
dan menyebabkan
data keluaran Q0-Q7 berubah sesuai dengan data yang dikirimkan
MCS1.
-
DiktatSistem Mikrokontroler
Page 14 | Politeknik Jambi Irwan Kurniawan, ST
Pengenalan Bahasa C untuk MCS51
Bahasa pemrograman C adalah sebuah bahasa 'mid-level', namun
memiliki fitur 'high-level' (seperti support pada fungsi dan modul)
dan juga memiliki fitur 'lowlevel' (seperti mengakses hardware
melalui pointer). Dengan menggunakan bahasa C, kita dapat dengan
mudah untuk pindah ke jenis mikrokontroler yang lain, lebih mudah
dan cepat dalam menulis kode program, dan lebih mudah dimengerti,
dan lebih mudah dalam melakukan debugging. Berikut penjelasan kode
kode dasar bahasa C untuk pemrograman mikrokontroler
keluarga MCS51 yang sering digunakan:
Preprosesor
Merupakan bagian program yang digunakan untuk mendefenisikan
library
berupa file header (*.h) yang ikutkan (include) ke dalam
program. Beberapa
contoh penggunaannya: #include //mengikutsertakan file
at89x51.h
#include
#include
Tipe Data
char : 1 byte ( -128 s/d 127 )
unsigned char : 1 byte ( 0 s/d 255 )
int : 2 byte ( -32768 s/d 32767 )
unsigned int : 2 byte ( 0 s/d 65535 )
long : 4 byte ( -2147483648 s/d 2147483647 )
unsigned long : 4 byte ( 0 s/d 4294967295 )
float : bilangan desimal
array : kumpulan data-data yang sama tipenya.
Terkadang untuk mendefenisikan tipe data dengan nama tersendiri
dapat
menggunakan keyword typedef. Perhatikan contoh berikut : typedef
unsigned char ubyte;
ubyte merupakan nama lain dari tipe data unsigned char
Deklarasi Variabel , Konstanta dan Alamat I/O
Variabel merupakan lokasi memori tempat penyimpanan data yang
nilai
datanya dapat diubah pada saat program dijalankan.
Sementara Konstanta merupakan lokasi memori penyimpan data yang
nilai
datanya tetap/konstan.
Ketika kita mendeklarasikan suatu variabel atau konstanta
secara
otomatis compiler bahasa C akan mengalokasikan sebuah lokasi
memori pada RAM internal MCS51 yang akan digunakan untuk
menyimpan nilai data dari variabel/konstanta tersebut.
Untuk mendeklarasikan variabel data penulisan kode programnya
sebagai
berikut:
[tipe data] [nama variabel] [= nilai awal (Optional)]
Contoh:
int counter = 0;
unsigned char sum;
-
DiktatSistem Mikrokontroler
Page 15 | Politeknik Jambi Irwan Kurniawan, ST
Untuk mendeklarasikan konstanta penulisannya adalah sebagai
berikut:
[#define] [nama konstanta] [nilai konstanta]
Contoh:
#define phi 3.14
#define data_led 0xFF
Selain variabel dan konstanta kita juga dapat mendeklarasikan
sebuah
variabel data dari sebuah PORT I/O atau Memori External
dengan
alamat tertentu. Yaitu dengan cara mengalokasikan lokasi
memori
/alamat PORT I/O secara manual menggunakan kata kunci xdata
at(alamat)
Contoh penggunaan xdata at(0x4002)
#include
xdata at(0x4002) unsigned char PORT_LED;
unsigned char data_led
void main(){
PORT_LED = 0x40;
}
Pada contoh program diatas, alamat 0x4002 dialokasikan sebagai
alamat
PORT_LED.Alamat external ini merupakan alamat yang dikeluarkan
melaui
Bus Alamat dari MCS51. Tipe data yang harus digunakan untuk
mendeklarasikan sebuah PORT adalah unsigned char.
Contoh
menuliskan/mengeluarkan data ke sebuah PORT Output
[nama_port] = [data_port] PORT_LED = 0x40;
membaca data dari sebuah PORT Input
[variabel_data] = [nama_port] data_led = PORT_LED;
Struktur Percabangan
Struktur percabangan digunakan untuk memilih atau menyeleksi
kondisi yang
dipersyaratkan dalam mengeksekusi perintah dalam
pemrograman.
Bentuk penulisannya
If (kondisi1) {perintah1 } else{perintah2} if(a==0xff){
b=0x1f;
}else{
b=0x00;
}
Jika kondisi1 terpenehi maka barisan perintah1 dieksekusi, jika
kondisi1 tidak
terpenuhi maka barisan perintah2 yang dieksekusi.
-
DiktatSistem Mikrokontroler
Page 16 | Politeknik Jambi Irwan Kurniawan, ST
If (kondisi1){perintah1} else if(kondisi2) {perintah2}
if(a==0xff){
b=0x1f;
}else if(a==0x00){
b=0x00;
}
Jika kondisi1 terpenuhi maka barisan perintah1 dieksekusi, jika
kondisi1 tidak
terpenuhi tetapi kondisi2 terpenuhi maka barisan perintah2 yang
dieksekusi.
if (kondisi1){perintah1}else if(kondisi2){pernitah2}
else{perintah3}
if(a==0xff){
b=0x1f;
}else if(a==0x00){
b=0x00;
}else{
b = 0xff;
}
Jika kondisi1 terpenuhi maka barisan perintah1 dieksekusi, jika
kondisi1 tidak
terpenuhi tetapi kondisi2 terpenuhi maka barisan perintah2 yang
dieksekusi,
dan jika tidak ada kondisi yang terpenuhi maka barisan perintah3
yang
dieksekusi.
Struktur Perulangan
Struktur perulangan digunakan untuk mengeksekusi barisan
perintah secara
berulang sesuai dengan kondisi atau jumlah perulangan yang
dipersyaratkan.
Perulangan dengan for
Pada Perulangan ini looping dilakukan sesuai dengan jumlah
yang
ditentukan. Contoh: for (n=0;n 0).nilai n akan berkurang
setiap
perulangan (n--).
Perulangan dengan while
Perulangan jenis ini kan melakukan looping selama kondisi
yang
dipersyaratkan terpenuhi.
-
DiktatSistem Mikrokontroler
Page 17 | Politeknik Jambi Irwan Kurniawan, ST
Contoh PORT_LED2 = 0xFF;
while(data_led !=0xFF){
data_led = PORT_LED1;
}
PORT_LED2 = 0x00;
Kondisi awal PORT_LED2 adalah 0xFF kemudian program akan
melakukan perulangan while(). Pada perulangan ini program
akan
mengeksekusi perintah data_led = PORT_LED1 atau perintah
membaca data pada PORT_LED1 berulangkali. Selama data_led
tidak
sama (!=) dengan 0xFF maka perulangan akan terus terjadi.
ketikadata_led=0xFF maka perulangan akan berhenti. Dan
program
akan lanjut ke baris perintah dibawahnya yaitu perintah
PORT_LED2 =
0x00.
Fungsi dan Subrutin
Fungsi adalah blok program yang digunakan untuk melakukan
sekumpulan
instruksi akan mengembalikan nilai tertentu setelah semua
instruksi
dilaksanakan.
Subrutin adalah blok program yang digunakan untuk melakukan
sekumpulan
instruksi tertentu. Perbedaannya dengan fungsi adalah subrutin
hanya
menjalankan sekumpulan instruksi dan tidak mengembalikan nilai
tertentu.
//contoh subrutin
void counter_up(){
counter++;
}
//contoh fungsi
int kalikan(int ct){
int temp;
temp = 2 * ct;
return temp; //pengembalian nilai
}
Prototype fungsi dan subrutin
Jika sebuah penulisan kode fungsi atau subrutin berada dibawah
program
utama (subrutin main()), agar fungsi atau subrutin tersebut
dapat dipanggil
oleh program utama maka perlu dilakukan deklarasi
fungsi/subrutin atau yang
disebut dengan prototype. Perhatikan contoh berikut:
#include
int hasil = 0;
int counter = 0;
int kalikan(int); //prototype fungsi kalikan
void counter_up(); //prototype subrutin counter_up
void main(){
counter_up();
hasil = kalikan(counter);
}
void counter_up(){
counter++;
}
int kalikan(int ct){
int temp;
temp = 2 * ct;
return temp;
}
-
DiktatSistem Mikrokontroler
Page 18 | Politeknik Jambi Irwan Kurniawan, ST
Operasi relasional (perbandingan) Sama dengan : == Tidak sama
dengan : != Lebih besar : > Lebih besar sama dengan : >=
Lebih kecil : < Lebih kecil sama dengan : >
Shift left biner :
-
DiktatSistem Mikrokontroler
Page 19 | Politeknik Jambi Irwan Kurniawan, ST
APLIKASI SISTEM MINIMUM MCS51 Sistem minimum MCS51 yang
digunakan untuk beberapa aplikasi biasanya memiliki
alamat PORT I/O yang cukup banyak.Sehingga sistem minimum MCS-51
nantinya dapat
diimplemantasikan untuk aplikasi yang luas dan mudah dalam
pengembangannya.
Pada diktat ini, sistem MCS51 yang digunakan pada beberapa
contoh aplikasi , memiliki
16 Port I/O dan 2K RAM Eksternal. Peta Alokasi Memori RAM dan
PORT I/O dapat dilihat
pada tabel berikut:
Port / Memori Alamat
1 buah RAM 2 KB 0x0000 0x07FF
7 buah Port I/O 0x1200 0x1207
7 buah Port I/O 0x1300 0x1307
A15 A14 A13 A12
A11 A10 A9 A8
A7 A6 A5 A4
A3 A2 A1 A0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x0000
0 0 0 0 0 x x x x x x x x x x x RAM 2KB
0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0x07FF
0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0x1200
0 0 0 1 0 0 1 0 0 0 0 0 0 x x x 8 PORT
0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0x1207
0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0x1300
0 0 0 1 0 0 1 1 0 0 0 0 0 x x x 8 PORT
0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0x13007
Rangkaian Dekoder sistem minimum MCS-51
Gambar 12. Rangkaian Dekoder Alamat Memori dan 16 Port I/O
-
DiktatSistem Mikrokontroler
Page 20 | Politeknik Jambi Irwan Kurniawan, ST
APLIKASI LED
Aplikasi Running LED
Berikut ini adalah aplikasi running led dengan menggunakan PORT
I/O pada alamat
1200H. Rangkaian LED dan PORT I/O yang digunakan, dapat dilihat
pada gambar
berikut :
Gambar 13.Rangkaian Aplikasi 8 LED pada PORT 1200H
Program Aplikasi :
#include
typedef unsigned char ubyte;
xdata at(0x1200) ubyte PORT_LED;
ubyte led ;
void delay (int);
void main(){
while(1){
if (led == 0x00){
led = 0x01;
}
PORT_LED = led;
delay(400);
led
-
DiktatSistem Mikrokontroler
Page 21 | Politeknik Jambi Irwan Kurniawan, ST
Aplikasi Led dan Input Switch
Pada aplikasi berikut digunakan 2 buah PORT yang berbeda, salah
satu PORT
digunakan sebagai jalur input dan PORT lainnya sebagai jalur
Output. PORT input
digunakan untuk membaca data switch, sedangkan PORT Output
digunakan untuk
display 8 led yang merepresentasikan kondisi switch. Berikut
rangkaian aplikasinya
Gambar 14.Rangkaian Input Switch pada Alamat PORT 1201H
Program Aplikasi Menampilkan data input switch bit ke displah
LED :
#include
typedef unsigned char ubyte;
xdata at(0x1200) ubyte PORT_LED;
xdata at(0x1201) ubyte PORT_SW;
ubyte led ;
void delay (int);
void main(){
while(1){
led = PORT_SW;
PORT_LED = led;
delay(200);
}
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m
-
DiktatSistem Mikrokontroler
Page 22 | Politeknik Jambi Irwan Kurniawan, ST
APLIKASI 7 SEGMEN
Untuk mempermudah display data dengan 7 segmen,biasanya
digunakan komponen
dekoder BCD to 7 Segmen. Dekoder yang digunakan adalah IC 7447.
Prinsip utama dari
dekoder ini adalah mendekodekan data BCD ke data display 7
segmen common katoda.
Data BCD yang digunakan untuk 1 buah dekoder 7 segmen adalah 4
bit yang mewakili
angka 0 sampai 9. Contoh rangkaian aplikasi seven segmen dapat
dilihat pada gambar
berikut:
Gambar 15.Aplikasi Seven Segmen Common Anode pada PORT 1202H
-
DiktatSistem Mikrokontroler
Page 23 | Politeknik Jambi Irwan Kurniawan, ST
Program Aplikasi Menampilkan angka ke Seven Segmen
#include
typedef unsigned char ubyte;
xdata at(0x1202) ubyte PORT_7SEG;
ubyte angka ;
ubyte data_seg;
void delay (int);
void main(){
angka = 34;
data_seg = (angka / 10)*16 + (angka % 10);
PORT_7SEG = data_seg;
delay(800);
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m 99){angka = 0;}
data_seg = (angka / 10)*16 + (angka % 10);
PORT_7SEG = data_seg;
angka++;
delay(800);
}
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m
-
DiktatSistem Mikrokontroler
Page 24 | Politeknik Jambi Irwan Kurniawan, ST
KEYPAD 4x3
Proses scaning keypad dilakukan untuk setiap kolom C0-C2 dengan
memberikan logika
0 pada kolom yang akan diaktifkan dan memberikan logika 1 pada
kolom lainya.
Kemudian membaca data pada baris R0-R3.Jika terjadi penekanan
tombol pada keypad
maka tombol yang ditekan dapat diketahui dengan melihat baris
dan kolom yang
berlogika 0.
Gambar 16. Keypad 4x3
Proses meng-aktifkan kolom dilakukan secara bergantian. Berikut
adalah table
hubungan antara data kolom dan data baris serta tombol yang
ditekan pada keypad.
C0-C2 dihubungkan dengan (Output) keluaran dari Mikroprosesor
R0-R3 dihubungkan
(Input) masukan ke Mikroprosesor
C0 C1 C2 R0 R1 R2 R3 KEY Keterangan
0 1 1 0 1 1 1 1
Kolom 0 Aktif 0 1 1 1 0 1 1 4
0 1 1 1 1 0 1 7
0 1 1 1 1 1 0 *
1 0 1 0 1 1 1 2 Kolom 1
Aktif 1 0 1 1 0 1 1 5
1 0 1 1 1 0 1 8
1 0 1 1 1 1 0 0
1 1 0 0 1 1 1 3 Kolom 2
Aktif 1 1 0 1 0 1 1 6
1 1 0 1 1 0 1 9
1 1 0 1 1 1 0 #
-
DiktatSistem Mikrokontroler
Page 25 | Politeknik Jambi Irwan Kurniawan, ST
Gambar 16. Rangkaian Keypad pada Port 1204h dan 1205h
Program Aplikasi:
Scanning Keypad dengan display 7 Segmen (gambar 16)
#include
typedef unsigned char ubyte;
xdata at(0x1204) ubyte PORT_BARIS ;
xdata at(0x1205) ubyte PORT_KOLOM ;
xdata at(0x1202) ubyte PORT_7SEG;
ubyte tabel_key[3][4];
ubyte scan_keypad();
void init_tabel_keypad();
void delay(int);
void main(){
ubyte key;
init_tabel_keypad();
while(1){
key = scan_keypad();
if (key !=0xFF){
PORT_7SEG = key;
}
delay(80);
}
}
-
DiktatSistem Mikrokontroler
Page 26 | Politeknik Jambi Irwan Kurniawan, ST
ubyte scan_keypad(){
ubyte k;
ubyte data_kolom;
ubyte data_baris;
ubyte s_key= 0xFF;
for (k =0;k
-
DiktatSistem Mikrokontroler
Page 27 | Politeknik Jambi Irwan Kurniawan, ST
Fungsi ubyte scan_keypad()akan melakukan scanning keypad mulai
dari kolom 0
sampai kolom 3. Setiap kali melakukan scanning pada kolom ,
MCS51 akan
mengeluarkan logic 0 pada kolom tersebut dan logic 1 pada kolom
lainya.Data kolom
dikeluarkan melalui PORT_KOLOM (0x1205). Kemudian dilakukan
pengecekan pada
setiap barisnya, melalui pembacaan PORT_BARIS (0x1204). Setiap
pasangan kolom dan
baris disesuaikan dengan tabel_key[3][4]. Fungsi ini akan
mengembalikan sebuah nilai
dari tombol yang ditekan ke variable key dari program utama.
-
DiktatSistem Mikrokontroler
Page 28 | Politeknik Jambi Irwan Kurniawan, ST
DISPLAY Liquid Cristal Dysplay (LCD)
Liquid Cristal Dysplay (LCD) merupakan suatu modul display. LCD
tersusun dari susunan dot matrik kristal cair. Suatu LCD tersusun
dari dot matrix LCD Controller, segment
driver, serta LCD Panel. Dimana controller LCD telah
terintegrasi dengan RAM/ROM pembangkit karakter atau CGRAM
(Character Generator RAM) dan RAM data display atau DDRAM (Display
Data RAM). Semua fungsi display dikendalikan oleh
instruksi-instruksi sehingga dapat dengan mudah dihubungkan dengan
mikrokontroler. LCD yang digunakan yaitu VCM- 162A atau M1632
dimana LCD ini memiliki fitur-fitur sebagai berikut: - Memiliki 16
karakter dan 2 baris (LCD 16 x 2)
- RAM pembangkit karakter untuk 192 tipe karakter (5 x 8 dot
matrix) - Mudah dihubungkan dengan mikroprosesor/mikrokontroler -
RAM data display (DDARAM) dan RAM pembangkit karakter (CGRAM) dapat
diambil dari mikroprosesor/mikrokontroler,
Modul LCD ini memiliki 16 kaki pin dimana fungsi dan letak pin
tersebut ditunjukkan pada tabel berikut :
Pada dasarnya akses dari microcontroller ke Modul LCD ini
terdiri dari 4 jenis sebagai berikut: Pengiriman Instruksi Register
Pembacaan Address Counter dan Busy Flag Pengiriman Data
Register
Pembacaan Data Register Register LCD mempunyai dua buah Register
yang aksesnya diatur dengan menggunakan kaki RS. Pada saat RS
berlogika 0, maka register yang diakses adalah Register Perintah
dan pada saat RS berlogika 1, maka register yang diakses adalah
Register Data
-
DiktatSistem Mikrokontroler
Page 29 | Politeknik Jambi Irwan Kurniawan, ST
Register Perintah Register ini adalah register di mana
perintah-perintah dari mikrokontroler ke HD44780 pada saat proses
penulisan data atau tempat status dari HD44780 dapat dibaca pada
saat pembacaan data. Penulisan Data ke Register Perintah Penulisan
data ke Register Perintah dilakukan dengan tujuan mengatur tampilan
LCD, inisialisasi dan mengatur Address Counter maupun Address Data.
Gambar 17 menunjukkan proses penulisan data ke register perintah
dengan menggunakan mode 4 bit interface. Kondisi RS berlogika 0
menunjukkan akses data ke Register Perintah. RW berlogika 0 yang
menunjukkan proses penulisan data akan dilakukan. Data instruksi
dikirimkan dengan diawali pulsa logika 1 pada sinyal E Clock dan
dalam selang waktu
yang singkat sinyal E di kembalikan ke logika 0.
Register Data
Register ini adalah register di mana mikrokontroler dapat
menuliskan atau membaca data ke atau dari DDRAM. Penulisan data
pada register ini akan menempatkan data tersebut ke DDRAM sesuai
dengan alamat yang telah diatur sebelumnya.
Penulisan Data ke Register Data Penulisan data pada Register
Data dilakukan untuk mengirimkan data yang akan ditampilkan pada
LCD. Proses diawali dengan adanya logika 1 pada RS yang menunjukkan
akses ke Register Data, kondisi R/W diatur pada logika 0 yang
menunjukkan proses penulisan data. Data karakter dikirimkan dengan
diawali pulsa logika 1 pada sinyal E Clock dan dalam selang waktu
yang singkat sinyal E di kembalikan ke logika 0.
-
DiktatSistem Mikrokontroler
Page 30 | Politeknik Jambi Irwan Kurniawan, ST
Gambar 18. Interfacing LCD pada PORT 1206H dan PORT 1207H
Program Aplikasi:
Menampilkan Tulisan LCD-MCS51 pada baris pertama
#include
typedef unsigned char ubyte ;
xdata at(0x1206) ubyte PORT_LCD_DATA;
xdata at(0x1207) ubyte PORT_LCD_CTL;
//D0-D7 => PORT_LCD_DATA
//PORT_LCD_CTL: bit0-E bit1-RS bit2-RW
#define funcset 0x38
#define clrscreen 0x01
#define displayon_cursoroff 0x0C
#define cursor_inc 0x06
void kirim_karakter(ubyte);
void kirim_instruksi(ubyte);
void delay(int);
void main(){
//inisialisasi lcd
kirim_instruksi(funcset);
kirim_instruksi(clrscreen);
kirim_instruksi(displayon_cursoroff);
kirim_instruksi(cursor_inc);
kirim_instruksi(0x80); //posisikan cursor kolom 0 baris 0
//kirim karkater
kirim_karakter('L');
kirim_karakter('C');
kirim_karakter('D');
kirim_karakter('-');
kirim_karakter('M');
kirim_karakter('C');
kirim_karakter('S');
-
DiktatSistem Mikrokontroler
Page 31 | Politeknik Jambi Irwan Kurniawan, ST
kirim_karakter('5');
kirim_karakter('1');
}
void kirim_instruksi(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
PORT_LCD_CTL = 0x01; //E = 1 RS 0 RW 0;
delay(5);
PORT_LCD_CTL = 0x00; //E = 0 RS 0 RW 0;
delay(5);
}
void kirim_karakter(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
delay(5);
PORT_LCD_CTL = 0x03; //E 1 RS 1 RW 0;
delay(5);
PORT_LCD_CTL = 0x02; //E 0 RS 1 RW 0;
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m PORT_LCD_DATA
//PORT_LCD_CTL: bit0-E bit1-RS bit2-RW
#define funcset 0x38
#define clrscreen 0x01
#define displayon_cursoroff 0x0C
#define cursor_inc 0x06
#define shifentry_left 0x05
void kirim_karakter(ubyte);
void kirim_instruksi(ubyte);
-
DiktatSistem Mikrokontroler
Page 32 | Politeknik Jambi Irwan Kurniawan, ST
void kirim_string(char *str);
void delay(int);
void main(){
//inisialisasi lcd
kirim_instruksi(funcset);
kirim_instruksi(clrscreen);
kirim_instruksi(displayon_cursoroff);
kirim_instruksi(cursor_inc);
kirim_instruksi(0x80); //posisikan cursor kolom 0 baris 1
kirim_string("POLITEKNIK");
kirim_instruksi(0xC0); //posisikan cursor kolom 0 baris 2
kirim_string("JAMBI");
}
void kirim_instruksi(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
PORT_LCD_CTL = 0x01; //E = 1 RS 0 RW 0;
delay(5);
PORT_LCD_CTL = 0x00; //E = 0 RS 0 RW 0;
delay(5);
}
void kirim_karakter(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
delay(5);
PORT_LCD_CTL = 0x03; //E 1 RS 1 RW 0;
delay(5);
PORT_LCD_CTL = 0x02; //E 0 RS 1 RW 0;
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m
-
DiktatSistem Mikrokontroler
Page 33 | Politeknik Jambi Irwan Kurniawan, ST
Analog to Digital Converter (ADC)
Konverter analog ke digital (ADC) tersedia secara komersial
sebagai rangkaian terpadu dengan resolusi 8 bit sampai dengan 16
bit. Pada percobaan ini akan
memperkenalkan ADC0804, yaitu sebagai sebuah konverter ADC 8 bit
yang mudah diinterfacekan dengan sistem mikrokontroller.
ADC ini menggunakan metode approksimasi berturut-turut untuk
mengkonversikan masukan analog (0-5V) menjadi data digital 8 bit
yang ekivalen.ADC0804 mempunyai pembangkit clock internal dan
memerlukan catu daya +5V dan mempunyai waktu konversi optimum
sekitar 100us.
Gambar 19. Konfigurasi Pin ADC 0804
Gambar 19 menunjukkan diagram konfigurasi pin ADC0804. Pin 11
sampai 18
(keluaran digital) adalah keluaran tiga keadaan, yang dapat
dihubungkan langsung dengan bus data bilamana diperlukan. Apabila
CS ( pin 1 ) atau RD (pin2) dalam keadaan high (1), pin 11 sampai
18 akan mengambang ( high impedance ), apabila CS dan RD rendah
keduanya, keluaran digital akan muncul pada saluran keluaran.
Sinyal mulai konversi pada WR (pin 3).Untuk memulai suatu
konversi, CS harus rendah.Bilamana WR menjadi rendah, konverter
akam mengalami reset, dan ketika WR kembali kepada keadaan high,
konversi segera dimulai. Konversi detak konverter harus terletak
dalam daerah frekuensi 100 sampai 800kHz. CLK IN ( pin 4) dapat
diturunkan
dari detak mikrokontroller, sebagai kemungkinan lain, kita dapat
mempergunakan pembangkit clock internal dengan memasang rangkaian
RC antara CLN IN ( pin 4) dan CLK R ( pin 19).
Pin 5 adalah saluran yang digunakan untuk INTR, sinyal selesai
konversi. INTR akan menjadi tinggi pada saat memulai konversi, dan
akan aktiv rendah bila konversi telah selesai. Tepi turun sinyal
INTR dapat dipergunakan untuk menginterupsi sistem mikrokontroller,
supaya mikrokontroller melakukan pencabangan ke subrutine pelayanan
yang memproses keluaran konverter. Pin 6 dan 7 adalah masukan
diferensial bagi sinyal analog. A/D ini mempunyai dua ground, AGND
(pin 8) dan DGND ( pin10). Kedua pin ini harus dihubungkan dengan
ground. Pin 20 harus dihubungkan dengan catu daya +5V
Pada A/D 0804 merupakan tegangan referensi yang digunakan untuk
offset suatu keluaran digital maksimum. Dengan persamaan sebagai
berikut:
VREF =0.5 x Vin Misalnya diinginkan masuk analog maksimum
sebesar 4 V, maka:VREF=0.5 x 4 = 2 volt
-
DiktatSistem Mikrokontroler
Page 34 | Politeknik Jambi Irwan Kurniawan, ST
Resolusi ADC untuk permisalan di atas mempunyai arti seperti
ditunjukkan padsa tabel berikut:
Tabel Tegangan Resolusi ADC 0804 untuk Tegangan Maks 4 Volt
Vin (Volt) Data Digital (biner)
Data Desimal
0 00000000 0
0,0156 00000001 1
0,0313 00000010 2
... ... ...
4 11111111 255
ADC ini dapat dirangkai untuk menghasilkan konversi secara
kontinu.Untuk
melaksanakannya, kita harus menghubungkan CS, dan RD ke ground
dan menyambungkan WR dengan INTR seperti pada gambar dibawah ini.
Maka dengan ini keluaran digital yang kontinu akan muncul, karena
sinyal INTR menggerakkan masukan WR. Pada akhir konversi INTR
berubah menjadi low, sehingga keadaan ini akan mereset konverter
dan mulai konversi.
Untuk membaca nilai tegangan Input (Vin) dapat menggunakan Rumus
Berikut:
Rangkaian ADC 0804 dengan MCS51
Gambar 21 Rangkaian Interface ADC0804 sebagai Volmeter
Digital
-
DiktatSistem Mikrokontroler
Page 35 | Politeknik Jambi Irwan Kurniawan, ST
Program Aplikasi Menampilkan data ADC Pada LED (PORT LED gambar
13)
#include
typedef unsigned char ubyte ;
xdata at(0x1302) ubyte PORT_ADC;
xdata at(0x1200) ubyte PORT_LED;
//P1.5 RD adc
//P1.6 WR adc
//P1.7 INTR adc
#define RD_ADC P1_5
#define WR_ADC P1_6
#define INT_ADC P1_7
ubyte data_adc;
void delay(int);
void main(){
while(1){
WR_ADC = 0;
while(INT_ADC==0){}
WR_ADC = 1;
RD_ADC = 0;
data_adc = PORT_ADC;
RD_ADC = 1;
PORT_LED = data_adc;
delay(1000);
}
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m
-
DiktatSistem Mikrokontroler
Page 36 | Politeknik Jambi Irwan Kurniawan, ST
Program Aplikasi Menampilkan data ADC Pada LCD (PORT LCD gambar
18) #include
#include
#include
#include
#include
#include
typedef unsigned char ubyte ;
xdata at(0x1302) ubyte PORT_ADC;
xdata at(0x1206) ubyte PORT_LCD_DATA;
xdata at(0x1207) ubyte PORT_LCD_CTL;
//P1.5 RD adc
//P1.6 WR adc
//P1.7 INTR adc
#define RD_ADC P1_5
#define WR_ADC P1_6
#define INT_ADC P1_7
#define funcset 0x38
#define clrscreen 0x01
#define displayon_cursoroff 0x0C
#define cursor_inc 0x06
void kirim_karakter(ubyte);
void kirim_instruksi(ubyte);
void delay(int);
ubyte read_adc();
void init_lcd();
void kirim_string(char *str);
ubyte str_adc[16];
float VMAX = 5;
float VIN;
ubyte ADC;
void main(){
init_lcd();
while(1){
ADC = read_adc();
VIN = __uchar2fs(ADC);
VIN = __fsdiv(VIN * VMAX,255);
float2str(VIN, str_adc);
kirim_instruksi(0x01);
kirim_instruksi(0x80);
kirim_string(str_adc);
kirim_string(" Volt");
delay(500);
}
}
ubyte read_adc(){
ubyte data_adc;
WR_ADC = 0;
while(INT_ADC==0){}
WR_ADC = 1;
RD_ADC = 0;
data_adc = PORT_ADC;
RD_ADC = 1;
return data_adc;
}
-
DiktatSistem Mikrokontroler
Page 37 | Politeknik Jambi Irwan Kurniawan, ST
void init_lcd(){
kirim_instruksi(funcset);
kirim_instruksi(clrscreen);
kirim_instruksi(displayon_cursoroff);
kirim_instruksi(cursor_inc);
kirim_instruksi(0x80); //posisikan cursor kolom 0 baris 0
}
void kirim_instruksi(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
PORT_LCD_CTL = 0x01; //E = 1 RS 0 RW 0;
delay(5);
PORT_LCD_CTL = 0x00; //E = 0 RS 0 RW 0;
delay(5);
}
void kirim_karakter(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
delay(5);
PORT_LCD_CTL = 0x03; //E 1 RS 1 RW 0;
delay(5);
PORT_LCD_CTL = 0x02; //E 0 RS 1 RW 0;
}
void kirim_string(char *str){
ubyte n;
for (n = 0;n 0){
for (m=0;m
-
DiktatSistem Mikrokontroler
Page 38 | Politeknik Jambi Irwan Kurniawan, ST
n = fabsf(n);
f_bulat = floorf(n);
temp = __fs2slong(f_bulat);
_ltoa(temp,str1,10);
for(i = 0; i < strlen(str1); i++){
str[j] = str1[i];
j++;
}
n = n-f_bulat;
str[j] = '.';
j++;
if (n < 0.1){
str[j] = '0';
j++;
}else if(n
-
DiktatSistem Mikrokontroler
Page 39 | Politeknik Jambi Irwan Kurniawan, ST
for (i = 0; i < strlen(str);i++){
if ((str[i]'9') && str[i] !='-' &&
str[i]!='.'){
str[i] = 0;
}
}
}
Simpan kode library diatas sebagai file header (*.h) dengan nama
float_str.h simpan ke directori tempat program aplikasi ADC
disimpan. Fungsi library ini adalah untuk mengkonversikan bilangan
decimal (float) ke bentuk string, sehingga dapat di tampilkan ke
LCD.