Program Studi Fisika Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Lambung Mangkurat
MIKROKONTROLLER MCS-51 Salah satu tipe mikrokontroler arsitektur MCS-51 yang banyak digunakan saat ini adalah tipe Atmel 89S51. Yang membedakan mikrokontroler AT89S51 dengan C51(seri sebelumnya) adalah cara pengisian program (flash programming). Pada mikrokontroler AT89S51 terdapat fasilitas ISP (In System Programming). Artinya mikrokontroler ini mampu diprogram meskipun dalam kondiasi bekerja. Letak perbedaan pada hardware adalah adanya MOSI, MOSI, dan SCK, pin ini berguna saat flash programming. Adapun fungsi dari pin pin yang lain, fungsinya sama seperti pada seri sebelumnya. Dibawah ini disajikan fungsi pin untuk mikrokontroler AT89S51
Gambar 1. Arsitektur dan pin-pin (kaki) AT89S51
Struktur Memori Dalam pengertian MCS51, Random Access Memory dalam chip AT89x51 adalah memori-data, yaitu memori yang dipakai untuk menyimpan data, sedangkan Flash PEROM merupakan memori penampung program pengendali AT89x51, dikenal sebagai memori-program. Karena kedua memori itu memang dibedakan dengan tegas, maka kedua memori itu mempunyai penomoran yang terpisah. Memori-program dinomori sendiri, pada AT89S51 mulai dari nomor $0000 sampai $0FFF. Sedangkan memori-data yang hanya 256 byte dinomori dari nomor $00 sampai $FF. Seperti terlihat dalam denah memori-data Gambar 2, memori-data dibagi menjadi dua bagian, memori nomor $00 sampai $7F merupakan memori seperti RAM selayaknya meskipun beberapa bagian mempunyai kegunaan khusus, sedangkan memori nomor $80 sampai $FF dipakai sangat khusus yang dinamakan sebagai Special Function Register
Gambar 2. Denah Memori Data Memori-data nomor $00 sampai $7F bisa dipakai sebagai memori penyimpan data biasa, dibagi menjadi 3 bagian: • Memori nomor $00 sampai $18 selain sebagai memori-data biasa, bisa pula dipakai sebagai Register Serba Guna (General Purpose Register). • Memori nomor $20 sampai $2F selain sebagai memori-data biasa, bisa dipakai untuk menyimpan informasi dalam level bit. • Memori nomor $30 sampai $7F (sebanyak 80 byte) merupakan memori-data biasa, bisa dipakai untuk menyimpan data maupun dipakai sebagai Stack. Register Serba Guna Register Serba Guna (General Purpose Register) menempati memori-data nomor $00 sampai $18, memori sebanyak 32 byte ini dikelompokkan menjadi 4 Kelompok Register (Register Bank), 8 byte memori dari masing-masing Kelompok itu dikenali sebagai Register 0, Register 1 .. Register 7 (R0, R1, R2, R3, R4, R5, R6 dan R7). Dalam penulisan program memori-memori ini bisa langsung disebut sebagai R0, R1, R2, R3, R4, R5, R6 dan R7, tidak lagi dengan nomor memori. Dengan cara ini instruksi yang terbentuk bisa lebih sederhana dan bekerja lebih cepat. Pengertian ini bisa diperjelas dengan contoh 2 instruksi berikut :
MOV A,04H MOV A,R4 Instruksi pertama mempunyai makna isi memori-data nomor 4 di-copy-kan ke Akumulator A, sedangkan instruksi kedua artinya isi R4 di-copy-kan ke Akumulator A. Karena R4 menempati memori-data nomor 4, jadi kedua instruksi itu berakibat sama bagi Akumulator A. Tapi saat diterjemahkan ke kode mesin, intruksi pertama dirubah menjadi E5 04 (heksadesimal) dan instruksi kedua menjadi E6 (heksadesimal), jadi instruksi kedua lebih sederhana dari instruksi pertama. Selain itu, khusus untuk Register 0 dan Register 1 (R0 dan R1) masih punya mempunyai kemampuan lain, kedua register ini bisa dipakai sebagai register penampung alamat yang dipakai dalam penyebutan memori secara tidak langsung (indirect memori addressing), hal ini akan dibicarakan lebih lanjut di belakang. Empat kelompok Register Serba Guna itu tidak bisa dipakai secara bersamaan, saat setelah reset yang aktif dipakai adalah Kelompok Register 0 (Register Bank 0). Kalau yang diaktifkan adalah Kelompok Register 1, maka yang dianggap sebagai R0 bukan lagi memori-data nomor 0 melainkan memori-data nomor 8, demikian pula kalau yang diaktifkan Kelompok Register 3 maka memori-data nomor 18h yang menjadi R0. Kelompok Register yang aktif dipilih dengan cara mengatur bit RS0 dan RS1 yang ada di dalam Register PSW (Program Status Word). Memori level Bit Memori-data nomor $20 sampai $2F bisa dipakai menampung informasi dalam level bit. Setiap byte memori di daerah ini bisa dipakai menampung 8 bit informasi yang masing-masing dinomori tersendiri, dengan demikian dari 16 byte memori yang ada bisa dipakai untuk menyimpan 128 bit (16 x 8 bit) yang dinomori dengan bit nomor $00 sampai $7F. Informasi dalam level bit tersebut masing-masing bisa di-‘1’-kan, di - ‘0’-kan dengan instruksi. Pengertian di atas bisa dipikirkan seolah-olah MCS51 mempunyai jenis memori yang lain, tapi sesungguhnya kedua jenis memori itu tetap sama, hanya saja cara penyebutannya saja yang berlainan. Instruksi SETB $00 mengakibatkan memori-bit nomor 0 menjadi ‘1’, atau sama dengan membuat bit nomor 0 dari memori-data nomor $20 menjadi ‘1’, sedangkan bit-bit lainnya dalam memori nomor $20 tidak berubah nilai. Sedangkan instruksi CLR $7F mengakibatkan memori-bit nomor $7F menjadi ‘0’, satau sama dengan membuat bit nomor 7 dari memori-data nomor $2F menjadi ‘0’, sedangkan bit-bit lainnya dalam memori nomor $2F tidak berubah nilai. Pengertian ini dipertegas dengn intsruksi-instruksi berikut: MOV 21H,#0FH Sama dengan hasil kerja instruksi-instruksi berikut : SETB 08H SETB 09H SETB 0AH SETB 0BH CLR 0CH CLR 0DH CLR 0EH CLR 0FH
Instruksi MOV 21H,#0FH mempunyai makna mengisi memori-data nomor 21H dengan nilai 0FH (atau bilangan biner 00001111), berarti mengisi memori-bit nomor 0FH sampai 08H dengan bilangan biner 00001111 yang bisa dinyatakan dengan 8 baris instruksi berikutnya. Special Function Register (SFR) Register Khusus (SFR - Special Function Register) adalah satu daerah RAM dalam IC keluarga MCS51 yang dipakai untuk mengatur perilaku MCS51 dalam hal-hal khusus, misalnya tempat untuk berhubungan dengan port paralel P1 atau P3, dan sarana input/output lainnya, tapi tidak umum dipakai untuk menyimpan data seperti layaknya memori-data. Meskipun demikian, dalam hal penulisan program SFR diperlakukan persis sama dengan memori-data. Untuk mengisi memoridata nomor 60H dengan bilangan 0FH, instruksi yang dipergunakan adalah : MOV 60H, #0FH Sedangkan untuk memenyimpan 0FH ke Port 1 yang di SFR menempati memori-data nomor 90H, instruksi yang dipergunakan adalah : MOV 90H, #0FH Membandingkan kedua instruksi di atas bisa dimengerti dalam segi penulisan program SFR diperlakukan persis sama dengan memori-data. Meskipun demikian, dalam menyebut memori-data bisa dipakai dua cara, yakni penyebutan nomor memori secara langsung (direct memory addressing) dan penyebutan nomor memori secara tidak langsung (indirect memory addressing) lewat bantuan R0 dan R1. Tapi untuk SFR hanya bisa dipakai penyebutan nomor memori secara langsung (direct memory addressing) saja. Hal ini akan dibahas lebih lanjut di bagian lain. Register Dasar MCS51 Untuk keperluan penulisan program, setiap mikroprosesor/mikrokontroler selalu dilengkapi dengan Register Dasar. Ada beberapa macam register merupakan register baku yang bisa dijumpai disemua jenis mikroprosesor/ mikrokontroler, ada register yang spesifik pada masing-masing prosesor. Yang termasuk Register Baku antara lain Program Counter, Akumulator, Stack Pointer Register, Program Status Register. MCS51 mempunyai semua register baku ini. Sebagai register yang khas MCS51, antara lain adalah Register B, Data Pointer High Byte dan Data Pointer Low Byte. Semua ini digambarkan dalam Gambar 3. Di samping itu MCS51 masih mempunyai Register Serba Guna R0..R7 yang sudah disebut dibagian atas. Dalam mikroprosesor/mikrokontroler yang lain, register-register dasar biasanya ditempatkan ditempat tersendiri dalam inti prosesor, tapi dalam MCS51 register-register itu ditempatkan secara terpisah. • Program Counter ditempatkan ditempat tersendiri di dalam inti prosesor • Register Serba Guna R0..R7 ditempatkan di salah satu bagian dari memori-data • Register lainnya ditempatkan dalam Special Function Register (SFR). Program Counter Program Counter (PC) dalam AT89S51 merupakan register dengan kapasitas 16 bit. Di dalam PC dicatat nomor memori-program yang menyimpan instruksi berikutnya yang akan diambil (fetch) sebagai instruksi untuk dikerjakan (execute). Saat setelah reset PC bernilai 0000h, berarti MCS51 akan segera mengambil isi memori-program nomor 0 sebagai instruksi. Nilai PC otomatis bertambah 1 setelah prosesor mengambil instruksi 1 byte. Ada instruksi yang hanya 1 byte, ada instruksi yang sampai 4 byte, dengan demikian pertambahan nilai PC setelah menjalankan instruksi, tergantung pada jumlah byte instruksi bersangkutan.
Gambar 3. Register Dasar MCS-51 Akumulator Sesuai dengan namanya, Akumulator adalah sebuah register yang berfungsi untuk menampung (accumulate) hasil hasil pengolahan data dari banyak instruksi MCS51. Akumulator bisa menampung data 8 bit (1 byte) dan merupakan register yang paling banyak kegunaannya, lebih dari setengah instruksi-instruksi MCS51 melibatkan Akumulator. Instruksi-instruksi berikut memperjelas pengertian di atas : MOV A,#20H ADD A,#30H Instruksi pertama menyimpan nilai 20H ke Akumulator, instruksi kedua menambahkan bilangan 30H ke Akumulator, hasil penjumlahan sebesar 50H ditampung di Akumulator. Stack Pointer Register Salah satu bagian dari memori-data dipakai sebagai Stack, yaitu tempat yang dipakai untuk menyimpan sementara nilai PC sebelum prosesor menjalankan sub-rutin, nilai tersebut akan diambil kembali dari Stack dan dikembalikan ke PC saat prosesor selesai menjalankan sub-rutin. Stack Pointer Register adalah register yang berfungsi untuk mengatur kerja stack, dalam Stack Pointer Register disimpan nomor memori-data yang dipakai untuk operasi Stack berikutnya. Program Status Word Program Status Word (PSW) berfungsi mencatat kondisi prosesor setelah melaksanakan instruksi. Pembahasan tentang PSW secara rinci akan dilakukan dibagian lain. Register B Merupakan register dengan kapasitas 8 bit, merupakan register pembantu Akumulator saat menjalankan instruk perkalian dan pembagian. DPH dan DPL Data Pointer High Byte (DPH) dan Data Pointer Low Byte (DPL) masing-masing merupakan register dengan kapasitas 8 bit, tapi dalam pemakaiannya kedua register ini digabungkan menjadi satu register 16 bit yang dinamakan sebagai Data Pointer Register (DPTR). Sesuai dengan namanya, Register ini dipakai untuk mengalamati data dalam jangkauan yang luas.
Sistem Minimum MCS-51 & Parallel Downloader
Rangkaian Downloader – Kompatibel AEC ISP
Rangkaian Downloader – Kompatibel SPI Flash Programmer (Asim Khan)
Contoh Pemrograman dengan Led ; satu led kedip org 00h start: setb p2.0 acall tunda clr p2.0 acall tunda sjmp start tunda: mov r7,#00h ulang2:mov r6,#00h ulang1:mov r5,#00h ulang: inc r5 cjne r5,#30h,ulang inc r6 cjne r6,#30h,ulang1 inc r7 cjne r7,#30h,ulang2 ret end
Contoh Pemrograman dengan Tombol dan led ; Mengatur nyala led dengan tombol org 00h start: mov A,P2 mov P0,A sjmp start
ASEMBBLY OPERATION & SINTAX PROGRAM ARITHMETIC OPERATIONS Mnemonic ADD A,Rn ADD A, ADD A, ADD A,#data ADDC A,Rn ADDC A,direct ADDC A,@Ri ADDC A,#data SUBB A,Rn SUBB A,direct SUBB A,@Ri SUBB A,#data INC A INC Rn INC direct INC @Ri DEC A DEC Rn DEC direct DEC @Ri INC DPTR MUL AB DIV AB DA A
Description Bytes Cycles Add register to A 1 1 direct Add direct byte to A 2 1 @Ri Add indirect RAM to A 1 1 Add immediate data to A 2 1 Add register to A with Carry 1 1 Add direct byte to A with Carry 2 1 Add indirect RAM to A with Carry 1 1 Add immediate data to A with Carry 2 1 Subtract register from A with Borrow 1 1 Subtract direct byte from A with Borrow 2 1 Subtract indirect RAM from A with Borrow 1 1 Subtract immediate data from A with Borrow 2 1 Increment A 1 1 Increment register 1 1 Increment direct byte 2 1 Increment indirect RAM 1 1 Decrement A 1 1 Decrement register 1 1 Decrement direct byte 2 1 Decrement indirect RAM 1 1 Increment Data Pointer 1 2 Multiply A & B (A x B => BA) 1 4 Divide A by B (A/B => A + B) 1 4 Decimal Adjust A 1 1
LOGICAL OPERATIONS Mnemonic ANL A,Rn ANL A,direct ANL A,@Ri ANL A,#data ANL direct,A ANL direct,#data ORL A,Rn
Description AND register to A AND direct byte to A AND indirect RAM to A AND immediate data to A AND A to direct byte AND immediate data to direct byte OR register to A
Bytes Cycles 1 1 2 1 1 1 2 1 2 1 3 2 1 1
ORL A,direct ORL A,@Ri ORL A,#data ORL direct,A ORL direct,#data XRL A,Rn XRL A,direct XRL A,@Ri XRL A,#data XRL direct,A XRL direct,#data CLR A CPL A RL A RLC A RR A RRC A SWAP A
OR direct byte to A OR indirect RAM to A OR immediate data to A OR A to direct byte OR immediate data to direct byte Exclusive-OR register to A Exclusive-OR direct byte to A Exclusive-OR indirect RAM to A Exclusive-OR immediate data to A Exclusive-OR A to direct byte Exclusive-OR immediate data to direct byte Clear A Complement A Rotate A Left Rotate A Left through Carry Rotate A Right Rotate A Right through Carry Swap nibbles within A
2 1 2 2 3 1 2 1 2 2 3 1 1 1 1 1 1 1
1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1
DATA TRANSFER Mnemonic MOV A,Rn MOV A,direct MOV A,@Ri MOV A,#data MOV Rn,A MOV Rn,direct MOV Rn,#data MOV direct,A MOV direct,Rn MOV direct,direct MOV direct,@Ri MOV direct,#data MOV @Ri,A MOV @Ri,direct MOV @Ri,#data MOV DPTR,#data16 MOVC A,@A+DPTR MOVC A,@A+PC MOVX A,@Ri MOVX A,@DPTR MOVX @Ri,A MOVX @DPTR,A PUSH direct POP direct XCH A,Rn
Description Move register to A Move direct byte to A Move indirect RAM to A Move immediate data to A Move A to register Move direct byte to register Move immediate data to register Move A to direct byte Move register to direct byte Move direct byte to direct byte Move indirect RAM to direct byte Move immediate data to direct byte Move A to indirect RAM Move direct byte to indirect RAM Move immediate data to indirect RAM Load Data Pointer with 16-bit constant Move Code byte relative to DPTR to A Move Code byte relative to PC to A Move External RAM (8-bit addr) to A Move External RAM (16-bit addr) to A Move A to External RAM (8-bit addr) Move A to External RAM (16-bit addr) Push direct byte onto stack Pop direct byte from stack Exchange register with A
Bytes Cycles 1 1 2 1 1 1 2 1 1 1 2 2 2 1 2 1 2 2 3 2 2 2 3 2 1 1 2 2 2 1 2 1 1 2 1 2 1 2 1 2 1 2 1 2 2 2 2 2 1 1
XCH A,direct XCH A,@Ri XCHD A,@Ri
Exchange direct byte with A 2 1 Exchange indirect RAM with A 1 1 Exchange low-order Digit indirect RAM with A 1 1
BOOLEAN VARIABLE MANIPULATION Mnemonic CLR C CLR bit SETB C SETB bit CPL C CPL bit ANL C,bit ANL C,/bit ORL C,bit ORL C,/bit MOV C,bit MOV bit,C
Description Clear Carry flag Clear direct bit Set Carry flag Set direct bit Complement Carry flag Complement direct bit AND direct bit to Carry flag AND complement of direct bit to Carry flag OR direct bit to Carry flag OR complement of direct bit to Carry flag Move direct bit to Carry flag Move Carry flag to direct bit
Bytes Cycles 1 1 2 1 1 1 2 1 1 1 2 1 2 2 2 2 2 2 2 2 2 1 2 2
PROGRAM AND MACHINE CONTROL Mnemonic Description Bytes Cycles ACALL addr11 Absolute subroutine call 2 2 LCALL addr16 Long subroutine call 3 2 RET Return from subroutine 1 2 RETI Return from interrupt 1 2 AJMP addr11 Absolute Jump 2 2 LJMP addr16 Long Jump 3 2 SJMP rel Short Jump (relative addr) 2 2 JMP @A+DPTR Jump indirect relative to DPTR 1 2 JZ rel Jump if A is Zero 2 2 JNZ rel Jump if A is Not Zero 2 2 JC rel Jump if Carry flag is set 2 2 JNC rel Jump if No Carry flag 2 2 JB bit,rel Jump if direct Bit is set 3 2 JNB bit,rel Jump if direct Bit is Not set 3 2 JBC bit,rel Jump if direct Bit is set & Clear bit 3 2 CJNE A,direct,rel Compare direct to A & Jump if Not Equal 3 2 CJNE A,#data,rel Compare immediate to A & Jump if Not Equal 3 2 CJNE Rn,#data,rel Compare immed. to reg. & Jump if Not Equal 3 2 CJNE @Ri,#data,rel Compare immed. to ind. & Jump if Not Equal 3 2 DJNZ Rn,rel Decrement register & Jump if Not Zero 2 2 DJNZ direct,rel Decrement direct byte & Jump if Not Zero 3 2 NOP No operation 1 1 Notes on data addressing modes
Rn direct @Ri #data #data16 bit
Working register R0-R7 128 internal RAM locations, any I/O port, control or status register Indirect internal RAM location addressed by register R0 or R1 8-bit constant included in instruction 16-bit constant included in instruction 128 software flags, any I/O pin, control or status bit
Notes on program addressing modes addr16 Destination address may be anywhere in 64-kByte program address space addr11 Destination address will be within same 2-kByte page of program address space as first byte of the following instruction rel 8-bit offset relative to first byte of following instruction (+127, -128) All mnemonics copyrighted © Intel Corporation 1979 Information from Intel Application Note AP-69