Pemrograman MCS51 (AT89S51,52 dll) dengan Bahasa C

Software yang digunakan dalam ujicoba kali ini ialah MIKROC 8051 ver 2.2. pemrograman mikrokontroler AT89S51 dengan bahasa C memang lebih mudah jika dibandingkan dengan menggunakan Assembler. apalagi jika kita ingin membuat perangkat yang rumit akan sangat terasa perbedaannya.

Awal pembuatan program bisa di lihat pada video berikut :


Resolusi lebih tinggi klik disini



Berikut merupakan daftar uji coba tersebut:
1. Percobaan LED
Skema Uji Coba LED

Program LED 1 menyalakan Led dengan bilangan heksa
void main() {
P0=0x00;     // LED SEMUA ON
}


Program LED 2 menyalakan sebagian Led dengan bilangan heksa
void main() {
P0=0xF0;     // LED P0-P3 ON
}

Program LED 3 menyalakan 1 Led dengan bilangan biner
void main() {
P0=0b11111110;     // LED 1 ON
}

Program LED 4 menyalakan 2  Led dengan bilangan biner
void main() {
P0=0b01111110;     // LED 1 dan 8 ON
}

Program LED 5 menyalakan Led per bit
void main() {
P0_0_bit=0;     // LED 1  ON
P0_7_bit=0;     // LED 8 ON
}


Program LED 6 Blinking led dengan delay
void main() {
while(1){
P0=0b00000000;     //led ON
delay_ms(1000);    //tunda 1 detik
P0=0b11111111;     //led OFF
delay_ms(1000);    //tunda 1 detik
} 

}

2. Percobaan Switch
Skema Uji Coba Switch

Program Switch 1
void main() {
while(1){
if(P1_0_bit==0){P0=0x00;}  //jika tombol 1 ditekan LED ON
}
}

Program Switch 2 
void main() {
while(1){
if(P1_0_bit==0){P0=0x00;}  //jika tombol 1 ditekan LED ON
if(P1_1_bit==0){P0=0xff;}  //jika tombol 2 ditekan LED OFF
}
}

Program Switch 3
void main() {
while(1){
if(P1_0_bit==0){P0_0_bit=0;}  //jika tombol 1 ditekan LED 1 ON
if(P1_1_bit==0){P0_1_bit=0;}  //jika tombol 2 ditekan LED 2 ON
if(P1_2_bit==0){P0=0xff;}     //jika tombol 3 ditekan LED OFF
}
}

Program Switch 4
void main() {
while(1){
if(P1_0_bit==0){P0=0x00;}     //jika tombol 1 ditekan led on dilepas led off
else{P0=0xff;}
} 
}

3. Percobaan LCD
Skema Uji Coba LCD

Program LCD 1
// lcd pinout settings
sbit LCD_RS at P2_0_bit;
sbit LCD_EN at P2_1_bit;
sbit LCD_D7 at P2_7_bit;
sbit LCD_D6 at P2_6_bit;
sbit LCD_D5 at P2_5_bit;
sbit LCD_D4 at P2_4_bit;

void main() {
lcd_init();
Lcd_Out(1, 3, "tutorial-");             //tulis di baris ke 1 kolom 3
lcd_Out(2,1, "mikrokontroler");   //tulis di baris ke 2 kolom 1
}


Program LCD 2
// lcd pinout settings
sbit LCD_RS at P2_0_bit;
sbit LCD_EN at P2_1_bit;
sbit LCD_D7 at P2_7_bit;
sbit LCD_D6 at P2_6_bit;
sbit LCD_D5 at P2_5_bit;
sbit LCD_D4 at P2_4_bit;

void main() {
lcd_init();
Lcd_Out(1, 3, "Uji coba");               //tulis di baris ke 1 kolom 3
Lcd_Cmd(_LCD_CURSOR_OFF);    //matikan kursor
while(1)
{
Lcd_Cmd(_LCD_SHIFT_RIGHT);     //geser tulisan ke kanan
delay_ms(1000);                              //tunda 1 detik
}                                                          //ulangi 
}


Program LCD 3
// lcd pinout settings
sbit LCD_RS at P2_0_bit;
sbit LCD_EN at P2_1_bit;
sbit LCD_D7 at P2_7_bit;
sbit LCD_D6 at P2_6_bit;
sbit LCD_D5 at P2_5_bit;
sbit LCD_D4 at P2_4_bit;

void main() {
lcd_init();
Lcd_Out(1, 3, "Uji coba");               //tulis di baris ke 1 kolom 3
Lcd_Cmd(_LCD_CURSOR_OFF);    //matikan kursor 

}

Command LCD lainnya :


4. Percobaan I2C RTC (Jam Digital Dengan LCD)
Skema Uji Coba RTC

Program Jam Digital
char seconds, minutes, hours, date, month;  // Global date/time variables
unsigned int year;
unsigned int RTCModuleAddress, YearOffset; // RTC chip description variables


#define DS1307          // Uncomment this line if you use DS1307 RTC chip (mE RTC2 extra board)

// Software I2C connections
sbit Soft_I2C_Scl at P1_0_bit;
sbit Soft_I2C_Sda at P1_1_bit;
// End Software I2C connections

// LCD module connections
sbit LCD_RS at P2_0_bit;
sbit LCD_EN at P2_1_bit;

sbit LCD_D4 at P2_4_bit;
sbit LCD_D5 at P2_5_bit;
sbit LCD_D6 at P2_6_bit;
sbit LCD_D7 at P2_7_bit;
// End LCD module connections

//------------------ Performs project-wide init
void Init_Main() {



  #ifdef DS1307
    RTCModuleAddress   = 0xD0;
    YearOffset         = 2000;
  #endif


  Soft_I2C_Init();           // Initialize Soft I2C communication
  Lcd_Init();                // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);       // Clear LCD display
  Lcd_Cmd(_LCD_CURSOR_OFF);  // Turn cursor off

  LCD_Out(1,1,"Date:");      // Prepare and output static text on LCD
  Lcd_Chr(1,8,':');
  Lcd_Chr(1,11,':');
  LCD_Out(2,1,"Time:");
  Lcd_Chr(2,8,':');
  Lcd_Chr(2,11,':');
}


//--------------------- Reads time and date information from DS1307 RTC
void Read_Time_DS1307() {
  char byte_read;

  Soft_I2C_Start();                   // Issue start signal
  Soft_I2C_Write(RTCModuleAddress);   // RTC module address + write (R#/W = 0)
  Soft_I2C_Write(0);                  // Start from seconds byte
  Soft_I2C_Start();                   // Issue repeated start signal
  Soft_I2C_Write(RTCModuleAddress+1); // RTC module address + read  (R#/W = 1)

  byte_read = Soft_I2C_Read(1);                                // Read seconds byte
  seconds = ((byte_read & 0x70) >> 4)*10 + (byte_read & 0x0F); // Transform seconds

  byte_read = Soft_I2C_Read(1);                                // Read minutes byte
  minutes = ((byte_read & 0x70) >> 4)*10 + (byte_read & 0x0F); // Transform minutes

  byte_read = Soft_I2C_Read(1);                                // Read hours byte
  if (byte_read.B6) {                                          // 12h format
    hours = ((byte_read & 0x10) >> 4)*10 + (byte_read & 0x0F); // Transform hours
    if (byte_read.B5)                                          // PM flag
      hours = hours + 12;
  }
  else
    hours = ((byte_read & 0x30) >> 4)*10 + (byte_read & 0x0F); // Transform hours

  byte_read = Soft_I2C_Read(1);                                // Read weekday byte

  byte_read = Soft_I2C_Read(1);                                // Read date byte
  date = ((byte_read & 0x30) >> 4)*10 + (byte_read & 0x0F);    // Transform date

  byte_read = Soft_I2C_Read(1);                                // Read month byte
  month = ((byte_read & 0x10) >> 4)*10 + (byte_read & 0x0F);   // Transform month

  byte_read = Soft_I2C_Read(1);                                // Read year byte
  year = YearOffset + ((byte_read & 0xF0) >> 4)*10 + (byte_read & 0x0F); // Transform year

  Soft_I2C_Stop();                    // Issue stop signal
}

//--------------------- Reads time and date information from RTC
void Read_Time() {

  #ifdef DS1307
    Read_Time_DS1307();
  #endif
}

//-------------------- Output values to LCD
void Display_Time() {

  Lcd_Chr(1, 6, (date / 10)   + 48);       // Print tens digit of date variable
  Lcd_Chr(1, 7, (date % 10)   + 48);    // Print oness digit of date variable
  Lcd_Chr(1, 9, (month / 10)  + 48);
  Lcd_Chr(1,10, (month % 10)  + 48);
  Lcd_Chr(1,12, ((year / 1000) % 10) + 48);    // Print year
  Lcd_Chr(1,13, ((year / 100)  % 10) + 48);
  Lcd_Chr(1,14, ((year / 10)   % 10) + 48);
  Lcd_Chr(1,15, (year % 10)          + 48);

  Lcd_Chr(2, 6, (hours / 10)   + 48);
  Lcd_Chr(2, 7, (hours % 10)   + 48);
  Lcd_Chr(2, 9, (minutes / 10) + 48);
  Lcd_Chr(2,10, (minutes % 10) + 48);
  Lcd_Chr(2,12, (seconds / 10) + 48);
  Lcd_Chr(2,13, (seconds % 10) + 48);
}

//----------------- Main procedure
void main() {


  Init_Main();               // Perform initialization

  while (1) {                // Endless loop
    Read_Time();             // Read time from RTC
    Display_Time();          // Prepare and display on LCD

    Delay_ms(950);          // Wait 1 second
  }
}

5. Percobaan SOUND (mikrokontroler mengeluarkan nada)
Skema Uji Coba Sound

sbit Sound_Play_Pin at P2_0_bit;
/*
220.00 Hz A (La)
246.94 Hz B (Si)
261.63 Hz C (Do)
293.66 Hz D (Re)
329.63 Hz E (Mi)
349.23 Hz F (Fa)
392.00 Hz G (Sol)
*/

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

 Sound_Play(262, 250);  // Frequency = 262Hz, duration = 250ms DO
 Sound_Play(294, 250);  // Frequency = 294Hz, duration = 250ms RE
 Sound_Play(330, 250);  // Frequency = 330Hz, duration = 250ms MI
 Sound_Play(349, 250);  // Frequency = 349Hz, duration = 250ms FA
 Sound_Play(392, 250);  // Frequency = 392Hz, duration = 250ms SO
 Sound_Play(220, 250);  // Frequency = 220Hz, duration = 250ms LA
 Sound_Play(247, 250);  // Frequency = 247Hz, duration = 250ms SI
 }


}

semua file uji coba tersebut dapat di download disini


Percobaan 1 AT89C1 Menggunakan Top View Simulator

Bagian 1
Menggerakkan LED

Rangkaian mikrokontroler dengan output led yang akan di simulasikan:


Program sederhana yang akan saya ujicobakan adalah menggerakkan led dari kiri ke kanan dengan cara direct addressing ke port 0, karena output led pada rangkaian berada pada port 0, berikut program yang akan di uji cobakan:

$mod51
org    0h

start:
mov    p0,#11111110b
call    delay
mov    p0,#11111101b
call    delay
mov    p0,#11111011b
call    delay
mov    p0,#11101111b
call    delay
mov    p0,#11011111b
call    delay
mov    p0,#10111111b
call    delay
mov    p0,#01111111b
call    delay
sjmp    tombol2
sjmp    start
;------------------------------------
; sub rutin waktu tunda
;------------------------------------
delay:
      mov r3,#0255
delay1:
      mov   r4,#0255
     djnz    r4,$
    djnz    r3,delay1
    ret

end
 
Berikut saya coba tunjukkan langkah-langkahnya

 

Dasar Pemrograman AT89C2051 (Bagian 3)

Special Function Register (SFR) AT89Cx051

Random Access Memory (RAM) dalam AT89Cx051 hanya 256 byte, hanya setengahnya yang dipakai sebagai memori-data biasa, setengahnya lagi dipakai untuk register-register 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 dipakai untuk menyimpan data seperti layaknya memori-data. Meskipun demikian, dalam hal penulisan program SFR diperlakukan persis sama dengan memori-data.
Nomor memori-data yang disediakan untuk Special Function Register mulai dari $80 sampai dengan $FF, area sebanyak 128 byte ini tidak semuanya dipakai, hal ini digambarkan dalam Denah Special Function Register, Gambar 5. Masing-masing register dalam Special Function Register mempunyai nomor dan nama.
Dianjurkan agar nomor-nomor yang tidak dipakai jangan dipergunakan, karena bisa mengakibatkan terjadinya sesuatu yang tidak terduga.
Sebagian register dalam Special Function Register sudah dibicarakan sebagai Register Dasar, merupakan piranti dasar untuk penulisan program. Register-register dasar tersebut antara lain adalah Akumulator (ACC), Stack Pointer Register (SP), Program Status Register (PSW), Register B, Data Pointer High Byte (DPH) dan Data Pointer Low Byte (DPL). Di dalam area Special Function Register. Register-register ini diperlakukan sebagai memori dengan nomor yang sudah tertentu.
Akumulator menempati memori-data nomor $E0, Stack Pointer Register menempati memori-data nomor $81, Program Status Register ada di $D0, Register B di $F0, DPL di $82 dan DPH di $83.
Kemampuan MCS51 untuk menomori memori-data dalam level bit, dipakai juga dalam Special Function Register. Secara keseluruhan nomor bit yang disediakan dalam MCS51 sebanyak 256, nomor bit 0 sampai 127 sudah dipakai untuk  nomor bit memori-data nomor $20 sampai $2F, sisanya sebanyak 128 nomor dipakai di Special Function Register.
Special Function Register yang bisa dinomori dengan nomor bit, adalah yang mempunyai nomor memori dengan digit heksadesimal kedua adalah 0 atau 8, misalnya nomor $80, $88, $90, $98..$F0 dan $F8.
Akumulator merupakan Special Function Register dengan nomor $E0, sehingga semua bit dalam Akumulator bisa di-nomor-i satu per satu.  Dalam penulisan program bit 0 Akumulator bisa dituliskan sebagai A.0, bit 1 Akumulator ditulis sebagai A.1 dan seterusnya. Instuksi SETB A.0 mengakibatkan bit 0 dari Akumulator menjadi ‘1’ sedangkan bit-bit lainnya tidak terpengaruh. Instruksi CLR A.6 mengakibatkan bit 6 dari Akumulator menjadi ‘0’ tapi tidak memengaruhi bit-bit yang lain.

Pengelompokan SFR

Selain register yang berfungsi sebagai register dasar yang sudah dibicarakan diatas, register-register dalam SFR dipakai untuk mengatur Input/Output dari MCS51 yang dikelompokan menjadi :
·        Register Penampung Data Input/Output, misalnya data yang diisikan ke register P1 akan diteruskan (di-output-kan) ke Port 1 yang terdapat di kaki IC AT89Cx051.
·        Register Pengatur Input/Output dan Register Status Input/Output, misalnya register SCON dipakai untuk mengatur UART dan dipakai untuk memantau kondisi UART, register TCON dipakai untuk mengatur kerja Timer.

Gambar 5
Denah Special Function Register

Uraian Singkat SFR

Berikut ini dibahas secara singkat fungsi dan sifat masing-masing register dalam Special Function Register, pembahasan secara rinci akan dilakukan dibagian lain.
P1 (Port 1, nomor $90, bisa dinomori dengan nomor bit): merupakan sarana input/output port 1, masing-masing bit dalam register ini setara dengan salah satu kaki IC AT89Cx051. Misalnya bit 3 dari register P1 terhubung ke kaki P1.3 (kaki nomor 15 AT89Cx051), instruksi SETB P1.3 mengakibatkan kaki nomor 15 tersebut menjadi ‘1’ dan instruksi CLR P1.3 akan membuatnya menjadi ‘0’.
P3 (Port 3, nomor $B0, bisa dinomori dengan nomor bit): merupakan sarana input/output port 3, masing-masing bit dalam register ini setara dengan salah satu kaki IC AT89Cx051. Misalnya bit 5 dari register P3 terhubung ke kaki P3.5 (kaki nomor 9 AT89Cx051), instruksi SETB P3.5 mengakibatkan kaki nomor 9 tersebut menjadi ‘1’ dan instruksi CLR P3.5 akan membuatnya menjadi ‘0’.
SBUF (Serial Buffer, nomor $99): Register Serial Buffer (SBUF) dipakai untuk mengirim data dan menerima data dengan UART yang terdapat dalam IC AT89Cx051. Angka yang disimpan ke SBUF akan dikirim keluar secara seri lewat kaki TXD (kaki nomor 3 IC AT89Cx051). Sebaliknya data seri yang diterima di kaki RXD (kaki nomor 2 IC AT89Cx051) bisa diambil di register SBUF. Jadi SBUF akan berfungsi sebagai port output pada saat register ini diisi data, dan SBUF akan menjadi port input kalau isinya diambil.
SCON (Serial Control, nomor $98, bisa dinomori dengan nomor bit): register SCON dipakai untuk mengatur perilaku UART di dalam IC AT89Cx051, hal-hal yang diatur meliputi penentuan kecepatan pengiriman data seri (baud rate); mengakitpkan fasilitas penerimaan data seri (fasilitas pengiriman data seri tidak perlu di atur), disamping itu register ini dipakai pula untuk memantau proses pengiriman data seri dan proses penerimaan data seri.
TL0/TH0 (Timer 0 Low/High, nomor $8A/$8C): Kedua register ini bersama membentuk Timer 0, yang merupakan pencacah naik (count up counter). Perilaku kedua register ini diatur oleh register TMOD dan register TCON. Hal-hal yang bisa diatur antara lain adalah sumber clock untuk pencacah, nilai awal pencacah, bilamana proses pencacahan mulai atau berhenti,  dan lain sebagainya.
 TL1/TH1 (Timer 1 Low/High, nomor $8B/$8D): Kedua register ini bersama membentuk Timer 1, yang merupakan pencacah naik (count up counter). Perilaku kedua register ini diatur oleh register TMOD dan register TCON. Hal-hal yang bisa diatur antara lain adalah sumber clock untuk pencacah, nilai awal pencacah, bilamana proses pencacahan mulai atau berhenti,  dan lain sebagainya.
TMOD (Timer Mode, nomor $89): register TMOD dipakai untuk mengatur mode kerja Timer 0 dan Timer 1, lewat register ini masing-masing timer bisa diatur menjadi timer 16-bit, timer 13-bit, timer 8-bit yang bisa isi ulang secara otomatis,  atau 2 buah timer 8 bit yang terpisah. Di samping itu bisa diatur agar proses proses pencacahan timer bisa dikendalikan lewat sinyal dari luar IC AT89Cx051, atau timer dipakai untuk mencacah sinyal-sinyal dari luar IC.
TCON (Timer Control, nomor $88, bisa dinomori dengan nomor bit): register TCON dipakai untuk memulai atau menghentikan proses pencacahan timer dan dipakai untuk memantau apakah terjadi limpahan dalam proses pencacahan. Disamping itu masih tersisa 4 bit dalam register TCON yang tidak dipakai untuk mengatur Timer, melainkan dipakai untuk mengatur sinyal interupsi yang diterima di INT0 (kaki nomor 6) atau INT1 (kaki nomor 7), dan dipakai untuk memantau apakah ada permintaan interupsi pada kedua kaki itu.
IE (Interrupt Enable, nomor $A8, bisa dinomori dengan nomor bit): register ini dipakai untuk mengaktipkan atau me-non-aktipkan sarana interupsi,  bit 0 sampai bit 6 dari register IE (IE.0..IE.6) dipakai untuk mengatur masing-masing sumber interupsi (sesungguhnya IE.6 tidak dipakai) sedangkan IE.7 dipakai untuk mengatur sistem interupsi secara keseluruhan, jika IE.7 =’0’ akan sistem interupsi menjadi non-aktip tidak mempedulikan keadaan IE.0.. IE.6.
IP (Interrupt Priority, nomor $B8, bisa dinomori dengan nomor bit): register ini dipakai untuk mengatur perioritas dari masing-masing sumber interupsi. Masing-masing sumber interupsi bisa diberi perioritas tinggi dengan memberi nilai ‘1’ pada bit bersangkutan dalam register ini. Sumber interupsi yang perioritasnya tinggi bisa menginterupsi proses interupsi dari sumber interupsi yang perioritasnya lebih rendah.
PCON (Power Control, nomor $87): Register PCON dipakai untuk mengatur pemakaian daya IC AT89Cx051, dengan cara ‘menidurkan’ IC tersebut sehingga memerlukan arus kerja yang sangat kecil. Satu satu bit dalam register ini dipakai untuk menggandakan kecepatan pengiriman data seri (baud rate) dari UART di dalam AT89Cx051.

Variasi dari SFR

Seperti sering disebut, MCS51 merupakan satu keluarga IC mikrokontroler yang terdiri dari ratusan macam IC, ratusan macam IC tersebut umumnya mempunyai fasilitas input/output yang berlainan. Keragaman ini ditampung dalam Special Function Register.
Register baku dalam keluarga MCS51, ada yang tidak dimiliki oleh keluarga AT89Cx051, register-register tersebut antara lain adalah :
P0 (Port 0, nomor  $80, bisa dinomori dengan nomor bit): merupakan sarana input/output port 0, masing-masing bit dalam register ini setara dengan salah satu kaki IC AT89C51. Sifat Port 0 mirip sekali dengan sifat Port 1 dan Port 3 milik AT89Cx051.
P2 (Port 2, nomor $A0, bisa dinomori dengan nomor bit): merupakan sarana input/output port 2, masing-masing bit dalam register ini setara dengan salah satu kaki IC AT89C51. Sifat Port 2 mirip sekali dengan sifat Port 1 dan Port 3 milik AT89Cx051
Kaki IC AT89Cx051 hanya 20, hanya setengah dari jumlah kaki AT89C51, berkurangnya kaki ini mengakibatkan AT89Cx051 tidak punya Port 0 dan Port 2 dan dengan demikian juga tidak punya register P0 dan register P2.
Di samping dipakai sebagai port input/output, Port 0 dan Port 2 bisa pula dipakai untuk saluran-data (data bus) dan saluran-alamat (address bus) yang diperlukan AT89C51 untuk bisa menambah memori diluar chip.

Dasar Pemrograman AT89C2051 (Bagian 2)

RAM dan Register dalam AT89Cx051

Bagi mereka yang sudah terbiasa memakai komputer, kapasitas Random Access Memory (RAM) yang dimiliki AT89Cx051 ‘mengerikan’ karena sangat sedikit, hanya 256 byte! Itupun tidak semuanya bisa dipakai sebagai memori penyimpan biasa, lebih dari setengahnya merupakan memori dengan keperluan khusus yang biasa dikenal sebagai register. Meskipun demikian bagi mikrokontroler kapasitas itu sudah mencukupi.
Dalam pengertian MCS51, Random Access Memory dalam chip AT89Cx051 adalah memori-data, yaitu memori yang dipakai untuk menyimpan data, sedangkan Flash PEROM merupakan memori penampung program pengendali AT89Cx051, 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 AT89C2051 mulai dari nomor $0000 sampai $07FF. Sedangkan memori-data yang hanya 256 byte dinomori dari nomor $00 sampai $FF.
Gambar 3
Denah Memori-data
Seperti terlihat dalam denah memori-data Gambar 3, 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 (akan dibahas tersendiri dibagian lain).
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,$04
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 aktip dipakai adalah Kelompok Register 0 (Register Bank 0).
Kalau yang diaktipkan adalah Kelompok Register 1, maka yang dianggap sebagai R0 bukan lagi memori-data nomor 0 melainkan memori-data nomor 8, demikian pula kalau yang diaktipkan Kelompok Register 3 maka memori-data nomor 18h yang menjadi R0.
Kelompok Register yang aktip dipilih dengan cara mengatur bit RS0 dan RS1 yang ada di dalam Register PSW (Program Status Word), hal ini akan dibicarakan lebih lanjut di bagian lain.

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 $21,#$0F
Sama dengan hasil kerja instruksi-instruksi berikut :
SETB $08
SETB $09
SETB $0A
SETB $0B
CLR  $0C
CLR  $0D
CLR  $0E
CLR  $0F
Instruksi MOV $21,#$0F mempunyai makna mengisi memori-data nomor $21 dengan nilai $0F (atau bilangan biner 00001111), berarti mengisi memori-bit nomor $0F sampai $08 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 memori-data nomor $60 dengan bilangan $0F, instruksi yang dipergunakan adalah :
MOV $60,#$0F
Sedangkan untuk memenyimpan $0F ke Port 1 yang di SFR menempati memori-data nomor $90, instruksi yang dipergunakan adalah :
MOV $90,#$0F
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 4.
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 ter­sendiri 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).

Gambar 4
Susunan Register Dasar MCS51

Kegunaan dan pemakaian register-register dasar tersebut antara lain sebagai berikut:

Program Counter

Program Counter (PC) dalam AT89C2051 merupakan register dengan kapasitas 11 bit (dalam AT89C51 atau keluarga MCS51 lainnya kapasitas PC adalah 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.

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,#$20
ADD A,#$30
Instruksi pertama menyimpan nilai $20 ke Akumulator, instruksi kedua menambahkan bilangan $30 ke Akumulator, hasil penjumlahan sebesar $50 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.