BAB II
MIKROKONTROLER AT89C2051

2.1. PERANGKAT KERAS MIKROKONTROLER
Perbedaan antara mikrokomputer, mikroprosesor, dan mikrokontroler adalah mikroprosesor merupakan bagian dari CPU (Central Processing Unit) dari sebuah komputer, tanpa memori, I/O dan feriperal yang dibutuhkan suatu sistem lengkap, contohnya 8088 dan 80X86. Untuk dapat bekerja mikroprosesor memerlukan perangkat pendukung yang berupa memori (RAM dan ROM).
Bila sebuah mikriprosesor dikombinasikan dengan I/O dan memori (RAM dan ROM), akan dihasilkan sebuah mikrokontroler. Pada kenyataanya mengkombinasi CPU dengan memori dan I/O dapat juga dilakukan dalam aras chip atau IC, yang menghasilkan Single Microcomputer (SCM) untuk membedakan dengan mikrokomputer. Untuk selanjutnya SCM dapat disebut dengan mikrokontroler.
Perbedaan yang menonjol antara mikrokomputer dengan mikrokontroler adalah pada mikrokontroler sudah terdapat RAM dan peralatan I/O pendukung sehingga tidak perlu digunakan lagi diluar mikrokontroler.

2.1.1. Fasilitas Dasar Mikrokontroler
 Mikrokontroler merupakan bentuk khusus gabungan CPU dengan peralatan atau komponen lain, maka berikut dapat diuraikan komponen-komponen tersebut yang merupakan fasilitas dasar sebuah mikrokontroler. Adapun fasilitas-fasilitas mikrokontroler AT89C2051 yaitu:
1. Central Processing Unit (CPU)
Unit pengolah pusat (Cental processing Unit) terdiri atas dua bagian, yaitu unit pengendali (Control Unit) serta arithmatika dan logika (Arithmatic Logic Unit). Fungsi utama pengendali adalah mengambil, mengkode dan melaksanakan urutan instruksi sebuah program yang tersimpan dalam memori. Unit pengendali mengatur urutan operasi seluruh sistem. Unit ini juga mengendalikan dan mengatur sinyal pengendali yang diperlukan untuk menyerempakkan operasi, juga aliran dan instruksi program.
2. Alamat (Address)
Pada mikrokontroler alamat yaitu suatu alat yang akan dihubungkan dengan mikrokontroler terlebih dahulu harus ditetapkan alamat (Address) alat tersebut. Hal ini bertujuan untuk menghindari terjadinya dua alat yang bekerja secara bersamaan dalam satu waktu sehingga memungkinkan terjadinya kesalahan atau kerusakan. Alat penyimpan data (Memory), baik RAM maupun ROM, juga mempunyai alamat. 
3. Data
CPU mikrokontroker AT89C2051 adalah prosesor 8 bit. Lebar bus data adalah 8 bit sehingga memerlukan 8 pena (D0…D7). Pena untuk bus data dimultipleks dengan alamat A0…A7 pada port 0. Karena itu port 0 sering kali ditulis sebagai AD0…AD7. Setiap bit data memiliki bobot masing-masing, tergantung pada letaknya.
4. Pengendali
Setiap bus alamat dan bus data mikrokontroler dilengkapi juga dengan bus kendali (Control Bus). Guna pengendali ini adalah menyerempakan operasi mikrokontroler dengan operasi rangkaian luar.
5. Memory
Suatu sistem mikrokontroler memerlukan memori untuk tempat penyimpanan program atau data. Pada mikrokontroler tempat menyimpan program adalah ROM/EPROM.
Ada beberapa tingkatan memori, diantaranya adalah register internal, memori utama dan memori massal (Mass Memory). Register internal adalah memori didalam ALU. Waktu akses register sangat cepat, umumnya kurang dari 100 ns. Memori utama adalah memori suatu sistem. Ukurannya berkisar antara 4 Kb sampai 64 Kb. Waktu aksesnya lebih lambat dibanding register internal, yaitu antara 200 sampai 1000 ns. Memori massal dipakai untuk penyimpanan berkapasitas tinggi, biasanya berbentuk disket, pita maknetik atau kaset.
6. Random Access Memory (RAM)
RAM (Random Access Memory) adalah memori yang dapat dibaca atau ditulis. Data dalam RAM akan terhapus (Volatile) bila catu daya dihilangkan. Karena sifat RAM yang volatile ini, maka program mikrokontroler tidak disimpan dalam RAM, tapi digunakan untuk menyimpan data sementara, yaitu data yang tidak begitu vital bila hilang akibat aliran listrik terputus.
Ada dua teknologi yang dipakai untuk membuat RAM, yaitu RAM statik dan RAM dinamik. Dalam RAM statik, satu bit informasi disimpan dalam sebuah flip-flop. RAM statik tidak memerlukan penyegar dan penangananya juga tidak terlalu rumit. Isi RAM tetap tersimpan selama daya diberikan. RAM dinamik menyimpan bit informasi sebagai muatan. Sel memori elementer dibuat dari kapasitas gerbang substrate transistor MOS. Keuntungan RAM dinamik adalah sel-sel memori yang lebih kecil sehingga menghemat tempat. Dengan kapasitas RAM dinamik lebih besar dibandingkan dengan RAM statik.

2.1.2. Organisasi Memori
Semua mikrokontroler dalam keluarga MCS-51 memiliki pembagian ruang (Address Space) untuk program dan data. Pemisahan memori program dan memori data memperbolehkan memori data untuk diakses oleh alamat 8 bit. Sekalipun demikian alamat data memori 16 bit dapat dihasilkan melalui register DPRTR (Data Ponter Register).
Memori program hanya dapat dibaca, tidak dapat ditulis (karena tersimpan dalam EPROM). Memori program sebesar 64 K dapat dimasukan dalam EPROM eksternal.
Sinyal yang memperbolehkan pembacaan dari program eksternal adalah dari pena PSEN. Memori data terletak pada ruang alamat yang terpisah dari memori program. RAM eksternal 64 K dapat dialamati dalam ruang memori data eksternal. CPU menghasilkan sinyal READ dan WRITE selama menghubungi memori data eksternal. Mikrokontroler AT89C2051 memiliki 5 ruang alamat yaitu:
1.  Ruang alamat kode (Code Address Space) sebanyak 64 K, yang seluruhnya merupakan ruang alamat kode eksternal (off chip).
 2. Ruang alamat data internal yang dapat dialamati secara langsung, yang terdiri atas RAM sebanyak 128 byte .
3.  Ruang alamat data internal yang dialamati secara tidak langsung sebanyak 128 byte, seluruhnya dialamati dalam pengalamatan tidak langsung.
4.  Ruang alamat data eksternal sebanyak 64 Kbyte yang dapat ditambahkan oleh pemakai.
5.  Ruang alamat bit. Dapat diakses dengan pengalamatan langsung.

a.	Memori Program
Gambar 2.3 memperlihatkan bagian bawah dari memori program. Setelah direset CPU memulai eksekusi dari lokasi 0000H. Interupsi menyebabkan CPU melompat ke lokasi tersebut, ketika interupsi mulai eksekusi routine layanan. Sebagai contoh interupsi eksternal 0 ditempatkan pada alamat atau lokasi 0003H. Jika interupsi eksternal 0 akan digunakan, routine layanan harus memulai pada alamat 0003H. Lokasi-lokasi layanan interupsi memerlukan interval ruang sebanyak 8 byte 0003H untuk interupsi eksternal 0, 000BH untuk timer 0, 0013H untuk interupsi eksternal 1, 001BH untuk timer 1 dan sebagainya.
 Jika sebuah layanan interupsi cukup pendek, maka interupsi dapat menempati seluruh interval sebanyak 8 byte. Routine layanan yang lebih panjang menggunakan sebuah intruksi loncat untuk melewati lokasi interupsi yang berikut jika interupsi lain sedang digunakan.

23H	
1BH	
13H	
0BH	
03H	
00H	

Gambar 2.1. Memori Program

b.	Memori Data

Memori data internal, seperti pada gambar 2.4. Ruang memorinya terdiri dari tiga blok, yaitu sebagai lower 128, upper 128 dan ruang SFR (Special Function Register).

00H

SRF

Gambar 2.2. Memori Data Internal
Bagian bawah dan bagian atas dari 128 byte RAM dipetakan seperti terlihat pada gambar 2.3. Tiga puluh dua byte paling bawah dikelompokan dalam 4 bank (8 register), yaitu R0 sampai R7. Dua bit dalam PSW (Program Status Word) memiliki register bank yang digunakan .

R7

7FH	
2FH

1FH

17H
	
0FH

07H

R0

Gambar 2.3. Bagian Bawah 128 byte RAM Internal

Gambar 2.5 menunjukan ruang SFR (SFR space). SFR berisi penahan port (port latch), pewaktu (Timer), pengontrol peripheral dan lain-lain. Register ini hanya dapat diakses oleh pengalamatan langsung.

Gambar 2.5. Ruang SFR (Special Function Memory)

2.1.4. Program Status Word (PSW)
Program status word berisi beberapa bit status yang mencerminkan keadaan mikrokontroler. Definisi dalam PSW dijelaskan dibawah ini:

Alamat PSW = 0D0H
MSB                                                                                                              LSB
CY	AC	F0	RS1	RS0	OV	-	P	
      Bit   7          6               5             4                 3               2                  1              0
Keterangan dari bit-bit  PSW yaitu pada table 2.1.
Tabel 2.1. Program Status Word (PSW)
Bit	Simbol	Fungsi	
7	CY	Carry Flag	
6	AC	Auxiliary Carry Flag	
5	F0	Flag 0 untuk kegunaan umum	
4	RS1	Bit pemilih bank register 	
3	RS0	Bit pemilih bank register	
2	OV	Overflow Register	
1	-	Dicadangkan, Flag didefinisikan oleh pemakai	
0	P	Parity Flag, Set / Clear oleh perangkat keras setiap siklus intruksi untuk menunjukan jumlah bit 1 dalam akumulator, ganjil atau genap	

RS0 dan RS1 digunakan untuk memilih bank register. Delapan buah register ini merupakan register serbaguna. Lokasinya pada awal 32 byte RAM internal yang memiliki alamat dari 00H sampai 1FH. Register ini dapat diakses melalui symbol Assembler (R0, R1, R2, R3, R4, R5, R6 dan R7). Pemilihan bank register terdapat pada tabel 2.2.
Tabel 2.2. Pemilihan Bank Register

RS1	RS0	Bank	Lokasi Memory	
0	0	0	00H – 07H	
0	1	1	08H – 0FH	
1	0	2	10H – 17H	
1	1	3	18H – 1FH	

Register R0 dan R1 dapat digunakan untuk pengalamatan tak langsung pada RAM internal. Sisa register lainnya tidak dapat digunakan untuk pengalamatan tak langsung.

2.1.5. Timer / Counter 
Pada mikrokontroler AT8920C51 tedapat dua timer/counter 16 bit yang dapat diukur dan diatur melalui perangkat lunak yaitu timer/counter 0 dan timer/counter 1.
Apabila timer/counter pada frekuensi kerja mikrokontroler AT89C51 12 Mhz, timer/counter akan melakukan perhitungan waktu sekali setiap 1 mikrodetik secara independen, tidak tergantung pada eksekusi suatu intruksi. Satu siklus pencacah waktu sama dengan satu siklus eksekusi instruksi, sedangkan satu siklus diselengarakan dalam waktu 1 mikrodetik. Bila dimisalkan suatu urutan instruksi telah selesai dilaksanakan dalam waktu 5 mikrodetik, maka pada saat itu pula timer/counter telah menunjukan perioda waktu 5 mikrodetik.
Apabila periode waktu tertentu telah dilampaui, timer/counter segera mengintrupsi mikrokontroler untuk memberitahukan bahwa perhitungan perioda waktu telah selesai dilaksanakan. Periode waktu timer/counter secara umum ditentukan oleh persamaan berikut ini:
a. Sebagai timer/counter 8 bit
T = (255 – TLx)*1s

b. Sebagai timer/counter 16 bit
T = (65535 – THxTLx)*1s
Keterangan :
THx = isi register TH0 dan TH1
TLx = isi register TL0 dan TL1
Pengontrolan kerja timer/counter adalah register Timer Control (TCON). TCON beralamat 88H, adapun definisi dari bit pada timer control adalah sebagai berikut:
Alamat TCON = 88H
TF1	TR1	TF0	TR0	IE1	IT1	IE0	IT0	
Bit   7            6           5              4                3                 2            1               0
Adapun keterangan dari bit-bit timer kontrol yaitu pada tabel 2.3.
Tabel 2.3. Timer Control

Bit	Posisi	Fungsi	
7	TF1	Timer / Counter overflow flag. Di-set oleh perangkat keras saat Timer / Counter menghasilkan limpahan (overflow). 	
6	TR1	Bit untuk menjalankan Timer 1. Di-set / clear oleh perangkat lunak untuk membuat Timer on atau off. 	
5	TF0	Timer 0 overflow flag. Di-set oleh perangkat keras.	
4	TR0	Bit untuk menjalankan Timer 0. Di-set / clear oleh perangkat lunak untuk membuat Timer on atau off.	
3	IE1	External interrupt 1 edge flag	
2	IT1	Interrupt 1 type control byte. Set / clear oleh perangkat lunak untuk menspesifikasi sisi turun / level rendah trigger dari interupsi eksternal.	
1	IE0	External interrupt 0 edge flag	
0	IT0	Internal 0 type control bit.	

Pengontrolan pemilih mode operasi timer/counter adalah register Timer Mode (TMOD) yang dimana difinisi bit-bitnya adalah sebagai berikut:
Alamat TMOD = 39H
MSB                                                                                                              LSB
GATE	C/T	M1	M0	GATE	C/T	M1	M0	
Bit   7             6                 5              4                3                 2            1         0
Keterangan dari bit-bit TMOD dapat dilihat pada table 2.4.
Tabel 2.4. Timer Mode

Bit	Posisi	Fungsi	
7	GATE	Saat TRx  dalam TCON diset 1 dan GATE = 1, timer/counter x akan berjalan ketika TRx = 1 (Timer dikontrol oleh perangkat lunak).	
6	C/T	Pemilih fungsi timer/counter. Clear (0) untuk operasi timer dengan masukan dari system clock internal. Set (1)untuk operasi counter dengan masukan dari pena T0 dan T1.	
5	MI	Bit pemilih mode	
4	M0	Bit pemilih mode	
3	GATE	Saat TRx  dalam TCON diset 1 dan GATE = 1, timer/counter x akan berjalan ketika TRx = 1 (Timer dikontrol oleh perangkat lunak).	
2	C/T	Pemilih fungsi timer/counter. Clear (0) untuk operasi timer dengan masukan dari system clock internal. Set (1)untuk operasi counter dengan masukan dari pena T0 dan T1.	
1	M1	Bit pemilih mode	
0	MO	Bit pemilih mode	

Kombinasi M0 dan M1 terdapat pada table 2.5.

Tabel 2.5. Kombinasi M0 dan M1

M1	M0	Mode	Operasi	
0	0	0	Timer 13 bit	
0	1	1	Timer / Counter 16 bit	
1	0	2	Timer auto reload 8 bit (pengisian otomatis	
1	1	3	TL 0 adalah Timer / Counter 8 bit dan dikontrol oleh kontrol bit Timer 1	

Timer/counter 0 dan 1 memiliki empat mode yaitu:
1. Mode 0
Dalam mode 0 register timer disusun sebagai register 13 bit. Setelah semua perhitungan selesai, mikrokontroler akan men-set Timer Interupt Flag (TF1). Dengan membuat GATE = 1, timer dapat dikendalikan oleh masukan luar INT1, untuk fasilitas pengukuran lebar pulsa.
2. Mode 1
Dalam mode 1 register timer disusun sebagai register 16 bit, setelah semua perhitungan selesai, mikrokontroler akan men-set Timer Interupt Flag (TF1). Dengan membuat GATE = 1, timer dapat dikendalikan oleh masukan luar INT1, untuk fasilitas pengukuran lebar pulsa.
3. Mode 2
Mode 2 menyusun register timer sebagai 8 bit counter. Limpahan (overflow) dari TL1 tidak hanya men-set TF1 tetapi juga mengisi TL1dengan isi TH1 yang diatur secara software. Pengisian tidak mengubah TH1.
4. Mode 3
Timer dalam mode 3 semata-mata memegang hitungan. Mode 3 diperlukan untuk aplikasi yang membutuhkan timer/counter ekstra 8 bit. Saat timer 0 dalam mode 3, timer 1 dapat dihidupkan atau dimatikan atau dapat digunakan oleh port sebagai pembangkit Baud Rate.
2.1.6. Port Paralel Input/Output (I/O)
Mikrokontroler 89C2051 mempunyai port I/O 4 buah. Sebuah port digunakan sebagai port keluaran, data yang dikeluarkan diletakkan dalam SFR yang bersesuaian jika dibawa ke sebuah latch yang akan melanjutkannya untuk mengakses sinyal atau tanda setelah operasi ditulis lengkap. 

2.1.7. Baud Rate
Port serial pada mode 0 mempunyai baud rate yang tetap, yaitu 1/12 frekuensi osilator. Untuk menjalankan mode ini tidak ada timer/counter yang dibutuhkan untuk menyetel register SCON yang diperlukan.
Port serial pada mode 1 memiliki baut rate yang dapat diubah. Baut rate dapat dihasilkan oleh timer 1 dan digunakan dalam mode 2 (auto reload).
     (K x Frekuensi Osilator)
Baud Rate      = 
     (32x12[256 – TH1])
Nilai K ditentukan oleh bit SMOD dalam power Control Register (PCON). Bila SMOD = 0 maka K = 1, bila SMOD = 1 maka K = 2. Bila diketahui baud rate, nilai TH dapat dicari melalui persamaan berikut ini:
             256 – (F x Frekuensi Osilator)
TH   = 
              (384 x Baud Rate) 

Nilai TH1 harus dalam bentuk integer. Pembuatan nilai TH1 pada nilai integer terdekat tidak akan menghasilkan baud rate yang dikehendaki. Dalam hal ini pemakai dapat menganti frekuensi kristal. Karena PCON tidak dapat dialamati per bit, untuk men-set PCON dilakukan dengan pengiriman perintah: ORL  PCON,#80H.
Pada port serial mode 2, baud rate memiliki nilai tetap yaitu 1/32 atau 1/64 dari frekuensi osilator, tergantung pada nilai SMOD dalam register PCON. Pada mode ini tidak ada timer yang digunakan. Bila SMOD = 1 baud rate-nya 1/32 frekuensi osilator. Pada port serial mode 3, boud rate dapat diatur seperti dalam mode 1.
2.1.8. Interupsi
Apabila CPU pada mikrokontroler AT89C2051 sedang melaksanakan suatu program maka dapat dihentikan pelaksanaan program tersebut secara sementara dengan meminta interupsi. Apabila CPU mendapat permintaan intrupsi program Counter (PC) akan diisi alamat dari vector interupsi. CPU kemudian melaksanakan rutin pelayanan interupsi mulai dari alamat tersebut. Bila rutin pelayanan interupsi selesai dilaksanakan, Mikrokontroler AT89C2051 kembali kepelaksanaan program utama yang ditinggalkan.
Pada mikrokontrler Intel 89C2051 terdapat beberapa saluran interupsi. Interupsi ini dibedakan menjadi dua jenis yaitu:
1. Interupsi yang tidak dapat dihalangi oleh perangkat lunak(Non Maskable Interrupt).
2. Interupsi yang dapat dihalangi oleh perangkat lunak (Maskable Interrupt). Jenis interupsi ini seperti INT0 dan INT1 (eksternal) serta timer/counter 0, timer/counter 1 dan interupsi dari port serial (internal).
Alamat awal layanan rutin interupsi dari setiap sumber interupsi, dapat dilihat dalam table 2.6.

Tabel 2.6. Alamat Awal Layanan Rutin Interrupsi

Nama	Alamat	Alat Interrupsi	
Reset	00H	Power on Reset	
INT0	03H	INT0	
Timer 0	0BH	Timer 0	
INT1	13H	INT1	
Timer 1	1BH	Timer 1	
Sint	23H	Port I/O Serial	

2.1.9. Untai Pewaktu dan Osilator
Mikrokontroler AT89C2051 memiliki osilator internal (on chip osilator) yang dapat digunakan sebagai sumber clock bagi CPU. Untuk menggunakan osilator internal diperlukan sebuah kristal atau kapasitor keramik letak pena XTAL1 dan pena XTAL2 dan sebuah kapasitor ke ground.
Kristal yang digunakan dapat mempunyai frekuensi 12 Hz sampai 12 Mhz. Sedangkan untuk kapasitor dapat bernilai antara 27 pF sampai 33 pF. Kaki XTAL1 merupakan keluaran suatu penguat yang besar, sedangkan kaki XTAL1 adalah masukan sebuah kristal yang dihubungkan pada kaki XTAL1 dan XTAL2 dengan memberikan umpan balik dan penggeseran fase yang diperlukan untuk osilasi. Jika kaki XTAL1 digunakan oleh sumber frekuensi luar maka kaki XTAL2 tidak dihubungkan.

2.2. PERANGKAT LUNAK MIKROKONTROLER AT89C2051
Himpunan instruksi mikrokontroler AT89C51 sama dengan himpunan instruksi mikrokontroler 8051. Mikrokontroler memiliki 256 perangkat instruksi. Seluruh instruksi dapat dikelompokan dalam 4 bagian yang meliputi  instruksi 1 sampai 4 byte. Apabila frekuensi clock mikrokontroler yang digunakan adalah 12 Mhz maka kecepatan pelaksanaan instruksi akan bervariasi dari 1 hingga 12 mikrodetik.
Perangkat instruksi mikrokontroler AT89C2051 dapat dibagi menjadi beberapa kelompok instruksi yaitu:
2.2.1. Instruksi Transfer Data
Mikrokontroler keluarga  MCS-51 memiliki beberapa himpunan instruksi transfer data seperti pada tabel 2.7. Instruksi ini untuk memindahkan data antara register-register, memori-memori, register-memori, antar muka register dan antar muka-memori. Operand-operand untuk perintah MOV dan MOVX terdapat pada tabel 2.8 dan 2.9 
Tabel 2.7. Instruksi Transfer Data

Mnemonic	Operand	Keterangan	
MOV          	<byte-tujuan>, <byte-sumber>	Byte variable yang ditunjuk oleh operand kedua dipindahkan ke lokasi yang dispesifikasi oleh operand pertama.	
MOVX	<byte-tujuan>, <byte-sumber>	Memindahkan data antara akumulator dan sebuah byte dari memory data eksternal.	
Push	Direct	Increment stack pointer dan memindahkan byte ke stack pointer.	
POP	Direct	Decremen stack pointer dan memindahkan dari stack pointer ke byte.	
XCH	A,<byte>	Menukar isi byte dengan isi akumulator.	
XCHD	A,@Ri	Menukar isi nibble rendah (bit 0-bit 3), dari lokasi memori yang alamatnya ditunjuk oleh isi register Ri dengan isi nibble rendah (bit 0-bit 3) akumulator.	

Tabel 2.8. Instruksi Transfer Data Untuk Perintah MOV

Mnemonic	Operand	Keterangan	
MOV	A,Rn	Memidahkan isi register Rn ke akumulator.	
MOV	A,direct	Memindahkan isi memori data pada suatu alamat  ke akumulator.	
MOV	A,@Ri	Memindahkan isi data memori yang lokasinya ditunjuk oleh register Ri ke akumulator .	
MOV	A,#data	Memindahkan data 8 bit secara langsung ke akumulator. 	
MOV	Rn,A	Memindahkan isi akumulator ke suatu register Rn.	
MOV	Rn,direct	Memindahkan isi memori data ke sebuah register Rn.	
MOV	Rn,#data	Memindahkan data 8 bit secara langsung ke register Rn.	
MOV	Direct,A	Memindahkan isi akumulator ke suatu alamat memori data.	
MOV	Direct,Rn	Memindahkan isi register Rn ke suatu alamat memori data.	
MOV	Direct,direct	Memindahkan isi memori data ke alamat memori lain.	
MOV	Direct,@Ri	Memindahkan isi lokasi memori yang ditunjuk oleh isi register Ri ke suatu alamat memori. 	
MOV	Direct,#data	Memindahkan data 8 bit ke suatu alamat memori secara langsung.	
MOV	@Ri,A	Memindahkan isi akumulator ke lokasi memori yang ditunjukan oleh isi register Ri.	
MOV	@Ri,direct	Memindahkan isi suatu alamat data ke lokasi memori yang ditunjukan oleh isi register Ri.	
MOV	@Ri,#data	Memindahkan suatu alamat data 8 bit secara langsung ke lokasi memori yang ditunjukan oleh isi register Ri.	

Tabel 2.9. Instruksi Transfer Data Untuk Perintah MOVX

Mnemonic	Operand	Keterangan	
MOVX	A,@Ri	Memindahkan sisi memori data eksternal yang lokasinya ditunjuk oleh register Ri ke akumulator	
MOVX	A,@DPTR	Memindahkan isi memori data eksternal yang lokasinya ditunjuk oleh data pointer ke akumulator.	
MOVX	@Ri,A	Memindahkan isi akumulator ke memori data eksternal yang lokasinya ditunjuk oleh register Ri	
MOVX	@DPTR,A	Memindahkan isi akumulator ke memori data  eksternal yang alamatnya ditunjuk oleh isi data pointer.	

2.2.2. Instruksi Arithmatika
Mikrokontroler keluarga MCS-51 memiliki beberapa instruksi arithmatika seperti pada tabel 2.10. Instruksi ini untuk melaksanakan operasi aritmatika yang meliputi penjumlahan, pengurangan, penambahan satu (inkremen), pengurangan satu (dekremen), perkalian dan pembagian. Operand-operand untuk perintah ADD, ADDC, SUBB, INC dan DEC dapat dilihat pada tabel 2.11, 2.12, 2.13, 2.14 dan 2.15.

Tabel 2.10. Instruksi Arithmatika

Mnemonic	Operand	Keterangan	
ADD	A,<byte-sumber>	Menambahkan isi byte sumber ke akumulator dan menyimpan hasilnya di akumulator.	
ADDC	A,<byte-sumber>	Menambah byte sumber beserta carry flag dan isi akumulator secara serentak dan hasilnya disimpan di akumulator.	
SUBB	A,<byte-sumber>	Mengurangi akumulator dengan carry flag dan isi byte sumber secara bersama dan hasilnya disimpan di akumulator.	
INC	<byte>	Variabel yang ditunjuk ditambah dengan 1.	
DEC	byte	Variabel yang ditunjuk dikurangi 1.	
MUL	AB	Mengalikan isi akumulator dengan isi register pengali(B). Byte rendah hasil perkalian dimasukkan ke akumulator dan  byte tinggi dimasukkan ke register pengali.	
DIV	AB	Membagi isi akumulator dengan isi register B. Kedua operand bilangan integer tak bertanda. Akumulator berisi hasil bagi, register B berisi sisa pembagian.	
DA	A	Mengatur isi akumulator ke BCD-nya, setelah penambahan dua angka BCD. Jika auxiliary carry flag 1 atau isi nibble bawah (bit 0-3) dari akumulator lebih tinggi dari 9, isi akumulator akan ditambah 6. Jika carry flag diset sebelum atau sesudah penambahan atau isi nibble atas (bit 4-7) lebih tinggi dari 9, isi akumulator akan ditambah 60H.	

Tabel 2.11. Instruksi Arithmatika Untuk Perintah ADD

Mnemonic	Operand	Keterangan	
ADD	A,@Rn	Menambahkan isi data memori yang lokasinya ditunjuk oleh register Rn ke isi akumulator dan menyimpan hasilnya di akumulator.	
ADD	A,#data	Menambahkan 8 bit data langsung kedalam isi  akumulator dan menyimpan hasilnya di akumulator.	
ADD	A,@Ri	Menambah isi data memori yang lokasinya ditunjuk oleh nilai register ke isi akumulator dan menyimpan hasilnya di akumulator.	
ADD	A,direct	Menambah isi alamat data ke isi akumulator dan menyimpan hasilnya di akumulator	

Tabel 2.12. Instruksi Arithmatika Untuk Perintah ADDC

Mnemonic	Operand	Keterangan	
ADDC	A,@Rn	Menambahkan isi carry flag (0 atau 1) dengan isi akumulator, Isi register Rn ditambahkan dan  hasilnya disimpan di akumulator.	
ADDC	A,#data	Menambah isi carry flag (0 atau 1) ke dalam isi akumulator.	
ADDC	A,@Ri	Menambahkan isi carry flag (0 atau 1) dengan isi akumulator. Isi data memori yang ditunjuk oleh register Ri ditambahkan dan hasilnya disimpan di akumulator.	
ADDC	A,direct	Menambah isi carry falg dengan isi akumulator. Isi dari alamat tertentu ditambahkan dan hasilnya disimpan di akumulator	

Tabel 2.13. Instruksi Arithmatika Untuk Perintah SUBB

Mnemonic	Operand	Keterangan	
SUBB	A,@Rn	Mengurangi isi akumulator dengan isi carry flag dan isi lokasi memori yang ditunjuk oleh register Rn, hasilnya disimpan di akumulator.	
SUBB	A,#data	Mengurangkan isi carry flag dan data langsung dari isi akumulator, hasilnya disimpan di akumulator.	
SUBB	A,@Ri	Mengurangi isi akumulator dengan isi carry flag dan isi lokasi memori yang ditunjuk oleh register Ri, hasilnya disimpan di akumulator.	
SUBB	A,direct	Mengurangkan isi akumulator dengan isi carry flag dan isi suatu alamat data, hasilnya disimpan di akumulator.	

Tabel 2.14. Instruksi Arithmatika Untuk Perintah INC

Mnemonic	Operand	Keterangan	
INC	A	Menambah isi akumulator dengan 1 dan menyimpan hasilnya di akumulator.	
INC	Rn	Menambah isi register Rn dengan 1 dan menyimpan hasilnya diregister tersebut.	
INC	@Ri	Menambahkan isi memori yang alamatnya ditunjuk oleh register Ri dengan 1 dan menyimpan hasilnya pada alamat tersebut.	
INC	direct	Menambahkan isi alamat data dengan 1 dan menyimpan hasilnya pada alamat tersebut.	

Tabel 2.15. Instruksi Arithmatika Untuk Perintah DEC

Mnemonic	Operand	Keterangan	
DEC	A	Mengurangi isi akumulator dengan 1 dan menyimpan hasilnya di akumulator.	
DEC	Rn	Mengurangi isi register Rn dengan 1 dan menyimpan hasilnya diregister tersebut.	
DEC	@Ri	Mengurangi isi memori yang alamatnya ditunjuk oleh register Ri dengan 1 dan menyimpan hasilnya pada alamat tersebut.	
DEC	direct	Mengurangi isi alamat data dengan 1 dan menyimpan hasilnya pada alamat tersebut.	

2.2.3. Instruksi Logika
Mikrokontroler keluarga MCS-51 memiliki beberapa instruksi logika seperti pada tabel 2.16. IOperand-operand yang dimiliki perintah ANL, ORL dan XRL terdapat pada tabel 2.17, 2.18 dan 2.19.
Tabel 2.16. Instruksi Logika

Mnemonic	Operand	Keterangan	
ANL	<byte-tujuan>, <byte-sumber>	Meng-AND-kan variable yang ditunjuk dengan hasil yang tersimpan dalam alamat tujuan.	
ORL	<byte-tujuan>, <byte-sumber>	Meng-OR-kan variable yang ditunjuk dan menyimpan hasilnya dalam alamat tujuan.	
XRL	<byte-tujuan>, <byte-sumber>	Meng-XOR-kan variable yang ditunjuk dan menyimpan hasilnya dalam alamat tujuan.	
CLR   	A
	Mengosongkan atau me-reset akumulator menjadi 0.	
CPL	A	Mengkomplemenkan isi akumulator.	
RL	A
	Memutar setiap bit dalam akumulator satu posisi kekiri. Bit MSB bergerak ke bit LSB.	
RLC   	A
	Mengatur bit-bit dalam akumulator satu posisi kekiri. MSB (bit 7) bergerak ke dalam carry flag dan isi carry flag menuju ke LSB (bit 0).	
RR   	A	Memutar setiap bit dalam akumulator satu posisi kekanan. LSB menuju MSB.	
RRC    	A	Memutar setiap bit dalam akumulator satu posisi kekanan. LSB (bit-0) menuju carry flag, sementara isi carry flag masuk MSB (bit-7).	
SWAP	A
	Mempertukarkan isi nibble bawah (0-3) dengan isi nibble atas(4-7).	

Tabel 2.17. Instruksi Logika Untuk Perintah ANL

Mnemonic	Operand	Keterangan	
ANL	A,#data	Meng-AND-kan  data 8 bit secara langsung  dengan isi akumulator.	
ANL	A,Rn	Meng-AND-kan isi register Rn dengan isi akumulator.	
ANL	A,@Ri	Meng-AND-kan isi memori yang lokasinya ditunjuk oleh register Ri dengan isi akumulator.	
ANL	A,direct	Meng-AND-kan data 8 bit secara langsung dengan isi akumulator.	

Tabel 2.18. Instruksi Logika Untuk Perintah ORL

Mnemonic	Operand	Keterangan	
ORL	A,#data	Meng-OR-kan data 8 bit secara langsung dengan isi akumulator, hasilnya disimpan di akumulator.	
ORL	A,Rn	Meng-OR-kan isi register Rn dengan isi akumulator, hasilnya disimpan di akumulator.	
ORL	A,@Ri	Meng-OR-kan isi lokasi memori yang ditunjuk oleh register Ri dengan isi akumulator, hasilnya disimpan di akumulator.	
ORL	A,direct	Meng-OR-kan isi suatu alamat data dengan isi  akumulator dan hasilnya di simpan dalam akumulator.	

Tabel 2.19. Instruksi Logika Untuk Perintah XRL

Mnemonic	Operand	Keterangan	
XRL	A,#data	Meng-XOR-kan data 8 bit secara langsung  dengan isi akumulator, hasilnya disimpan di akumulator.	
XRL	A,Rn	Meng-XOR-kan isi register Rn dengan isi akumulator, hasilnya disimpan di akumulator.	
XRL	A,@Ri	Meng-XOR-kan isi lokasi memori yang ditunjuk oleh register Ri dengan isi akumulator, hasilnya disimpan di akumulator.	
XRL	A,direct	Meng-XOR-kan isi suatu alamat data dengan isi  akumulator dan hasilnya disimpan pada akumulator.	

2.2.4. Instruksi Manipulasi Bit
Mikrokontroler keluarga MCS-51 memiliki beberapa instruksi manipulasi bit seperti pada tabel 2.20.
Tabel 2.20. Instruksi Manipulasi Bit
Mnemonic	Operand	                      Keterangan	
CLR	C
	Mengosongkan atau me-set carry flag menjadi 0.	
CLR	Bit
	Mengosongkan atau me-set alamat bit menjadi 0.	
SETB	C	Men-set isi carry flag menjadi 1.	
SETB   	Bit	Men-set isi suatu alamat bit menjadi 1.	
CPL  	C
	Mengkomplemenkan isi carry flag.	
CPL  	bit	Mengkomplemenkan suatu alamat bit.	
ANL  	C,bit
	Meng-AND-kan isi alamat bit tertentu dengan isi carry flag dan hasilnya ditempatkan pada carry flag.	
ANL	C,/bit	Meng-AND-kan hasil komplemen isi alamat bit tertentu dengan isi carry flag dan hasilnya ditempatkan pada carry flag.	
ORL	C,bit
	Meng-OR-kan isi suatu alamat dengan isi carry flag dan hasilnya disimpan dalam carry flag.	
ORL  	C,/bit
	Meng-OR-kan komplemen dari suatu alamat bit dengan isi carry flag dan hasilnya disimpan dalam carry flag.	
MOV   	C,bit	Memindahkan isi suatu alamat bit ke carry flag.	
MOV	bit,C	Memindahkan carry flag ke isi suatu alamat bit.	
JC   	rel	Menguji isi carry flag. Jika berisi 1, instruksi akan menuju ke alamat kode. Jika berisi 0, instruksi selanjutnya akan dieksekusi.	
JNC	rel	Menguji isi carry flag. Jika berisi 0, instruksi akan menuju ke alamat kode. Jika berisi 1, instruksi selanjutnya akan dieksekusi.	

Lanjutan tabel 2.20

JB  	bit,rel
	Menguji suatu alamat bit. Jika berisi 1, eksekusi akan menuju alamat kode. Jika isinya 0, instruksi selanjutnya akan dieksekusi.	
JNB	bit,rel
	Menguji suatu alamat bit. Jika berisi 0, eksekusi akan menuju alamat kode. Jika isinya 1, instruksi selanjutnya akan dieksekusi.	
JBC	bit,rel
	Menguji suatu alamat bit. Jika berisi 1, bit tersebut akan diubah 0 dan eksekusi akan menuju alamat kode. Jika berisi 0, instruksi selanjutnya akan dieksekusi.	

2.2.5. Instruksi Percabangan
Mikrokontroler keluarga MCS-51 memiliki beberapa instruksi percabangan seperti pada tabel 2.21. Instruksi ini untuk mengubah urutan normal pelaksanaan suatu program. Operand-operand yang dimiliki perintah CJNE dan DJNZ terdapat pada tabel 2.22 dan 2.23.
Tabel 2.21. Instruksi Percabangan
Mnemonic	Operand	                      Keterangan	
ACALL    	addr11
	Menyimpan isi yang telah dinaikkan dari pencacah program pada stack. Byte bawah dari pencacah program selalu ditempatkan pada stack pertama.	
LCALL  	addr16	Menyimpan pencacah program pada stack dan eksekusi akan menuju ke alamat kode.	

Lanjutan tabel 2.21

RET		Untuk kembali dari suatu subrutin ke alamat terakhir saat subrutin dipanggil. Mengambil byte tinggi dan byte rendah program counter dari stack dan decrement stack pointer dengan 2.	
RET1
		Untuk kembali dari suatu rutin pelayanan interupsi. Mengambil byte tinggi dan byte rendah program counter dari stack dan menyimpan logika interupsi tambahan pada tingkat prioritas yang sama.	
AJMP	addr11
	Meletakan bagian bawah 11 bit dari pencacah program dengan 11 bit alamat yang dikodekan.	
LJMP	addr16
	Untuk menuju ke alamat kode. Digunakan untuk program dengan kapasitas kecil, kapasitas untuk instruksi ini sekitar 128 byte.	
SJMP	Rel	Instruksi yang menyebabkan operasi meloncat ke alamat kode. Digunakan untuk program dengan kapasitas kecil, kapasitas untuk instruksi ini sekitar 128 byte.	
JMP	@A+DPTR	Menambahkan isi data pointer dan isi akumulator meloncat ke alamat kode sesuai hasil penjumlahan.	
JZ   	rel
	Menguji isi akumulator, jika nilainya  0 maka eksekusi akan menuju alamat kode. Jika nilainya tidak 0 maka instruksi selanjutnya yang akan dieksekusi.	
JNZ	rel
	Menguji isi akumulator, jika nilai tidak 0 maka eksekusi akan menuju alamat kode. Jika nilainya 0 maka instruksi selanjutnya yang akan dieksekusi.	
CJNE  	<byte-tujuan>, <byte-sumber>	Membandingkan nilai 2 buah operand dan meloncat jika nilai kedua operand tersebut tidak sama.	
DJNZ	<byte>,<rel-addr>	Decrement isi lokasi yang ditunjuk oleh operand pertama dan bercabang ke operand yang kedua jika nilai hasil tidak sama dengan 0.	
NOP		Instruksi ini tidak melakukan apapun selama satu siklus.	

 
Tabel 2.22. Instruksi Percabangan Untuk Perintah CJNE

Mnemonic	Operand	Keterangan	
CJNE	A,#data,rel	Operand pertama adalah akumulator, kedua adalah konstanta, dan ketiga adalah alamat relatif. Program akan membandingkan dan akan menuju ke alamat yang di tunjuk oleh label jika isi operand pertama dan kedua tidak sama.	
CJNE	Rn,#data,rel	Program akan membandingkan data dengan lokasi memori yang dialamati oleh register. Apabila tidak sama program akan menuju alamat yang ditunjuk oleh label, tetapi jika sama maka program akan mengeksekusi instruksi berikutnya.	
CJNE	@Ri,#data,rel	Operand pertama adalah register Ri (R0…R7), kedua adalah konstanta dan ketiga adalah alamat relatif. Program akan menuju alamat yang ditunjuk oleh label jika operand pertama dan kedua yang dibandingkan tidak sama.	
CJNE	A,direct,rel	Operand pertama adalah akumulator, kedua adalah register, dan ketiga adalah alamat relatif. Program akan membandingkan dan akan menuju  alamat yang di tunjuk oleh label jika isi akumulator dan register internal tidak sama.	

Tabel 2.23. Instruksi Percabangan Untuk Perintah DJNZ

Mnemonic	Operand	Keterangan	
DJNZ	Rn.rel	Mengurangi isi register Rn dengan 1 dan menempatkan hasilnya pada register tertentu. Jika hasilnya sudah 0, instruksi selanjutnya akan dikerjakan. Jika belum 0, eksekusi akan menuju ke alamat kode.	
DJNZ	Direct,rel	Mengurangi alamat data dengan 1 dan menempatkan hasilnya pada register tertentu. Jika hasilnya sudah 0, instruksi selanjutnya yang akan dikerjakan. Jika belum 0, eksekusi akan menuju ke alamat kode.