Setelah reset TMOD bernilai $00, berarti Timer 1 bekerja sebagai pencacah biner 13 bit, sumber sinyal denyut dari osilator kristal atau Timer 1 bekerja sebagai ‘timer’, bit GATE =’0’ berarti kaki INT1 tidak berpengaruh pada rangkaian sehingga Timer 1 hanya dikendalikan dari bit TR1.
Dalam pemakaian biasanya dipakai pencacah biner 16 bit, untuk keperluan itu instruksi yang diperlukan untuk mengatur TMOD adalah :
MOV TMOD,#%00010000
Catatan dalam instruksi di atas tanda ‘#’ menyatakan bagian di belakangnya adalah bilangan konstan yang akan diisikan ke TMOD, ‘%’ merupakan awalan yang menandakan bahwa bilangan di belakangnya adalah bilangan biner. Penulisan dengan bilangan biner semacam ini, memudahkan untuk mengenali dengan cepat bit-bit apa saja yang diisikan ke TMOD.
Bilangan biner %00010000 diisikan ke TMOD, berakibat bit 7 TMOD (bit GATE) bernilai ‘0’, bit 6 (bit C/T*) bernilai ‘0’, bit 5 dan 4 (bit M1 dan M0) bernilai ‘01’, ke-empat bit ini dipakai untuk mengatur Timer 1, sehingga Timer 1 bekerja sebagai timer dengan pencacah biner 16 bit yang dikendalikan hanya dengan TR1.
Jika dikehendaki pencacah biner dipakai sebagai counter untuk mencacah jumlah pulsa yang masuk lewat kaki T1 (P3.5), instruksinya menjadi :
MOV TMOD,#%01010000
Perbedaannya dengan instruksi di atas adalah dalam instruksi ini bit 6 (bit C/T*) bernilai ‘1’. Selanjutnya jika diinginkan sinyal dari perangkat keras di luar chip MCS51 bisa ikut mengendalikan Timer 1, instruksi pengatur Timer 1 akan menjadi :
MOV TMOD,#%11010000
Dalam hal ini bit 7 (bit GATE) bernilai ‘1’.
Setelah mengatur konfigurasi Timer 0 seperti di atas, pencacah biner belum mulai mencacah sebelum diperintah dengan instruksi :
SETB TR1
Perlu diingatkan jika bit GATE = ‘1’, selama kaki INT1 bernilai ‘0’ pencacah biner belum akan mencacah. Untuk menghentikan proses pencacahan, dipakai instruksi
CLR TR1
Di atas hanya dibahas Timer 1 saja, tata canya untuk Timer 0 persis sama. Yang perlu diperhatikan adalah register TMOD dipakai untuk mengatur Timer 0 dan juga Timer 1, sedangkan TMOD tidak bisa dialamati secara bit (non bit addressable) sehingga jika jika kedua Timer dipakai, pengisian bit-bit dalam register TMOD harus dipikirkan sekali gus untuk Timer 0 dan Timer 1.
Bit TR1 dan TR0 yang dipakai untuk mengendalikan proses pencacahan, terletak di dalam register TCON (memori-data internal nomor $88) yang bisa dialamati secara bit (bit addressable). Sehingga TR0 dan TR1 bisa diatur secara terpisah (dengan perintah SETB atau CLR), tidak seperti mengatur TMOD yang harus dilakukan secara bersamaan.
Demikian pula bit penampung limpahan pencacah biner TF0 dan TF1, juga terletak dalam register TCON yang masing-masing bisa di-monitor sendiri.
Pemakaian Waktu Tunda
Waktu tunda banyak dipakai dalam pemerograman mikronkontroler untuk membangkitkan pulsa, membangkitkan sinyal periodik dengan frekuensi tertentu, untuk menghilangkan effek getar dari skalar dalam membuat key pad (keyboard sederhana) dan lain sebagainya.
Waktu tunda bisa dibangkitkan secara sederhana dengan menjalankan instruksi-instruksi yang waktu pelaksanaanya bisa diperhitungkan dengan tepat. Untuk mendapatkan waktu tunda yang panjang, tidak dipakai cara di atas tapi pakai Timer. Waktu tunda yang dibentuk dengan kedua cara tersebut sangat tergantung pada frekuensi kerja mikrokontroler, dalam contoh-contoh berikut dianggap mikrokontroler bekerja pada frekuensi 12 MHz.
Instruksi-instruksi berikut ini bisa dipakai untuk membangkitkan pulsa ‘0’ dengan lebar 3 mikro-detik pada kaki P1.0
01: CLR P1.0
02: NOP ; 1 mikro-detik
03: NOP ; 1 mikro-detik
04: SETB P1.0 ; 1 mikro-detik
Instruksi baris pertama membuat P1.0 yang mula-mula ‘1’ menjadi ‘0’, pelaksanaan instruksi NOP memerlukan waktu 1 mikro-detik (jika MCS51 bekerja pada frekuensi 12 MHz), instruksi SETB P1.0 juga memerlukan waktu 1 mikro-detik, total waktu sebelum P1.0 kembali menjadi ‘1’ adalah 3 mikro-detik (baris 2 3 dan 4). Dengan demikian terjadilah pulsa dengan lebar 3 mikro-detik pada kaki P1.0 seperti terlihat pada gambar berikut
Dengan sedikit perubahan instruksi-instruksi di atas bisa membangkitkan sinyal dengan frekuensi 100 KHz pada kaki P1.0 :
01: Sinyal100KHz:
02: CPL P1.0 ; 1 mikro-detik
03: NOP ; 1 mikro-detik
04: NOP ; 1 mikro-detik
05: SJMP Sinyal100KHz ; 2 mikro-detik
Instruksi CPL P1.0 pada baris 1 membalik keadaan pada P1.0, bila mula-mula P1.0 bernilai ‘1’ akan dirubah menjadi ‘0’, sebaliknya bila mula-mula ‘0’ akan dirubah menjadi ‘1’. Total waktu tunda ke-empat baris di atas adalah 5 mikro-detik, sehingga yang terjadi adalah P1.0 bernilai ‘0’ selama 5 mikro-detik dan bernilai ‘1’ selama 5 mikro-detik berulang terus tanpa henti, dengan frekuensi sebesar 1/10 mikro-detik = 100.000 Hertz.
Program di atas bisa pula dibuat dengan memakai Timer 1 sebagai pengatur waktu tunda sebagai berikut :
01: MOV TMOD,#%00100000 ; Timer 1 bekerja pada Mode 2
02: MOV TH1,#$F6 ; Nilai pengisi ulang TL1
03: SET TR1 ; Timer 1 mulai mencacah
04: Ulangi:
05: BIT TF1,$ ; Tunggu sampai melimpah
06: CPL P1.0 ; Keadaan pada P1.0 di-balik
07: CLR TF1 ; Hapus limpahan pencacah
08: SJMP Ulangi ; Ulangi terus tiada henti…
Instruksi baris pertama mempersiapkan Timer 0 bekerja pada Mode 2 – Pencacah Biner 8 bit dengan Isi Ulang, bilangan pengisi ulang ditentukan sebesar $F0 yang disimpan ke register TH1 pada baris 2, instruksi berikutnya memerintahkan pencacah biner mulai mencacah.
Pencacah biner yang dibentuk dengan register TL1 akan mencacah naik seirama dengan sikluas sinyal denyut, mulai dari $F6 sampai $FF, saat pencacah melimpah dari $FF ke $00 bit TR1 pada register TCON akan menjadi ‘1’ dan TL1 secara otomatis di isi ulang dengan bilangan $F0 yang tersimpan pada register TH0. Hal ini akan terjadi terus menerus dan berulang setiap 10 siklus sinyal denyut ($F6, $F7, $F8, $F9, $FA, $FB, $FC, $FD, $FE, $FF kembali ke $00, total 10 siklus)
Instruksi BIT TR1,$ menunggu bit TR1 menjadi ‘1’, yakni saat pecacah biner melimpah dari $FF ke $00 yang dibahas di atas. Lepas dari penantian tersebut, P1.0 dibalik keadaanya dengan instruksi CPL P1.0, TR1 dikembalikan menjadi 0 (harus dikembalikan sendiri dengan instruksi ini), agar bisa ditunggu lagi sampai menjadi ‘1’ kembali setelah instruksi SJMP Ulangi.
Frekuensi dari sinyal di P1.0 sebesar 1 / 16 mikro-detik = 31,25 KHz.
Nilai awal yang diisikan ke pencacah biner di atas, adalah nilai negatip dari faktor pembagi yang dikehendaki. Dalam contoh di atas, bilangan pembaginya adalah 16 (atau $10 heksadesimal), nilai negatip dari $10 adalah $F0 (bilangan negatip komplemen 2 diturunkan dengan cara bilangan asal dibalik/di-not-kan kemudian ditambah 1, dalam hal ini $10 di-not-kan menjadi $EF dan ditambah 1 menjadi $F0).
Cara menentukan bilangan negatip di atas cukup merepotkan, tapi hal ini mudah diselesaikan dengan bantuan assembler, instruksi MOV TH1,#$F0 di atas bisa digantikan dengan MOV TH1,#-$10, assembler yang akan menghitung -$10 menjadi $F0.
Contoh pemakaian waktu tunda berikutnya adalah untuk mengatasi getaran saklar dalam membuat key pad (keyboard sederhana).
Pada saat saklar mekanis di tekan atau pada saat tekanan pada saklar dilepas, selama lebih kurang 30 mili-detik saklar tersebut akan bergetar atau sebelum mencapai keadaan stabil saklar tersebut akan on/off selama waktu lebih kurang 30 detik, mengakibatkan program mikrokontroler merasakan tombol berulang-ulang ditekan, meskipun sesungguhnya hanya ditekan satu kali saja.
Hal ini bisa diatasi dengan cara menunda waktu sekitar 50 mili-detik setelah program merasakan sebuah tombol ditekan, seperti berikut:
01: BacaTombol:
02: MOV TMOD,#%00010000 ; Timer 1 bekerja pada mode 1
03: JB T1,$ ; tunggu di sini sampai tombol ditekan
04: MOV TL1,#-50000/256 ; siapkan waktu tunda 50 mili-detik
05: MOV TH1,#-50000
06: CLR TF1 ; me-nol-kan bit limpahan
07: SETB TR1 ; timer mulai bekerja
08: JNB TF1,$ ; tunggu di sini sampai melimpah
09: CLR TR1 ; timer berhenti kerja
10: RET
Dalam program di atas, saklar dipasangkan antara kaki T1 dan Ground, pencacah biner yang dipakai adalah pencacah biner 16 yang sudah ditentukan dengan instruksi MOV TMOD,#%00010000. Pada baris berikut program menunggu saklar yang terhubung pada T1 ditekan, selama saklar belum ditekan mikrokontroler akan tertahan pada instruksi JB T1,$.
Dua baris berikutnya adalah cara mengisikan nilai –50000 yang terdiri dari 2 byte ke register TL1 dan TH1. Bit TF1 di-nol-kan dan akan kembali menjadi ‘1’ setelah Tl1/TH1 mencacah dari –50000 kembali menjadi $0000. Waktu tunda dimulai segera setelah instruksi SETB TR1, dan selesainya waktu tunda ditunggu dengan instruksi JNB TF1,$. Jika MCS51 bekerja dengan kristal 12 MHz, waktu tunda selama 50000 siklus sama dengan 50.000 x 1 mikro-detik = 50 mili-detik,
Setelah menunggu selama 50 mili-detik, pencacah biner kembali di-non-aktipkan dengan CLR TR1 dan berikutnya meninggalkan sub-rutin ini dengan instruksi RET. Dengan demikian mikrokontroler akan menungu saklar stabil, selama saklar masih bergetar mikrokontroler masih tertahan di dalam su-rutin BacaTombol.

