Monday, 18 April 2011

Digital Stop Watch

Hello Friends,

In this tutorial we will make a "Digital Stop Watch" using an AVR ATmega8 Microcontroller. This will help you learn many concepts like

  1. Multiplexed Seven Segment Display Interfacing
  2. Using AVR Timers
  3. Using Interrupts
  4. And many others too.

The code is written in C language for avr-gcc (WinAVR) .

digital stop watch using avr atmega8 and seven segment displays

Fig.: Digital Stop Watch Prototype


Steps to Build the "Digital Stop Watch" using AVR ATmega8 MCU

  1. Make the circuit according to the schematic on general purpose PCB or a BreadBoard.
  2. Make a project in AVR Studio and add a new file to the project. Copy/paste the "c" code. Set optimization as "o2" and CPU frequency as 16000000Hz. Save and Build the project. You will get a HEX file.
  3. Burn this HEX file to an ATmega8 MCU using a tool such as eXtreme Burner AVR.
  4. Set High Fuse = C9(Hex) Low Fuse = FF(Hex). How to do this depends on you programmer software.

I have use a xBoard MINI development board for fast and easy prototyping. The Displays+Transistors+Key are on the Veroboard while the Core CPU unit + power supply is in the xBoard MINI. It can be programmed "In System" over USB Port using eXtreme Burner - AVR software toolkit.

digital stop watch circuit

Fig.: Digital Stop Watch made using xBoard MINI

How to Use the "Digital Stop Watch"

When initially powered up the Stop watch is in "STOP" condition. This is indicated by a blinking display. The count is 00:00 initially. Press "START" to start the watch. The blinking will now stop and the display will be fully on. It will start counting and MIN:SEC is displayed. The stop watch can be halted at any time by pressing "HALT" key. In halt state the counting freezes and the display starts blinking. You can press "START' key again to resume counting from there. The "RESET" key is used to reset the clock to 00:00 i.e. 0 minute and 0 sec.

Digital Stop Watch Schematic

Fig.: Digital Stop Watch Schematic

Digital Stop Watch C Source Code.


/*

Description: An AVR ATmega8 based Digital Stop Watch

Project.
________________________________________________________

Author: Avinash Gupta
Date: 04 July 09
Web www.eXtremeElectronics.co.in


*/

#include
#include
#include

#define true 1
#define false 0

#define SEVEN_SEGMENT_PORT PORTD

#define SEVEN_SEGMENT_DDR DDRD

volatile uint8_t digits[4];

//Global variable for the clock system
volatile unsigned int clock_millisecond=0;
volatile unsigned char clock_second=0;

volatile unsigned char clock_minute=0;
volatile unsigned char clock_hour=0;

//Display hiding system
uint8_t hide_display = false;

//Blinking system

uint8_t blink_display = true;



void SevenSegment(uint8_t n,uint8_t dp)
{
/*
This function writes a digits given by n to the display
the decimal point is displayed if dp=1

Note:
n must be less than 9

*/
if(n<11)
{
switch (n)
{
case 0:
SEVEN_SEGMENT_PORT=0b00000011;
break;

case 1:
SEVEN_SEGMENT_PORT=0b10011111;
break;

case 2:
SEVEN_SEGMENT_PORT=0b00100101;
break;

case 3:
SEVEN_SEGMENT_PORT=0b00001101;
break;

case 4:
SEVEN_SEGMENT_PORT=0b10011001;
break;

case 5:
SEVEN_SEGMENT_PORT=0b01001001;
break;

case 6:
SEVEN_SEGMENT_PORT=0b01000001;
break;

case 7:
SEVEN_SEGMENT_PORT=0b00011111;
break;

case 8:
SEVEN_SEGMENT_PORT=0b00000001;
break;

case 9:
SEVEN_SEGMENT_PORT=0b00001001;
break;

case 10:
//A BLANK DISPLAY

SEVEN_SEGMENT_PORT=0b11111111;
break;

}
if(dp)
{
//if decimal point should be displayed
//make 0th bit Low
SEVEN_SEGMENT_PORT&=0b11111110;
}
}
else

{
//This symbol on display tells that n was greater than 10
//so display can't handle it
SEVEN_SEGMENT_PORT=0b11111101;
}
}

void Wait()
{
uint8_t i;
for(i=0;i<10;i++)
{
_delay_loop_2(0);
}
}


void Print(uint16_t num)
{
/*

This function breaks apart a given integer into separete digits
and writes them to the display array i.e. digits[]

*/

uint8_t i=0;
uint8_t j;
if(num>9999) return;


while(num)
{
digits[i]=num%10;
i++;

num=num/10;
}

//Fill with leading 0s

for(j=i;j<4;j++) digits[j]=0;
}




void main()
{
uint16_t i;

// Prescaler = FCPU/1024
TCCR0|=(1<//Enable Overflow Interrupt Enable

TIMSK|=(1<//Initialize Counter
TCNT0=0;

//Port c[3,2,1,0] as out put
DDRC|=0b00001111;

PORTC=0b00001110;

//Port D

SEVEN_SEGMENT_DDR=0XFF;

//Turn off all segments
SEVEN_SEGMENT_PORT=0XFF;

//Set up the timer1 as described in the
//tutorial
//TCCR1B=(1<<<

//initailly stop the timer by setting clock source =000
TCCR1B&=(~((1<1<1<250
;

//Enable the Output Compare A interrupt
TIMSK|=(1<//Enable interrupts globally

sei();

//Continuasly display the time
while(1)
{
int disp;
disp=(clock_hour*100)+clock_minute;
//disp=(clock_minute*100)+clock_second;

Print(disp);

if(!(PINB & (1<//RESET PRESSED
clock_millisecond=0;
clock_second=0;
clock_minute=0;
clock_hour=0;
}

if(!(PINB & (1<//halt pressed

//stop the timer
TCCR1B&=(~((1<1<1<//Start blinking the display
blink_display=true;
}

if(!(PINB & (1<//start pressed

//start the timer
//Set up the timer1 as described in the
//tutorial
TCCR1B=(1<1<1<//Stop blinking the display

blink_display=false;

//Show the display
hide_display=false;
}

_delay_loop_2(0);
_delay_loop_2(0);

}


}

ISR(TIMER0_OVF_vect)
{


/*

This interrup service routine (ISR)
Updates the displays

*/
static uint8_t i=0;

if(i==3)
{
//If on last display then come

//back to first.
i=0;
}
else
{
//Goto Next display
i++;
}

//Acivate a display according to i

PORTC=~(1<if(hide_display)
{
//Show a blank display
SevenSegment(10,0);

}
else
{
//Write the digit[i] in the ith display.

SevenSegment(digits[i],0);
}

//Handle blinking

if(!blink_display) return;

static uint8_t blink_counter=0;

blink_counter++;
if(blink_counter == 16)
{
blink_counter =0;

hide_display=!hide_display;
}

}


//The output compate interrupt handler
//We set up the timer in such a way that
//this ISR is called exactly at 1ms interval
ISR(TIMER1_COMPA_vect)
{
clock_millisecond++;
if(clock_millisecond==1000)
{
clock_second++;
clock_millisecond=0;
if(clock_second==60)
{
clock_minute++;
clock_second=0;
}
if(clock_minute==60)
{
clock_hour++;
clock_minute=0;
}
}
}


Friday, 15 April 2011

Pengenalan RTC (Real Time Clock)

Prinsip Kerja Alat

Prinsip kerja alat Alarm Pengingat Waktu Minum Obat Menggunakan RTC DS12C887 Berbasis Mikrokontroler AT89S52 ini adalah mikrokontroler sebagai bagian pemroses selalu melihat keadaan 4 ruangan memori pada memori RTC yang mewakili 4 jenis obat, pada tiap ruangan ini berisi 4 buah jadwal alarm yaitu.

  1. Alarm obat 1×1 sehari.
  2. Alarm obat 1×2 sehari.
  3. Alarm obat 1×3 sehari.
  4. Alarm obat 1×4 sehari.

Pada bagian pengaturan dapat memilih jenis obat mana yang akan diaktifkan dan juga memilih jadwal alarm obat dari ke empat pilihan dalam sehari. Sedangkan untuk 4 waktu bunyi alarm telah ditentukan melalui pemrograman flash PEROM mikrokontroler sehingga pengguna tidak dapat mengubahnya kecuali lewat pemrograman IC mikrokontroler. Empat waktu yang telah diisikan ke dalam memori IC mikrokontroler tersebut adalah sebagai berikut.

  1. 1×1 pada pukul 08.00
  2. 1×2 pada pukul 14.00
  3. 1×3 pada pukul 20.00
  4. 1×4 pada pukul 02.00

Berikut ini adalah Gambar 4.1 alat Alarm Pengingat Waktu Minum Obat Menggunakan RTC DS12C887 Berbasis Mikrokontroler AT89S52 yang selesai dirakit.

IC Pewaktu RTC DS12C887

Real Time Clock atau biasa disebut dengan RTC adalah sebuah komponen elektronik yang didalamnya berisi jam elektronik yang tidak pernah berhenti bekerja kecuali register diisi kode OFF. Komponen ini menyimpan waktu mulai dari detik hingga tahun, dan selalu diperbaharui setiap saat secara otomatis, nilai informasi waktu disimpan di dalam sebuah RAM dengan alamat yang telah ditentukan. Karena disimpan di dalam sebuah RAM dengan alamat yang sudah ditentukan, maka pengguna dapat mengambil datanya dengan sebuah mikrokontroler, dan hubungannya dengan mikrokontroler sebagai komponen memori eksternal. Jadi dalam hal ini mengakses data memori eksternal dan mengakses data RTC adalah sama caranya. Berikut ini adalah Gambar 3.2 menyambungkan RTC ke mikrokontroler.

Gambar 3.2 Menyambungkan RTC ke port mikrokontroler

Di samping itu karena data waktu yang disimpan tidak banyak, maka sisa ruang memori yang disediakan RTC, bisa digunakan untuk menyimpan data secara aman, data tersebut tidak akan hilang meskipun catu daya dimatikan sampai jangka waktu sekitar 10 tahun (seumur baterai yang ada di dalam RTC).

Sistem Minimum Mikrokontroler AT89S52

Mikrokontroler merupakan komponen utama yang mengendalikan seluruh sistem. Mikrokontroler yang digunakan pada penelitian ini adalah mikrokontroler keluaran Atmel dengan seri AT89S52. Seri ini merupakan varian baru dari keluarga AT89C51 yang mengalami perubahan prosedur pengisian program. Pada seri ini memiliki fasilitas ISP (In System Programming) yang tidak dimiliki pada seri sebelumnya. Fasilitas ini memungkinkan pengubahan isi program walaupun sistem sedang berjalan. Pada penelitian ini sistem minimum disajikan pada Gambar 3.3.

Tombol Masukan

Tombol masukan ini terdiri dari 4 buah tombol (push on) yang dihubungkan ke port 3.0 – port 3.3 mikrokontroler. Ke-empat tombol ini akan mewakili tombol MENU, tombol UP, tombol DOWN, dan tombol NEXT. Tombol – tombol ini akan berfungsi saat setting jam, hari, tanggal, bulan, dan tahun pada RTC. Juga akan berfungsi pada saat pengisian waktu membunyikan alarm minum obat pada setiap harinya. Berikut ini adalah Gambar 3.4 penyambungan tombol ke port mikrokontroler.

Penampil LCD

LCD merupakan penampil yang digunakan untuk memberikan informasi bagi pengguna alat. LCD ada yang mempunyai satu baris dan ada yang dua baris, LCD satu baris disebut LCD 1 x 16 dan LCD dua baris biasa disebut LCD 2 x 16, 16 menunjukkan banyaknya karakter yang dapat ditampilkan dalam setiap baris. Pada sistem ini digunakan sebagai penampil waktu normal dan waktu pengaturan bunyi alarm pada setiap harinya.

Pada Gambar 3.5 merupakan antarmuka LCD 2×16 dengan menggunakan mode antarmuka 8 bit. Berikut beberapa hal yang perlu diperhatikan adalah LCD selalu berada pada kondisi tulis (write), dengan menghubungkan pin R/W ke Ground. Hal ini dimaksudkan agar LCD tersebut tidak pernah mengeluarkan data (kondisi baca) yang mana data tersebut akan bertabrakan dengan data komponen lain di jalur bus.


Rangkaian Penggerak Speaker

Rangkaian penggerak speaker menggunakan transistor jenis PNP (A733), pada dasarnya speaker dihubungkan ke tegangan Vcc (dengan batasan arus oleh resistor 47 Ω). Karena adanya transistor, maka speaker mendapatkan arus atau tidaknya tergantung dari kondisi transistor saat itu. Jika transistor ON (karena ada arus low pada basis, dengan pemberian logika ’0’), maka speaker mandapatkan tegangan Vcc, namun sebaliknya jika transistor OFF speaker juga akan OFF.

Jika keadaan ON dan OFF ini diberikan secara periodik, maka akan timbul suatu gelombang (gelombang kotak) dengan frekuensi tertentu (berdasarkan periode gelombang). Dengan demikian program yang dibuat harus bisa membangkitkan gelombang kotak pada port mikrokontroler. Berikut ini adalah Gambar 3.6 rangkaian penggerak speaker yang masukannya dari port mikrokontroler.

Perancangan Perangkat Lunak Mikrokontroler AT89S52

Sebelum melakukan permrograman alat, maka diperlukan rancangan perangkat lunak mikrokontroler. Rancangan perangkat lunak (diagram alir) ini diperlukan untuk memudahkan pada saat pemrograman. Berikut ini adalah Gambar 3.8 diagram alir alat Alarm Pengingat Waktu Minum Obat Menggunakan RTC DS12C887 Berbasis Mikrokontroler AT89S52.

Listing Program

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Program Alarm Obat
; RTC DS 12C887
; Mikrokontroler AT89S52
; LCD M1632
; Push Button = 4
; Output Speaker = 1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
K_next bit p3.1
K_menu bit p3.0
K_up bit p3.3
K_down bit p3.2

LCD_rs bit p1.1
LCD_cs bit p1.0

RTC_cs bit p3.5

Speaker bit p2.0

Nada_1 Equ -1000
Nada_2 Equ -655
Nada_3 Equ -500

memori_1 equ 20H
memori_1x1 bit 20H.0
memori_1x2 bit 20H.1
memori_1x3 bit 20H.2
memori_1x4 bit 20H.3

memori_2 equ 21H
memori_2x1 bit 21H.0
memori_2x2 bit 21H.1
memori_2x3 bit 21H.2
memori_2x4 bit 21H.3

memori_3 equ 22H
memori_3x1 bit 22H.0
memori_3x2 bit 22H.1
memori_3x3 bit 22H.2
memori_3x4 bit 22H.3

memori_4 equ 23H
memori_4x1 bit 23H.0
memori_4x2 bit 23H.1
memori_4x3 bit 23H.2
memori_4x4 bit 23H.3

bebas equ 25H

Del1 equ 30h
Del2 equ 31h
Tmp equ 33h
Dech equ 36h
DecL equ 37h
Almcount equ 38h
Tmp1 equ 3ch
Detik_lama equ 3dh

jam_rtc equ 50h
menit_rtc equ 51h
detik_rtc equ 52h

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Memori RTC
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Secon equ 0
Minute equ 2
Hour equ 4
Day_week equ 6
Day_month equ 7
Month equ 8
Year equ 9
Reg_a equ 10
Reg_b equ 11

RTC_menit_obat1 equ 20
RTC_jam_obat1 equ 21
RTC_menit_obat2 equ 22
RTC_jam_obat2 equ 23
RTC_menit_obat3 equ 24
RTC_jam_obat3 equ 25
RTC_menit_obat4 equ 26
RTC_jam_obat4 equ 27

aktif_Obat_1 equ 30H
aktif_Obat_2 equ 31H
aktif_Obat_3 equ 32H
aktif_Obat_4 equ 33H

Alamat_obat_1 equ 40H
Alamat_obat_2 equ 41H
Alamat_obat_3 equ 42H
Alamat_obat_4 equ 43H
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Program utama
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
org 0h
restart:
mov tmod,#01H
mov memori_1,#0ffh
mov memori_2,#0ffh
mov memori_3,#0ffh
mov memori_4,#0ffh

Mulai: call inisialisasi_lcd
call inisialisasi_rtc
mov dptr,#judul
call tulis_lcd
call tunda_long
call nada_alarm_1
mov dptr,#waktu
call tulis_lcd

Ulang: mov detik_lama,a
call display

Dtk: mov dptr,#secon
clr rtc_cs
movx a,@dptr
setb rtc_cs
cjne a,detik_lama,ulang
call scaning_memori_1
call scaning_memori_2
call scaning_memori_3
call scaning_memori_4
ulangan:
mov detik_lama,a
call display
jb k_menu,dtk
call setting_pilihan
jmp ulang
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
scaning_memori_1:
mov dptr,#Alamat_obat_1
call ambil_rtc_desimal
mov a,tmp
cjne a,#01,keluar_1
mov dptr,#aktif_Obat_1
call ambil_rtc_desimal
mov a,tmp
cjne a,#1,lanjut_1_1x2
call scan_obat_1_1x1
call reseter
ret
lanjut_1_1x2:
cjne a,#02,lanjut_1_1x3
call scan_obat_1_1x1
call scan_obat_1_1x3
call reseter
ret
lanjut_1_1x3:
cjne a,#03,lanjut_1_1x4
call scan_obat_1_1x1
call scan_obat_1_1x2
call scan_obat_1_1x3
call reseter
ret
lanjut_1_1x4:
cjne a,#04,keluar_1
call scan_obat_1_1x1
call scan_obat_1_1x2
call scan_obat_1_1x3
call scan_obat_1_1x4
call reseter
keluar_1:
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
scaning_memori_2:
mov dptr,#Alamat_obat_2
call ambil_rtc_desimal
mov a,tmp
cjne a,#01,keluar_2
mov dptr,#aktif_Obat_2
call ambil_rtc_desimal
mov a,tmp
cjne a,#01,lanjut_2_1x2
call scan_obat_2_1x1
call reseter
ret
lanjut_2_1x2:
cjne a,#02,lanjut_2_1x3
call scan_obat_2_1x1
call scan_obat_2_1x3
call reseter
ret
lanjut_2_1x3:
cjne a,#03,lanjut_2_1x4
call scan_obat_2_1x1
call scan_obat_2_1x2
call scan_obat_2_1x3
call reseter
ret
lanjut_2_1x4:
cjne a,#04,keluar_2
call scan_obat_2_1x1
call scan_obat_2_1x2
call scan_obat_2_1x3
call scan_obat_2_1x4
call reseter
keluar_2:
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
scaning_memori_3:
mov dptr,#Alamat_obat_3
call ambil_rtc_desimal
mov a,tmp
cjne a,#01,keluar_3
mov dptr,#aktif_Obat_3
call ambil_rtc_desimal
mov a,tmp
cjne a,#01,lanjut_3_1x2
call scan_obat_3_1x1
call reseter
ret
lanjut_3_1x2:
cjne a,#02,lanjut_3_1x3
call scan_obat_3_1x1
call scan_obat_3_1x3
call reseter
ret
lanjut_3_1x3:
cjne a,#03,lanjut_3_1x4
call scan_obat_3_1x1
call scan_obat_3_1x2
call scan_obat_3_1x3
call reseter
ret
lanjut_3_1x4:
cjne a,#04,keluar_3
call scan_obat_3_1x1
call scan_obat_3_1x2
call scan_obat_3_1x3
call scan_obat_3_1x4
call reseter
keluar_3:
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
scaning_memori_4:
mov dptr,#Alamat_obat_4
call ambil_rtc_desimal
mov a,tmp
cjne a,#01,keluar_4
mov dptr,#aktif_Obat_4
call ambil_rtc_desimal
mov a,tmp
cjne a,#01,lanjut_4_1x2
call scan_obat_4_1x1
call reseter
ret
lanjut_4_1x2:
cjne a,#02,lanjut_4_1x3
call scan_obat_4_1x1
call scan_obat_4_1x3
call reseter
ret
lanjut_4_1x3:
cjne a,#03,lanjut_4_1x4
call scan_obat_4_1x1
call scan_obat_4_1x2
call scan_obat_4_1x3
call reseter
ret
lanjut_4_1x4:
cjne a,#04,keluar_4
call scan_obat_4_1x1
call scan_obat_4_1x2
call scan_obat_4_1x3
call scan_obat_4_1x4
call reseter
keluar_4:
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Scan waktu Alarm Obat
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
scan_obat_1_1x1:
call ambil_waktu
mov a,jam_rtc
cjne a,#08,keluar_1_1x1
mov a,menit_rtc
cjne a,#00,keluar_1_1x1
jb memori_1x1,alarm_1_1x1
jmp keluar_1_1x1
alarm_1_1x1:
call tampilan_obat_1_1x1
call alarm_mulai
jb k_menu,cek_alarm_1_1x1
jnb K_menu,$
jmp berhenti_1_1x1
cek_alarm_1_1x1:
call ambil_waktu
mov a,jam_rtc
cjne a,#08,alarm_1_1x1
mov a,menit_rtc
cjne a,#01,alarm_1_1x1
setb memori_1x1
jmp matikan_1_1x1
berhenti_1_1x1:
clr memori_1x1
matikan_1_1x1:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_1_1x1:
ret

scan_obat_1_1x2:
call ambil_waktu
mov a,jam_rtc
cjne a,#14,keluar_1_1x2
mov a,menit_rtc
cjne a,#00,keluar_1_1x2
jb memori_1x2,alarm_1_1x2
jmp keluar_1_1x2
alarm_1_1x2:
call tampilan_obat_1_1x2
call alarm_mulai
jb k_menu,cek_alarm_1_1x2
jnb K_menu,$
jmp berhenti_1_1x2
cek_alarm_1_1x2:
call ambil_waktu
mov a,jam_rtc
cjne a,#14,alarm_1_1x2
mov a,menit_rtc
cjne a,#01,alarm_1_1x2
setb memori_1x2
jmp matikan_1_1x2
berhenti_1_1x2:
clr memori_1x2
matikan_1_1x2:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_1_1x2:
ret

scan_obat_1_1x3:
call ambil_waktu
mov a,jam_rtc
cjne a,#20,keluar_1_1x3
mov a,menit_rtc
cjne a,#00,keluar_1_1x3
jb memori_1x3,alarm_1_1x3
jmp keluar_1_1x3
alarm_1_1x3:
call tampilan_obat_1_1x3
call alarm_mulai
jb k_menu,cek_alarm_1_1x3
jnb K_menu,$
jmp berhenti_1_1x3
cek_alarm_1_1x3:
call ambil_waktu
mov a,jam_rtc
cjne a,#20,alarm_1_1x3
mov a,menit_rtc
cjne a,#01,alarm_1_1x3
setb memori_1x3
jmp matikan_1_1x3
berhenti_1_1x3:
clr memori_1x3
matikan_1_1x3:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_1_1x3:
ret

scan_obat_1_1x4:
call ambil_waktu
mov a,jam_rtc
cjne a,#02,keluar_1_1x4
mov a,menit_rtc
cjne a,#00,keluar_1_1x4
jb memori_1x4,alarm_1_1x4
jmp keluar_1_1x4
alarm_1_1x4:
call tampilan_obat_1_1x4
call alarm_mulai
jb k_menu,cek_alarm_1_1x4
jnb K_menu,$
jmp berhenti_1_1x4
cek_alarm_1_1x4:
call ambil_waktu
mov a,jam_rtc
cjne a,#02,alarm_1_1x4
mov a,menit_rtc
cjne a,#01,alarm_1_1x4
setb memori_1x4
jmp matikan_1_1x4
berhenti_1_1x4:
clr memori_1x4
matikan_1_1x4:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_1_1x4:
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
scan_obat_2_1x1:
call ambil_waktu
mov a,jam_rtc
cjne a,#08,keluar_2_1x1
mov a,menit_rtc
cjne a,#02,keluar_2_1x1
jb memori_2x1,alarm_2_1x1
jmp keluar_2_1x1
alarm_2_1x1:
call tampilan_obat_2_1x1
call alarm_mulai
jb k_menu,cek_alarm_2_1x1
jnb K_menu,$
jmp berhenti_2_1x1
cek_alarm_2_1x1:
call ambil_waktu
mov a,jam_rtc
cjne a,#08,alarm_2_1x1
mov a,menit_rtc
cjne a,#03,alarm_2_1x1
setb memori_2x1
jmp matikan_2_1x1
berhenti_2_1x1:
clr memori_2x1
matikan_2_1x1:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_2_1x1:
ret

scan_obat_2_1x2:
call ambil_waktu
mov a,jam_rtc
cjne a,#14,keluar_2_1x2
mov a,menit_rtc
cjne a,#02,keluar_2_1x2
jb memori_2x2,alarm_2_1x2
jmp keluar_2_1x2
alarm_2_1x2:
call tampilan_obat_2_1x2
call alarm_mulai
jb k_menu,cek_alarm_2_1x2
jnb K_menu,$
jmp berhenti_2_1x2
cek_alarm_2_1x2:
call ambil_waktu
mov a,jam_rtc
cjne a,#14,alarm_2_1x2
mov a,menit_rtc
cjne a,#03,alarm_2_1x2
setb memori_2x2
jmp matikan_2_1x2
berhenti_2_1x2:
clr memori_2x2
matikan_2_1x2:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_2_1x2:
ret

scan_obat_2_1x3:
call ambil_waktu
mov a,jam_rtc
cjne a,#20,keluar_2_1x3
mov a,menit_rtc
cjne a,#02,keluar_2_1x3
jb memori_2x3,alarm_2_1x3
jmp keluar_2_1x3
alarm_2_1x3:
call tampilan_obat_2_1x3
call alarm_mulai
jb k_menu,cek_alarm_2_1x3
jnb K_menu,$
jmp berhenti_2_1x3
cek_alarm_2_1x3:
call ambil_waktu
mov a,jam_rtc
cjne a,#20,alarm_2_1x3
mov a,menit_rtc
cjne a,#03,alarm_2_1x3
setb memori_2x3
jmp matikan_2_1x3
berhenti_2_1x3:
clr memori_2x3
matikan_2_1x3:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_2_1x3:
ret

scan_obat_2_1x4:
call ambil_waktu
mov a,jam_rtc
cjne a,#02,keluar_2_1x4
mov a,menit_rtc
cjne a,#02,keluar_2_1x4
jb memori_2x4,alarm_2_1x4
jmp keluar_2_1x4
alarm_2_1x4:
call tampilan_obat_2_1x4
call alarm_mulai
jb k_menu,cek_alarm_2_1x4
jnb K_menu,$
jmp berhenti_2_1x4
cek_alarm_2_1x4:
call ambil_waktu
mov a,jam_rtc
cjne a,#02,alarm_2_1x4
mov a,menit_rtc
cjne a,#03,alarm_2_1x4
setb memori_2x4
jmp matikan_2_1x4
berhenti_2_1x4:
clr memori_2x4
matikan_2_1x4:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_2_1x4:
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
scan_obat_3_1x1:
call ambil_waktu
mov a,jam_rtc
cjne a,#08,keluar_3_1x1
mov a,menit_rtc
cjne a,#04,keluar_3_1x1
jb memori_3x1,alarm_3_1x1
jmp keluar_3_1x1
alarm_3_1x1:
call tampilan_obat_3_1x1
call alarm_mulai
jb k_menu,cek_alarm_3_1x1
jnb K_menu,$
jmp berhenti_3_1x1
cek_alarm_3_1x1:
call ambil_waktu
mov a,jam_rtc
cjne a,#08,alarm_3_1x1
mov a,menit_rtc
cjne a,#05,alarm_3_1x1
setb memori_3x1
jmp matikan_3_1x1
berhenti_3_1x1:
clr memori_3x1
matikan_3_1x1:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_3_1x1:
ret

scan_obat_3_1x2:
call ambil_waktu
mov a,jam_rtc
cjne a,#14,keluar_3_1x2
mov a,menit_rtc
cjne a,#04,keluar_3_1x2
jb memori_3x2,alarm_3_1x2
jmp keluar_3_1x2
alarm_3_1x2:
call tampilan_obat_3_1x2
call alarm_mulai
jb k_menu,cek_alarm_3_1x2
jnb K_menu,$
jmp berhenti_3_1x2
cek_alarm_3_1x2:
call ambil_waktu
mov a,jam_rtc
cjne a,#14,alarm_3_1x2
mov a,menit_rtc
cjne a,#05,alarm_3_1x2
setb memori_3x2
jmp matikan_3_1x2
berhenti_3_1x2:
clr memori_3x2
matikan_3_1x2:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_3_1x2:
ret

scan_obat_3_1x3:
call ambil_waktu
mov a,jam_rtc
cjne a,#20,keluar_3_1x3
mov a,menit_rtc
cjne a,#04,keluar_3_1x3
jb memori_3x3,alarm_3_1x3
jmp keluar_3_1x3
alarm_3_1x3:
call tampilan_obat_3_1x3
call alarm_mulai
jb k_menu,cek_alarm_3_1x3
jnb K_menu,$
jmp berhenti_3_1x3
cek_alarm_3_1x3:
call ambil_waktu
mov a,jam_rtc
cjne a,#20,alarm_3_1x3
mov a,menit_rtc
cjne a,#05,alarm_3_1x3
setb memori_3x3
jmp matikan_3_1x3
berhenti_3_1x3:
clr memori_3x3
matikan_3_1x3:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_3_1x3:
ret

scan_obat_3_1x4:
call ambil_waktu
mov a,jam_rtc
cjne a,#02,keluar_3_1x4
mov a,menit_rtc
cjne a,#04,keluar_3_1x4
jb memori_3x4,alarm_3_1x4
jmp keluar_3_1x4
alarm_3_1x4:
call tampilan_obat_3_1x4
call alarm_mulai
jb k_menu,cek_alarm_3_1x4
jnb K_menu,$
jmp berhenti_3_1x4
cek_alarm_3_1x4:
call ambil_waktu
mov a,jam_rtc
cjne a,#02,alarm_3_1x4
mov a,menit_rtc
cjne a,#05,alarm_3_1x4
setb memori_3x4
jmp matikan_3_1x4
berhenti_3_1x4:
clr memori_3x4
matikan_3_1x4:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_3_1x4:
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
scan_obat_4_1x1:
call ambil_waktu
mov a,jam_rtc
cjne a,#08,keluar_4_1x1
mov a,menit_rtc
cjne a,#06,keluar_4_1x1
jb memori_4x1,alarm_4_1x1
jmp keluar_4_1x1
alarm_4_1x1:
call tampilan_obat_4_1x1
call alarm_mulai
jb k_menu,cek_alarm_4_1x1
jnb K_menu,$
jmp berhenti_4_1x1
cek_alarm_4_1x1:
call ambil_waktu
mov a,jam_rtc
cjne a,#08,alarm_4_1x1
mov a,menit_rtc
cjne a,#07,alarm_4_1x1
setb memori_4x1
jmp matikan_4_1x1
berhenti_4_1x1:
clr memori_4x1
matikan_4_1x1:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_4_1x1:
ret

scan_obat_4_1x2:
call ambil_waktu
mov a,jam_rtc
cjne a,#14,keluar_4_1x2
mov a,menit_rtc
cjne a,#06,keluar_4_1x2
jb memori_4x2,alarm_4_1x2
jmp keluar_4_1x2
alarm_4_1x2:
call tampilan_obat_4_1x2
call alarm_mulai
jb k_menu,cek_alarm_4_1x2
jnb K_menu,$
jmp berhenti_4_1x2
cek_alarm_4_1x2:
call ambil_waktu
mov a,jam_rtc
cjne a,#14,alarm_4_1x2
mov a,menit_rtc
cjne a,#07,alarm_4_1x2
setb memori_4x2
jmp matikan_4_1x2
berhenti_4_1x2:
clr memori_4x2
matikan_4_1x2:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_4_1x2:
ret

scan_obat_4_1x3:
call ambil_waktu
mov a,jam_rtc
cjne a,#20,keluar_4_1x3
mov a,menit_rtc
cjne a,#06,keluar_4_1x3
jb memori_4x3,alarm_4_1x3
jmp keluar_4_1x3
alarm_4_1x3:
call tampilan_obat_4_1x3
call alarm_mulai
jb k_menu,cek_alarm_4_1x3
jnb K_menu,$
jmp berhenti_4_1x3
cek_alarm_4_1x3:
call ambil_waktu
mov a,jam_rtc
cjne a,#20,alarm_4_1x3
mov a,menit_rtc
cjne a,#07,alarm_4_1x3
setb memori_4x3
jmp matikan_4_1x3
berhenti_4_1x3:
clr memori_4x3
matikan_4_1x3:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_4_1x3:
ret

scan_obat_4_1x4:
call ambil_waktu
mov a,jam_rtc
cjne a,#02,keluar_4_1x4
mov a,menit_rtc
cjne a,#06,keluar_4_1x4
jb memori_4x4,alarm_4_1x4
jmp keluar_4_1x4
alarm_4_1x4:
call tampilan_obat_4_1x4
call alarm_mulai
jb k_menu,cek_alarm_4_1x4
jnb K_menu,$
jmp berhenti_4_1x4
cek_alarm_4_1x4:
call ambil_waktu
mov a,jam_rtc
cjne a,#02,alarm_4_1x4
mov a,menit_rtc
cjne a,#07,alarm_4_1x4
setb memori_4x4
jmp matikan_4_1x4
berhenti_4_1x4:
clr memori_4x4
matikan_4_1x4:
clr speaker
mov dptr,#waktu
call tulis_lcd
ret
keluar_4_1x4:
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
tampilan_obat_1_1x1:
mov dptr,#alarm_obat1_1
call tulis_lcd
ret
tampilan_obat_1_1x2:
mov dptr,#alarm_obat1_2
call tulis_lcd
ret
tampilan_obat_1_1x3:
mov dptr,#alarm_obat1_3
call tulis_lcd
ret
tampilan_obat_1_1x4:
mov dptr,#alarm_obat1_4
call tulis_lcd
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
tampilan_obat_2_1x1:
mov dptr,#alarm_obat2_1
call tulis_lcd
ret
tampilan_obat_2_1x2:
mov dptr,#alarm_obat2_2
call tulis_lcd
ret
tampilan_obat_2_1x3:
mov dptr,#alarm_obat2_3
call tulis_lcd
ret
tampilan_obat_2_1x4:
mov dptr,#alarm_obat2_4
call tulis_lcd
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
tampilan_obat_3_1x1:
mov dptr,#alarm_obat3_1
call tulis_lcd
ret
tampilan_obat_3_1x2:
mov dptr,#alarm_obat3_2
call tulis_lcd
ret
tampilan_obat_3_1x3:
mov dptr,#alarm_obat3_3
call tulis_lcd
ret
tampilan_obat_3_1x4:
mov dptr,#alarm_obat3_4
call tulis_lcd
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
tampilan_obat_4_1x1:
mov dptr,#alarm_obat4_1
call tulis_lcd
ret
tampilan_obat_4_1x2:
mov dptr,#alarm_obat4_2
call tulis_lcd
ret
tampilan_obat_4_1x3:
mov dptr,#alarm_obat4_3
call tulis_lcd
ret
tampilan_obat_4_1x4:
mov dptr,#alarm_obat4_4
call tulis_lcd
ret

reseter:
call ambil_waktu
mov a,jam_rtc
cjne a,#0,keluar
mov a,menit_rtc
cjne a,#0,keluar
mov memori_1,#0ffh
mov memori_2,#0ffh
mov memori_3,#0ffh
mov memori_4,#0ffh
keluar: ret

alarm_mulai:
call nada_alarm_1
call nada_alarm_2
call nada_alarm_3
ret
ambil_waktu:
mov dptr,#hour
call ambil_rtc_desimal
mov jam_rtc,tmp
mov dptr,#minute
call ambil_rtc_desimal
mov menit_rtc,tmp
ret
ambil_detik:
mov dptr,#secon
call ambil_rtc_desimal
mov detik_rtc,tmp
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Nada alarm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
nada_alarm_1:
mov bebas,#0
mulai_nada_1:
mov th0,#high nada_1
mov tl0,#high nada_1
setb tr0
jnb tf0,$
clr tr0
clr tf0
cpl speaker
djnz bebas,mulai_nada_1
ret
nada_alarm_2:
mov bebas,#0
mulai_nada_2:
mov th0,#high nada_2
mov tl0,#high nada_2
setb tr0
jnb tf0,$
clr tr0
clr tf0
cpl speaker
djnz bebas,mulai_nada_2
ret
nada_alarm_3:
mov bebas,#0
mulai_nada_3:
mov th0,#high nada_3
mov tl0,#high nada_3
setb tr0
jnb tf0,$
clr tr0
clr tf0
cpl speaker
djnz bebas,mulai_nada_3
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Tampilan utama LCD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Display:
mov a,#80h
call write_inst
T_hari:
mov dptr,#day_week
clr rtc_cs
movx a,@dptr
setb rtc_cs
mov dptr,#hari
dec a
mov b,#6
mul ab
mov tmp,#6
mov tmp1,a
T_hari_2:
mov a,tmp1
movc a,@a+dptr
call write_data
inc dptr
djnz tmp,T_hari_2
mov a,#20h
call write_data
mov a,#088h
call write_inst
T_jam:
mov dptr,#hour
call ambil_data_rtc
mov a,#’:’
call write_data
T_menit:
mov dptr,#minute
call ambil_data_rtc
mov a,#’:’
call write_data
T_detik:
mov dptr,#secon
call ambil_data_rtc
T_tanggal:
mov a,#0c0h
call write_inst
mov dptr,#day_month
call ambil_data_rtc
mov a,#’ ‘
call write_data
T_bulan:
mov dptr,#month
clr rtc_cs
movx a,@dptr
setb rtc_cs
mov dptr,#bulan
dec a
mov b,#8
mul ab
mov tmp,#8
mov tmp1,a
T_bulan_2:
mov a,tmp1
movc a,@a+dptr
call write_data
inc dptr
djnz tmp,T_bulan_2
mov a,#20h
call write_data
mov a,#0ceh
call write_inst
T_tahun:
mov dptr,#year
call ambil_data_rtc
mov p0,#0ffh
exit0:
ret
disp_set:
mov a,#0cah
call write_inst
call ambil_data_rtc
ret
disp_setting:
mov a,#0c1h
call write_inst
call ambil_data_rtc
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Settingan tombol pilihan
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_pilihan:
mov dptr,#rtc0
call tulis_lcd
pilihan_set_jam:
mov tmp1,#0
jb k_up,pilihan_set_timer
bounce_p1a:
jnb k_up,$
djnz tmp1,bounce_p1a
call tunda_long
call setting_1
ret
pilihan_set_timer:
mov tmp1,#0
jb k_down,keluar_pilihan
bounce_p1b:
jnb k_down,$
djnz tmp1,bounce_p1b
call tunda_long
call setting_timer
ret
keluar_pilihan:
jb k_next,pilihan_set_jam
jmp setting_7
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Settingan tombol alarm obat
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
setting_timer:
mov almcount,#0
mov dptr,#Obat_aktif_1
call tulis_lcd
mov dptr,#Alamat_obat_1
mov tmp1,#0
bou_t1a:
jnb k_menu,$
djnz tmp1,bou_t1a
Setting_t1a:
call disp_setting
set_t1a:
jb k_next,set_t2a
inc almcount
jnb k_next,$
jmp Setting_t2
set_t2a:
jb k_up,set_t3a
mov p0,#0ffh
call up_aktif
jmp setting_t1a
set_t3a:
jb k_down,set_t4a
mov p0,#0ffh
call down_aktif
jmp setting_t1a
set_t4a:
mov tmp1,#0
bou_t1b:
jb k_next,setting_t1a
djnz tmp1,bou_t1b
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_t2:
jnb k_next,$
mov dptr,#obat_jenis_1
call tulis_lcd
mov dptr,#aktif_Obat_1
Setting_t2a:
call disp_setting
set_t1b:
jb k_next,set_t2b
inc almcount
jnb k_next,$
jmp setting_t3
set_t2b:
jb k_up,set_t3b
mov p0,#0ffh
call up_jenis
jmp setting_t2a
set_t3b:
jb k_down,setting_t2a
mov p0,#0ffh
call down_jenis
jmp setting_t2a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_t3:
jnb k_next,$
mov dptr,#Obat_aktif_2
call tulis_lcd
mov dptr,#Alamat_obat_2
Setting_t3a:
call disp_setting
set_t1c:
jb k_next,set_t2c
inc almcount
jnb k_next,$
jmp setting_t4
set_t2c:
jb k_up,set_t3c
mov p0,#0ffh
call up_aktif
jmp setting_t3a
set_t3c:
jb k_down,setting_t3a
mov p0,#0ffh
call down_aktif
jmp setting_t3a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_t4:
jnb k_next,$
mov dptr,#obat_jenis_2
call tulis_lcd
mov dptr,#aktif_Obat_2
Setting_t4a:
call disp_setting
set_t1d:
jb k_next,set_t2d
inc almcount
jnb k_next,$
jmp setting_t5
set_t2d:
jb k_up,set_t3d
mov p0,#0ffh
call up_jenis
jmp setting_t4a
set_t3d:
jb k_down,setting_t4a
mov p0,#0ffh
call down_jenis
jmp setting_t4a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_t5:
jnb k_next,$
mov dptr,#Obat_aktif_3
call tulis_lcd
mov dptr,#Alamat_obat_3
Setting_t5a:
call disp_setting
set_t1e:
jb k_next,set_t2e
inc almcount
jnb k_next,$
jmp setting_t6
set_t2e:
jb k_up,set_t3e
mov p0,#0ffh
call up_aktif
jmp setting_t5a
set_t3e:
jb k_down,setting_t5a
mov p0,#0ffh
call down_aktif
jmp setting_t5a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_t6:
jnb k_next,$
mov dptr,#obat_jenis_3
call tulis_lcd
mov dptr,#aktif_Obat_3
Setting_t6a:
call disp_setting
set_t1f:
jb k_next,set_t2f
inc almcount
jnb k_next,$
jmp setting_t7
set_t2f:
jb k_up,set_t3f
mov p0,#0ffh
call up_jenis
jmp setting_t6a
set_t3f:
jb k_down,setting_t6a
mov p0,#0ffh
call down_jenis
jmp setting_t6a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_t7:
jnb k_next,$
mov dptr,#Obat_aktif_4
call tulis_lcd
mov dptr,#Alamat_obat_4
Setting_t7a:
call disp_setting
set_t1g:
jb k_next,set_t2g
inc almcount
jnb k_next,$
jmp setting_t8
set_t2g:
jb k_up,set_t3g
mov p0,#0ffh
call up_aktif
jmp setting_t7a
set_t3g:
jb k_down,setting_t7a
mov p0,#0ffh
call down_aktif
jmp setting_t7a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_t8:
jnb k_next,$
mov dptr,#obat_jenis_4
call tulis_lcd
mov dptr,#aktif_Obat_4
Setting_t8a:
call disp_setting
set_t1h:
jb k_next,set_t2h
inc almcount
jnb k_next,$
jmp setting_7
set_t2h:
jb k_up,set_t3h
mov p0,#0ffh
call up_jenis
jmp setting_t8a
set_t3h:
jb k_down,setting_t8a
mov p0,#0ffh
call down_jenis
jmp setting_t8a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Settingan tombol jam dan kalender
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_1:
mov almcount,#0
mov dptr,#rtc1
call tulis_lcd
mov dptr,#hour
mov tmp1,#0
bounce_1a:
jnb k_menu,$
djnz tmp1,bounce_1a
Setting_1a:
call disp_set
cekset_1a:
jb k_next,cekset_2a
inc almcount
jnb k_next,$
jmp setting_2
cekset_2a:
jb k_up,cekset_3a
mov p0,#0ffh
call up_jam
jmp setting_1a
cekset_3a:
jb k_down,cekset_4a
mov p0,#0ffh
call down_jam
jmp setting_1a
cekset_4a:
mov tmp1,#0
bounce_1b:
jb k_next,setting_1a
djnz tmp1,bounce_1b
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_2:
jnb k_next,$
mov dptr,#rtc2
call tulis_lcd
mov dptr,#minute
Setting_2a:
call disp_set
cekset_1b:
jb k_next,cekset_2b
inc almcount
jnb k_next,$
jmp setting_3
cekset_2b:
jb k_up,cekset_3b
mov p0,#0ffh
call up_menit
jmp setting_2a
cekset_3b:
jb k_down,setting_2a
mov p0,#0ffh
call down_menit
jmp setting_2a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_3:
jnb k_next,$
mov dptr,#rtc3
call tulis_lcd
setting_3a:
mov a,#0c8h
call write_inst
mov dptr,#day_week
clr rtc_cs
movx a,@dptr
setb rtc_cs
mov dptr,#hari
dec a
mov b,#6
mul ab
mov tmp,#6
mov tmp1,a
Setting_3b:
mov a,tmp1
movc a,@a+dptr
call write_data
inc dptr
djnz tmp,setting_3b
cekset_1c:
mov dptr,#day_week
jb k_next,cekset_2c
inc almcount
jnb k_next,$
jmp setting_4
cekset_2c:
jb k_up,cekset_3c
mov p0,#0ffh
call up_day
jmp setting_3a
cekset_3c:
jb k_down,cekset_1c
mov p0,#0ffh
call down_day
jmp setting_3a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_4:
jnb k_next,$
mov dptr,#rtc4
call tulis_lcd
mov dptr,#day_month
Setting_4a:
call disp_set
cekset_1d:
jb k_next,cekset_2d
inc almcount
jnb k_next,$
jmp setting_5
cekset_2d:
jb k_up,cekset_3d
mov p0,#0ffh
call up_day_month
jmp setting_4a
cekset_3d:
jb k_down,setting_4a
mov p0,#0ffh
call down_day_month
jmp setting_4a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_5:
jnb k_next,$
mov dptr,#rtc5
call tulis_lcd
setting_5a:
mov a,#0c7h
call write_inst
mov dptr,#month
clr rtc_cs
movx a,@dptr
setb rtc_cs
mov dptr,#bulan
dec a
mov b,#8
mul ab
mov tmp,#8
mov tmp1,a
Setting_5b:
mov a,tmp1
movc a,@a+dptr
call write_data
inc dptr
djnz tmp,setting_5b
cekset_1e:
mov dptr,#month
jb k_next,cekset_2e
inc almcount
jnb k_next,$
jmp setting_6
cekset_2e:
jb k_up,cekset_3e
mov p0,#0ffh
call up_month
jmp setting_5a
cekset_3e:
jb k_down,cekset_1e
mov p0,#0ffh
call down_month
jmp setting_5a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_6:
jnb k_next,$
mov dptr,#rtc6
call tulis_lcd
mov dptr,#year
Setting_6a:
mov a,#0cch
call write_inst
call ambil_data_rtc
cekset_1f:
jb k_next,cekset_2f
inc almcount
jnb k_next,$
jmp setting_7
cekset_2f:
jb k_up,cekset_3f
mov p0,#0ffh
call up_year
jmp setting_6a
cekset_3f:
jb k_down,setting_6a
mov p0,#0ffh
call down_year
jmp setting_6a
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Setting_7:
mov tmp1,#0
bounce_7a:
jnb k_next,$
djnz tmp1,bounce_7a
bounce_7b:
jnb k_menu,$
djnz tmp1,bounce_7b
mov dptr,#waktu
call tulis_lcd
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Baca rtc up rtc down dan tulis rtc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Baca_rtc_up:
mov r7,#25
Bounce_up:
jb k_up,exit
djnz r7,bounce_up
baca_up:
clr rtc_cs
movx a,@dptr
setb rtc_cs
inc a
ret
Baca_rtc_down:
mov r7,#25
baca_down:
jb k_down,exit
djnz r7,baca_down
clr rtc_cs
movx a,@dptr
setb rtc_cs
dec a
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Tulis_rtc:
clr rtc_cs
movx @dptr,a
setb rtc_cs
Tunggu_tombol_dilepas:
ca:
mov r7,#25
cc:
jnb k_up,ca
jnb k_down,ca
djnz r7,cc
exit:
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin tambah & kurangi waktu aktif
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Up_aktif:
call baca_rtc_up
cjne a,#02,cek_01
cek_01:
jc belum_01
clr a
belum_01:
jmp tulis_rtc

Down_aktif:
call baca_rtc_down
cjne a,#0ffh,aktif_255
mov a,#01
aktif_255:
jmp tulis_rtc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin tambah & kurangi jenis obat
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Up_jenis:
call baca_rtc_up
cjne a,#05,cek_04
cek_04:
jc belum_04
clr a
belum_04:
jmp tulis_rtc

Down_jenis:
call baca_rtc_down
cjne a,#0ffh,jenis_255
mov a,#04
jenis_255:
jmp tulis_rtc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin tambah & kurangi menit
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Up_menit:
call baca_rtc_up
cjne a,#59,cek_59
cek_59:
jc belum_59
clr a
belum_59:
jmp tulis_rtc

Down_menit:
call baca_rtc_down
cjne a,#0ffh,m_255
mov a,#59
m_255:
jmp tulis_rtc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin tambah & kurangi jam
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Up_jam:
call baca_rtc_up
cjne a,#24,cek_24
cek_24:
jc belum_24
clr a
belum_24:
jmp tulis_rtc

Down_jam:
call baca_rtc_down
cjne a,#0ffh,j_255
mov a,#23
j_255:
jmp tulis_rtc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin tambah & kurangi hari dlm seminggu
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Up_day:
call baca_rtc_up
cjne a,#8,cek_7
cek_7:
jc belum_7
clr a
inc a
belum_7:
jmp tulis_rtc

Down_day:
call baca_rtc_down
jnz bukan_0_day
mov a,#7
bukan_0_day:
jmp tulis_rtc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin tambah & kurangi hari dlm sebulan
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Up_day_month:
call baca_rtc_up
cjne a,#32,cek_31
cek_31:
jc belum_31
clr a
inc a
belum_31:
jmp tulis_rtc

Down_day_month:
call baca_rtc_down
jnz bukan_0_daymonth
mov a,#31
bukan_0_daymonth:
jmp tulis_rtc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin tambah & kurangi bulan
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Up_month:
call baca_rtc_up
cjne a,#13,cek_12
cek_12:
jc belum_12
clr a
inc a
belum_12:
jmp tulis_rtc

Down_month:
call baca_rtc_down
jnz bukan_0_month
mov a,#12
bukan_0_month:
jmp tulis_rtc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin tambah & kurangi tahun
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Up_year:
call baca_rtc_up
cjne a,#100,cek_99
cek_99:
jc belum_99
clr a
belum_99:
jmp tulis_rtc

Down_year:
call baca_rtc_down
cjne a,#0ffh,y_255
mov a,#99
y_255:
jmp tulis_rtc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; inisialisasi LCD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Inisialisasi_LCD:
mov a,#03fh
call write_inst
call write_inst
mov a,#0dh
call write_inst
mov a,#06h
call write_inst
mov a,#01h
call write_inst
mov a,#0ch
call write_inst
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; inisialisasi RTC
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Inisialisasi_rtc:
clr rtc_cs
; reg a = UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
; REG B = SET PIE AIE UIE SQWE DM 24/12 DSE
mov r0,#reg_a
mov a,#00101111b
movx @r0,a
inc r0
mov a,#00001110b
movx @r0,a
clr a
setb rtc_cs
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Ambil data rtc dan tulis ke lcd
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Ambil_data_rtc:
clr rtc_cs
movx a,@dptr
setb rtc_cs
mov decl,a
call hextodec
mov tmp,a
swap a
anl a,#0fh
orl a,#30h
call write_data
mov a,tmp
anl a,#0fh
orl a,#30h
call write_data
ret
Ambil_rtc_desimal:
clr rtc_cs
movx a,@dptr
setb rtc_cs
mov tmp,a
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin menulis instruksi ke lcd
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
write_inst:
clr lcd_rs
setb lcd_cs
mov p0,a
wrdt:
clr lcd_cs
setb lcd_cs
call delay
mov p0,#0ffh
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin menulis data ke lcd
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
write_data:
setb lcd_rs
setb lcd_cs
trsa:
mov p0,a
jmp wrdt
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; tulis 16 char di baris lcd atas
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Tulis_lcd_atas:
mov a,#80h
tlcdb:
mov r3,#16
call write_inst
tulis1:
clr a
movc a,@a+dptr
call write_data
inc dptr
djnz r3,tulis1
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; tulis 16 char di baris lcd bawah
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Tulis_lcd_bawah:
mov a,#0c0h
jmp tlcdb
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; tulis 32 char di baris lcd
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Tulis_lcd:
call tulis_lcd_atas
call tulis_lcd_bawah
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; konversi heksa ke desimal
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
hextodec:
mov psw,#0
clr c
mov dech,#0
mov a,decl
swap a
anl a,#0fh ;00001111
mov tmp,a
jz sudah_ditambah
clr a
tambah_16:
add a,#16h ;22 d
da a
mov r2,a
clr a
addc a,dech
mov dech,a
mov a,r2
djnz tmp,tambah_16
sudah_ditambah:
mov tmp,a
mov a,decl
anl a,#0fh
da a
add a,tmp
da a
mov decl,a
; desimal hanya di bawah 100
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Rutin delay
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
delay:
mov del1,#5
delay1:
mov del2,#0
djnz del2,$
djnz del1,delay1
ret
ldelay:
mov del1,#0
call delay1
call delay1
ret
TUNDA_LONG:
MOV R5,#010H
JJz:
CALL TUNDAan
DJNZ R5,JJz
RET
TUNDAan:
MOV R7,#100
LD11:
DJNZ R6,$
DJNZ R7,LD11
RET
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Data
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Judul:db ‘ Alarm Pengingat’,'~Efqi Voluntoro~’

alarm_obat1_1:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 1 ‘
alarm_obat1_2:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 1 ‘
alarm_obat1_3:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 1 ‘
alarm_obat1_4:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 1 ‘

alarm_obat2_1:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 2 ‘
alarm_obat2_2:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 2 ‘
alarm_obat2_3:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 2 ‘
alarm_obat2_4:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 2 ‘

alarm_obat3_1:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 3 ‘
alarm_obat3_2:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 3 ‘
alarm_obat3_3:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 3 ‘
alarm_obat3_4:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 3 ‘

alarm_obat4_1:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 4 ‘
alarm_obat4_2:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 4 ‘
alarm_obat4_3:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 4 ‘
alarm_obat4_4:db ‘ Alarm Berbunyi ‘,’ Obat Jenis 4 ‘

Waktu:db ‘ ‘,’ 20 ‘
Rtc0: db ‘Up ~Atur Waktu’,'Down ~Atur Alarm’
Rtc1: db ‘ Set 1 ‘,’Jam = [ ] ‘
Rtc2: db ‘ Set 2 ‘,’Menit = [ ] ‘
Rtc3: db ‘ Set 3 ‘,’Hari = [ ]‘
Rtc4: db ‘ Set 4 ‘,’Tanggal= [ ] ‘
Rtc5: db ‘ Set 5 ‘,’Bulan=[ ]‘
Rtc6: db ‘ Set 6 ‘,’Tahun = [20 ] ‘

obat_aktif_1:db ‘Obat 1 00 = Non ‘,’[ ] 01 = Aktf’
obat_aktif_2:db ‘Obat 2 00 = Non ‘,’[ ] 01 = Aktf’
obat_aktif_3:db ‘Obat 3 00 = Non ‘,’[ ] 01 = Aktf’
obat_aktif_4:db ‘Obat 4 00 = Non ‘,’[ ] 01 = Aktf’

obat_jenis_1:db ‘Jdwl x1=01,x2=02′,’[ ] x3=03,x4=04′
obat_jenis_2:db ‘Jdwl x1=01,x2=02′,’[ ] x3=03,x4=04′
obat_jenis_3:db ‘Jdwl x1=01,x2=02′,’[ ] x3=03,x4=04′
obat_jenis_4:db ‘Jdwl x1=01,x2=02′,’[ ] x3=03,x4=04′

Hari: db ‘Minggu’
db ‘Senin ‘
db ‘Selasa’
db ‘Rabu ‘
db ‘Kamis ‘
db ‘Jumat ‘
db ‘Sabtu ‘

Bulan: db ‘Januari ‘
db ‘Februari’
db ‘Maret ‘
db ‘April ‘
db ‘Mei ‘
db ‘Juni ‘
db ‘Juli ‘
db ‘Agustus ‘
db ‘Sptember’
db ‘Oktober ‘
db ‘November’
db ‘Desember’
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
END

Power Supply


Power Supply (Catu Daya)

1. Prinsip Kerja Catu Daya Linear

Perangkat elektronika mestinya dicatu oleh suplai arus searah DC (direct current) yang stabil agar dapat bekerja dengan baik. Baterai atau accu adalah sumber catu daya DC yang paling baik. Namun untuk aplikasi yang membutuhkan catu daya lebih besar, sumber dari baterai tidak cukup. Sumber catu daya yang besar adalah sumber bolak-balik AC (alternating current) dari pembangkit tenaga listrik. Untuk itu diperlukan suatu perangkat catu daya yang dapat mengubah arus AC menjadi DC. Pada tulisan kali ini disajikan prinsip rangkaian catu daya (power supply) linier mulai dari rangkaian penyearah yang paling sederhana sampai pada catu daya yang ter-regulasi.

2. PENYEARAH (RECTIFIER)

Prinsip penyearah (rectifier) yang paling sederhana ditunjukkan pada gambar-1 berikut ini. Transformator (T1) diperlukan untuk menurunkan tegangan AC dari jala-jala listrik pada kumparan primernya menjadi tegangan AC yang lebih kecil pada kumparan sekundernya.

Rangkaian Penyearah

Pada rangkaian ini, dioda (D1) berperan hanya untuk merubah dari arus AC menjadi DC dan meneruskan tegangan positif ke beban R1. Ini yang disebut dengan penyearah setengah gelombang (half wave). Untuk mendapatkan penyearah gelombang penuh (full wave) diperlukan transformator dengan center tap (CT) seperti pada gambar-2.

Gelombang Penuh

Tegangan positif phasa yang pertama diteruskan oleh D1 sedangkan phasa yang berikutnya dilewatkan melalui D2 ke beban R1 dengan CT transformator sebagai common ground.. Dengan demikian beban R1 mendapat suplai tegangan gelombang penuh seperti gambar di atas. Untuk beberapa aplikasi seperti misalnya untuk men-catu motor dc yang kecil atau lampu pijar dc, bentuk tegangan seperti ini sudah cukup memadai. Walaupun terlihat di sini tegangan ripple dari kedua rangkaian di atas masih sangat besar.

Gelombang Setengah dengan Filter C

Gambar 3 adalah rangkaian penyearah setengah gelombang dengan filter kapasitor C yang paralel terhadap beban R. Ternyata dengan filter ini bentuk gelombang tegangan keluarnya bisa menjadi rata. Gambar-4 menunjukkan bentuk keluaran tegangan DC dari rangkaian penyearah setengah gelombang dengan filter kapasitor. Garis b-c kira-kira adalah garis lurus dengan kemiringan tertentu, dimana pada keadaan ini arus untuk beban R1 dicatu oleh tegangan kapasitor. Sebenarnya garis b-c bukanlah garis lurus tetapi eksponensial sesuai dengan sifat pengosongan kapasitor.

Bentuk Gelombang

Kemiringan kurva b-c tergantung dari besar arus (I) yang mengalir ke beban R. Jika arus I = 0 (tidak ada beban) maka kurva b-c akan membentuk garis horizontal. Namun jika beban arus semakin besar, kemiringan kurva b-c akan semakin tajam. Tegangan yang keluar akan berbentuk gigi gergaji dengan tegangan ripple yang besarnya adalah :

Vr = VM -VL

dan tegangan dc ke beban adalah Vdc = VM + Vr/2

Rangkaian penyearah yang baik adalah rangkaian yang memiliki tegangan ripple (Vr) paling kecil. VL adalah tegangan discharge atau pengosongan kapasitor C, sehingga dapat ditulis :

VL = VM e -T/RC

Jika persamaan (3) disubsitusi ke rumus (1), maka diperole

Vr = VM (1 – e -T/RC)

Jika T << RC, dapat ditulis : e -T/RC  1 – T/RC

sehingga jika ini disubsitusi ke rumus (4) dapat diperoleh persamaan yang lebih sederhana :

Vr = VM(T/RC)

VM/R tidak lain adalah beban I, sehingga dengan ini terlihat hubungan antara beban arus I dan nilai kapasitor C terhadap tegangan ripple Vr. Perhitungan ini efektif untuk mendapatkan nilai tegangan ripple yang diinginkan.

Vr = I T/C

Rumus ini mengatakan, jika arus beban I semakin besar, maka tegangan ripple akan semakin besar. Sebaliknya jika kapasitansi C semakin besar, tegangan ripple akan semakin kecil. Untuk penyederhanaan biasanya dianggap T=Tp, yaitu periode satu gelombang sinus dari jala-jala listrik yang frekuensinya 50Hz atau 60Hz. Jika frekuensi jala-jala listrik 50Hz, maka T = Tp = 1/f = 1/50 = 0.02 det. Ini berlaku untuk penyearah setengah gelombang. Untuk penyearah gelombang penuh, tentu saja frekuensi gelombangnya dua kali lipat, sehingga T = 1/2 Tp = 0.01 det.

Penyearah gelombang penuh dengan filter C dapat dibuat dengan menambahkan kapasitor pada rangkaian gambar 2. Bisa juga dengan menggunakan transformator yang tanpa CT, tetapi dengan merangkai 4 dioda seperti pada gambar-5 berikut ini.

Gelombang Penuh dengan Filter C

Sebagai contoh, anda mendisain rangkaian penyearah gelombang penuh dari catu jala-jala listrik 220V/50Hz untuk mensuplai beban sebesar 0.5 A. Berapa nilai kapasitor yang diperlukan sehingga rangkaian ini memiliki tegangan ripple yang tidak lebih dari 0.75 Vpp. Jika rumus (7) dibolak-balik maka diperoleh.

C = I.T/Vr = (0.5) (0.01)/0.75 = 6600 uF

Untuk kapasitor yang sebesar ini banyak tersedia tipe elco yang memiliki polaritas dan tegangan kerja maksimum tertentu. Tegangan kerja kapasitor yang digunakan harus lebih besar dari tegangan keluaran catu daya. Anda barangkali sekarang paham mengapa rangkaian audio yang anda buat mendengung, coba periksa kembali rangkaian penyearah catu daya yang anda buat, apakah tegangan ripple ini cukup mengganggu. Jika dipasaran tidak tersedia kapasitor yang demikian besar, tentu bisa dengan memparalel dua atau tiga buah kapasitor.

3. Voltage Regulator

Rangkaian penyearah sudah cukup bagus jika tegangan ripple-nya kecil, namun ada masalah stabilitas. Jika tegangan PLN naik/turun, maka tegangan outputnya juga akan naik/turun. Seperti rangkaian penyearah di atas, jika arus semakin besar ternyata tegangan dc keluarnya juga ikut turun. Untuk beberapa aplikasi perubahan tegangan ini cukup mengganggu, sehingga diperlukan komponen aktif yang dapat meregulasi tegangan keluaran ini menjadi stabil.

Regulator Voltage berfungsi sebagai filter tegangan agar sesuai dengan keinginan. Oleh karena itu biasanya dalam rangkaian power supply maka IC Regulator tegangan ini selalu dipakai untuk stabilnya outputan tegangan.

Berikut susunan kaki IC regulator tersebut.

IC Regulator

Misalnya 7805 adalah regulator untuk mendapat tegangan +5 volt, 7812 regulator tegangan +12 volt dan seterusnya. Sedangkan seri 79XX misalnya adalah 7905 dan 7912 yang berturut-turut adalah regulator tegangan -5 dan -12 volt.

Selain dari regulator tegangan tetap ada juga IC regulator yang tegangannya dapat diatur. Prinsipnya sama dengan regulator OP-amp yang dikemas dalam satu IC misalnya LM317 untuk regulator variable positif dan LM337 untuk regulator variable negatif. Bedanya resistor R1 dan R2 ada di luar IC, sehingga tegangan keluaran dapat diatur melalui resistor eksternal tersebut.

Rangkaian regulator yang paling sederhana ditunjukkan pada gambar 6. Pada rangkaian ini, zener bekerja pada daerah breakdown, sehingga menghasilkan tegangan output yang sama dengan tegangan zener atau Vout = Vz. Namun rangkaian ini hanya bermanfaat jika arus beban tidak lebih dari 50mA.

Regulator Zener

Prinsip rangkaian catu daya yang seperti ini disebut shunt regulator, salah satu ciri khasnya adalah komponen regulator yang paralel dengan beban. Ciri lain dari shunt regulator adalah, rentan terhadap short-circuit. Perhatikan jika Vout terhubung singkat (short-circuit) maka arusnya tetap I = Vin/R1. Disamping regulator shunt, ada juga yang disebut dengan regulator seri. Prinsip utama regulator seri seperti rangkaian pada gambar 7 berikut ini. Pada rangkaian ini tegangan keluarannya adalah:

Vout = VZ + VBE

VBE adalah tegangan base-emitor dari transistor Q1 yang besarnya antara 0.2 – 0.7 volt tergantung dari jenis transistor yang digunakan. Dengan mengabaikan arus IB yang mengalir pada base transistor, dapat dihitung besar tahanan R2 yang diperlukan adalah :

R2 = (Vin – Vz)/Iz

Iz adalah arus minimum yang diperlukan oleh dioda zener untuk mencapai tegangan breakdown zener tersebut. Besar arus ini dapat diketahui dari datasheet yang besarnya lebih kurang 20 mA.

Regulator Zener Follower

Jika diperlukan catu arus yang lebih besar, tentu perhitungan arus base IB pada rangkaian di atas tidak bisa diabaikan lagi. Dimana seperti yang diketahui, besar arus IC akan berbanding lurus terhadap arus IB atau dirumuskan dengan IC = bIB. Untuk keperluan itu, transistor Q1 yang dipakai bisa diganti dengan transistor Darlington yang biasanya memiliki nilai b yang cukup besar. Dengan transistor Darlington, arus base yang kecil bisa menghasilkan arus IC yang lebih besar.

Teknik regulasi yang lebih baik lagi adalah dengan menggunakan Op-Amp untuk men-drive transistor Q, seperti pada rangkaian gambar 8. Dioda zener disini tidak langsung memberi umpan ke transistor Q, melainkan sebagai tegangan referensi bagi Op-Amp IC1. Umpan balik pada pin negatif Op-amp adalah cuplikan dari tegangan keluar regulator, yaitu :

Vin(-) = (R2/(R1+R2)) Vout

Jika tegangan keluar Vout menaik, maka tegangan Vin(-) juga akan menaik sampai tegangan ini sama dengan tegangan referensi Vz. Demikian sebaliknya jika tegangan keluar Vout menurun, misalnya karena suplai arus ke beban meningkat, Op-amp akan menjaga kestabilan di titik referensi Vz dengan memberi arus IB ke transistor Q1. Sehingga pada setiap saat Op-amp menjaga kestabilan :

Vin(-) = Vz

Regulator dengan OPM

Dengan mengabaikan tegangan VBE transistor Q1 dan mensubsitusi rumus (11) ke dalam rumus (10) maka diperoleh hubungan matematis :

Vout = ( (R1+R2)/R2) Vz

Pada rangkaian ini tegangan output dapat diatur dengan mengatur besar R1 dan R2.

Sekarang mestinya tidak perlu susah payah lagi mencari op-amp, transistor dan komponen lainnya untuk merealisasikan rangkaian regulator seperti di atas. Karena rangkaian semacam ini sudah dikemas menjadi satu IC regulator tegangan tetap. Saat ini sudah banyak dikenal komponen seri 78XX sebagai regulator tegangan tetap positif dan seri 79XX yang merupakan regulator untuk tegangan tetap negatif. Bahkan komponen ini biasanya sudah dilengkapi dengan pembatas arus (current limiter) dan juga pembatas suhu (thermal shutdown). Komponen ini hanya tiga pin dan dengan menambah beberapa komponen saja sudah dapat menjadi rangkaian catu daya yang ter-regulasi dengan baik.

Regulator dengan IC

Hanya saja perlu diketahui supaya rangkaian regulator dengan IC tersebut bisa bekerja, tegangan input harus lebih besar dari tegangan output regulatornya. Biasanya perbedaan tegangan Vin terhadap Vout yang direkomendasikan ada di dalam datasheet komponen tersebut. Pemakaian heatshink (aluminium pendingin) dianjurkan jika komponen ini dipakai untuk men-catu arus yang besar. Di dalam datasheet, komponen seperti ini maksimum bisa dilewati arus mencapai 1 A.