Gelombang kotak dengan frekuensi variabel
Pembangkit gelombang kotak dengan frekuensi variabel ini mendaya-gunakan 2 sistem interupsi MCS51, masing-masing adalah interupsi Timer 0, ditambah dengan interupsi Ekternal 0.
Setiap kali tombol SW1 ditekan, Q1 dari U2 74121 akan mengeluarkan pulsa nol sesaat, lebar pulsa tersebut ditentukan oleh nilai kapasitor C4 dan resistor R4 yang nilainya bisa di-rubah. Pulsa nol dari U2 74121 dipakai untuk menginterupsi U1 AT89C2051 lewat INT0 (P3.2, kaki nomor 6).
Permintaan interupsi terjadi pada saat kaki INT0 berubah dari ‘1’ menjadi ‘0’. Program Layanan Interupsi (ISR – Interrupt Service Routine) untuk Interupsi Eksternal 0 bertugas mengukur periode waktu kaki INT0 bernilai ‘0’

Gambar 4 Pembentuk Gelombang Kotak
Program 2 : Gelombang kotak dengan frekuensi variabel
01: Clock bit P1.7
02: Pulse bit P3.2
03: ;
04: ; Vektor Reset
05: ORG $0000
06: LJMP Start
07: ;
08: ; Vektor interupsi Eksternal 0
09: ORG $0003
10: LJMP MengukurPulsa
11: ;
12: ; Vektor interupsi Timer 0
13: ORG $000B
14: LJMP MembuatClock
15: ;
16: Start:
17: MOV TMODE,#$01
18: SETB IT0
19: SETB EX0
20: SETB EA
21: TanpaHenti:
22: SJMP TanpaHenti
23: ;
24: ; ISR interupsi eksternal
25: MengukurPulsa:
26: MOV TH0,#0
27: MOV TL0,#1
28: SETB TR0
29: JNB Pulse,$
30: CLR TR0
31: XRL TH0,#$FF
32: XRL TL0,#$FF
33: MOV A,#1
34: ADD A,TL0
35: MOV R2,A
36: MOV A,#0
37: ADDC A,TH0
38: MOV R3,A
39: SETB ET0
40: SETB TF0
41: RETI
42: ;
43: ; ISR interupsi timer 0
44: MembuatClock:
45: CLR TR0
46: MOV TH0,R3
47: MOV TL0,R2
48: CPL Clock
49: SETB TR0
50: RETI
51: ;
52: END
Program utama terletak pada baris 16 sampai 22. Baris 17 mengatur Timer 0 bekerja pada Mode 1 - Pencacah Biner 16 bit, yakni menghubungkan TL0 dan TH0 menjadi satu. Baris 18 menentukan yang dianggap sebagai sinyal interupsi adalan perubahan tegangan pada kaki INT0 dari ‘1’ menjadi ‘0’. Baris 19 mengaktipkan sistem interupsi eksternal 0 dan baris 20 mengaktipkan sistem interupsi AT89C2051 secara keseluruhan. Tapi saat ini interupsi Timer 0 belum diaktipkan.
Seperti halnya contoh program pertama, AT89C2051 akan berputar-putar pada baris 21 dan 22.Saat tegangan pada kaki INT0 berubah dari ‘1’ menjadi ‘0’, bit IE0 menjadi ‘1’ yang merupakan sinyal permintaan interupsi eksternal 0, hal ini mengakibatkan AT89C2051 mengerjakan rutin MengukurPulsa yang merupakan ISR interupsi eksternal 0 (baris 25 sampai 41).
Dalam ISR ini, lebar pulsa pada kaki INT0 dengan Timer 0. Baris 26 dan 27 membuat TH0 dan TL0 bernilai 0. Baris 28 membuat Timer 0 mulai mencacah, dan baris 29 menunggu tegangan pada kaki INT0 kembali menjadi ‘1’, dan selama itu Timer 0 terus mencacah. Baris 30 menghentikan Timer 0, nilai yang tersimpan dalam TH0 dan TL0 saat itu merupakan panjang pulsa dalam satuan mikro-detik.
Lebar pulsa yang didapat dari pengukuran ini akan dipakai untuk menentukan frekuensi gelombang kotak yang dibangkitkan. Lebar pulsa ini dinegatipkan dan disimpan ke dalam R2 dan R3 pada baris 31 sampai 38.
Baris 39 mengaktifkan permintaan interupsi dari Timer 0, dan baris 40 (SETB TF0) membangkitkan permintaan interupsi timer 0 yang pertama kali lewat program.
Rutin Membuat Clock (baris 44 sampai 50) merupakan ISR untuk interupsi Timer 0. Dalam rutin ini mula-mula sumber sinyal denyut (clock) untuk Timer 0 dihentikan (baris 45), setelah itu TH0 dan TL0 diisi ulang dengan nilai hasil pengukuran pulsa yang sudah disimpan dalam R2 dan R2 (baris 46 dan 47). Level tegangan pada P1.7 dibalik pada baris 48, setelah itu sumber sinyal denyut Timer 0 diaktipkan kembali pada baris 49.
Pembangkit gelombang kotak dengan frekuensi variabel ini mendaya-gunakan 2 sistem interupsi MCS51, masing-masing adalah interupsi Timer 0, ditambah dengan interupsi Ekternal 0.
Setiap kali tombol SW1 ditekan, Q1 dari U2 74121 akan mengeluarkan pulsa nol sesaat, lebar pulsa tersebut ditentukan oleh nilai kapasitor C4 dan resistor R4 yang nilainya bisa di-rubah. Pulsa nol dari U2 74121 dipakai untuk menginterupsi U1 AT89C2051 lewat INT0 (P3.2, kaki nomor 6).
Permintaan interupsi terjadi pada saat kaki INT0 berubah dari ‘1’ menjadi ‘0’. Program Layanan Interupsi (ISR – Interrupt Service Routine) untuk Interupsi Eksternal 0 bertugas mengukur periode waktu kaki INT0 bernilai ‘0’

Gambar 4 Pembentuk Gelombang Kotak
Program 2 : Gelombang kotak dengan frekuensi variabel
01: Clock bit P1.7
02: Pulse bit P3.2
03: ;
04: ; Vektor Reset
05: ORG $0000
06: LJMP Start
07: ;
08: ; Vektor interupsi Eksternal 0
09: ORG $0003
10: LJMP MengukurPulsa
11: ;
12: ; Vektor interupsi Timer 0
13: ORG $000B
14: LJMP MembuatClock
15: ;
16: Start:
17: MOV TMODE,#$01
18: SETB IT0
19: SETB EX0
20: SETB EA
21: TanpaHenti:
22: SJMP TanpaHenti
23: ;
24: ; ISR interupsi eksternal
25: MengukurPulsa:
26: MOV TH0,#0
27: MOV TL0,#1
28: SETB TR0
29: JNB Pulse,$
30: CLR TR0
31: XRL TH0,#$FF
32: XRL TL0,#$FF
33: MOV A,#1
34: ADD A,TL0
35: MOV R2,A
36: MOV A,#0
37: ADDC A,TH0
38: MOV R3,A
39: SETB ET0
40: SETB TF0
41: RETI
42: ;
43: ; ISR interupsi timer 0
44: MembuatClock:
45: CLR TR0
46: MOV TH0,R3
47: MOV TL0,R2
48: CPL Clock
49: SETB TR0
50: RETI
51: ;
52: END
Program utama terletak pada baris 16 sampai 22. Baris 17 mengatur Timer 0 bekerja pada Mode 1 - Pencacah Biner 16 bit, yakni menghubungkan TL0 dan TH0 menjadi satu. Baris 18 menentukan yang dianggap sebagai sinyal interupsi adalan perubahan tegangan pada kaki INT0 dari ‘1’ menjadi ‘0’. Baris 19 mengaktipkan sistem interupsi eksternal 0 dan baris 20 mengaktipkan sistem interupsi AT89C2051 secara keseluruhan. Tapi saat ini interupsi Timer 0 belum diaktipkan.
Seperti halnya contoh program pertama, AT89C2051 akan berputar-putar pada baris 21 dan 22.Saat tegangan pada kaki INT0 berubah dari ‘1’ menjadi ‘0’, bit IE0 menjadi ‘1’ yang merupakan sinyal permintaan interupsi eksternal 0, hal ini mengakibatkan AT89C2051 mengerjakan rutin MengukurPulsa yang merupakan ISR interupsi eksternal 0 (baris 25 sampai 41).
Dalam ISR ini, lebar pulsa pada kaki INT0 dengan Timer 0. Baris 26 dan 27 membuat TH0 dan TL0 bernilai 0. Baris 28 membuat Timer 0 mulai mencacah, dan baris 29 menunggu tegangan pada kaki INT0 kembali menjadi ‘1’, dan selama itu Timer 0 terus mencacah. Baris 30 menghentikan Timer 0, nilai yang tersimpan dalam TH0 dan TL0 saat itu merupakan panjang pulsa dalam satuan mikro-detik.
Lebar pulsa yang didapat dari pengukuran ini akan dipakai untuk menentukan frekuensi gelombang kotak yang dibangkitkan. Lebar pulsa ini dinegatipkan dan disimpan ke dalam R2 dan R3 pada baris 31 sampai 38.
Baris 39 mengaktifkan permintaan interupsi dari Timer 0, dan baris 40 (SETB TF0) membangkitkan permintaan interupsi timer 0 yang pertama kali lewat program.
Rutin Membuat Clock (baris 44 sampai 50) merupakan ISR untuk interupsi Timer 0. Dalam rutin ini mula-mula sumber sinyal denyut (clock) untuk Timer 0 dihentikan (baris 45), setelah itu TH0 dan TL0 diisi ulang dengan nilai hasil pengukuran pulsa yang sudah disimpan dalam R2 dan R2 (baris 46 dan 47). Level tegangan pada P1.7 dibalik pada baris 48, setelah itu sumber sinyal denyut Timer 0 diaktipkan kembali pada baris 49.