Arsip

Posts Tagged ‘Bahasa C untuk mikrokontroller 89S51’

Tutorial Mikrokontroller Part 1 (latihan 3)

April 22, 2011 4 komentar

Mudah-mudahan pengunjung mau mencoba  tutorial yang saya tulis ini,sederhana dan mungkin sudah usang….

saya menggunakan compiler bahasa C- SDCC dan ASM51 untuk compiler Assembler…..Langsung ke TKP ….

tema latihan 3 adalah : Nyala Led Kanan Kiri (dengan Bahasa C dan assembler)

#include <at89x51.h>

void time (void)  //fungsi tunda waktu
{
unsigned int i;

for(i=0; i<0xffff;i++);

}

void main()
{
unsigned char a,rotate;

while(1)
{
a = 0x01;
P1=~a;     //inverst bit
time();   //panggil tunda waktu
for(rotate=1;rotate<8;rotate++)        //Right Rotate
{
a = a*2; //nilai a dikalikan 2 ayoo brapa……

/* penjelasannya :  0000 0001 = 1×2=2 , jadi 0000 0010 x 2 = 4(desimal) 0000 0100 (biner)….dst…hingga mentok …..
P1 = ~a;  //nilai a disalin ke P1
time();  //panggil tunda waktu
}

a = 0x80;
P1=~a;
time();
for(rotate=1;rotate<8;rotate++)        //Right Rotate
{
a = a/2;
P1 = ~a;
time();
}
}

}

Bila pengujung suka dengan Bahasa Asembler ini,…silahkan dicoba…yach jangan lupa header filenya…
; Lampu menyala pingpong kiri ke kanan, kanan ke kiri di port 1
;
;———————————————————————————
$mod51

Org        0h
;
MOV   A, #0FEh        ; simpan data 11111110B ke akumulator (P1.0 menyala
; duluan)
MULAI:
MOV   P1,A        ; kirim data ke Port 1
ACALL DELAY         ; tunda sebentar
RL    A            ; putar isi akumulator ke kiri 1 bit
CJNE  A,#7FH,MULAI    ; apakah A=01111111B ? Tidak, ulangi lagi!
MULAI1:                ; Ya, lanjutkan ke proses berikut…
MOV   P1,A        ; kirim data ke Port 1
ACALL DELAY        ; tunda sebentar
RR    A            ; putar isi akumulator ke kanan 1 bit
CJNE  A,#0FEh,MULAI1    ; apakah A=11111110B ? Tidak, ulangi lagi!
SJMP  MULAI        ; Ya, ulangi lagi dari paling awal…
;
;-subrutin DELAY——————————————————————
;
; subrutin ini hanya sekedar melakukan penundaan sesaat dengan cara
; mengulangi proses (pengurangan isi register) hingga dicapai suatu
; kondisi tertentu
;
;———————————————————————————
Delay:    Mov    R0,#0        ; Isi Register R0 dengan 0 (256x ulang)
Delay1: Mov    R1,#0        ; Isi Register R1 dengan 0 (256x ulang)
Djnz       R1,$
Djnz    R0,Delay1
Ret
End