Professional Documents
Culture Documents
Timer dan Counter merupakan sarana input yang kurang dapat perhatian
pemakai mikrokontroler, dengan sarana input ini mikrokontroler dengan mudah bisa
dipakai untuk mengukur lebar pulsa, membangkitkan pulsa dengan lebar yang pasti,
dipakai dalam pengendalian tegangan secara PWM (Pulse Width Modulation) dan
Pada dasarnya sarana input yang satu ini merupakan seperangkat pencacah biner
diumpankan sudah melebihi kapasitas pencacah, maka pada bagian akhir untaian
pencacah akan timbul sinyal limpahan, sinyal ini merupakan suatu hal yang penting
sekali dalam pemakaian pencacah. Terjadinya limpahan pencacah ini dicatat dalam
Di samping itu, sinyal denyut yang diumpankan ke pencacah harus pula bisa
dikendalikan dengan mudah. Hal-hal yang dibicarakan di atas diringkas dalam Gambar
1. MCS-51 mempunyai dua buah register timer/ counter 16 bit, yaitu Timer 0 dan Timer
1. Keduanya dapat dikonfigurasikan untuk beroperasi sebagai timer atau counter, seperti
yang pertama yalah sinyal denyut dengan frekuensi tetap yang sudah diketahui besarnya
dan yang kedua adalah sinyal denyut dengan frekuensi tidak tetap. Jika sebuah pencacah
bekerja dengan frekuensi tetap yang sudah diketahui besarnya, dikatakan pencacah
tersebut bekerja sebagai timer, karena kedudukan pencacah tersebut setara dengan
Jika sebuah pencacah bekerja dengan frekuensi yang tidak tetap, dikatakan
menyatakan banyaknya pulsa yang sudah diterima pencacah. Untaian pencacah biner
yang dipakai, bisa merupakan pencacah biner menaik (count up binary counter) atau
1. Fasilitas Timer/Counter
Timer 0 dan Timer 1. Sedangkan untuk jenis yang lebih besar, misalnya AT89C52,
Timer 2.
181
tersebut dikenal sebagai SFR (Special Function Register) yang berkedudukan sebagai
(Timer 0 Low Byte, memori-data internal nomor $6A) dan register TH0 (Timer 0 High
Byte, memori-data internal nomor $6C).Pencacah biner untuk Timer 1 dibentuk dengan
register TL1 (Timer 1 Low Byte, memori-data internal nomor $6B) dan register TH1
menaik (count up binary counter) yang mencacah dari $0000 sampai $FFFF, saat
kedudukan pencacah berubah dari $FFFF kembali ke $0000 akan timbul sinyal
dipakai bersama oleh Timer 0 dan Timer 1. Register tambahan tersebut adalah register
TCON (Timer Control Register, memori-data internal nomor $88, bisa dialamat secara
bit) dan register TMOD (Timer Mode Register, memori-data internal nomor $89).
Pencacah biner Timer 0 dan 1 TL0, TH0, TL1 dan TH1 merupakan SFR
(Special Function Register) yang dipakai untuk membentuk pencacah biner perangkat
Timer 0 dan Timer 1. Kapasitas keempat register tersebut masing-masing 8 bit, bisa
Pada Mode 0, Mode 1 dan Mode 2 Timer 0 dan Timer 1 masing-masing bekerja
sendiri, artinya bisa dibuat Timer 0 bekerja pada Mode 1 dan Timer 1 bekerja pada
Mode 2, atau kombinasi mode lainnya sesuai dengan keperluan. Pada Mode 3 TL0,
TH0, TL1 dan TH1 dipakai bersama-sama untuk menyusun sistem timer yang tidak bisa
di-kombinasi lain.
182
register pembantu untuk mengatur kerja Timer 0 dan Timer 1, kedua register ini dipakai
Register TMOD dibagi menjadi 2 bagian secara simitris, bit 0 sampai 3 register TMOD
(TMOD bit 0 .. TMOD bit 3) dipakai untuk mengatur Timer 0, bit 4 sampai 7 register
TMODE (TMOD bit 4 .. TMOD bit 7) dipakai untuk mengatur Timer 1, pemakaiannya
sebagai berikut :
1. Bit M0/M1 dipakai untuk menentukan Mode Timer seperti yang terlihat dalam
Tabel di Gambar7.6.
2. Bit C/T* dipakai untuk mengatur sumber sinyal denyut yang diumpankan ke
pencacah biner. Jika C/T*=0 sinyal denyut diperoleh dari osilator kristal yang
frekuensinya sudah dibagi 12, sedangkan jika C/T*=1 maka sinyal denyut
diperoleh dari kaki T0 (untuk Timer 0) atau kaki T1 (untuk Timer 1).
3. Bit GATE merupakan bit pengatur saluran sinyal denyut. Bila bit GATE=0
saluran sinyal denyut hanya diatur oleh bit TRx (maksudnya adalah TR0 atau
TR1 pada register TCON). Bila bit GATE=1 kaki INT0 (untuk Timer 0) atau
kaki INT1 (untuk Timer 1) dipakai juga untuk mengatur saluran sinyal denyut
Register TCON dibagi menjadi 2 bagian, 4 bit pertama (bit 0 .. bit 3, bagian
yang diarsir dalam Gambar 3) dipakai untuk keperluan mengatur kaki INT0 dan INT1,
1. Bit TFx (maksudnya adalah TF0 atau TF1) merupakan bit penampung limpahan
(lihat Gambar 2), TFx akan menjadi ‘1’ setiap kali pencacah biner yang
kembali menjadi $0000). Bit TFx di-nol-kan dengan istruksi CLR TF0 atau CLR
184
TF1. Jika sarana interupsi dari Timer 0/Timer 1 dipakai, TRx di-nol-kan saat
2. Bit TRx (TR0 atau TR1) merupakan bit pengatur saluran sinyal denyut, bila bit
berhenti mencacah. Bila bit GATE pada register TMOD =1, maka saluran sinyal
denyut ini diatur bersama oleh TRx dan sinyal pada kaki INT0/INT1.
Susunan TL0, TH0, TL1 dan TH1 pada masing-masing mode adalah sebagai berikut:
Pencacah biner dibentuk dengan TLx (maksudnya bisa TL0 atau TL1) sebagai
pencacah biner 5 bit (meskipun kapasitas sesungguhnya 8 bit), limpahan dari pencacah
biner 5 bit ini dihubungkan ke THx (maksudnya bisa TH0 atau TH1) membentuk
sebuah untaian pencacah biner 13 bit, limpahan dari pencacah 13 bit ini ditampung di
flip-flop TFx (maksudnya bisa TF0 atau TF1) yang berada di dalam register TCON.
Mode ini meneruskan sarana Timer yang ada pada mikrokontroler MCS48
(mikrokontroler pendahulu MCS51), dengan maksud rancangan alat yang dibuat dengan
MCS48 bisa dengan mudah diadaptasikan ke MCS51. Mode ini tidak banyak dipakai.
o Jika sisa ≠ 0:
o Jika sisa = 0:
Program berikut ini akan dibuat program timer 0 mode 0 melakukan cacahan 100. Agar
timer pada mode 0 kita harus menginisialisasikan timer terlebih dahulu. Didalam
inisialisasi kita menentukan TMOD, TH0, dan TL0. Uuntuk menentukan TMOD, TH0,
100/32 = 3 dan 4
TL0 = 32- 4 = 28
TMOD = 0x00
GATE C / T M1 M0 GATE C /T M1 M0
0 0 0 0 0 0 0 0
TL0 = 28;
TR0 = 1; // timer 0 dijalankan
}
void main()
{
Init_timer0();
while(!TF0) //tunggu sampai hitungan selesai
{;}
TF0=0; //flag dinolkan kembali
TR0=0; //timer dihentikan
P1=0xaa;
}
Program berikut ini akan dibuat program timer 0 mode 0 sebagai counter melakukan
cacahan 100. Agar timer pada mode 0 kita harus menginisialisasikan timer terlebih
dahulu. Didalam inisialisasi kita menentukan TMOD, TH0, dan TL0. Uuntuk
32/32 = 1
TL0 = 0
TMOD = 0x44
GATE C / T M1 M0 GATE C /T M1 M0
0 1 0 0 0 1 0 0
//Program 8.2
#include <at89x51.h>
void Init_counter0( )
{
187
Mode ini sama dengan Mode 0, hanya saja register TLx dipakai sepenuhnya
sebagai pencacah biner 8 bit, sehingga kapasitas pencacah biner yang tersbentuk adalah
16 bit. Seiring dengan sinyal denyut, kedudukan pencacah biner 16 bit ini akan bergerak
dari $0000 (biner 0000 0000 0000 0000), $0001, $0002 … sampai $FFFF (biner 1111
o Jika sisa ≠ 0:
188
o Jika sisa = 0:
Program berikut ini akan dibuat program timer 1 mode 1 melakukan cacahan 100. Agar
timer pada mode 1 kita harus menginisialisasikan timer terlebih dahulu. Didalam
inisialisasi kita menentukan TMOD, TH0, dan TL0. Uuntuk menentukan TMOD, TH0,
TMOD = 0x11
GATE C / T M1 M0 GATE C /T M1 M0
0 0 0 1 0 0 0 1
Init_timer1();
while(!TF1) //tunggu sampai hitungan selesai
{;}
TF1=0; //flag dinolkan kembali
TR1=0; //timer dihentikan
P1=0xf0;
}
Program berikut ini akan dibuat program timer 1 mode 1 sebagai counter melakukan
cacahan 100. Agar timer pada mode 1 kita harus menginisialisasikan timer terlebih
dahulu. Didalam inisialisasi kita menentukan TMOD, TH1, dan TL1. Uuntuk
256/256 = 1 dan 0
TL0 = 0
TMOD = 0x11
GATE C / T M1 M0 GATE C /T M1 M0
0 0 0 1 0 0 0 1
//Program 8.3
#include <at89x51.h>
void Init_counter0( )
{
TMOD = 0x11; //timer 1 sebagai counter pada mode 1
TH0 = 255; //melakukan cacahan 256
TL0 = 0;
TR1 = 1; // timer 1 dijalankan
}
190
void main()
{
Init_counter0( );
while(!TF1) //tunggu sampai hitungan selesai
{;}
TF1=0; //flag dinolkan kembali
TR1=0; //timer dihentikan
P1=0xbb;
}
TLx dipakai sebagai pencacah biner 8 bit, sedangkan THx dipakai untuk
menyimpan nilai yang diisikan ulang ke TLx, setiap kali kedudukan TLx melimpah
(berubah dari $FF menjadi $00). Dengan cara ini bisa didapatkan sinyal limpahan yang
Program berikut ini akan dibuat program timer 1 mode 2 melakukan cacahan 100. Agar
timer pada mode 0 kita harus menginisialisasikan timer terlebih dahulu. Didalam
inisialisasi kita menentukan TMOD, TH0, dan TL0. Uuntuk menentukan TMOD, TH0,
TMOD = 0x22
GATE C / T M1 M0 GATE C /T M1 M0
0 0 1 0 0 0 1 0
//Program 8.5
#include <at89x51.h>
void Init_timer1()
{
TMOD = 0x22; //timer 1 sebagai timer pada mode 2
TH1 = 156; //melakukan cacahan 100
TL1 = 156;
TR1 = 1; // timer 1 dijalankan
}
void main()
{
Init_timer1();
while(!TF1) //tunggu sampai hitungan selesai
{;}
TR1=0; //timer dihentikan
P1=0x0f;
}
Program berikut ini akan dibuat program timer 1 mode 2 sebagai counter melakukan
cacahan 100. Agar timer pada mode 2 kita harus menginisialisasikan timer terlebih
dahulu. Didalam inisialisasi kita menentukan TMOD, TH0, dan TL0. Uuntuk
TMOD = 0x66
GATE C / T M1 M0 GATE C /T M1 M0
0 1 1 0 0 1 1 0
//Program 8.6
#include <at89x51.h>
void Init_counter1( )
{
TMOD = 0x66; //timer 1 sebagai counter pada mode 2
TH1 = 246; //melakukan cacahan 10
TL1 = 246;
TR1 = 1; // timer 1 dijalankan
}
void main()
{
Init_counter1();
while(!TF1) //tunggu sampai hitungan selesai
{;}
TF1=0; //flag dinolkan kembali
TR1=0; //timer dihentikan
P1=0x44;
}
193
Pada Mode 3 TL0, TH0, TL1 dan TH1 dipakai untuk membentuk 3 untaian
pencacah, yang pertama adalah untaian pencacah biner 16 bit tanpa fasiltas pemantau
sinyal limpahan yang dibentuk dengan TL1 dan TH1. Yang kedua adalah TL0 yang
dipakai sebagai pencacah biner 8 bit dengan TF0 sebagai sarana pemantau limpahan.
Pencacah biner ketiga adalah TH0 yang dipakai sebagai pencacah biner 8 bit dengan
Program berikut ini akan dibuat program timer 0 mode 3 melakukan cacahan 100. Agar
timer pada mode 0 kita harus menginisialisasikan timer terlebih dahulu. Didalam
inisialisasi kita menentukan TMOD, TH0, dan TL0. Uuntuk menentukan TMOD, TH0,
TMOD = 0x33
GATE C / T M1 M0 GATE C /T M1 M0
0 0 0 0 0 0 0 0
Program berikut ini akan dibuat program timer 0 mode 3 sebagai counter melakukan
cacahan 30. Agar timer pada mode 3 kita harus menginisialisasikan timer terlebih
dahulu. Didalam inisialisasi kita menentukan TMOD, TH0, dan TL0. Uuntuk
TMOD = 0x77
GATE C / T M1 M0 GATE C /T M1 M0
0 0 0 0 0 0 0 0
//Program 8.8
#include <at89x51.h>
void Init_counter0( )
{
TMOD = 0x07; //timer 0 sebagai counter pada mode 3
TH0 = 226; //melakukan cacahan 30 kali
TL0 = 226;
TR0 = 1; // timer TL0 dijalankan
}
void main()
{
Init_counter0();
P1=0x20; //jika tl0 50 cacahan
TF0=0;
TR0=0;
P1=0x20; //jika tl0 50 cacahan
}
pada Gambar 6.8. yang perlu diperhatikan adalah konfigurasi rangkaian LED yaitu
196
Common Anode (CA) artinya untuk menghidupkan LED pada Port 3, port 3 harus
dikirim atau diberi logika ‘0’. Jika LED terhubung secara Common Katode, maka untuk
menyalakan LED harus dikirim atau diberi logika ‘1’, menyebabkan Port 0 menjadi
masukan berimpedansi, sehingga tidak dapat menyalakan LED karena ordenya μA.
V C C
4 0
3 9 V C C 2 1
3 8 P 0 . 0 / A PD 2 0. 0 / 2A 28
3 7 P 0 . 1 / A PD 2 1. 1 / 2A 39
3 6 P 0 . 2 / AP D2 .2 2 / A2 41 0
3 5 P 0 . 3 / AP D2 .3 3 / A2 51 1
3 4 P 0 . 4 / AP D2 .4 4 / A2 61 2
3 3 P 0 . 5 / AP D2 .5 5 / A2 71 3
3 2 P 0 . 6 / AP D2 .6 6 / A2 81 4
P 0 . 7 / AP D2 .7 7 / A 1 5
1 1 0
2 P 1 . 0 P 3 . 0 / R 1 X1 D
3 P 1 . 1 P 3 . 1 / T1 X2 D
I S P 4 P 1 . 2 P 3 . 2 / I 1N 3 T 0
5 P 1 . 3 P 3 . 3 / I 1N 4 T 1
6 P 1 . 4 P 3 . 4 /1 T 50
1 7 P 1 . 5 P 3 . 5 /1 T 61
2 8 P 1 . 6 P 3 . 6 / W1 7 R
3 9 P 1 . 7 P 3 . 7 / R D
4 R S T 3 0
5 A L E / P R2 9O G
P S E N
1 9
V C C 3 1 X T A L1 1 8
E A /2 V 0 P PX T A L 2
G N D
1 2 M H z
A T 8 9 C 5 1
3 0 p 3 0 p
R E S E T 1 0 u
C
V C C
4 K 7
1 N 4 0 0 2
A
mikrokontroller, maka sekarang saatnya Anda membuat program yang digunakan untuk
#include <at89x51.h>
/* deklarasi delay 1 ms*/
void tunda(unsigned int j)
{
TMOD = 0x11;
while(j) // kerjakan selama j tidak nol
{
TH0 = 0xFC; // isi TH0 dengan FC
TL0 = 0x65; // isi TH0 dengan 65
TR0 = 1; // timer 0 mulai mencacah
while (!TF0);
TF0 = 0; // bersihkan flag
TR0 = 0; // hentikan mencacah
j--; // kurangi nilai j dengan 1
}
}
/* Program utama */
void main()
{
while(1)
{
P3= 0xff; tunda(1000);
P3=0; tunda(1000);
}
}
RANGKAIAN SPEAKER
V C C
U 1
3 9 2 1
3 8 P 0 . 0 / AP D2 .0 0 2/ A 2 8
3 7 P 0 . 1 / AP D2 .1 1 2/ A 3 9
P 0 . 2 / PA 2D . 2 / 2A 4 1 0 4 7
3 6
3 5 P 0 . 3 / PA 2D . 3 / 2A 5 1 1
3 4 P 0 . 4 / PA 2D . 4 / 2A 6 1 2
3 3 P 0 . 5 / PA 2D . 5 / 2A 7 1 3
3 2 P 0 . 6 / PA 2D . 6 / 2A 8 1 4
H E A D E R 5 P 0 . 7 / PA 2D . 7 / A 1 5 Q 1
P 1 _ 10 1 0
R S T P 1 _ 21 P 1 . 0 P 3 . 0 / 1R 1 X D
1 P 1 _ 32 P 1 . 1 P 3 . 1 / 1T 2X D
2 P 1 _ 43 P 1 . 2 P 3 . 2 / I1 N 3 T 0 2 K 2
3 P 1 _ 54 P 1 . 3 P 3 . 3 / I1 N 4 T 1 1
4 G N D P 1 _ 65 P 1 . 4 P 3 . 4 1/ T 5 0 2
5 P 1 _ 76 P 1 . 5 P 3 . 5 1/ T 6 1
P 1 _ 87 P 1 . 6 P 3 . 6 / 1W 7 R
J P 4 P 1 . 7 P 3 . 7 / R D S P E A K E R
1 9 3 0
1 8 X T A LA 1 L E / P 2R 9 O G
X T A L 2 P S E N
X 1
V C C 3 1
9 E A / V P P
R S T
1 2 M H z
C 3 A T 8 9 S 5 1
1 0 u
3 0 p 3 0 pR E S E T
C 6 C 7 R S T
C
R 2 D 3
4 K 7
1 N 4 0 0 2
A
mikrokontroller, maka sekarang saatnya Anda membuat program yang digunakan untuk
void tone()
{
pulse();
while(!TF0==1); P1_7=0;
pulse();
while(!TF0==1); P1_7=1;
}
void main ( )
{
init_timer0();
while(1)
{
tone(); // frekuensi 500Hz
}
}