MODUL 1
Pengenalan C untuk 8051 (Compile dan Download)
Bahasa pemrograman C adalah sebuah bahasa 'mid-level', namun memiliki fitur
'high-level' (seperti support pada fungsi dan modul) dan juga memiliki fitur
'low-level' (seperti mengakses hardware melalui pointer). Dengan menggunakan
bahasa C, kita dapat dengan mudah untuk pindah ke jenis mikrokontroler yang
lain, lebih mudah dan cepat dalam menulis kode program, dan lebih mudah
dimengerti, dan lebih mudah dalam melakukan debugging.
1. Tujuan
●
Peserta mengetahui pembuatan program dengan menggunakan bahasa C
●
Peserta mengetahui bagaimana proses kompilasi dan download program
pada 8051
2. Dasar Teori
Keil uVision2
Untuk menggunakan bahasa C pada mikrokontroler diperlukan compiler. Pada
percobaan kali ini digunakan Keil uVision2 sebagai compiler untuk mikrokontroler
8051.
Memulai membuat project:
●
Atur pilihan device sesuai dengan device yang digunakan. Pada percobaan
kali ini dipilih database Atmel -> 89S8252 untuk keluarga 8051.
Membuat file source code yang baru:
●
Pilih opsi File -> New...
●
Tulis source code C pada halaman baru tersebut dan simpan dengan
ekstensi .c
●
Klik kanan pada Source Group dan pilih opsi Add Files to Group
'Source Group 1' kemudian tambahkan file .c yang kita buat tadi ke
Source Group tersebut.
Melakukan kompilasi:
●
Tekan tombol F7 untuk melakukan proses build.
Contoh tampilan hasil proses Build:
Agar program dapat di-download ke dalam mikrokontroler, kita memerlukan file
berbentuk file dari program yang telah kita buat. Untuk menghasilkan
HEX-file ini, dilakukan dengan cara:
Dengan mengaktifkan opsi tersebut, maka ketika proses build program akan
dihasilkan HEX-file dari program tersebut.
SPI – Flash Programmer 3.7
Salah satu alternatif untuk mendownload HEX-file yang telah dibuat tadi adalah
secara serial. Pada percobaan kali ini digunakan aplikasi SPI – Flash Programmer
3.7 buatan Asim Khan.
Proses download program:
●
Pilih opsi Open File kemudian pilih HEX-file yang kita buat tadi.
●
Pilih jenis mikrokontroler yang digunakan. Pada praktikum kali ini
digunakan jenis AT89S52.
●
Kemudian pilih opsi Program.
●
Jika program yang di-download ingin dibuat agar tidak bisa dibaca orang
lain, maka digunakan opsi Lock Bit.
3. Petunjuk Praktikum
Percobaan 1: Port I/O
//#include <stdio.h>
#include "AT898252.H" // Fungsi main
void main (void) {
P0 = 0x55; // set port 0 menjadi 0x55
while (1) // superloop {
// tidak ada yang dilakukan }
}
Compile dan download program di atas ke board 8051 yang telah dibuat!
Perhatikan apa yang terjadi! Analisis!
Percobaan 2: Interupsi Eksternal
#include "AT898252.H"// Interrupt eksternal 0, dipanggil saat ada interupsi EXT0
void isrExt0(void) interrupt 0 {
P0 = 0x55; // set P0 ke 0x55
return; }
// Interrupt eksternal 1, dipanggil saat ada interupsi EXT1
void isrExt1(void) interrupt 2 {
P0 = 0xAA; // set P0 ke 0xAA
return; }
// Fungsi main
void main (void) {
EX0 = 1; // enable interrupt EXT0 EX1 = 1; // enable interrupt EXT1 EA = 1; // enable interrupts P0 = 0xFF; // set P0 ke 0xFF
while (1) // superloop
{
// tidak ada yang dilakukan }
}
Compile dan download program di atas ke board 8051 yang telah dibuat!
Percobaan 3: RS232 (Komunikasi Serial)
#include <stdio.h>#include "AT898252.H"
// Interrupt eksternal 0, dipanggil saat ada interupsi EXT0
void isrExt0(void) interrupt 0 {
printf("halo");
return; }
// Interrupt eksternal 1, dipanggil saat ada interupsi EXT1
void isrExt1(void) interrupt 2 {
printf("dunia");
return; }
// Inisialisasi komunikasi serial
void initSerialComm(void) {
SCON = 0x40; // Setup serial port control register // Mode 1: 8-bit uart var. baud rate // REN: enable receiver disable
// use 0x50 to enable receiver PCON &= 0x7F; // Clear SMOD bit in power ctrl reg // This bit doubles the baud rate TMOD &= 0xCF; // Setup timer/counter mode register // Clear M1 and M0 for timer 1
TMOD |= 0x20; // Set M1 for 8-bit autoreload timer TH1 = 0xFD; // Set autoreload value for timer 1 // 9600 baud with 11.0592 MHz xtal TR1 = 1; // Start timer 1
TI = 1; // Set TI to indicate ready to xmit }
// Fungsi main
void main (void) {
initSerialComm(); // inisialisasi Komunikasi Serial EX0 = 1; // enable interrupt EXT0
EX1 = 1; // enable interrupt EXT1 EA = 1; // enable interrupts
while (1) // superloop
{
// tidak ada yang dilakukan }
Compile dan download program di atas ke board 8051 yang telah dibuat!
Perhatikan apa yang terjadi! Analisis!
Percobaan 4: Implementasi 7-Segment
#include "AT898252.H"// variabel untuk menyimpan data waktu sekarang, waktu on, dan waktu off
unsigned char cWaktuSekarang[4] = {1,2,3,4}; // 7 segment decoder (active low)
// berikut merupakan gambaran mengenai decoder BCD to 7 segment:
// ===================================================== // | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | o | n | f | // ===================================================== // a a => P0_0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | // ---- b => P0_1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | // f | g | b c => P0_2 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | // ---- d => P0_3 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | // e | | c e => P0_4 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | // ---- f => P0_5 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | // d g => P0_6 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | // //
unsigned char BCDTO7SEGMENTS[] = {0xC0, // 1100 0000b // 0 0xF9, // 1111 1001b // 1 0xA4, // 1010 0100b // 2 0xB0, // 1011 0000b // 3 0x99, // 1001 1001b // 4 0x92, // 1001 0010b // 5 0x82, // 1000 0010b // 6 0xF8, // 1111 1000b // 7 0x80, // 1000 0000b // 8 0x90, // 1001 0000b // 9 0xA3, // 1010 0011b // o 0xAB, // 1010 1011b // n 0x8E}; // 1000 1110b // f ////////////////////////////////////////////////////////////////////////////// // Unit Refresh Display - mux 7 segment - mulai
//////////////////////////////////////////////////////////////////////////////
void refresh7Segment(char cDigitPos) {
P2 = 0xFF; // clear data pada port 0 untuk mematikan semua lampu
P0 = BCDTO7SEGMENTS[cWaktuSekarang[cDigitPos]];//keluarkan data 7 segment di P0 P2 = P2 ^ (1 << cDigitPos); // nyalakan sebuah 7 segment
// P2 = 11111110 saat menyalakan 7 segment pertama // P2 = 11111101 saat menyalakan 7 segment kedua // P2 = 11111011 saat menyalakan 7 segment ketiga // P2 = 11110111 saat menyalakan 7 segment keempat return;
////////////////////////////////////////////////////////////////////// // Unit Refresh Display - mux 7 segment - selesai
////////////////////////////////////////////////////////////////////// // Interrupt Timer2 setiap 2,5 ms
void isrTimer2(void) interrupt 5 // Dipanggil setiap 2,5 ms {
static unsigned int cCount = 0; TF2=0; //clear interrupt
// tambah satu untuk nilai cCount cCount++;
// refresh 7 Segment
refresh7Segment(cCount & 0x3);//cCount & 0x3 = cCount%4.U/ mendptkan nilai 0-3. return;
}
// Inisialisasi Timer2
// asumsi clock 12 MHz => 12 MHz/12 = 1.000.000 hitungan setiap detiknya // dalam hal ini, diinginkan periode Timer 2 sebesar 2,5 ms
// jadi jumlah hitungan yang harus di-count adalah 2,5/1000*1000000 = 2500 hitungan
void initTimer2(void) {
T2MOD=0; // Timer 2 : 16 bit autoreload T2CON=0;
// agar timer2 dipanggil setiap 5 ms, counter sebanyak 2500 kali // 0x09C4=2500
RCAP2H=0xF6; // 65536-2500=63036d=F63Ch
RCAP2L=0x3C; // masukkan nilai reload di sini TL2=RCAP2L;
TH2=RCAP2H;
PT2 = 1; // Set Timer2 menjadi prioritas tertinggi ET2=1; // enable interrupt
TR2=1; // start timer2 return;
}
// Fungsi main
void main (void) {
initTimer2(); // inisialisasi Timer2 EA = 1; // enable interrupts while (1) // superloop
{
// tidak ada yang dilakukan }