Anda di halaman 1dari 123

Pengantar

Disain Rangkaian
Aplikasi yang banyak kita temukan dalam kehidupan keseharian kita adalah aplikasi yang menggunakan teknologi digital sebagai salah satu solusi untuk membuat proses lebih cepat, tepat, ringkas dan lebih mudah untuk mengembangkan sistem secara keseluruhan. Pada kesempatan ini kami mengenalkan penggunaan mikrokontroler sebagai pengontrol pada sebuah sistem yang ingin kita bangun dengan memberikan dasar-dasar pengaksesan terhadap beberapa perangkat keras seperti pengaksesan port masukan dan keluaran, Lyquid Crystal Display (LCD), Seven Segment, Dot Matrik, Analog To Digital Converter (ADC), Digital To Analog Converter (DAC), dan bagaimana melakukan pengkontrolan pada motor stepper menggunakan fasilitas yang dimiliki oleh mikrokontroler keluarga 8051, yaitu 89S51/52. Adapun fasilitas yang dapat diaplikasikan juga adalah Timer, Interupsi, Serial. Bahasa yang kita gunakan adalah bahasa C dengan menggunakan compiler Small Device C Compiler atau lebih dikenal dengan SDCC. Dimana pemrogram diberikan kemudahan untuk mendekati perangkat keras dengan menggunakan bahasa aras menengah. Kemudahan yang akan dirasakan adalah apabila pengguna telah terbiasa menggunakan bahasa C sebagai bahasa pemrograman dan dapat lebih mudah untuk mengembangkan beberapa sistem dasar menjadi sistem yang lebih rumit. Disain sistem yang kita bangun adalah penggabungan beberapa modul menjadi satu modul yang kita sebut sebagai compact board, dimana didalamnya sudah terdapat berberapa perangkat keras yang berbeda yang akan menjadi obyek, dimana masing masing perangkat keras yang akan dikontrol mempunyai alamat alamat unik yang diperoleh dari disain perangkat keras itu sendiri, yang telah kami buat sebelumnya. Adapun disain dari sistem yang kami buat adalah sebagai berikut :

Port 0 LCD Port 1 8 bit LED Port 2 Kontrol Data Port 3 DipSwitch Tombol Dot Matrik 5 x 8 ADC 7segmen Stepper DAC

89S51/52

Gambar 1. Blok Diagram Sistem Keseluruhan

Rancang bangun sistem yang berupa skematik adalah :

Gambar 2. Skema Rangkaian Kontrol dan pengalamatan

Gambar 3. Tombol Masukan

Gambar 4. DipSwitch 8 bit

Gambar 5. Seven Segment (Common Cathode)

Gambar 6. LCD

Gambar 7. Motor Stepper

Pengalamatan untuk mengakses masing masing perangkat keras diatas diagunakan pengalamatan yang diperoleh dengan memberikan data pada IC 74LS138, yang dapat ditabelkan sebagai berikut :

Tabel 1. Alamat akses perangkat keras No 1 2 3 4 5 6 7 Perangkat Keras Stepper 7s2 7s1 Matrix/LED DAC ADC LCD Alamat Akses Y0 ( 1100 0111 = 0C7 ) Y1 ( 1100 1111 = 0CF ) Y2 ( 1101 0111 = 0D7 ) Y3 ( 1101 1111 = 0DF ) Y4 ( 1110 0111 = 0E7 ) Y5 ( 1110 1111 = 0EF ) Y6 ( 1111 0111 = 0F7 )

Pengantar

Teknik Kompilasi
Adapun Teknik Kompilasi Program adalah sebagai berikut : 1. Mengkompile file percobaan yang berekstensi c menjadi ihx

Gambar 8. Kompilasi file percobaan.c menjadi percobaan.ihx Tahapan dalam kompilasi : Kompilasi dalam folder aktif /SDCC/BIN Instruksi : SDCC namafile.c 2. Mengubah file yang berekstensi ihx menjadi hex

Gambar 9. Kompilasi file percobaan.ihx menjadi percobaan.hex

Tahapan dalam kompilasi : Kompilasi dalam folder aktif /SDCC/BIN Instruksi : PACKIHX namafile.ihx > namafile.hex 3. Membuka file downloader File downloader bisa bekerja pada Window XP dengan memenuhi persyaratan pada folder aktif ada file : ALLOWIO.EXE dan PORTTALK.SYS. Hal ini bisa dipermudah dengan membuat file shortcut sebagai berikut : @echo off AllowIo 0x42 0x43 0x61 0x378 0x278 0x3BC ISP-Pgm3v0.exe Simpan instruksi diatas pada file dengan berekstensi .BAT File untuk download Atmel_Isp.set yang harus tersedia ISP-Pgm3v0.exe dan

Adapun tahapan dalam pengoperasian program adalah : 1. Memilih jenis IC 89S atau ATMega yang akan digunakan :

Gambar 10. Tipe IC pada Downloader software

2. Membuka file yang berekstensi *.hex untuk diisikan secara ISP

Gambar 11. Menu Open File

Gambar 12. Membuka file *.hex yang akan di download

3. Menuliskan program anda ke IC 89S secara ISP

Gambar 13. Menuliskan Program ke Flash EEPROM Perhatian : Posisi Lock Bits Tidak Boleh diaktifkan. Hal tersebut akan menyebabkan IC terkunci dan tidak dapat di program ulang Klik Write apabila peralatan anda telah siap untuk di program.

PERCOBAAN 1

MASUKAN DAN KELUARAN


Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat menggunakan port mikrokontroler sebagai jalur masukan atau jalur keluaran Dapat menyebutkan register yang digunakan untuk mengakses port Dapat membuat program dengan C untuk mengakses port

Dasar teori

Port paralel mikrokontroler terhubung dengan register P0, P1, P2, dan P3. Masingmasing register tersebut mempunyai lebar 8-bit. Register-register tersebut berada didalam RAM internal (daerah Special Function Register atau SFR). P0 berada pada alamat 80h, P1 berada pada alamat 90h, P2 berada pada alamat A0h, dan P3 berada pada alamat B0h. Untuk mengeluarkan nilai 20h ke port P1 misalnya, Anda dapat menggunakan instruksi: P1 = 0x20;

Apabila ingin membaca port P2 misalnya, Anda dapat menggunakan instruksi: baca = P2;

Variabel baca dapat Anda definisikan sebagai unsigned char atau variabel bertipe byte. Sedangkan P1 dan P2 tidak perlu Anda definisikan lagi karena telah didaftar didalam file header at89x52.h. Sehingga pada program, Anda menggunakan instruksi #include <at89x51.h>

Percobaan

Berikutnya Anda akan melakukan 7 macam percobaan. Amati dengan seksama dan pahami benar program tersebut. Untuk membantu memahami mengapa instruksi pada program dibuat maka Anda dapat melihat skematik dari perangkat keras yang Anda gunakan dengan hubungan seperti yang ditunjukkan oleh gambar yang ada pada lampiran. Pada kesempatan ini digunakan lampu LED sebagai sarana menampilkan hasil keluaran.

a a k

Keterangan : a = anoda, k = katoda Gambar 1.1. Bentuk fisik LED dan simbolnya

Percobaan 1.1 : Keluaran pada Port 1 Tujuan: Anda mencoba untuk mengeluarkan data 8-bit ke Port 1.
// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC = 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7

// aktifkan Y3 Matrix/LED= 1101 1111 = 0DF // aktifkan Y2 7s1 // aktifkan Y1 7s2 // aktifkan Y0 Stepper = 1101 0111 = 0D7 = 1100 1111 = 0CF = 1100 0111 = 0C7

/* Mengatur latch data LED */ /* Latch pada Y3 LED (P2.5 P2.4 P2.3 = 0 1 1) */ /* Latch pada matrix, matikan (P2.2 P2.1 P2.0 = 1 1 1) */ /* (P2.7 P2.6 = 0 0) */ /* P2 = 0001 1111 = 1Fh) */

#include <at89x51.h> void led() { /* Aktifkan LED */ P2=0x0DF;

10

/* Kirim data */ P1=0x0AA; } void main() { while (1) { led(); } // tutup akhir program } Program 1.1. Mengirim data ke Port 1

Percobaan 1.2 : Masukan melalui Port 1 keluaran melalui Port 0 Tujuan : Anda akan mencoba membaca data 8-bit dari Port 3 dan mengeluarkan data 8-bit tersebut ke Port 1.
/* Mengatur latch data LED */ /* Latch pada Y3 LED (P2.5 P2.4 P2.3 = 0 1 1) */ /* Latch pada matrix, matikan (P2.2 P2.1 P2.0 = 1 1 1) */ /* (P2.7 P2.6 = 0 0) */ /* (P2 = 0001 1111 = 1Fh) */

#include <at89x51.h> void led() { /* Aktifkan LED */ P2=0x0DF; /* Baca data P3, keluarkan ke P1 */ P1=P3; }

void main() { while(1) { led();

11

} // tutup akhir program } Program 1.2. Data dari port 3 ditampilkan ke port 1

Percobaan 1.3 : Increment isi Port 1 dan tampilkan hasilnya ke Port 1 Tujuan : Anda mencoba menambah data pada Port 1 dengan 1 #include <at89x51.h> void main () { unsigned int cnt1,cnt2; /* Aktifkan LED */ P2=0x0DF; P1=0x00; while (1) { P1 = P1+1; /* delay */ for (cnt1=0;cnt1<100;cnt1++) { for (cnt2=0;cnt2<500;cnt2++) { } } } Program 1.3. Increment satu isi Port 1

Percobaan 1.4 : Decrement isi Port 1 dan tampilkan hasilnya ke Port 1 Tujuan : Anda akan mencoba mengurangi data pada Port 1 dengan 1

#include <at89x52.h> void main () { unsigned int cnt1,cnt2; /* Aktifkan LED */

12

P2=0x0DF; P1=0x00; while (1) { /* kurangi isi P1 dengan 1 */ P1 = P1-1; /* delay */ for (cnt1=0;cnt1<100;cnt1++) { for (cnt2=0;cnt2<500;cnt2++) { } } } } } Program 1.4. Decrement satu isi Port 1

Percobaan 1.5 : Mengeluarkan data 2 pangkat n dimana n=0,1,2, dan 3 Tujuan : Anda akan mencoba mengeluarkan data 2 n dimana n=0,1,2 dan 3 secara berurutan ke Port 1.

#include <at89x52.h>

/* subrutin delay */ void tunda() { unsigned int cnt1,cnt2; for (cnt1=0;cnt1<100;cnt1++) { for (cnt2=0;cnt2<300;cnt2++){}; } } void main () {

13

/* Aktifkan LED */ P2=0x0DF;

while (1) { P1 = 0x01; tunda(); P1 = 0x02; tunda(); P1 = 0x04; tunda(); P1 = 0x08; tunda(); P1 = 0x10; tunda(); P1 = 0x20; tunda(); P1 = 0x40; tunda(); P1 = 0x80; tunda(); } } Program 1.5. Mengeluarkan data 2 pangkat n dimana n =0,1,2,3

Percobaan 1.6 : Menggunakan instruksi geser kiri dan geser kanan Tujuan : Anda akan mencoba menggunakan instruksi logika SHL dan SHR.

#include <at89x52.h> /* subrutin delay */ void tunda() { unsigned int cnt1,cnt2; for (cnt1=0;cnt1<100;cnt1++)

14

{ for (cnt2=0;cnt2<300;cnt2++){}; } }

void main () { unsigned A; int kanan; /* Aktifkan LED */ P2=0x0DF; A=0x80; kanan=0; while (1) { if (kanan==1) { if (A!=0x80) {A = A << 1;} else {kanan = 0;} P1 = A; tunda(); } else { if (A!=0x01) {A = A >> 1;} else {kanan = 1;} } } } Program 1.6. Instruksi SHL dan SHR

15

Percobaan 1.7 : Toggle Push Button Tujuan : Anda akan mencoba menggunakan sebuah saklar di Port 3 sebagai toggle data.

#include <at89x52.h> void main () { int toggle; toggle=0; /* Aktifkan Bus Data LED */ P2=0x0DF; while (1) { // toggle status // 0001 1110 = ditekan P3.1 = 0001 1100 if ((P3 & 0x01E) == 0x01C) { toggle = !toggle; }

if (toggle==0) {P1=0x01;} // '1' else {P1=0x02;} // '2' } } } Program 1.7. Toggle Button (Case 1 / 2) Tugas Buat program untuk menyeleksi masukan dari tombol, ditekan pertama lampu gerak ke kiri, di tekan kedua kali lampu bergerak ke kanan.

16

PERCOBAAN 2

MENGGUNAKAN RAM INTERNAL

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat memanfaatkan RAM internal untuk menyimpan data Dapat menggunakan fungsi SBIT Dapat menggunakan tipe data pointer untuk mengakses RAM

Dasar Teori

Memori digunakan sebagai tempat untuk menyimpan program, data dan stack. Program adalah kumpulan instruksi untuk mengerjakan suatu pekerjaan. Data adalah variabel-variabel yang nilainya dapat diubah saat program sedang berjalan. Stack digunakan untuk menyimpan alamat kembali (return address) dan juga dapat dipakai untuk menyimpan data.

Umumnya didalam mikrokontroler tersedia dua jenis memori, yaitu ROM dan RAM. ROM (Read-Only Memory) bersifat hanya bisa dibaca dan isinya tidak hilang bila catu daya dimatikan, digunakan untuk menyimpan program. Sedangkan RAM (Random-Access Memory) bersifat bisa dibaca dan ditulis tetapi isinya bisa hilang bila catu daya dimatikan, digunakan untuk menyimpan data dan stack.

Anda mungkin membutuhkan beberapa variabel yang nilainya dapat berubah-ubah ketika program yang Anda buat sedang dijalankan oleh mikrokontroler. Variabel atau data ini dapat Anda letakkan pada memori data atau RAM. Karena sifat RAM yang dapat ditulis dan dibaca maka data yang Anda letakkan pada RAM dapat Anda ubah nilainya.

17

Mikrokontroler seri 89x51 mempunyai RAM sebanyak 256 byte. 128-byte bagian atas ditempati oleh register-register khusus yang disebut Special Function Register atau SFR. Sedangkan 128-byte bagian bawah disediakan untuk dapat Anda gunakan. Peta memori data menggunakan skema dan. Artinya Anda disediakan dua skema yang dapat digunakan bersama-sama

Gambar 2.1. Peta memori data

Percobaan

Berikutnya Anda akan melakukan 4 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

Percobaan 2.1 : RAM untuk Variabel Tujuan : Anda akan mencoba menggunakan RAM sebagai penyimpan variabel data.
// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC // aktifkan Y3 Matrix/LED // aktifkan Y2 7s1 // aktifkan Y1 7s2 // aktifkan Y0 Stepper = 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7 = 1101 1111 = 0DF = 1101 0111 = 0D7 = 1100 1111 = 0CF = 1100 0111 = 0C7

18

#include <at89x51.h> /* Subrutin tunda */ void tunda() { unsigned int cnt1,cnt2; for (cnt1=0;cnt1<100;cnt1++) { for (cnt2=0;cnt2<500;cnt2++){}; } }

void main(void) { int Data1,Data2; Data1=0x01; Data2=0x80;

/* Aktifkan Bus Data LED */ P2=0x0DF; while(1) { P1=Data1; tunda(); P1=Data2; tunda(); } } Program 2.1. Menyimpan data Integer

Percobaan 2.2 : Fungsi SBIT untuk mengakses 1 bit data pada RAM Tujuan : Anda akan mencoba menggunakan fungsi SBIT untuk mengakses alamat dari bit port

#include <at89x51.h>

19

sbit P10 = 0x90; // port 1 bit 0 sbit P17 = 0x97; // port 1 bit 7

void main(void) { /* Aktifkan Data Bus LED */ P2=0x0DF;

P1=0x00; P10=1; P17=1; while(1); } Program 2.2. Fungsi sbit untuk mengkases per bit

Perobaan 2.3 : Fungsi SFR untuk mengakses isi RAM, 8 bit data Tujuan : Anda kan mencoba untuk menggunakan fungsi sfr untuk mengakses 8-bit data.

#include <at89x51.h> // menyimpan data di alamat 70h di SFR sfr data1 = 0x70;

void main(void) { /* Aktifkan Data Bus LED */ P2=0x0DF;

data1 = 0x0AA; P1=data1; while(1); } Program 2.3. Fungsi sfr 8 bit data

20

Percobaan 2.4 : Menunjuk isi alamat RAM Tujuan : Anda akan mencoba menggunakan instruksi menunjuk tidak langsung (indirect) ke alamat memori #include <at89x51.h> // menyimpan data di alamat 70h di sfr mikro sfr data1 = 0x70;

void main(void) { /* Aktifkan Bus Data LED */ P2=0x0DF;

data1 = 0x0AA; // dialamat 70h diisi 0x0AA P1=@data1; while(1); } Program 2.4. Pointer menunjuk isi alamat

Tugas Buat program lampu berjalan dimana datanya disimpan di alamat yang ditentukan.

21

PERCOBAAN 3

ANTARMUKA DENGAN SEVEN SEGMEN

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat program untuk menyalakan seven segmen Dapat membuat program untuk menampilkan tulisan berjalan pada seven segmen

Dasar Teori

Seven segmen adalah tersusun dari tujuh (seven) buah LED berbentuk garis (segmen) yang ditempatkan sedemikian rupa sehingga dapat menampilkan angka desimal 0 sampai 9. Beberapa huruf juga dapat Anda tampilkan pada seven segmen. Jika tujuh buah LED tersebut digabung pada kutub anodanya maka seven segmen tersebut diberi istilah dengan seven segmen common anoda. Sebaliknya, bila tujuh buah LED tersebut digabung pada kutub katodanya maka seven segmen tersebut diberi istilah dengan seven segmen common katoda

Gambar 3.1. Seven segmen common anoda dan common katoda 22

Gambar 3.2. Bentuk fisik seven segmen

Percobaan

Berikutnya Anda akan melakukan 3 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

Percobaan 3.1 : Mengirim data 0-9 berurutan Tujuan : Anda akan mencoba melakukan pengiriman data pada seven segmen segmen untuk menampilkan angka 0 sampai angka 9.

// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC // aktifkan Y3 Matrix/LED // aktifkan Y2 7s1 // aktifkan Y1 7s2

= 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7 = 1101 1111 = 0DF = 1101 0111 = 0D7 = 1100 1111 = 0CF

// aktifkan Y0 Stepper = 1100 0111 = 0C7

#include <at89x51.h>

// 0x40 = a // 0x80 = b // 0x04 = c // 0x02 = d // 0x01 = e // 0x20 = f // 0x08 = g

23

// d7 d6 d5 d4 d3 d2 d1 d0 // b // // // // // // a -| | f nc a f dan b g e dan c g c d e

-| |

-- . d dan . baf. gcde 0xE7 0x84 0xCB 0xCE 0xAC 0x6E 0x2F 0xC4 0xFF 0xEC

// 0= 1110 0111 // 1= 1000 0100 // 2= 1100 1011 // 3= 1100 1110 // 4= 1010 1100 // 5= 0110 1110 // 6= 0010 1111 // 7= 1100 0100 // 8= 0000 0000 // 9= 1110 1100

/* Subrutin delay */ void tunda() { unsigned int cnt1,cnt2; for (cnt1=0;cnt1<100;cnt1++) { for (cnt2=0;cnt2<500;cnt2++) { } } }

void nyalakan(int bilangan) { switch (bilangan) {

24

case 0: P0=0xE7; break; case 1: P0=0x84; break; case 2: P0=0xCB; break; case 3: P0=0xCE; break; case 4: P0=0xAC; break; case 5: P0=0x6E; break; case 6: P0=0x2F; break; case 7: P0=0xC4; break; case 8: P0=0xFF; break; case 9: P0=0xEC; break; default:P0=0x00; break; } }

// aktifkan Y2 7s1 // aktifkan Y1 7s2

= 1101 0111 = 0D7 = 1100 1111 = 0CF

void main () { int satuan = 0; int puluhan = 0; while (1) {

25

// Aktifkan Bus Data 7s1 P2 = 0x0CF; nyalakan(satuan); P2 = 0x0D7; nyalakan(puluhan);

tunda();

//ulang terus dari 0-9 if (satuan!=9) { satuan=satuan+1; } else { satuan=0; puluhan=puluhan+1; if (puluhan>9) { puluhan = 0; } } }

} Program 3.1. Mengirim data 0-9 berurutan

26

Percobaan 3.2 : Mengirim data huruf Tujuan : Anda akan mencoba menampilkan sebuah kata pada seven segmen

// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC

= 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7

// aktifkan Y3 Matrix/LED = 1101 1111 = 0DF // aktifkan Y2 7s1 // aktifkan Y1 7s2 // aktifkan Y0 Stepper = 1101 0111 = 0D7 = 1100 1111 = 0CF = 1100 0111 = 0C7

#include <at89x51.h>

// 0x40 = a // 0x80 = b // 0x04 = c // 0x02 = d // 0x01 = e // 0x20 = f // 0x08 = g // d7 d6 d5 d4 d3 d2 d1 d0 // b a f nc g c d e

// -// | |

a f dan b g e dan c

// -// | |

// -- . d dan . // baf. gcde

// i= 1000 0100 0x84 // n= 1110 0101 0xE5 // f= 0110 1001 0x69 // o= 0000 1111 0x0F // r= 0000 1001 0x09

27

/* Subrutin delay */ void tunda() { unsigned int cnt1,cnt2; for (cnt1=0;cnt1<100;cnt1++) { for (cnt2=0;cnt2<1000;cnt2++) { } } }

void nyalakan(int huruf) { switch (huruf) { case 0: P0=0x84; break; case 1: P0=0xE5; break; case 2: P0=0x69; break; case 3: P0=0x0F; break; case 4: P0=0x09; break; case 5: P0=0x00; break; default:P0=0x00; break; } }

28

// aktifkan Y2 7s1 // aktifkan Y1 7s2

= 1101 0111 = 0D7 = 1100 1111 = 0CF

void main () { int satuan = 0; int puluhan = 0; while (1) {

// Aktifkan Bus Data 7s1 P2 = 0x0D7; nyalakan(0); P2 = 0x0CF; nyalakan(1); tunda();

P2 = 0x0D7; nyalakan(1); P2 = 0x0CF; nyalakan(2); tunda();

P2 = 0x0D7; nyalakan(2); P2 = 0x0CF; nyalakan(3); tunda();

P2 = 0x0D7; nyalakan(3); P2 = 0x0CF; nyalakan(4); tunda();

29

P2 = 0x0D7; nyalakan(4); P2 = 0x0CF; nyalakan(5); tunda();

P2 = 0x0D7; nyalakan(5); P2 = 0x0CF; nyalakan(5); tunda(); } } Program 3.2. Mengirimkan teks ke seven segment

3.3.Setting data berdasar keypad pada seven segmen Tujuan: Toggle data input menentukan output pada seven segment

#include <at89x51.h>

/* Subrutin delay */ void tunda() { unsigned int cnt1,cnt2; for (cnt1=0;cnt1<100;cnt1++) { for (cnt2=0;cnt2<1000;cnt2++) { } } }

30

void main () { int toggle; toggle=0; /* 7s2 */ P2 = 0x0D7; P0 = 0x00; /* 7s1 */ P2 = 0x0CF; while (1) { // toggle status P3.1 if ((P3 & 0x01E) == 0x01C) { toggle = !toggle; tunda(); } if (toggle==0) P0=0x084; // '1' else P0=0x0CB; // '2'

} } Program 3.3. Toggle switch data seven segment

Tugas :

1. Buat Menu data scroll dimana terdiri dari nama, nrp , kelas masing masing berganti apabila ada tombol yang ditekan dan tulisan bergeser satu persatu, data disimpan dengan look up table.

31

PERCOBAAN 4

OPERASI ARITHMATIKA

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat program untuk operasi arithmatika pada mikrokontroler Dapat mengerti instruksi penjumlahan, pengurangan, perkalian dan pembagian pada mikrokontroler

Dasar Teori

Operasi arithmatika dasar adalah penjumlahan, pengurangan, perkalian dan pembagian. Pada percobaan ini kita akan membuat program untuk operasi arithmatika dasar terhadap dua bilangan 8 bit. Data masukan berasal dari skalar dipswitch 8 bit.

Percobaan

Berikutnya Anda akan melakukan 4 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

4.1.Penjumlahan Tujuan : Pada percobaan ini dapat mengoperasikan penjumlahan dua data

//jumlah #include <at89x51.h>

void main () { unsigned int data1,data2; data1=0x01; P2 = 0x0DF;

32

while(1) { data2=P3; P1=data1+data2; } } Program 4.1. Penjumlahan

4.2.Pengurangan Tujuan : Pada percobaan ini dapat mengoperasikan pengurangan dua data

//kurang #include <at89x51.h>

void main () { unsigned int data1,data2; data1=0x0FF; P2 = 0x0DF; while(1) { data2=P3; P1=data1-data2; } } Program 3.2. Pengurangan

4.3.Perkalian Tujuan : Pada percobaan ini dapat mengoperasikan perkalian dua data

//kali #include <at89x51.h>

void main () { unsigned int data1,data2;

33

data1=0x03; P2 = 0x0DF; while(1) { data2=P3; P1=data1*data2; } } Program 4.3. Perkalian

4.4.Pembagian Tujuan : Pada percobaan ini dapat mengoperasikan pembagian dua data

//bagi #include <at89x51.h> void main () { unsigned int data1,data2; data1=0x0FF; P2 = 0x01F; while(1){ data2=P3; P1=data1/data2; } } Program 4.4. Pembagian

Tugas : 1. Buat Toggle operasi arithmatika dimana bila tombol ditekan operasi dapat berganti-ganti dari penjumlahan, pengurangan, perkalian dan pembagian.

34

PERCOBAAN 5

TIMER/COUNTER

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat program untuk operasi timer secara otomatis Dapat membuat program untuk timer berdasar detak masukan

Dasar Teori

Timer/Counter adalah pencacah atau penghitung dimana dalam penggunaannya bisa kita atur jumlah pencacahnya. Register yang digunakan telah disediakan oleh mikrokontroler itu sendiri diantaranya adalah TMOD untuk menentukan mode dari timer yang akan digunakan, TH, TL, TR dan TF menentukan jumlah cacahan, aktivasi dan batas limpahan. Register-register yang harus diinisialsasi adalah:

Interrupt Enable Register (IE)

Interrupt Priority Register (IP)

Timer/Counter Control Register (TCON)

Untuk lebih jelasnya Anda bisa langsung melakukan percobaan

35

Percobaan

Berikutnya Anda akan melakukan 2 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

5.1. Timer Otomatis isi data Tujuan : Pada percobaan ini dapat menggunakan Timer 16 bit auto reload

// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC

= 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7

// aktifkan Y3 Matrix/LED = 1101 1111 = 0DF // aktifkan Y2 7s1 // aktifkan Y1 7s2 // aktifkan Y0 Stepper = 1101 0111 = 0D7 = 1100 1111 = 0CF = 1100 0111 = 0C7

//timer 0FFFFh x 2 x 8 1.04 detik #include <at89x52.h> void init_tmr() { TMOD=0x01; } //timer 0 16 bit

void tundaan() { TH0=0x00; //isi high bit

TL0=0x00; //isi low bit TR0=1; //timer on

while (TF0==0) //tunggu hingga melimpah { } TF0=0; TR0=0; //kosongkan //timer off

36

void tunda() { // delay unsigned int i; for (i=0;i<9;i++) { tundaan(); } } void main () {/* forever loop */ init_tmr(); /* Buka data bus P2 = Y3 = 0x01F; */ P2 = 0x01F; while (1==1) { P1 = 0x00; tunda(); P1 = 0x0FF; tunda(); } } Program 5.1. Timer 0 kode 16 bit

5.2. Timer berdasar detak input Tujuan: Pada percobaan ini dapat mengirimkan teks pada seven segment

//timer menunggu 5 kali penekanan tombol

#include <at89x51.h> void tr() {

37

TMOD=0x0E; TH0=-5; TL0=-5; TR0=1;

//timer 0 8 bit

while (TF0==0) //tunggu sampai melimpah { } TF0=0; }

void main () { /* forever loop */ /* Aktifkan LED */ P2=0x01F; P1=0x01; while (1==1) { tr(); P1=0x00; tr(); P1=0x01;

} } Program 5.2. Timer menunggu detak input

Tugas : 1. Buat Timer untuk mengatur pergerakan lampu dari kiri ke kanan 2. Buat Timer untuk mengatur pergerakan lampu dari kanan ke kiri 3. Buat Timer dimana bila tiap 5 detik data di P1 bertambah satu

38

PERCOBAAN 6

LYQUID CRYSTAL DISPLAY (LCD)

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat program untuk memberikan instruksi pada LCD Dapat membuat program untuk memberikan data pada LCD

Dasar Teori

LCD adalah Lyquid Crystal Display, kita bisa memberikan instruksi dan data pada display, data bisa berupa sebuah karakter atau kalimat.

Gambar 6.1. Modul LCD

Kita juga bisa memeberikan instruksi untuk penggeseran layar dan sebagainya. Beberapa register yang harus diinisialisasi adalah : Entry Mode Set RS 0 R/W DB7 ------------------------------------------------------------ DB0 0 0 0 0 0 0 1 I/D S

Entry Mode Set mengeset arah dari gerakan cursor dan apakah display akan menggeser / berpindah.

39

Display ON/OFF Control RS 0 R/W 0 DB7 ------------------------------------------------------------ DB0 0 0 0 0 1 D C B

Display

ON/OFF control mengembalikan total display dan kursor ON/OFF dan

membuat posisi kursor start untuk blink Cursor/Display Shift RS 0 R/W DB7 --------------------------------------------------------------- DB0 0 0 0 0 1 S/C R/L . .

Kusor/Display Shift memindahkan kursor dan menggeser display tanpa mengubah isi DD RAM.

Diagram alir dari proses inisialisasi adalah :

Gambar 6.2. Diagram alir inisialisasi LCD 40

Percobaan

Berikutnya Anda akan melakukan 5 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

6.1 Inisialisasi pada modul LCD Tujuan : Pada percobaan ini bisa melakukan inisialisasi sehingga LCD bisa digunakan sesuai keperluan disain

// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC // aktifkan Y3 Matrix/LED // aktifkan Y2 7s1 // aktifkan Y1 7s2

= 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7 = 1101 1111 = 0DF = 1101 0111 = 0D7 = 1100 1111 = 0CF

// aktifkan Y0 Stepper = 1100 0111 = 0C7

// aktifkan Y6LCD = XX11 0111 // RS = P2.6 // E = P2.7

#include <at89x51.h> void tunda(int p1, int p2) { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

41

//pin P0 = D0-D7 = Data //pin P2.6 = RS //pin P2.7 = E //kirim instruksi register (RS=0) void kirim_instruksi(int data_byte) { //E RS 11 0111 P2=0x037; tunda(1,100); P2=0x0B7; P0=data_byte; tunda(10,100); P2=0x037; tunda(10,100); } //E=0 RS=0 //E=1 RS=0 //Kirim Databyte //E=0 RS=0

//inisialisasi LCD void init_lcd() { tunda(255,255); tunda(255,255); kirim_instruksi(0x30); tunda(50,100); kirim_instruksi(0x30); tunda(5,100); kirim_instruksi(0x30); kirim_instruksi(0x38); kirim_instruksi(0x08); kirim_instruksi(0x01); kirim_instruksi(0x06); } //tunggu sampai siap //Set data 8 bits //Display Off //Display clear //Entry Mode Set //tunggu min 100 us //tunggu min 4.1 ms //Inisialisasi

//kirim data LCD (RS=1) void kirim_data(int data_lcd)

42

{ //E RS 11 0111 P2=0x077; tunda(1,100); P2=0x0F7; P0=data_lcd; tunda(10,100); P2=0x077; tunda(1,100); } //E=0 RS=1 //E=1 RS=1 //Kirim Databyte; //E=0 RS=1

//program utama void main () { init_lcd(); kirim_instruksi(0x0F); kirim_instruksi(0x01); kirim_instruksi(0x02); } Program 6.1. Melakukan Inisialisasi LCD Kursor dan Blink //cursor on, blink on //display clr //cursor home

6.2 Mengirim data 1 karakter pada LCD Tujuan : Pada percobaan ini bisa menggunakan LDC : data 1 karakter

// aktifkan Y6LCD = 1111 0111 = 0F7 // aktifkan Y6LCD = XX11 0111 // RS = P2.6 // E = P2.7

#include <at89x51.h>

void tunda(int p1, int p2) { // delay

43

unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

//pin P0 = D0-D7 = Data //pin P2.6 = RS //pin P2.7 = E //kirim instruksi register (RS=0) void kirim_instruksi(int data_byte) { //E RS 11 0111 P2=0x037; //E=0 RS=0 tunda(1,100); P2=0x0B7; //E=1 RS=0 P0=data_byte; tunda(10,100); P2=0x037; //E=0 RS=0 tunda(10,100); } //Kirim Databyte

//inisialisasi LCD void init_lcd() { tunda(255,255); tunda(255,255); kirim_instruksi(0x30); tunda(50,100); kirim_instruksi(0x30); tunda(5,100); //tunggu min 100 us //tunggu min 4.1 ms //Inisialisasi

44

kirim_instruksi(0x30); kirim_instruksi(0x38); kirim_instruksi(0x08); kirim_instruksi(0x01); kirim_instruksi(0x06); }

//tunggu sampai siap //Set data 8 bits //Display Off //Display clear //Entry Mode Set

//kirim data LCD (RS=1) void kirim_data(int data_lcd) { //E RS 11 0111 P2=0x077; //E=0 RS=1 tunda(1,100); P2=0x0F7; //E=1 RS=1 P0=data_lcd; tunda(10,100); P2=0x077; //E=0 RS=1 tunda(1,100); } //Kirim Databyte;

//program utama void main () { init_lcd(); kirim_instruksi(0x0E); kirim_instruksi(0x01); kirim_instruksi(0x02); tunda(1,100); kirim_data('A'); tunda(1,100); } Program 6.2. Memberi data 1 karakter pada LCD //cursor on, blink on //display clr //cursor home

45

6.3 Memberi data 1 string pada LCD Tujuan : Pada percobaan ini bisa menuliskan data string (n karakter) ke LCD

// aktifkan Y6LCD = 1111 0111 = 0F7 // aktifkan Y6LCD = XX11 0111 // RS = P2.6 // E = P2.7

#include <at89x51.h>

void tunda(int p1, int p2) { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

//pin P0 = D0-D7 = Data //pin P2.6 = RS //pin P2.7 = E //kirim instruksi register (RS=0) void kirim_instruksi(int data_byte) { //E RS 11 0111 P2=0x037; //E=0 RS=0 tunda(1,100); P2=0x0B7; //E=1 RS=0 P0=data_byte; tunda(10,100); P2=0x037; //E=0 RS=0 //Kirim Databyte

46

tunda(10,100); }

//inisialisasi LCD void init_lcd() { tunda(255,255); tunda(255,255); kirim_instruksi(0x30); tunda(50,100); kirim_instruksi(0x30); tunda(5,100); kirim_instruksi(0x30); kirim_instruksi(0x38); kirim_instruksi(0x08); kirim_instruksi(0x01); kirim_instruksi(0x06); } //tunggu sampai siap //Set data 8 bits //Display Off //Display clear //Entry Mode Set //tunggu min 100 us //tunggu min 4.1 ms //Inisialisasi

//kirim data LCD (RS=1) void kirim_data(int data_lcd) { //E RS 11 0111 P2=0x077; //E=0 RS=1 tunda(1,100); P2=0x0F7; //E=1 RS=1 P0=data_lcd; tunda(10,100); P2=0x077; //E=0 RS=1 tunda(1,100); } //Kirim Databyte;

//program utama void main ()

47

{ init_lcd(); kirim_instruksi(0x0E); kirim_instruksi(0x01); kirim_instruksi(0x02); tunda(1,100); //cursor on, blink on //display clr //cursor home

kirim_data('I'); tunda(1,100); kirim_data('N'); tunda(1,100); kirim_data('F'); tunda(1,100); kirim_data('O'); tunda(1,100); kirim_data('R'); tunda(1,100); kirim_data('M'); tunda(1,100); kirim_data('A'); tunda(1,100); kirim_data('T'); tunda(1,100); kirim_data('I'); tunda(1,100); kirim_data('K'); tunda(1,100); kirim_data('A'); tunda(1,100); } Program 6.3. Mikrokontroller mengirimkan 1 string ke PC

48

6.4 Mengirimkan data pada ke dua baris LCD Tujuan : Pada percobaan ini bisa mengirimkan data string ke-2 baris LCD

// aktifkan Y6LCD = 1111 0111 = 0F7 // aktifkan Y6LCD = XX11 0111 // RS = P2.6 // E = P2.7

#include <at89x51.h>

void tunda(int p1, int p2) { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

//pin P0 = D0-D7 = Data //pin P2.6 = RS //pin P2.7 = E //kirim instruksi register (RS=0) void kirim_instruksi(int data_byte) { //E RS 11 0111 P2=0x037; //E=0 RS=0 tunda(1,100); P2=0x0B7; //E=1 RS=0 P0=data_byte; tunda(10,100); P2=0x037; //E=0 RS=0 //Kirim Databyte

49

tunda(10,100); }

//inisialisasi LCD void init_lcd() { tunda(255,255); tunda(255,255); kirim_instruksi(0x30); tunda(50,100); kirim_instruksi(0x30); tunda(5,100); kirim_instruksi(0x30); kirim_instruksi(0x38); kirim_instruksi(0x08); kirim_instruksi(0x01); kirim_instruksi(0x06); } //tunggu sampai siap //Set data 8 bits //Display Off //Display clear //Entry Mode Set //tunggu min 100 us //tunggu min 4.1 ms //Inisialisasi

//kirim data LCD (RS=1) void kirim_data(int data_lcd) { //E RS 11 0111 P2=0x077; //E=0 RS=1 tunda(1,100); P2=0x0F7; //E=1 RS=1 P0=data_lcd; tunda(10,100); P2=0x077; //E=0 RS=1 tunda(1,100); } //Kirim Databyte;

//program utama void main ()

50

{ init_lcd(); kirim_instruksi(0x0E); kirim_instruksi(0x01); kirim_instruksi(0x02); tunda(1,100); //cursor on dan blink on //display clr //cursor home

kirim_data('I'); tunda(1,100); kirim_data('N'); tunda(1,100); kirim_data('F'); tunda(1,100); kirim_data('O'); tunda(1,100); kirim_data('R'); tunda(1,100); kirim_data('M'); tunda(1,100); kirim_data('A'); tunda(1,100); kirim_data('S'); tunda(1,100); kirim_data('I'); tunda(1,100);

kirim_instruksi(0x0C0); tunda(1,100);

kirim_data('P'); tunda(1,100); kirim_data('E'); tunda(1,100); kirim_data('N');

51

tunda(1,100); kirim_data('S'); tunda(1,100); kirim_data('-'); tunda(1,100); kirim_data('I'); tunda(1,100); kirim_data('T'); tunda(1,100); kirim_data('S'); tunda(1,100); }

Program 6.4. Mengakses dua baris LCD, data string

6.5 Menggunakan instruksi geser layar Tujuan : Pada percobaan ini bisa menggeser layar LCD

// aktifkan Y6LCD = 1111 0111 = 0F7 // aktifkan Y6LCD = XX11 0111 // RS = P2.6 // E = P2.7

#include <at89x51.h>

void tunda(int p1, int p2) { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

52

//pin P0 = D0-D7 = Data //pin P2.6 = RS //pin P2.7 = E //kirim instruksi register (RS=0) void kirim_instruksi(int data_byte) { //E RS 11 0111 P2=0x037; //E=0 RS=0

tunda(1,100); P2=0x0B7; //E=1 RS=0 //Kirim Databyte

P0=data_byte; tunda(10,100); P2=0x037;

//E=0 RS=0

tunda(10,100); }

//inisialisasi LCD void init_lcd() { tunda(255,255); tunda(255,255); kirim_instruksi(0x30); tunda(50,100); kirim_instruksi(0x30); tunda(5,100); kirim_instruksi(0x30); kirim_instruksi(0x38); kirim_instruksi(0x08); kirim_instruksi(0x01); kirim_instruksi(0x06); } //tunggu sampai siap //Set data 8 bits //Display Off //Display clear //Entry Mode Set //tunggu min 100 us //tunggu min 4.1 ms //Inisialisasi

53

//kirim data LCD (RS=1) void kirim_data(int data_lcd) { //E RS 11 0111 P2=0x077; //E=0 RS=1

tunda(1,100); P2=0x0F7; //E=1 RS=1

P0=data_lcd; //Kirim Databyte; tunda(10,100); P2=0x077; //E=0 RS=1

tunda(1,100); }

//program utama void main () { init_lcd(); kirim_instruksi(0x0E); //cursor on dan blink on kirim_instruksi(0x01); //display clr kirim_instruksi(0x02); //cursor home tunda(1,100);

kirim_data('I'); tunda(1,100); kirim_data('N'); tunda(1,100); kirim_data('F'); tunda(1,100); kirim_data('O'); tunda(1,100); kirim_data('R'); tunda(1,100); kirim_data('M'); tunda(1,100);

54

kirim_data('A'); tunda(1,100); kirim_data('T'); tunda(1,100); kirim_data('I'); tunda(1,100); kirim_data('K'); tunda(1,100); kirim_data('A'); tunda(1,100);

kirim_instruksi(0x0C0); tunda(1,100);

kirim_data('P'); tunda(1,100); kirim_data('E'); tunda(1,100); kirim_data('N'); tunda(1,100); kirim_data('S'); tunda(1,100); kirim_data('-'); tunda(1,100); kirim_data('I'); tunda(1,100); kirim_data('T'); tunda(1,100); kirim_data('S'); tunda(1,100);

while(1) { kirim_instruksi(0x18);

55

tunda(10,2000); } } Program 6.5. Program Geser Layar LCD

Tugas : 1. Buatlah pergeseran LCD dimana arah pergeseran bisa anda pilih 2. Buatlah program diatas dengan menggunakan array dalam pengiriman data string, sehingga data tidak dikirimkan per-karakter

56

PERCOBAAN 7

INTERUPSI

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat program untuk menggunakan fasilitas eksternal interupsi Dapat membuat program untuk menggunakan fasilitas interupsi timer

Dasar Teori

Saat Anda sedang menerangkan sesuatu didepan kelas tiba-tiba seorang siswa mengangkat tangannya sambil berkata, Maaf, saya masih belum mengerti bagian pertama tadi, mohon dijelaskan kembali. Kemudian Anda menjelaskan kembali bagian yang ditanyakan. Setelah selesai menjelaskan, Anda kembali lagi meneruskan materi.

Ilustrasi diatas menggambarkan proses interupsi. Perhatikan gambar 7.1. Saat mikrokontroler mengerjakan program utama, apabila ada interupsi maka

mikrokontroler akan meninggalkan program utama dan mengerjakan permintaan interupsi. Setelah pekerjaan interupsi selesai, mikrokotroler akan kembali meneruskan program utama ditempat yang ditinggalkan tadi.

Gambar 7.1. Ilustrasi proses interupsi

57

Kejadian interupsi pada mikrokontroler dapat disebabkan oleh adanya kejadian eksternal, timer overflow, dan penerimaan / pengiriman data secara serial.

Interupsi merupakan fungsi dari mikrokontroler yang dapat kita manfaatkan dengan menyetel beberapa register. Kita bisa menyetel fasilitas dari interupsi dengan melihat tabel vektor interupsi, sehingga layanan prosedur interupsi yang kita buat bisa kita isi dengan program untuk LED, Seven Segment, Motor Stepper atau LCD. Interupsi berguna untuk mempercepat respon terhadap keinginan dibandingkan terhadap sistem yang menggunakan metode polling.

Sebelum interupsi dapat digunakan maka Anda haruslah melakukan inisialisasi atau melakukan seting terhadap register-register yang berhubungan dengan interupsi. Register-register tersebut adalah: Interrupt Enable Register (IE)

Interrupt Priority Register (IP)

Timer/Counter Control Register (TCON)

Untuk lebih jelasnya Anda bisa langsung melakukan percobaan

Percobaan

Berikutnya Anda akan melakukan 4 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

58

7.1 Menggunakan interupsi external /INT0 Tujuan : Pada percobaan ini dapat menggunakan Interupsi /INT0 dan menentukan ISR INT0
// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC // aktifkan Y3 Matrix/LED // aktifkan Y2 7s1 // aktifkan Y1 7s2 // aktifkan Y0 Stepper = 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7 = 1101 1111 = 0DF = 1101 0111 = 0D7 = 1100 1111 = 0CF = 1100 0111 = 0C7

// 0x40 = a // 0x80 = b // 0x04 = c // 0x02 = d // 0x01 = e // 0x20 = f // 0x08 = g // d7 d6 d5 d4 d3 d2 d1 d0 // b // a f a f dan b g e dan c nc g c d e

-|

// | //

-|

// | // //

-- . d dan . baf. gcde

// 0= 1110 0111 // 1= 1000 0100 // 2= 1100 1011 // 3= 1100 1110 // 4= 1010 1100 // 5= 0110 1110 // 6= 0010 1111 // 7= 1100 0100 // 8= 0000 0000 // 9= 1110 1100 // a= 1100 1111 // b= 0010 1111

0xE7 0x84 0xCB 0xCE 0xAC 0x6E 0x2F 0xC4 0xFF 0xEC 0xCF 0x2F

59

// c= 0110 0011 // d= 1000 1111 // e= 1110 1011 // f= 0110 1001 // h= 0010 1101

0x63 0x8F 0xEB 0x69 0x2D

#include <at89x51.h>
// tabel interrupt //Interrupt //External0 //Timer 0 //External1 //Timer 1 //Serial l Vector address 0003h 000Bh 0013h 001Bh 0023h Interrupt number 0 1 2 3 4

//isr int0 void EX0RLI(void) interrupt 0 { //untuk mematikan heater //untuk menyalakan cooler P2=0x0DF; P1=0x80; P2=0x0D7; P0=0x63; // display text ke 7 segment huruf c} } P1.0 P1.7 // external 0

//init int0 saja aktif void initINT() { IE=0x81; IT0=1; } // init default int external 0 // set int0

//main void main(void) {

60

//nyalakan interrupt initINT(); P2=0x0DF; P1=0x00; P2=0x0D7; P0=0x2D; P2=0x0CF; P0=0x00; // display text ke 7 segment OFF // display text ke 7 segment OFF // P1=OFF

//wait external interrupt while (1) { } } Program 7.1. Membaca respon /INT0

7.2 Menggunakan interupsi external /INT1 Tujuan : Pada percobaan ini dapat menggunakan Interupsi menentukan ISR INT1 /INT1 dan

#include <at89x51.h>

// tabel interrupt //Interrupt //External0 //Timer 0 //External1 //Timer 1 //Serial l Vector address 0003h 000Bh 0013h 001Bh 0023h Interrupt number 0 1 2 3 4

//isr int1 void EX0RLI(void) interrupt 2 { //untuk mematikan heater //untuk menyalakan cooler P1.0 P1.7 // external 1

61

P2=0x0DF; P1=0x80; P2=0x0D7; P0=0x63; // display text ke 7 segment huruf c} }

//init int0 saja aktif void initINT() { IE=0x84; IT0=1; } //main void main(void) { //nyalakan interrupt initINT(); P2=0x0DF; P1=0x00; P2=0x0D7; P0=0x2D; P2=0x0CF; P0=0x00; // display text ke 7 segment OFF // display text ke 7 segment OFF // P1=OFF // init default int external 1 // set int0

//wait external interrupt while (1) { } } Program 7.2. Membaca respon /INT1

62

7.3 Kontrol pemanas dan pendingin otomatis Tujuan : Pada percobaan ini dapat menggunakan INT0 dan INT1
//-------------------------------------------------// Aplikasi interupsi untuk mematikan & menghidupkan LED // Asumsi LED P1.0 sebagai HEATER // Asumsi LED P1.1 sebagai COOLER // /INT0 sebagai sensor HEATER=SUHU TRLL PANAS =OVER HEATING // /INT1 sebagai sensor COOLER=SUHU TRLL DINGIN=KURANG PANAS // Relay kompor/oven dipasang pada P1.7 //--------------------------------------------------

// aktifkan Y3 Matrix/LED // aktifkan Y2 7s1 // aktifkan Y1 7s2

= 1101 1111 = 0DF = 1101 0111 = 0D7 = 1100 1111 = 0CF

// d7 d6 d5 d4 d3 d2 d1 d0 // b a f nc g c d e

// // // // // //

-| |

a f dan b g e dan c

-| |

-- . d dan . baf. gcde 0xE7 0x84 0xCB 0xCE 0xAC 0x6E 0x2F 0xC4 0xFF 0xEC 0xCF 0x2F 0x63 0x8F 0xEB

// 0= 1110 0111 // 1= 1000 0100 // 2= 1100 1011 // 3= 1100 1110 // 4= 1010 1100 // 5= 0110 1110 // 6= 0010 1111 // 7= 1100 0100 // 8= 0000 0000 // 9= 1110 1100 // a= 1100 1111 // b= 0010 1111 // c= 0110 0011 // d= 1000 1111 // e= 1110 1011

63

// f= 0110 1001 // h= 0010 1101

0x69 0x2D

#include <at89x51.h>
//tabel interrupt //Interrupt Vector address //External0 //Timer 0 //External1 //Timer 1 //Serial l 0003h 000Bh 0013h 001Bh 0023h Interrupt number 0 1 2 3 4

//isr int0 void EX0RLI(void) interrupt 0 using 0 //ext0 use bank 0 //register 0 { //untuk mematikan heater //untuk menyalakan cooler P2=0x0DF; P1=0x80; P2=0x0D7; P0=0x63; // display text ke 7 segment // huruf c = cooler } P1.0 P1.7

//isr int1 void EX1RLI(void) interrupt 2 using 1 //ext1 use bank 1 { //untuk menyalakan Heater //untuk mematikan cooler P2=0x0DF; P1=0x01; P2=0x0D7; P0=0x2D; // display text ke 7 segment // huruf h = heater 64 P1.0 P1.7

//init int0 & int1 aktif void initINT() { IE=0x85;// init default int external 0 dan // external 1 IT0=1; IT1=1; } // set int0 // set int1

//main void main(void) { //nyalakan interrupt initINT(); //init kondisi awal = mengejar setting pemanas //untuk menyalakan Heater //untuk mematikan cooler P2=0x0DF; P1=0x01; P1.0 P1.7

P2=0x0D7; P0=0x2D; // display text ke 7 segment // huruf h = heater //wait external interrupt while (1) { } } Program 7.3. Membaca respon /INT1

65

7.4 Interupsi Timer Tujuan : Pada percobaan ini dapat menggunakan Interupsi Timer

//Aplikasi timer yang diaktifkan melalui interupsi //P1=LED,pin INT0,pin T0 //tabel interrupt sbb : //Interrupt //External0 //Timer 0 //External1 //Timer 1 //Serial l Vector address 0003h 000Bh 0013h 001Bh 0023h Interrupt number 0 1 2 3 4

//-----------------------------------------------------

#include <at89x51.h>

// Init Timer 0 void init_tmr() { TMOD=0x01; } //timer 0 16 bit

// Timer 0 void tundaan() { TH0=0x00; //isi high bit TL0=0x00; //isi low bit TR0=1; //timer on

while (TF0==0) //tunggu hingga melimpah { } TF0=0; TR0=0; } //kosongkan //timer off

66

// isr timer 0 void T0RLI(void) interrupt 1 { ET0=0; P2=0x0DF; P1=0x01; tundaan(); P2=0x0DF; P1=0x02; tundaan(); P2=0x0DF; P1=0x04; tundaan(); P2=0x0DF; P1=0x08; tundaan(); P2=0x0DF; P2=0x0DF; P1=0x10; tundaan(); P2=0x0DF; P1=0x20; tundaan(); P2=0x0DF; P1=0x40; tundaan(); P2=0x0DF; P1=0x80; tundaan(); P2=0x0DF; P1=0x00; tundaan(); ET0=1; } // on interupsi timer 0 // off interupsi timer 0 // interupsi timer 0

67

//isr int0 void EX0RLI(void) interrupt 0 // ext 0 using bank register 0 { TF0=1; ET0=1; } // paksa terjadi interupsi timer 0 // aktifkan interupsi timer 0

//init int0 aktif, timer 0 dan 1 aktif, auto reload //16 bit void initINT() { P2=0x0DF; P1=0x00; IE=0x83; //aktifkan bus data LED // P1 off // init default Interupsi Ext 0, //Interupsi Timer 0 IT0=1; TMOD=0x01; } // set int0 aktif // Timer 0 16 bit auto reload

//main void main(void) { //on int ext 0, int timer 0 16 bit auto reload initINT(); init_tmr();

//wait external interrupt while (1==1) { } } Program 7.4. Interupsi Timer 0

68

PERCOBAAN 8

MOTOR STEPPER

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat program untuk mengirim data ke motor stepper Dapat membuat program untuk memutar motor stepper kekiri dan kekanan

Dasar Teori

Motor stepper adalah motor yang pergerakannya per step dimana sudut putar berdasar dari jumlah pole yang dimiliki. Apabila ada 4 pole maka gerakan per step dari motor tersebut adalah 1.8 derajat, sehingga total putaran 360 derajat menghasilkan 200 step putaran untuk mode full step. Sedangkan untuk mode half step bisa menjadi 2 kali lipatnya yaitu 400 step. Berikut adalah sinyal untuk Full Step :

Gambar 8.1. Sinyal Full Step sedangkan untuk sinyal Half Step :

Gambar 8.2. Sinyal Half Step

69

Berikut adalah bentuk fisik dari motor stepper

Gambar 8.3. Motor Stepper

Adapun cara pemberian data full step pada motor stepper adalah sebagai berikut :

Tabel 8.1. Data Full Step (metode 1) Step 1 2 3 4 Kabel 1 1 0 0 0 Kabel 2 0 1 0 0 Kabel 3 0 0 1 0 Kabel 4 0 0 0 1

atau untuk memperkuat dari torsi motor stepper dapat dilakukan dengan memberikan data (full step) sebagai berikut :

Tabel 8.2. Data Full Step (metode 2) Step 1 2 3 4 Kabel 1 1 0 0 1 Kabel 2 1 1 0 0 Kabel 3 0 1 1 0 Kabel 4 0 0 1 1

Percobaan

Berikutnya Anda akan melakukan 3 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

70

8.1 Menggunakan Stepper digerakkan ke kiri berurutan Tujuan : Pada percobaan ini dapat menggunakan motor Stepper

// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC

= 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7

// aktifkan Y3 Matrix/LED = 1101 1111 = 0DF // aktifkan Y2 7s1 // aktifkan Y1 7s2 // aktifkan Y0 Stepper = 1101 0111 = 0D7 = 1100 1111 = 0CF = 1100 0111 = 0C7

#include <at89x51.h>

void tunda() { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<100;cnt1++) { for (cnt2=0;cnt2<300;cnt2++) { } } }

void main () { unsigned A; P2=0x0C7; A=0x01; while (1==1) { P1 = A; tunda(); if (A!=0x80)

71

A = A << 1; else A=0x01; } } Program 8.1. Stepper gerak ke kiri

8.2 Menggunakan Stepper digerakkan ke kanan berurutan Tujuan : Pada percobaan ini dapat menggunakan motor Stepper

#include <at89x51.h>

void tunda() { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<100;cnt1++) { for (cnt2=0;cnt2<300;cnt2++) { } } }

void main () { unsigned A; P2=0x0C7; A=0x01; while (1==1) { P1 = A; tunda(); if (A!=0x01) A = A >> 1;

72

else A=0x80; } } Program 8.2. Stepper gerak kekanan

8.3 Menggunakan Stepper gerak kekiri dan kekanan berurutan berulang Tujuan : Pada percobaan ini dapat menggerakkan stepper ke kiri dan ke kanan berdasar masukan dari keypad /INT0 dan /INT1, delay dengan Timer 0 16 bit auto reload

#include <at89x51.h>

// tabel interrupt //Interrupt Vector address Interrupt number //External0 0003h //Timer 0 000Bh 0 1 2 3 4

//External1 0013h //Timer 1 //Serial l 001Bh 0023h

//Timer 0 16 bit auto reload void tundaan() { TH0=0x00; //isi high bit TL0=0x00; //isi low bit TR0=1; //timer on

while (TF0==0) //tunggu hingga melimpah { } TF0=0; TR0=0; } //kosongkan //timer off

73

void tunda() { // delay 2 kali timer unsigned int i; for (i=0;i<1;i++) { tundaan(); } }

//isr int0 void EX0RLI(void) interrupt 0 // external 0 { unsigned A; P2=0x0C7; A=0x01; while (1==1) { P1 = A; tunda(); if (A!=0x80) A = A << 1; else A=0x01; } }

//isr int1 void EX1RLI(void) interrupt 2 // external 1 { unsigned A; P2=0x0C7; A=0x80; while (1==1)

74

{ P1 = A; tunda(); if (A!=0x01) A = A >> 1; else A=0x80; } }

//init int0 & int1 aktif void initINT() { IE=0x85; //init default int external 0& IT0=1; IT1=1; } // set int0 // set int1 external 1

//main void main(void) { //nyalakan interrupt initINT(); //wait external interrupt while (1==1) { } } Program 8.3. Stepper gerak kiri/kanan berdasar INT0 dan INT1

Tugas : 1. Buat Program dimana motor 1 bergerak ke kiri, motor 2 bergerak kekanan, dipilih dengan INT0&INT1 , delay dengan Timer 0 16 bit

75

PERCOBAAN 9

KOMUNIKASI SERIAL

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat melakukan komunikasi 2 arah antara PC dan Mikrokontroler Dapat membuat program untuk mengirim data dari PC ke Mikrokontroler Dapat membuat program untuk Mengirimkan data dari Mikrokontroler ke PC

Dasar Teori

Berkomunikasi dengan peralatan lain? Sepertinya sangat menarik untuk Anda coba. Anda dapat mengirimkan data dari mikrokontroler ke komputer desktop misalnya. Atau sebaliknya, komputer mengirimkan data ke mikrokontroler untuk diproses lebih lanjut.

Mikrokontroler dapat berkomunikasi dengan peralatan lain secara serial. Komunikasi serial mengirim sebuah bit dalam satu waktu.

Register yang berhubungan dengan komunikasi serial adalah: Serial port Control Register (SCON)

Serial port buffer (SBUF) Register 8-bit yang digunakan untuk mengirim atau menerima data Power Control Register (PCON)

Bit yang digunakan hanya bit SMOD

76

Bila komunikasi serial pada mikrokontroler diaktifkan maka port 3.0 dan port 3.1 akan berubah fungsi menjadi port RxD dan port TxD. Yang harus Anda perhatikan dalam membuat program dengan komunikasi serial adalah: Menggunakan timer1 pada mode 2 autoreload. Nilai reload pada TH1 menentukan besar baudrate. Bila perlu, set bit SMOD untuk menggandakan baudrate. Set bit SM0=0 dan bit SM1=1 pada register SCON untuk komunikasi serial mode 1. Bila diperlukan, gunakan metode rutin layanan interupsi. Rutin ini akan dijalankan bila ada pengiriman data (TI=1) atau penerimaan data (RI=1). Jika digunakan, jangan lupa untuk membuat bit ES=1 (Enable Serial interrupt) pada register IE. Mengirim dan menerima data pada register SBUF. Saat akan mengirim data, cek bit TI. Bila bernilai 1 maka program harus mengisi nilainya menjadi 0 kemudian lakukan pengiriman data. Program harus mengenolkan TI dan RI terlebih dahulu sebelum mengirim atau menerima data, dan setelah terjadi interupsi serial. Hal ini akan mengijinkan port serial untuk mengirimkan atau menerima data berikutnya. Bila program telah siap untuk berkomunikasi serial, isi bit REN=1 untuk mengijinkan penerimaan data serial.

Percobaan

Berikutnya Anda akan melakukan 5 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

Tahapan untuk melakukan Komunikasi Serial Adapun tahapan untuk melakukan komunikasi serial adalah mempersiapkan layanan komunikasi pada komputer anda agar dapat terjadi komunikasi yang benar antara mikrokontroler dengan komputer anda melalui port serial. Beberapa tahapan adalah sebagia berikut :

77

1. Aktifkan layanan Komunikasi Serial. Langkahnya adalah Klik Start Program Accessories Communication Hyperterminal

Gambar 9.1. Program Hyperterminal

2. Isi nama koneksi dengan tes

Gambar 9.2. Pengisian Nama Koneksi

78

3. Isi Port yang akan anda gunakan untuk melakukan koneksi

Gambar 9.3. Port koneksi yang digunakan

4. Isi Kecepatan Transfer data yang digunakan, sesuai dengan program mikro anda

Gambar 9.4. Kecepatan koneksi

79

5. Isi Data Bits = 8, Parity = None, Stop Bits = 1, Flow Control = None

Gambar 9.5. Setting Data bits,Parity, Stop bits, Flow control 6. Amati, apakah telah terjadi komunikasi dengan benar atau belum antara mikrokontroler dan komputer anda dengan memperhatikan ikon konektivitas.

Gambar 9.6. Ikon Connected sebagai tanda komunikasi serial berjalan

80

7. Cara memutuskan hubungan antara komputer dengan mikrokontroler

Gambar 9.7. Memutuskan hubungan antara PC dengan mikrokontroler

Program yang anda buat untuk melakukan komunikasi diatas adalah :

9.1.Mengirimkan Data Serial dari Mikrokontroller ke Personal Computer Tujuan : Pada percobaan ini bisa mengakses port serial untuk mengirimkan data ke Personal Komputer : data 1 karakter

/*-----------------------------------------------Serial Communication, Created by setiawardhana Sending data To PC = 'any character' ------------------------------------------------*/ #include <At89x51.h> #include <stdlib.h> #include <string.h>

// prototipe fungsi void initserial(); void putchar(char c);

81

//inisialisasi serial interface void initserial() { TMOD=0x20; // timer 1 mode 2 // (8 bit isi ulang otomatis) TH1=0x0F4; // baudrate 2400 untuk crystal // 11.0592MHz SCON=0x50; TR1=1; TI =1; RI =1; } //kirim 1 char void putchar(char c) { while (!TI); TI=0; SBUF=c; } //program utama void main(void) { initserial(); while(1) { //kirim karacter 'S' putchar('S'); } } Program 9.1. Mengirim 1 karakter dari mikro ke PC // mode srial 8-bit UART // jalankan timer 1

9.2.Menerima Data Serial dari Personal Computer di Mikrokontroller Tujuan : Pada percobaan ini bisa mengakses port serial untuk menerima data dari Personal Komputer : data 1 karakter

82

/*Serial Interface by setiawardhana read one character */ #include <At89x51.h> #include <stdlib.h>

// prototipe fungsi void init(); char getchr(void);

//inisialisasi serial interface void initserial() { TMOD=0x20; // timer 1 mode 2 // (8 bit isi ulang otomatis) TH1=0x0F4; SCON=0x50; TR1=1; TI =1; RI =1; } // baudrate 2400 untuk crystal 11.0592 // mode srial 8-bit UART // jalankan timer 1

//ambil 1 karakter char getchr(void) { while (!RI); RI=0; return SBUF; }

//program utama void main(void) { char dat; initserial(); while(1==1)

83

{ P2=0x0DF; dat=getchr(); if(dat=='x') break; if(dat=='1') P1=0x00; if(dat=='2') P1=0x0FF; } } Program 9.2. Menerima 1 karakter dari PC di mikro

9.3.Mengirimkan Data Serial dari Mikrokontroller ke Personal Computer Tujuan : Pada percobaan ini bisa mengakses port serial untuk mengirimkan data ke Personal Komputer : data string (bukan 1 karakter) /*----------------------------------------------------Serial Communication Created by setiawardhana Sending data To PC = 'any string' -----------------------------------------------------*/ #include <At89x51.h> #include <stdlib.h> #include <string.h>

// prototipe fungsi void initserial(); void putchar(char c); void putstr(char *s);

//inisialisasi serial interface void initserial() { TMOD=0x20; TH1=0x0F4; SCON=0x50; TR1=1; TI =1; RI =1;} // timer 1 mode 2 8 bit isi otomatis // baudrate 2400 untuk crystal 11.059 // mode srial 8-bit UART // jalankan timer 1

84

//kirim 1 char void putchar(char c) { while (!TI); TI=0; SBUF=c;} //kirim 1 string void putstr(char *s) { char i=0; char c; while((c=*(s+(i++)))!=0) putchar(c); } //program utama void main(void) { char *s; initserial(); while(1==1) { s = "IT PENS"; putstr(s); } } Program 9.3. Mikrokontroller mengirimkan 1 string ke PC

9.4.Mengirimkan Data Serial dari Mikrokontroller ke Personal Computer dan menerima kembali sebagai umpan balik Tujuan : Pada percobaan ini bisa mengakses port serial untuk mengirimkan data ke Personal Komputer : data string (bukan 1 karakter) /* Serial Interface baca 1 chr kirim balik 1 chr tst ke PC dgn ASCII+1 contoh : kirim 'a' maka akan mendapat jawaban 'b'

85

*/ #include <At89x51.h> #include <stdlib.h>

// prototipe fungsi void init(); char getchr(void); void putchar(char c); //inisialisasi serial interface void initserial() { TMOD=0x20; // timer 1 mode 2 // (8 bit isi ulang otomatis) TH1=0x0F4; SCON=0x50; TR1=1; TI =1; RI =1; } // baudrate 2400 untuk crystal 11.059 // mode srial 8-bit UART // jalankan timer 1

//kirim 1 char void putchar(char c) { while (!TI); TI=0; SBUF=c; } //ambil 1 karakter char getchr(void) { while (!RI); RI=0; return SBUF;

86

} //program utama void main(void) { char dat; initserial(); while(1==1) { dat=getchr(); putchar(dat+1); } } Program 9.4. Mikro menerima data dari PC dan mengirimkan ulang ke PC

9.5.Mengirimkan Data Serial dari Mikrokontroller ke Personal Computer dan menerima kembali sebagai umpan balik dengan INTERUPSI SERIAL Tujuan : Pada percobaan ini bisa mengakses port serial untuk mengirimkan data ke Personal Komputer : data string (bukan 1 karakter)

#include <At89x51.h> #include <stdlib.h> // prototipe fungsi void init(); char getchr(void); void putchar(char c); void putstr(char *s); //inisialisasi serial interface void initserial() { TMOD=0x20; // timer 1 mode 2 // (8 bit isi ulang otomatis) TH1=0x0F4; SCON=0x50; TR1= 1; // baudrate 2400 untuk crystal 11.059 // mode srial 8-bit UART // jalankan timer 1

87

TI = 1; RI = 1; ES = 1; EA = 1; } // init INT = aktivasi bit // INT on

//kirim 1 char void putchar(char c) { while (!TI); TI=0; SBUF=c; }

//kirim 1 string void putstr(char *s) { char i=0; char c; while((c=*(s+(i++)))!=0) putchar(c); }

//ambil 1 karakter char getchr(void) { while (!RI); RI=0; return SBUF; } //isr interupsi serial void isr_serial() interrupt 4 { char dat; dat=getchr(); //serial interupsi

88

if (dat=='1') { putstr("on"); P2=0xDF; P1=0x0F; } if (dat=='2') { putstr("off"); P2=0xDF; P1=0x0F0; } if (dat=='3') { putstr("idle"); P2=0xDF; P1=0x00; } } void main(void) { initserial(); while(1) { } } Program 9.5. INTERUPSI SERIAL

89

PERCOBAAN 10

Analog To Digital Converter (ADC)

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat program untuk membaca data dari ADC Dapat memanfaatkan mode pembacaan pada ADC

Dasar Teori

Analog To Digital Converter atau yang lebih sering disebut dengan ADC adalah suatu perangkat atau IC yang digunakan untuk mengkonversi masukan yang berupa tegangan analog menjadi data digital. Pada ADC yang kita gunakan mempunyai range masukan 0 sampai 5 volt dan hasil data digital mempunyai range 00H sampai FFH. Cara melakukan pembacaan seperti pada gambar 10.2 adalah :

Gambar 10.1. Diagram fungsional ADC 0820

90

Gambar 10.2. Pembacaan ADC 0820 dengan mode RD

Aktifkan ADC 0820 dengan memberikan logika 0 pada pin /CS Tunggu selama tRDY yaitu 600 ns, setelah itu berikan logika 0 pada pin /RD Data siap dibaca setelah memenuhi waktu konversi ADC yaitu 2.5us Tanda bahwa data telah siap dibaca adalah adanya perubahan logika pada pin /INT menjadi logika 0

Percobaan

Berikutnya Anda akan melakukan 2 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

10.1.

Membaca data ADC

Tujuan: Pada percobaan ini diharapkan dapat melakukan pembacaan pada ADC secara polling, data hasil pembacaan di klasifikasikan berdasarkan fungsi keanggotaan

// aktifkan Y6 LCD // aktifkan Y5 ADC

= 1111 0111 = 0F7 = 1110 1111 = 0EF

// ADC melalui port 1 tidak menggunakan addressing // aktifkan Y6LCD = 1111 0111 = 0F7

91

// aktifkan Y6LCD = XX11 0111 // RS = P2.6 // E = P2.7

#include <at89x51.h> void tunda(int p1, int p2) { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

//pin P0 = D0-D7 = Data //pin P2.6 = RS //pin P2.7 = E //kirim instruksi register (RS=0) void kirim_instruksi(int data_byte) { //E RS 11 0111 P2=0x037; //E=0 RS=0 tunda(1,100); P2=0x0B7; //E=1 RS=0 P0=data_byte; tunda(10,100); P2=0x037; //E=0 RS=0 tunda(10,100); } //Kirim Databyte

92

//inisialisasi LCD void init_lcd() { tunda(255,255); tunda(255,255); kirim_instruksi(0x30); tunda(50,100); kirim_instruksi(0x30); tunda(5,100); kirim_instruksi(0x30); kirim_instruksi(0x38); kirim_instruksi(0x08); kirim_instruksi(0x01); kirim_instruksi(0x06); } //tunggu sampai siap //Set data 8 bits //Display Off //Display clear //Entry Mode Set //tunggu min 100 us //tunggu min 4.1 ms //Inisialisasi

//kirim data LCD (RS=1) void kirim_data(int data_lcd) { //E RS 11 0111 P2=0x077; //E=0 RS=1 tunda(1,100); P2=0x0F7; //E=1 RS=1 P0=data_lcd; tunda(10,100); P2=0x077; //E=0 RS=1 tunda(1,100); } //Kirim Databyte;

void bacaADC() { int data1; // // // P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 MODE CS x 0 /RD x /WR x /INT 0 x 0 0 0 0 0

93

//awal 0 //write 0 //read 0

0 0 0

1 1 0

1 0 1

1 1 1

0 0 0

0 0 0

0 0 0

P3=0x38; tunda(1,100); P3=0x28; tunda(1,100); P3=0x18; tunda(1,100); data1=P1; P3=0x38; tunda(1,100);

if (data1<=25) { kirim_data('1'); } if ((data1>25) && (data1<=50)) kirim_data('2'); } if ((data1>75) && (data1<=100)) { kirim_data('3'); } if ((data1>100) && (data1<=125)) { kirim_data('4'); } if ((data1>125) && (data1<=150)) { kirim_data('5'); } if ((data1>150) && (data1<=175)) { kirim_data('6'); } if ((data1>175) && (data1<=200)) { kirim_data('7'); {

94

} if ((data1>200) && (data1<=225)) { kirim_data('8'); } if ((data1>225) && (data1<=250)) { kirim_data('9'); } } //program utama void main() { init_lcd(); kirim_instruksi(0x0E); kirim_instruksi(0x01); kirim_instruksi(0x02); //cursor on dan blink on //display clr //cursor home

while(1) { bacaADC(); } } Program 10.1. Membaca Data ADC secara Polling

95

PERCOBAAN 11

Digital To Analog Converter (DAC)

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat program untuk mengirimkan data ke DAC Dapat memanfaatkan penggunaan ke dua kanal pada DAC

Dasar Teori

Digital To Analog Converter atau yang lebih dikenal dengan DAC adalah suatu perangkat atau IC yang digunakan untuk mengkonversi Data masukan Digital menjadi data keluaran Analog. Pada percobaan ini hasil outputnya berupa tegangan DC dari 0 sampai dengan 5 Volt dengan data masukan dari 00H sampai FFH, informasi pada LCD.

Gambar 11.1. Diagram fungsional DAC 7302

96

Gambar 11.2. Diagram waktu menulis DAC 7302

Percobaan

Berikutnya Anda akan melakukan 3 macam percobaan. Amati dengan seksama dan pahami benar program tersebut. Aplikasi dari program ini adalah untuk mengatur kecepatan putaran motor DC, masukan bisa berasal Potensiometer yang dihubungkan ke ADC atau berdasar pada setting melalui DipSwitch.

Gambar 11.3. Beberapa bentuk motor DC

11.1.

Mengirimkan data ke DAC kanal A

Tujuan : Pada percobaan ini bisa menggunakan Kanal A dari DAC dengan mengirimkan data tertentu

// aktifkan Y6 LCD // aktifkan Y5 ADC

= 1111 0111 = 0F7 = 1110 1111 = 0EF

97

// aktifkan Y4 DAC

= 1110 0111 = 0E7

// DAC melalui port 1, Control Port 3

// aktifkan Y6LCD = 1111 0111 = 0F7 // aktifkan Y6LCD = XX11 0111

// RS = P2.6 // E = P2.7

#include <at89x51.h>

void tunda(int p1, int p2) { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

//pin P0 = D0-D7 = Data //pin P2.6 = RS //pin P2.7 = E //kirim instruksi register (RS=0)

void kirim_instruksi(int data_byte) { //E RS 11 0111 P2=0x037; //E=0 RS=0 tunda(1,100); P2=0x0B7; //E=1 RS=0

98

P0=data_byte; tunda(10,100);

//Kirim Databyte

P2=0x037; //E=0 RS=0 tunda(10,100); }

//inisialisasi LCD void init_lcd() { tunda(255,255); tunda(255,255); kirim_instruksi(0x30); tunda(50,100); kirim_instruksi(0x30); tunda(5,100); kirim_instruksi(0x30); kirim_instruksi(0x38); kirim_instruksi(0x08); kirim_instruksi(0x01); kirim_instruksi(0x06); } //tunggu sampai siap //Set data 8 bits //Display Off //Display clear //Entry Mode Set //tunggu min 100 us //tunggu min 4.1 ms //Inisialisasi

//kirim data LCD (RS=1) void kirim_data(int data_lcd) { //E RS 11 0111 P2=0x077; //E=0 RS=1 tunda(1,100); P2=0x0F7; //E=1 RS=1 P0=data_lcd; tunda(10,100); P2=0x077; //E=0 RS=1 tunda(1,100); } //Kirim Databyte;

99

void line1() { kirim_data('K'); tunda(1,100); kirim_data('A'); tunda(1,100); kirim_data('N'); tunda(1,100); kirim_data('A'); tunda(1,100); kirim_data('L'); tunda(1,100); kirim_data(':'); tunda(1,100); kirim_data('A'); tunda(1,100); }

void sendtoDAC_kanalA() { //P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 //CS //0 //write = 0 //write = 0 P3=0x10; tunda(1,100); P1=0x50; P3=0x00; tunda(1,100); } CLR 0 0 0 PD 0 0 0 WR x 1 0 LDAC A/B 0 0 0 x 0 0 0 0 0 0 0 0 0 0

100

//program utama void main () { init_lcd(); kirim_instruksi(0x0E); kirim_instruksi(0x01); kirim_instruksi(0x02); line1(); while(1) { tunda(1,100); sendtoDAC_kanalA(); } } //cursor on, blink on //display clr //cursor home

Program 11.1. Mengirimkan data ke kanal A

11.2.

Mengirimkan data ke DAC kanal B

Tujuan : Pada percobaan ini bisa menggunakan Kanal B dari DAC dengan mengirimkan data tertentu

// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC

= 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7

// DAC melalui port 1 tidak menggunakan addressing

// aktifkan Y6LCD = 1111 0111 = 0F7 // aktifkan Y6LCD = XX11 0111 // RS = P2.6 // E = P2.7

#include <at89x51.h> void tunda(int p1, int p2)

101

// delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } }

//pin P0 = D0-D7 = Data //pin P2.6 = RS //pin P2.7 = E //kirim instruksi register (RS=0) void kirim_instruksi(int data_byte) { //E RS 11 0111 P2=0x037; //E=0 RS=0 tunda(1,100); P2=0x0B7; //E=1 RS=0 P0=data_byte; tunda(10,100); P2=0x037; //E=0 RS=0 tunda(10,100); } //Kirim Databyte

//inisialisasi LCD void init_lcd() { tunda(255,255); tunda(255,255); kirim_instruksi(0x30); tunda(50,100); kirim_instruksi(0x30); tunda(5,100); //tunggu min 100 us //tunggu min 4.1 ms //Inisialisasi

102

kirim_instruksi(0x30); kirim_instruksi(0x38); kirim_instruksi(0x08); kirim_instruksi(0x01); kirim_instruksi(0x06); }

//tunggu sampai siap //Set data 8 bits //Display Off //Display clear //Entry Mode Set

//kirim data LCD (RS=1) void kirim_data(int data_lcd) { //E RS 11 0111 P2=0x077; //E=0 RS=1 tunda(1,100); P2=0x0F7; //E=1 RS=1 P0=data_lcd; tunda(10,100); P2=0x077; //E=0 RS=1 tunda(1,100); } //Kirim Databyte;

void line1() { kirim_data('K'); tunda(1,100); kirim_data('A'); tunda(1,100); kirim_data('N'); tunda(1,100); kirim_data('A'); tunda(1,100); kirim_data('L'); tunda(1,100); kirim_data(':'); tunda(1,100); kirim_data('B'); tunda(1,100);

103

void sendtoDAC_kanalB() { //P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 //CS //0 //write //write = 0 = 0 CLR 0 0 0 PD 0 0 0 WR x 1 0 LDAC A/B 0 0 0 x 1 1 0 0 0 0 0 0 0 0

P3=0x14; tunda(1,100); P1=0x7F; P3=0x04; tunda(1,100); }

//program utama void main () { init_lcd(); kirim_instruksi(0x0E); kirim_instruksi(0x01); kirim_instruksi(0x02); //cursor on, blink on //display clr //cursor home

line1();

while(1) { tunda(1,100); sendtoDAC_kanalB(); } } Program 11.2. Mengirimkan data ke kanal B

104

11.3.

Mengirimkan data ke DAC kanal A dan kanal B

Tujuan : Pada percobaan ini bisa menggunakan kedua buah kanal dari DAC dengan mengirimkan data tertentu

// aktifkan Y6 LCD // aktifkan Y5 ADC // aktifkan Y4 DAC

= 1111 0111 = 0F7 = 1110 1111 = 0EF = 1110 0111 = 0E7

// DAC melalui port 1 tidak menggunakan addressing

// aktifkan Y6LCD = 1111 0111 = 0F7 // aktifkan Y6LCD = XX11 0111 // RS = P2.6 // E = P2.7

#include <at89x51.h>

void tunda(int p1, int p2) { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

//pin P0 = D0-D7 = Data //pin P2.6 = RS //pin P2.7 = E //kirim instruksi register (RS=0)

105

void kirim_instruksi(int data_byte) { //E RS 11 0111 P2=0x037; //E=0 RS=0 tunda(1,100); P2=0x0B7; //E=1 RS=0 P0=data_byte; tunda(10,100); P2=0x037; //E=0 RS=0 tunda(10,100); } //Kirim Databyte

//inisialisasi LCD void init_lcd() { tunda(255,255); tunda(255,255); kirim_instruksi(0x30); tunda(50,100); kirim_instruksi(0x30); tunda(5,100); kirim_instruksi(0x30); kirim_instruksi(0x38); kirim_instruksi(0x08); kirim_instruksi(0x01); kirim_instruksi(0x06); } //tunggu sampai siap //Set data 8 bits //Display Off //Display clear //Entry Mode Set //tunggu min 100 us //tunggu min 4.1 ms //Inisialisasi

//kirim data LCD (RS=1) void kirim_data(int data_lcd) { //E RS 11 0111 P2=0x077; //E=0 RS=1 tunda(1,100); P2=0x0F7; //E=1 RS=1 P0=data_lcd; tunda(10,100); //Kirim Databyte;

106

P2=0x077; //E=0 RS=1 tunda(1,100); }

void line1() { kirim_data('K'); tunda(1,100); kirim_data('A'); tunda(1,100); kirim_data('N'); tunda(1,100); kirim_data('A'); tunda(1,100); kirim_data('L'); tunda(1,100); kirim_data(':'); tunda(1,100); kirim_data('A'); tunda(1,100); kirim_data('&'); tunda(1,100); kirim_data('B'); tunda(1,100); }

void sendtoDAC_kanalAB() { //P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 //CS //0 //write //write = 0 = 0 CLR 0 0 0 PD 0 0 0 WR x 1 0 LDAC A/B 0 0 0 x 1 1 0 0 0 0 0 0 0 0

P3=0x10; tunda(1,100);

107

P1=0xC8; P3=0x00;

// kanal A = 200D = C8h

tunda(1,100);

P3=0x14; tunda(1,100); P1=0x7F; P3=0x04; tunda(1,100); } // kanal B = 127D = 127h

//program utama void main () { init_lcd(); kirim_instruksi(0x0E); kirim_instruksi(0x01); kirim_instruksi(0x02); //cursor on, blink on //display clr //cursor home

line1(); while(1) { tunda(1,100); sendtoDAC_kanalAB(); } } Program 11.3. Mengirimkan data ke kanal A dan kanal B

Tugas : Kirimkan data sehingga membentuk fungsi ramp (ramp generator), informasi data yang dikirim ditampilkan di LCD

108

PERCOBAAN 12

DISPLAY DOT MATRIK

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat program untuk menyalakan lampu dot matrix Dapat membuat program untuk memberikan pola pada lampu dot matrix

Dasar Teori

Lampu Dot Matrix adalah bekerja berdasarkan ada dan tidaknya tegangan, dimana pengiriman datanya adalah secara scaning, sehingga apabila kita ingin menyalakan lampu pada lokasi tertentu maka kita bisa melakukannya dengan cara mengirimkan data untuk baris dan kolom tertentu dimana posisi lampu yang akan dinyalakan, untuk menyalakannya sama dengan prinsip yang digunakan pada lampu LED.

(a) Tipe-tipe DotMatrix

(b) DotMatrix 8x5

(c) Baris Kolom

Gambar 12. Dot Matrik

109

Percobaan

Berikutnya Anda akan melakukan 4 macam percobaan. Amati dengan seksama dan pahami benar program tersebut.

12.1. Mengirimkan data tertentu ke lampu dot matrik Tujuan : Pada percobaan ini bisa mengirimkan data dengan konsep scanning baris dan kolom

//seleksi data baris dan kolom #include <at89x51.h> void tunda(unsigned int p1, unsigned int p2) { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

void tulis() {
//alamat scanning // aktifkan Y3 Matrix/LED= 1101 1111 = 0DF // P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 // 1 // 1 // 1 1 1 1 0 0 0 1 1 1 1 1 1 x 0 1 x 0 1 x 0 1 = D9H (data awal) = DFH (data akhir)

// P2.2-P2.0 diisi data dari 000 sampai 111 ( 8 baris)

P1=0x55; P2=0xD8;

110

tunda(1,10); P2=0xD9; tunda(1,10); P2=0xDA; tunda(1,10); P2=0xDB; tunda(1,10); P2=0xDC; tunda(1,10); }

//program utama void main() { while(1) { tulis(); } } Program 12.1. Mengirimkan data tertentu ke lampu dot matrik

12.2. Mengirimkan array data tertentu ke lampu dot matrik Tujuan : Pada percobaan ini bisa mengirimkan data yang berasal dari array data dengan konsep scanning baris dan kolom

// data berdasar array #include <at89x51.h>

unsigned char angka[10]={11,22,33,44,55,66,77,88,99,180}; unsigned char i=0,j=0;

void tunda(unsigned int p1, unsigned int p2) { // delay

111

unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

void tulis(unsigned char i) { //alamat scanning


// aktifkan Y3 Matrix/LED= 1101 1111 = 0DF // P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 // 1 // 1 // 1 1 1 1 0 0 0 1 1 1 1 1 1 x 0 1 x 0 1 x 0 1 = D9H (data awal) = DFH (data akhir)

// P2.2-P2.0 diisi data dari 000 sampai 111 ( 8 baris)

P1=i; P2=0xD8; tunda(1,10); P2=0xD9; tunda(1,10); P2=0xDA; tunda(1,10); P2=0xDB; tunda(1,10); P2=0xDC; tunda(1,10); } //program utama void main() { while(1) { for (i=0;i<10;i++)

112

{ for (j=0;j<255;j++) {tulis(angka[i]);} } } } Program 12.2. Mengirimkan array data tertentu ke lampu dot matrik

12.3. Menggabungkan fungsi toggle keypad dengan lampu dot matrik Tujuan : Pada percobaan ini bisa menggabungkan fungsi keypad dengan lampu dot matrik

// toggle button #include <at89x51.h> void tunda(unsigned int p1, unsigned int p2) { unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++){ } } }

void tulis(int pilihan) { //alamat scanning


// aktifkan Y3 Matrix/LED= 1101 1111 = 0DF // P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 // 1 // 1 // 1 1 1 1 0 0 0 1 1 1 1 1 1 x 0 1 x 0 1 x 0 1 = D9H (data awal) = DFH (data akhir)

// P2.2-P2.0 diisi data dari 000 sampai 111 ( 8 baris)

if (pilihan==1) P1=0x55; else

113

P1=0xAA;

P2=0xD8; tunda(1,10); P2=0xD9; tunda(1,10); P2=0xDA; tunda(1,10); P2=0xDB; tunda(1,10); P2=0xDC; tunda(1,10); }

//program utama void main() { int toggle; toggle=0; while(1) { if ((P3 & 0x0FF) == 0x0FD) { toggle = !toggle; tunda(1,1); }

if (toggle==0) tulis(1); else tulis(2); }

} Program 12.3. Menggabungkan fungsi keypad dengan lampu dot matrik

114

12.4. Mengirimkan 1 karakter huruf ke lampu dot matrik Tujuan : Pada percobaan ini bisa mengirimkan 1 karakter huruf pada lampu dot Matrik

// huruf A #include <at89x51.h>

void tunda(unsigned int p1, unsigned int p2) { // delay unsigned int cnt1,cnt2; for (cnt1=0;cnt1<p1;cnt1++) { for (cnt2=0;cnt2<p2;cnt2++) { } } }

void tulis() {
//alamat scanning // aktifkan Y3 Matrix/LED= 1101 1111 = 0DF // P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 // 1 // 1 // 1 1 1 1 0 0 0 1 1 1 1 1 1 x 0 1 x 0 1 x 0 1 = D9H (data awal) = DFH (data akhir)

// P2.2-P2.0 diisi data dari 000 sampai 111 ( 8 baris)

P1=0x3F; P2=0xD8; tunda(1,10);

P1=0x48; P2=0xD9;

115

tunda(1,10);

P1=0x88; P2=0xDA; tunda(1,10);

P1=0x48; P2=0xDB; tunda(1,10);

P1=0x3F; P2=0xDC; tunda(1,10); }

//program utama void main() { int toggle; toggle=0; while(1) { tulis(); } } Program 12.4. Mengirimkan satu karakter pada lampu dot matrik Tugas 1. Buatlah tulisan berjalan IT PENS pada layar dot matrik 2. Buatlah program dimana arah gerakan berubah dari kiri kekanan dan sebaliknya berdasarkan inputan tombol

116

PROYEK AKHIR

ROBOT LINE TRACER

Tujuan

Setelah mengikuti praktikum ini, yang Anda peroleh adalah: Dapat membuat rangkaian robot line tracer Dapat membuat program robot line tracer

Dasar Teori

Robot line tracer adalah robot yang bekerja berdasarkan garis atau line yang harus dilewati, dan tidak boleh keluar dari jalur yang ada. Rangkaian dan program yang dibuat harus mendukung agar robot tetap bisa berjalan pada lintasan garis yang ada. Hal ini sangat menarik bagi kami untuk mencoba memberikan ringkasan penyelesaian dari kasus yang ada berupa workshop.

13.1. Rangkaian Infra Red Rangkaian Infra Red digunakan untuk pembacaan garis pada lapangan robot, data yang diberikan adalah data informasi posisi, apakah robot tersebut masih berada pada posisi yang benar atau tidak, sehingga robot bisa melakukan aksi koreksi terhadap kesalahan sehingga bisa kembali pada posisi jalur yang benar

(a) High Output IR LED

(b) 5mm 40 Degree IR LED

(c) IR Photo Module

Gambar 13.1. Beberapa Tipe Infra Red

117

Berikut adalah skema untuk rangkaian Infrared sebelah kiri:

Gambar 13.2. Rangkaian Infrared

Untuk rangkaian infrared sebelah kanan mempunyai skema yang sama dengan sebelah kiri, jadi digunakan 4 buah infrared untuk mendeteksi garis lintasan.

13.2. Rangkaian Motor DC Rangkaian Motor DC berguna untuk men-drive motor DC agar dapat bekerja sesuai dengan spesifikasi yang ada, karena Motor DC tidak akan bisa bekerja optimal apabila kebutuhan tegangan dan arusnya bisa terpenuhi. Driver untuk Bi-directional Motor DC ( Motor DC dua arah) digunakan pasangan transistor NPN dan PNP, untuk menentukan arah gerakan digunakan pembeda logika. Berikut adalah rancangan driver Bi-Directional Motor DC - H Bridge sebelah kiri :

118

Gambar 13.3. Rangkaian H-Bridge Motor DC

Sesuai dengan skema rangkaian diatas maka dapat kita buat pengaturan sebagai berikut :

Tabel 13.1. Arah gerakan motor DC No 1. 2. IN 1 0 1 IN 2 1 0 Arah gerak Kanan Kiri TR 1 ON OFF TR 2 OFF ON TR 3 OFF ON TR 4 ON OFF

Tipe Transistor yang digunakan adalah BC550 (NPN) dan BC557 (PNP), sedangakan untuk nilai resistansi yang digunakan adalah 470 ohm untuk semuanya. Untuk motor kanan kita gunakan disain perangkat keras dan masukan logika yang sama dengan motor kiri.

119

13.3. Rangkaian Mikrokontroler Mikrokontroler yang digunakan adalah bertipe Atmel 89S51/52, dimana pembacaan data Infrared melalui Port 2, pengaturan arah gerak motor DC melalui Port 1. Berikut adalah skema dari mikrokontroler sebagai penagatur utama :

Gambar 13.4. Rangkaian Mikrokontroler 89S51/52

120

13.4. Program Line Tracer Program yang kita buat adalah program yang berdasar pada skema yang dirancang sebagai berikut :

Gambar 13.5. Disain Line Tracer

Program dari rangkaian line tracer diatas :

#include <at89x51.h>

sbit P10 = 0x90; sbit P11 = 0x91; sbit P12 = 0x92; sbit P13 = 0x93;

// port 1 bit 0 = Kiri IN 1 // port 1 bit 1 = Kiri IN 2 // port 1 bit 2 = Kanan IN 1 // port 1 bit 3 = Kanan IN 2

121

sbit P20 = 0xA0; sbit P21 = 0xA1; sbit P22 = 0xA2; sbit P23 = 0xA3;

// port 2 bit 0 = kiri IR 1 // port 2 bit 1 = kiri IR 2 // port 2 bit 2 = kanan IR 1 // port 2 bit 3 = kanan IR 2

// posisi miring ke kiri 1 infra void majukiri() { P10 = 0; P11 = 1; P12 = 0; P13 = 0; } // posisi miring ke kanan 1 infra void majukanan() { P10 = 0; P11 = 0; P12 = 0; P13 = 1; } // posisi miring ke kanan 2 infra void mundurkiri() { P10 = 1; P11 = 0; P12 = 0; P13 = 0; } // posisi miring ke kiri 2 infra void mundurkanan() { P10 = 0; P11 = 0; P12 = 1; P13 = 0; }

122

// posisi tengah void majulurus() { P10 = 0; P11 = 1; P12 = 0; P13 = 1; }

void main() { while(1) { // posisi tengah if (P21==1)&&(P20==1)&&(P23==1)&&(P22==1) majulurus(); } // posisi miring ke kiri 1 infra if (P21==0)&&(P20==1)&&(P23==1)&&(P22==1) majukiri(); } // posisi miring ke kanan 1 infra if (P21==1)&&(P20==1)&&(P23==1)&&(P22==0) majukanan(); } // posisi miring ke kanan 2 infra if (P21==1)&&(P20==1)&&(P23==0)&&(P22==0) mundurkiri(); } // posisi miring ke kiri 2 infra if (P21==0)&&(P20==0)&&(P23==1)&&(P22==1) mundurkanan(); } } } Program 13.1. Robot Line Tracer { { { { {

123