76460173-WaroengSMS
-
Upload
alex-manalu -
Category
Documents
-
view
202 -
download
3
Transcript of 76460173-WaroengSMS
PERANCANGAN DAN PEMBUATAN PERANGKAT WARUNG SMS
DENGAN MENGGUNAKAN IBM PC
Oleh :
Nama : Ihyauddin
NIM : 02.41020.0019
Program : S1 (Strata Satu)
Jurusan : Sistem Komputer
SEKOLAH TINGGI
MANAJEMEN INFORMATIKA & TEKNIK KOMPUTER
SURABAYA
2006
PERANCANGAN DAN PEMBUATAN PERANGKAT WARUNG SMS
DENGAN MENGGUNAKAN IBM PC
SKRIPSI
Diajukan sebagai salah satu syarat untuk menyelesaikan
Program Sarjana Komputer
Oleh :
Nama : Ihyauddin
NIM : 02.41020.0019
Program : S1 (Strata Satu)
Jurusan : Sistem Komputer
SEKOLAH TINGGI
MANAJEMEN INFORMATIKA & TEKNIK KOMPUTER
SURABAYA
2006
PERANCANGAN DAN PEMBUATAN PERANGKAT WARUNG SMS
DENGAN MENGGUNAKAN IBM PC
Disusun Oleh :
Nama : Ihyauddin
NIM : 02.41020.0019
Surabaya, Agustus 2006
Telah diperiksa, diuji dan disetujui :
Pembimbing I Pembimbing II
Tjio Hok Hoo, ST, M.Sc. Harianto, S.Kom. NIDN. 0707106901 NIDN. 0722087701
Mengetahui :
Wakil Ketua Bidang Akademik
Drs. Antok Supriyanto, M.MT NIDN. 0726106201
SEKOLAH TINGGI MANAJEMEN INFORMATIKA & TEKNIK KOMPUTER SURABAYA
ABSTRAKSI
SMS (Short Message Service) merupakan sarana komunikasi yang
mudah, murah dan efektif. Jika selama ini pengiriman atau penerimaan SMS
hanya bisa dilakukan secara pribadi oleh pemilik handphone, maka dalam Tugas
Akhir ini bertujuan untuk membuat seperangkat alat pengirim atau penerima SMS
yang dapat digunakan oleh umum. Sehingga dengan perangkat tersebut dapat
memberikan sarana komunikasi bagi masyarakat yang berada di daerah yang
hanya dijangkau oleh operator selular.
Dengan membuat editor teks elektronik yang berbasis Mikrokontroler,
penulisan atau pembacaan SMS akan lebih mudah dilakukan. SMS yang telah
diketik akan dikirim ke komputer untuk diubah menjadi format PDU (Protocol
Data Unit) kemudian melalui sebuah handphone sebagai SMS Gateway, akan
dikirimkan dengan menggunakan perintah AT Command. Program billing
komputer akan menyimpan laporan hasil transaksi yang dapat diberikan pada
pengguna.
Perangkat ini telah dapat mengirim dan menampilkan SMS yang diterima
sesuai dengan permintaan pengguna.
iv
KATA PENGANTAR
Puji syukur kehadirat Allah SWT atas rahmat dan hidayah-Nya penulis
dapat menyelesaikan Tugas Akhir ini. Dalam Tugas Akhir ini penulis
mengerjakan pembuatan seperangkat alat pengirim dan pembaca SMS yang dapat
digunakan oleh masyarakat dan program komputer yang dapat menampilkan
tagihan pengiriman SMS.
Penulis mengucapkan terima kasih kepada :
1) Kedua orang tua dan adik-adik penulis yang telah memberikan
semangat dan doanya dalam pengerjaan Tugas Akhir ini.
2) Bapak Tjio Hok Hoo, ST, M.Sc. selaku Dosen Pembimbing I yang
telah memberikan bimbingan dan arahan selama penulis
mengerjakan Tugas Akhir ini.
3) Bapak Harianto, S.Kom. selaku Pembimbing II yang telah
memberikan bimbingan dalam pengerjaan dan penulisan Tugas
Akhir ini.
4) Rekan-rekan asisten Laboratorium Sistem Komputer yang telah
memberikan bantuannya.
5) Rekan-rekan mahasiswa Sistem Komputer angkatan 2002 yang
telah memberikan motivasi dan dukungannya hingga
terselesaikannya Tugas Akhir ini.
Penulis
v
DAFTAR ISI
ABSTRAKSI iv
KATA PENGANTAR v
DAFTAR ISI vi
DAFTAR TABEL ix
DAFTAR GAMBAR xi
DAFTAR ISTILAH DAN SINGKATAN xiv
DAFTAR LAMPIRAN xvi
BAB I PENDAHULUAN 1
1.1 Latar Belakang masalah 1
1.2 Perumusan Masalah 2
1.3 Pembatasan Masalah 2
1.4 Tujuan 3
1.5 Kontribusi 3
1.6 Sistematika Penulisan 4
BAB II LANDASAN TEORI 7
2.1 Short Message Service 7
2.1.1 Mode Teks 8
2.1.2 Mode PDU 9
2.2 SIEMENS AT Command 25
2.3 Komunikasi Serial RS232 26
2.4 Mikrokontroler MCS-51 29
2.4.1 Fungsi-fungsi Kaki (Pin) 31
vi
vii
2.4.2 Spesifikasi Masing-masing Port 32
2.4.3 Timer/Counter 35
2.4.4 Interupsi 38
2.4.5 Port Serial 41
2.4.6 Reset 44
2.5 Octal Data Latch 46
2.6 RAM (Random Access Memory) 48
2.7 CMOS Analog Multiplexer/Demultiplexer 49
2.8 RS232 TransmitterReceiver 50
2.9 Keyboard 51
2.10 LCD (Liquid Crystal Display) 53
2.11 1 Of 8 Decoder 56
BAB III METODE PENELITIAN 58
3.1 Perancangan Perangkat Keras 59
3.1.1 Minimum System AT89S52 60
3.1.2 RAM 6116 (2 kByte) 65
3.1.3 LCD 4x16 69
3.1.4 MAX232 RS232 Transmitter/Receiver 72
3.1.5 4051 Multiplekser/Demultiplekser 74
3.1.6 Keyboard 77
3.1.7 Format Data yang Dikirimkan oleh Sistem 84
3.2 Perancangan Perangkat Lunak 86
3.2.1 Terminal Selector 86
3.2.2 Terminal 87
viii
3.2.3 Komputer 88
BAB IV PENGUJIAN SISTEM 102
4.1 Pengujian Keyboard 102
4.1.1 Tujuan 102
4.1.2 Alat yang Digunakan 102
4.1.3 Prosedur Pengujian 102
4.1.4 Hasil dari Pengujian 104
4.2 Pengujian Pengiriman Data 107
4.2.1 Tujuan 107
4.2.2 Alat yang Digunakan 107
4.2.3 Prosedur Pengujian 107
4.2.4 Hasil dari Pengujian 110
4.3 Pengujian Program Billing 120
4.3.1 Tujuan 120
4.3.2 Alat yang Digunakan 120
4.3.3 Prosedur Pengujian 120
4.3.4 Hasil dari Pengujian 120
BAB V PENUTUP 123
5.1 Kesimpulan 123
5.2 Saran 124
DAFTAR PUSTAKA 125
LAMPIRAN 128
DAFTAR TABEL
Halaman
Tabel 2.1 PDU SMSC dengan National Code 11
Tabel 2.2 PDU SMSC dengan International Code 12
Tabel 2.3 PDU Type 12
Tabel 2.4 Rumus jangka waktu validasi SMS 16
Tabel 2.5 Skema 7 bit 17
Tabel 2.6 Skema 7 bit kata MOEHI 17
Tabel 2.7 Konversi 7 bit ke 8 bit 18
Tabel 2.8 PDU Type 21
Tabel 2.9 Konversi 8 bit ke 7 bit 25
Tabel 2.10 Beberapa perintah AT Command 26
Tabel 2.11 Keterangan pinout DB25 28
Tabel 2.12 Keterangan pinout DB9 29
Tabel 2.13 Fungsi–fungsi khusus kaki–kaki port 3 35
Tabel 2.14 Susunan bit dalam register TCON 36
Tabel 2.15 Susunan bit dalam register TMOD 37
Tabel 2.16 Mode Operasi Timer/Counter 38
Tabel 2.17 Susunan bit dalam register IE 39
Tabel 2.18 Alamat ISR 40
Tabel 2.19 Susunan bit dalam register IP 40
Tabel 2.20 Susunan bit dalam register SCON 42
Tabel 2.21 Mode port serial 42
ix
x
Tabel 2.22 Susunan bit dalam register PCON 43
Tabel 2.23 Isi Register setelah reset 44
Tabel 2.24 Octal Data Latch Truth table 48
Tabel 2.25 Tabel Kebenaran Mux/Demux 4051 50
Tabel 2.26 Tabel kebenaran pengoperasian LCD 55
Tabel 2.27 Tabel Instruksi-instruksi dalam pengoperasian LCD 56
Tabel 2.28 Tabel kebenaran 74LS138 57
Tabel 3.1 Susunan bit dalam register SCON 64
Tabel 3.2 Susunan bit dalam register PCON 64
Tabel 3.3 Pengalamatan RAM dan LCD 68
Tabel 3.4 Kombinasi A, B, C sebagai pemilih sistem 76
Tabel 4.1 Hasil pengujian keyboard 104
Tabel 4.2 Hasil pengiriman data 111
Tabel 4.3 Uji coba penerimaan data SMS dari Terminal pada Komputer 118
Tabel 4.4 Pengiriman SMS ke beberapa nomor handphone 119
Tabel 4.5 Uji coba penerimaan data SMS dari Komputer pada Terminal 119
DAFTAR GAMBAR
Halaman
Gambar 2.1 Skema cara kerja SMS 8
Gambar 2.2 Skema format SMS PDU Pengirim 9
Gambar 2.3 Skema format SMS PDU Penerima 19
Gambar 2.4 Arah komunikasi serial 27
Gambar 2.5 Pinout konektor jarum DB25 28 Gambar 2.6 Pinout konektor jarum DB9 28
Gambar 2.7 Pembagian bit dalam 1 frame 29
Gambar 2.8 Pin out Microcontroller ATMEL 89S52 30
Gambar 2.9 Skema rangkaian reset 44
Gambar 2.10 Aliran arus dan perubahan tegangan pada reset otomatis 45
Gambar 2.11 Rangkaian ekivalen saat saklar S1 ditekan 46
Gambar 2.12 Pin-out 74LS573 dan 74373 47
Gambar 2.13 Pinout RAM 6116 49
Gambar 2.14 Pinout 4051 49
Gambar 2.15 Pinout ICL232 51
Gambar 2.16 Rangkaian fungsional ICL232 51
Gambar 2.17 Scan code tombol keyboard 52
Gambar 2.18 Konektor PS2 (Keyboard) model lubang 52
Gambar 2.19 Sinyal komunikasi data serial dari keyboard 53
Gambar 2.20 Karakter-karakter pada LCD 54
Gambar 2.21 Karakteristik pewaktuan proses menulis pada LCD 55
xi
xii
Gambar 2.22 Pin out 74LS138 57
Gambar 3.1 Blok diagram sistem secara keseluruhan 58
Gambar 3.2 Blok diagram sistem Terminal Selector 59
Gambar 3.3 Blok diagram sistem Terminal 60
Gambar 3.4 Minimum system Mikrokontroler AT89S52 pada Terminal Selector 60
Gambar 3.5 Minimum system Mikrokontroler AT89S52 pada Terminal 61
Gambar 3.6 Rangkaian kabel downloader pada port LPT1 63
Gambar 3.7 Software ISP-Flash Progammer ver3.0a 63
Gambar 3.8 Konektor downloader pada Mikrokontroler AT89S52 64
Gambar 3.9 Rangkaian RAM pada Terminal Selector 66
Gambar 3.10 Rangkaian RAM pada Terminal 67
Gambar 3.11 Rangkaian konektor LCD 70
Gambar 3.12 Rangkaian MAX232 Terminal Selector 73
Gambar 3.13 Rangkaian MAX232 Terminal 74
Gambar 3.14 Rangkaian Multiplekser 4051 75
Gambar 3.15 Rangkaian Demultiplekser 4051 75
Gambar 3.16 Konektor PS2 (jarum) keyboard pada mikrokontroler 77
Gambar 3.17 Format data pengiriman SMS dari Terminal ke komputer 85 Gambar 3.18 Format data penerimaaan SMS 85 Gambar 3.19 Format data pengiriman SMS dari Terminal Selector
ke Terminal 86 Gambar 3.20 Diagram alir perangkat lunak pada Terminal Selector 87
Gambar 3.21 Diagram alir perangkat lunak pada Terminal 88
Gambar 3.22 Diagram alir perangkat lunak pada komputer 89
xiii
Gambar 3.23 Tampilan form utama 91
Gambar 3.24 Tampilan form inbox 100
Gambar 3.25 Tampilan form outbox 101
Gambar 4.1 Sinyal data tombol A 105
Gambar 4.2 Sinyal data tombol S 105
Gambar 4.3 Sinyal data tombol D 106
Gambar 4.4 Sinyal data tombol F 106
Gambar 4.5 Sinyal data tombol G 106
Gambar 4.6 Sinyal data 0xF0 yang dikirim oleh Terminal 112
Gambar 4.7 Sinyal data 0xF0 yang diterima oleh Terminal Selector 112
Gambar 4.8 Data 0xF0 yang diterima oleh komputer 112
Gambar 4.9 Sinyal data 0xF1 yang dikirim oleh Terminal 113
Gambar 4.10 Sinyal data 0xF1 yang diterima oleh Terminal Selector 113
Gambar 4.11 Data 0xF1 yang diterima oleh komputer 114
Gambar 4.12 Sinyal data 0xF2 yang dikirim oleh Terminal 114
Gambar 4.13 Sinyal data 0xF2 yang diterima oleh Terminal Selector 115
Gambar 4.14 Data 0xF2 yang diterima oleh komputer 115
Gambar 4.15 Sinyal data 0xAE yang dikirim oleh Terminal 116
Gambar 4.16 Sinyal data 0xAE yang diterima oleh Terminal Selector 116
Gambar 4.17 Data 0xAE yang diterima oleh komputer 116
Gambar 4.18 Data kalimat ’ABCDEFGHIJKLMNOP’ yang diterima oleh komputer 117
Gambar 4.19 Program Billing menerima data dari Terminal Selector 121
Gambar 4.20 Program Billing menyimpan SMS yang dikirim 122
Gambar 4.21 Program Billing menyimpan SMS baru 122
DAFTAR ISTILAH DAN SINGKATAN
Active High : bernilai 1 jika dalam kondisi aktif.
Active Low : bernilai 0 jika dalam kondisi aktif.
AT Command : Attention Command, sekumpulan perintah yang
digunakan komputer untuk mengakses modem handphone.
Baudrate : kecepatan transmisi data
Bit : Binary Digit. Data dengan bilangan basis 2, yaitu 0 atau 1.
Bps : Bit per second. Satuan baudrate
Byte : Sejumlah data 8 bit
EIA : Electronics Industries Association
GPRS : General Packet Radio Service
GSM : Global System for Mobile Communications
HEX (Heksadesimal) : Format bilangan basis 16
LCD : Liquid Crystal Display
LSB : Least Significant Bit. Bit ke-0 dalam 1 byte
MMS : Multimedia Message Service
MSB : Most Significant Bit. Bit ke-7 dalam 1 byte
PC : Personal Computer
PDU Decodec : Proses perubahan format PDU menjadi format teks.
PDU Encodec : Proses perubahan format teks menjadi format PDU.
PDU : Protocol Data Unit
RAM : Random Access Memory
Receiver : Peralatan yang menerima data
xiv
xv
SMS : Short Message Service
SMSC : Short Message Service Center
Transmitter : Peralatan yang mengirimkan data
TTL : Transistor-transistor Logic
UART : Universal Asynchronous Receiver/Transmitter
USB : Universal Serial Bus
DAFTAR LAMPIRAN
Lampiran 1 : Rangkaian Skematik Terminal 128
Lampiran 2 : Rangkaian Skematik Terminal Selector 129
Lampiran 3 : Listing Program Terminal 130
Lampiran 4 : Listing Program Terminal Selector 140
Lampiran 5 : Listing Program Billing Komputer 143
Lampiran 6 : Petunjuk Penggunaan Alat 159
Lampiran 7 : Biodata Penulis 161
xvi
BAB I
PENDAHULUAN
1.1 Latar Belakang Masalah
Peralatan komunikasi nirkabel Mobile Phone atau di Indonesia lebih
dikenal dengan Hand Phone (HP) yang fleksibel untuk dibawa kemana-mana dan
memiliki berbagai fasilitas yang ada didalamnya untuk memudahkan manusia
dalam berkomunikasi. Short Message Service (SMS) merupakan salah satu fitur
dari Global System for Mobile Communications (GSM), yang dikembangkan dan
distandardisasi oleh The European Telecommunications Standards Institute
(ETSI). Meskipun telah banyak pula fitur-fitur dari GSM seperti Enhanced
Message Service (EMS), Multimedia Messaging Service (MMS) dan General
Packet Radio Service (GPRS), keberadaan jasa dan industri yang menggunakan
SMS sebagai fasilitas populer yang terdapat pada HP, menjadikan sarana pilihan
yang murah, cepat dan mudah untuk berkomunikasi.
Jangkauan yang lebih luas yang diberikan oleh masing-masing operator
selular HP dibandingkan dengan telepon biasa, seperti di beberapa daerah
pedesaan dan pegunungan yang belum terjangkau oleh jaringan telepon, dapat
memudahkan masyarakat yang berada di daerah tersebut untuk menggunakan alat
komunikasi. Selama ini HP hanya digunakan oleh masing-masing orang dengan
keadaan ekonomi yang cukup. Untuk orang dengan keadaan ekonomi menengah
kebawah, HP dianggap sebagai barang mewah. Sehingga mereka hampir tidak
pernah melakukan komunikasi menggunakan fasilitas SMS. Bahkan orang yang
1
2
sudah memiliki HP, tidak dapat melakukan pengiriman SMS karena tidak
memiliki pulsa yang cukup.
Sehingga dengan membuat tempat penyedia layanan pengiriman atau
penerimaan SMS, dapat menjadikan masyarakat lebih mudah dalam mengirim
SMS walaupun belum memiliki HP atau tidak memiliki pulsa yang cukup.
1.2 Perumusan Masalah
Berdasarkan latar belakang masalah diatas, didapatkan rumusan masalah
sebagai berikut :
1. Bagaimana merancang dan membuat perangkat pengirim dan penerima SMS
yang dapat digunakan oleh umum ?
2. Bagaimana merancang dan membuat perangkat untuk mengetik SMS dengan
menggunakan mikrokontroler ?
3. Bagaimana merancang dan membuat program aplikasi tagihan (billing) dari
pengiriman SMS dengan menggunakan IBM PC ?
1.3 Pembatasan Masalah
Batasan masalah dari pembuatan perangkat ini adalah sebagai berikut :
1. Komputer yang digunakan harus memiliki minimal 2 buah port serial (COM1
dan COM2) dan sebuah port paralel (LPT1) atau sebuah port USB untuk
koneksi printer.
2. Perangkat ini hanya menyediakan tiga terminal terpisah untuk mengetik dan
mengirim atau membaca SMS.
3
3. Dalam sekali pengiriman SMS dari Terminal, hanya dapat mengirimkan
maksimal 608 karakter dengan biaya pengiriman SMS sesuai dengan jumlah
SMS yang dikirim. Sejumlah SMS berisi sebanyak karakter yang disesuaikan
dengan jenis HP yang digunakan sebagai SMS Gateway.
4. SMS yang telah diterima akan disimpan pada PC. Jika user ingin membaca
SMS yang telah dipesan, operator akan menampilkan SMS tersebut pada satu
terminal yang kosong.
5. Status pengiriman SMS diberikan pada nota pembayaran, sesaat setelah user
mengirim SMS.
1.4 Tujuan
Tujuan dari perancangan dan pembuatan perangkat ini adalah sebagai
berikut :
1. Membuat perangkat pengirim dan penerima SMS yang dapat digunakan untuk
umum.
2. Membuat perangkat warung SMS yang dapat dijadikan sebagai bentuk usaha
dalam rumah tangga.
3. Membuat perangkat komunikasi yang berada di daerah yang belum terjangkau
oleh jaringan telepon tetapi bisa dijangkau oleh operator selular.
1.5 Kontribusi
Dari beberapa penelitian sebelumnya, pengiriman SMS dengan
menggunakan AT Command hanya digunakan untuk mengirim dan menerima
SMS dengan isi SMS tertentu. Dalam penelitian ini SMS yang dikirim atau
4
diterima memiliki isi dan panjang SMS yang bervariasi sesuai kebutuhan
pengguna.
Kita ketahui bahwa SMS merupakan fitur handphone yang paling sering
digunakan. Tetapi sarana komunikasi tersebut hanya dapat digunakan oleh
masing-masing pemilik handphone dan memiliki pulsa yang cukup. Dalam Tugas
Akhir ini dibuat perangkat pengirim dan penerima SMS yang dapat digunakan
oleh umum. Sehingga meskipun seseorang tidak memiliki handphone atau tidak
memiliki pulsa, mereka dapat menggunakan perangkat ini untuk berkirim SMS.
Dari tiga buah editor teks elektronik berbasis mikrokontroler (tiga buah
Terminal) yang terhubung pada komputer, masing-masing Terminal tersebut
berfungsi untuk mengetik dan mengirim SMS atau menampilkan SMS yang telah
diterima. Pengguna yang telah mengirim SMS akan diberikan laporan pengiriman
dan membayar sesuai dengan jumlah SMS yang telah dikirimkan.
Perangkat ini dapat berfungsi sebagai suatu bentuk usaha yang dapat
dikelola oleh siapapun seperti hal-nya perangkat WARTEL TELKOM yang sudah
ada.
1.6 Sistematika Penulisan
Sistematika penulisan buku Tugas Akhir ini terdiri dari lima bab, dimana
dalam tiap bab terdapat beberapa sub-bab. Ringkasan uraian dari tiap bab tersebut
adalah sebagai berikut :
5
Bab I Pendahuluan
Pada bab ini menjelaskan tentang latar belakang masalah, perumusan
masalah, pembatasan masalah, tujuan dan sistematika penulisan buku
Tugas Akhir.
Bab II Landasan Teori
Pada bab ini menjelaskan tentang beberapa teori tentang komponen dan
sistem transmisi yang digunakan dalam pengerjaan Tugas Akhir ini.
Diantaranya adalah ATCommand, Komunikasi Serial RS232,
Mikrokontroler MCS-51, Octal Data Latch, RAM, Keyboard, LCD,
RS232 Transmitter/Receiver, CMOS Analog
Multiplexers/Demultiplexers, 1 of 8 Decoder.
Bab III Metode Penelitian
Bab ini berisi tentang penjelasan penulis dalam merancang dan
membuat perangkat keras dan perangkat lunak. Dalam Bab ini juga
menjelaskan tentang cara kerja dari perangkat keras, seperti sistem pada
Terminal dan Terminal Selector, format data yang digunakan dalam
pengiriman data antar sistem, dan pembuatan perangkat lunak pada
komputer.
Bab IV Pengujian Sistem
Bab ini berisi tentang pengujian terhadap perangkat keras dan perangkat
lunak dari sistem Terminal, Terminal Selector dan komputer yang telah
dilakukan oleh penulis. Pengujian tersebut meliputi pengujian keyboard,
pengiriman data dan pengujian program Billing.
6
Bab V Penutup
Pada bab ini menjelaskan tentang kesimpulan dari Tugas Akhir yang
telah dikerjakan dan saran-saran yang diberikan oleh penulis.
BAB II
LANDASAN TEORI
2.1 Short Message Service
SMS adalah salah satu layanan nirkabel yang dapat diterima secara
umum yang mampu mengirimkan pesan-pesan dalam bentuk karakter antara
peralatan komunikasi bergerak dan sistem luar. SMS merupakan salah satu fitur
dari GSM yang dikembangkan dan distandardisasi oleh ETSI. Pada saat kita
mengirim pesan SMS dari HP, maka pesan SMS tersebut tidak langsung dikirim
ke HP tujuan, akan tetapi terlebih dahulu dikirim ke SMS Center (SMSC) dengan
prinsip store and forward, setelah itu dikirim ke HP tujuan.
Melalui keberadaan SMSC, kita dapat mengetahui status dari SMS yang
dikirim, apakah telah sampai atau gagal diterima oleh HP tujuan. Apabila HP
tujuan dalam keadaan aktif dan menerima SMS yang dikirim, ia akan mengirim
kembali pesan konfirmasi ke SMSC yang menyatakan bahwa SMS telah diterima.
Kemudian SMSC mengirimkan status tersebut kepada si pengirim. Tetapi jika HP
tujuan dalan keadaan mati atau diluar jangkauan, SMS yang dikirimkan akan
disimpan pada SMSC sampai periode validitas terpenuhi. Jika periode validitas
terlewati, maka SMS akan dihapus dari SMSC dan tidak dikirimkan ke HP tujuan.
(Gunawan, 2005 : 18)
7
8
Gambar 2.1 Skema cara kerja SMS
Menurut Gunawan (2003 : 21) dalam pengiriman dan penerimaan pesan
SMS terdapat 2 mode, yaitu mode Teks dan mode Protocol Data Unit (PDU).
2.1.1 Mode Teks
Mode teks adalah format pesan dalam bentuk teks asli atau tidak
dilakukan konversi dari pesan yang ditulis pada saat akan dikirim, sehingga mode
ini merupakan cara termudah dalam mengirim SMS. Sesungguhnya mode teks ini
adalah hasil pengkodean dari mode PDU.
Jika menggunakan mode ini teks yang dikirim dapat mencapai 160 (7 bit
default alphabet) atau 140 (8 bit) karakter. Kelemahan dari mode ini, kita tidak
dapat menyisipkan gambar dan nada dering kedalam pesan yang akan dikirim
serta terbatasnya tipe enkoding. (Gunawan, 2003 : 21)
Di Indonesia, pengiriman SMS dari HP ke SMSC maupun sebaliknya
tidak menggunakan mode ini, tetapi mengunakan mode PDU.
9
2.1.2 Mode PDU
Mode PDU adalah format pesan SMS dalam heksadesimal oktet dan
semi-desimal oktet dengan panjang mencapai 160 (7 bit default alphabet) atau 140
(8 bit) karakter. Kelebihan menggunakan mode PDU adalah kita dapat melakukan
enkoding sendiri yang tentunya harus didukung oleh hardware (HP) dan operator
GSM. Beberapa tipe enkoding yang umum digunakan adalah ”PCCP437”,
”PCDN”, ”8859-1”, ”IRA”, ”HEX” dan ”GSM”. Pada beberapa jenis HP hanya
didukung oleh tipe enkoding tertentu. Untuk mengetahuinya dapat melalui
perintah AT+CSCS pada AT Command.
A. PDU SMS Pengirim (SMS Submit PDU/Mobile Originated (MO))
SMS PDU pengirim adalah pesan yang dikirim dari HP ke terminal yang
kemudian dikirimkan ke SMSC. Pada prinsipnya apabila kita mengirim pesan ke
nomor tujuan, pesan itu akan melalui SMSC.
Pesan akan dikirim oleh terminal masih dalam bentuk teks, sedangkan
dalam pengiriman ke SMSC harus dalam bentuk PDU. Untuk itu sebelum dikirim,
terminal atau HP akan melakukan perubahan dari format teks menjadi format
PDU, proses ini sering disebut encodec. Adapun skema dari format PDU pengirim
telah diatur dan ditetapkan oleh ETSI sebagai berikut : (Tim Penelitian, 2005 : 13)
SCA PDU Type MR DA PID DCS VP UDL UD
Gambar 2.2 Skema format SMS PDU Pengirim
10
A.1 Service Center Address (SCA)
SCA adalah informasi dari alamat (nomor) SMSC. SCA memiliki 3
komponen utama yaitu length, type of number, dan service center number.
1. Length
Berupa jumlah pasangan heksadesimal SMSC dalam bilangan
heksadesimal.
2. Type of Number
Apabila SMSC dalam bentuk kode nasional (National code), maka sub-
header-nya 81 atau dalam bentuk kode internasional (International code), maka
sub-header-nya 91.
3. Service center number
Berupa nomor SMSC dalam pasangan heksadesimal yang dibalik-
balik. Jika tertinggal satu angka heksa yang tidak memiliki pasangan, maka angka
tersebut akan dipasangkan dengan F di depannya. (Khang, 2003 : 9)
Sebagai contoh untuk nomor SMSC dari Excelcom dapat ditulis dalam 2
cara, yaitu :
- Menggunakan National Code
Nomor SMSC = 0818445009, maka akan diubah menjadi :
• 06 karena memiliki 6 pasang heksadesimal yaitu 5 pasang nomor SMSC dan
1 pasang untuk National Code.
• 81 (National Code)
11
• 80 – 81 – 44 – 05 – 90 (nomor SMSC yang dibolak-balik)
Sehingga apabila digabungkan menjadi 06818081440590
- Menggunakan International code
Nomor SMSC = 62818445009, maka diubah menjadi :
• 07 karena memiliki 7 pasang heksadesimal yaitu 6 pasang nomor SMSC dan
1 pasang untuk International Code.
• 91 (International Code)
• 26 – 18 – 48 – 54 – 00 – F9 (Nomor SMSC yang dibalik-balik, dimana F
merupakan panambahan karena satu angka tidak memiliki pasangan
heksadesimal).
Sehingga apabila digabungkan menjadi 07912618485400F9
Berikut ini adalah Kode PDU SMSC untuk beberapa operator selular
yang ada di Indonesia :
Tabel 2.1 PDU SMSC dengan National Code
No. Operator Selular Nomor SMSC Kode PDU 1. Telkomsel 081100000 068180110000F0 2. Indosat Mentari 0816124 0581806121F4 3. Excelcom 0818445009 06818081440590 4. Indosat IM3 0855000000 06818055000000
12
Tabel 2.2 PDU SMSC dengan International Code
No. Operator Selular Nomor SMSC Kode PDU 1. Telkomsel 6281100000 06912618010000 2. Indosat Mentari 62816124 059126181642 3. Excelcom 62818445009 07912618485400F9 4. Indosat IM3 62855000000 07912658050000F0
A.2 PDU Type
Nilai default dari PDU type untuk SMS pengirim adalah 11 heksadesimal
atau 00010001 biner. Jika ingin mendapatkan status dari pengiriman SMS, nilai
PDU Type adalah 31 heksadesimal atau 00110001 biner. Pengaturan bit-bit
tersebut sesuai dengan Tabel 2.3.
Tabel 2.3 PDU Type
Bit ke 7 6 5 4 3 2 1 0
Nama RP UDHI SRR VPF VPF RD MTI MTI
Nilai 0 0 1 1 0 0 0 1
Keterangan :
Reply Path (RP) : Parameter yang menunjukkan bahwa terdapat alur
jawaban.
User Data Header Indicator (UDHI) : Bit ini bernilai 1 jika data pengirim
dimulai dengan suatu judul/tema.
Status Report Request (SRR) : Bit ini bernilai 1 jika laporan status
pengiriman diminta.
Validity Period Format (VPF) : Format dari batas waktu pengiriman jika
pesan gagal diterima. Kombinasi 2 bit VPF adalah sebagai berikut :
13
0 0 → Jika pesan tidak disimpan di SMSC.
0 1 → Format Enhanced (7 oktet).
1 0 → Format Relatif (1 oktet).
1 1 → Format Absolut (7 oktet).
Reject Duplicates (RD) : Parameter yang menandakan ya atau tidaknya
Service Center akan menerima suatu pengiriman pesan SMS untuk suatu pesan
yang masih disimpan dalam Service Center tersebut. Ia mempunyai MR dan DA
yang sama sebagai pesan dikirimkan dari nomor pengirim yang sama.
Message Type Indicator (MTI) : Bit ini bernilai 0 untuk menunjukkan
bahwa PDU ini adalah SMS Pengirim. (Tim Penelitian, 2005 : 14)
A.3 Message Reference (MR)
Message Reference adalah acuan dari pengaturan pesan SMS. Untuk
membiarkan pengaturan pesan SMS dilakukan sendiri oleh HP tujuan, maka nilai
yang diberikan adalah 00.
A.4 Destination Address (DA)
Destination Address adalah alamat (nomor) tujuan yang terdiri atas
Length, Type Number, Destination Number.
1. Length
Berupa jumlah bilangan desimal nomor tujuan dalam bilangan
heksadesimal.
14
2. Type of Number
Apabila nomor tujuan dalam bentuk kode nasional, maka sub-header-nya
81 atau dalam bentuk kode internasional, maka sub-header-nya 91.
3. Destination number
Berupa nomor tujuan dalam pasangan heksadesimal yang dibolak-balik.
Jika tertinggal satu angka heksa yang tidak memiliki pasangan, maka angka
tersebut akan dipasangkan dengan F di depannya. (Khang, 2003 : 11)
Sebagai contoh untuk nomor tujuan 08563033808 dapat ditulis dalam 2
cara, yaitu :
- Menggunakan National Code
Nomor tujuan = 08563033808, maka akan diubah menjadi :
• 0B karena memiliki 11 angka pada nomor tujuan, sehingga 11 desimal = 0B
heksadesimal.
• 81 (National Code)
• 80 – 65 – 03 – 33 – 08 – F8 (Nomor tujuan yang dibolak-balik, dimana F
merupakan panambahan karena satu angka tidak memiliki pasangan
heksadesimal).
Sehingga apabila digabungkan menjadi 0B818065033308F8
- Menggunakan International code
Nomor tujuan = 628563033808, maka diubah menjadi :
• 0C karena memiliki 12 angka pada nomor tujuan, sehingga 12 desimal = 0C
heksadesimal.
15
• 91 (International Code)
• 26 – 58 – 36 – 30 – 83 – 80 (Nomor tujuan yang dibolak-balik).
Sehingga apabila digabungkan menjadi 0C91625836308380
A.5 Protocol Identifier (PID)
Protocol Identifier adalah tipe atau format dari cara pengiriman pesan
yang biasanya diatur dari HP pengirim. Misalnya tipe Standard Text, Fax, E-mail,
Telex, X400, dan lain-lain. Nilai default dari PID adalah 00 (Standard Text). Jika
dikirim sebagai Telex, nilai PID-nya 01 dan jika dikirim sebagai Fax, nilai PID-
nya 02. (Tim Penelitian, 2005 : 15)
A.6 Data Coding Scheme (DCS)
Data Coding Scheme adalah rencana dari pengkodean data untuk
menentukan kelas dari pesan tersebut apakah berupa SMS teks standar, Flash
SMS, atau Blinking SMS. Jika yang digunakan adalah skema 7 bit, maka DCS
bernilai 00. Jika yang digunakan adalah skema 8 bit, maka DCS bernilai angka
heksadesimal lebih dari nol. Di Indonesia HP yang digunakan sebagai SMS
Gateway menggunakan skema 7 bit. (Tim Penelitian, 2005 : 15)
A.7 Validity Period (VP)
Validity Period adalah lama waktu pesan SMS disimpan di SMSC
apabila pesan tersebut gagal diterima oleh HP penerima. Rumus untuk
menghitung jangka waktu validasi SMS terdapat pada Tabel 2.4
16
Tabel 2.4 Rumus jangka waktu validasi SMS
Integer (INT) Jangka Waktu Validasi SMS 0 – 143 (INT + 1) * 5 menit (berarti : 5 menit s.d. 12 jam) 144 – 167 12 jam + ((INT – 143) * 30 menit) 168 – 196 (INT – 166) * 1 hari 197 - 255 (INT – 192) * 1 minggu
Agar SMS kita pasti terkirim sampai ke HP penerima, sebaiknya kita
memberikan batasan waktu maksimal. Sehingga VP bernilai FF. (Khang, 2003 :
13)
A.8 User Data Length (UDL)
User Data Length adalah panjang pesan SMS yang akan dikirim dengan
bentuk teks standar dalam angka heksadesimal. Sebagai contoh pesan yang
dikirim adalah MOEHI, yang memiliki 5 karakter. Sehingga UDL bernilai 05.
A.9 User Data (UD)
User Data adalah isi pesan yang akan dikirim dalam format
heksadesimal. Pengkodean dari nilai teks standar menjadi heksadesimal dilakukan
dengan bantuan Default Alphabet yang dibakukan oleh ETSI GSM 03.38. Untuk
HP atau SMS gateway berskema enkoding 7 bit, berarti kita telah mengetikkan
suatu huruf dari keypad, berarti kita telah membuat 7 angka 1 atau 0 berurutan.
Skema 7 bit tersebut dibuat dalam Tabel 2.5 (Tim Penelitian, 2005 : 16)
(Gunawan, 2003 : 25)
17
Tabel 2.5 Skema 7 bit
b7 0 0 0 0 1 1 1 1 b6 0 0 1 1 0 0 1 1
b5 0 1 0 1 0 1 0 1 b4 b3 b2 b1 0 0 0 0 @ ∆ SP 0 - P ¨ p 0 0 0 1 ! 1 A Q a q 0 0 1 0 $ Ф “ 2 B R b r 0 0 1 1 Г # 3 C S c s 0 1 0 0 Λ 4 D T d t 0 1 0 1 Ω % 5 E U e u 0 1 1 0 ∏ & 6 F V f v 0 1 1 1 Ψ ‘ 7 G W g w 1 0 0 0 Σ ( 8 H X h x 1 0 0 1 Ө ) 9 I Y i y 1 0 1 0 LF Ξ * : J Z j z 1 0 1 1 + ; K Ä k ä 1 1 0 0 , < L l ö 1 1 0 1 CR - = M ü m 1 1 1 0 Β . > N n ü 1 1 1 1 / ? O o
Sebagai contoh pesan yang dikirim adalah MOEHI.
Terdapat dua langkah yang harus dilakukan untuk mengkonversi isi
SMS, yaitu :
1. Mengubah menjadi kode 7 bit sesuai dengan Tabel 2.5
Tabel 2.6 Skema 7 bit kata MOEHI
Karakter Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 M 1 0 0 1 1 0 1 O 1 0 0 1 1 1 1 E 1 0 0 0 1 0 1 H 1 0 0 1 0 0 0 I 1 0 0 1 0 0 1
18
2. Mengubah kode 7 bit menjadi kode 8 bit, yang diwakili oleh pasangan heksa.
Karena total 7 bit x 5 huruf = 35 bit, sedangkan yang diperlukan adalah 8
bit x 5 huruf = 40 bit karena 8 bit mewakili suatu pasangan heksa (4 bit biner = 1
angka heksa), maka diperlukan 5 bit dummy berupa bilangan 0 yang diisikan pada
karakter terakhir.
Tabel 2.7 Konversi 7 bit ke 8 bit
Karakter Skema 7 bit Skema 8 bit Heksa M 1001101 1 1001101 CD O 1001111 01 100111 67 E 1000101 000 10001 11 H 1001000 1001 1001 99 I 1001001 00000 100 04
dummy
Dengan demikian kata MOEHI setelah dikonversi menjadi 8 bit menjadi
CD67119904.
Setelah mendapatkan masing-masing sub-header dari header PDU, maka
dapat digabungkan menjadi header PDU lengkap. Sub-header yang telah didapat
adalah sebagai berikut :
1. SCA → 07912618485400F9 (SMSC Exelcom dengan International Code).
2. PDU Type → 31 (Pengiriman SMS dengan balasan status pengiriman).
3. MR → 00 (nomor referensi SMS).
4. DA → 0B818065033308F8 (nomor tujuan 08563033808 National Code).
5. PID → 00 (Standard Text).
6. DCS → 00 (Skema data 7 bit).
7. VP → FF (waktu maksimum validasi).
8. UDL → 05 (panjang isi SMS).
19
9. UD → CD67119904 (isi SMS = MOEHI)
Jadi PDU lengkap-nya adalah
07912618485400F931000B818065033308F80000FF05CD67119904
B. PDU SMS Penerima (SMS Deliver PDU/Mobile Terminated (MT))
SMS PDU Penerima adalah terminal menerima pesan yang datang dari
SMSC ke HP dalam format PDU. Pada prinsipnya pesan yang kita terima dari
SMSC masih dalam format PDU setelah itu terminal HP yang menerima pesan
melakukan pengkodean menjai teks, proses ini sering disebut proses decodec.
Cara pengkodean format PDU sudah diatur dan distandarkan oleh ETSI. Format
PDU SMS Penerima adalah pada Gambar 2.3 (Tim Penelitian, 2005 : 17)
SCA PDU Type OA PID DCS SCTS UDL UD
Gambar 2.3 Skema format SMS PDU Penerima
Penjelasan masing-masing format adalah sebagai berikut :
B.1 Service Center Address (SCA)
SCA adalah informasi dari alamat (nomor) SMSC. SCA memiliki 3
komponen utama yaitu length, type of number, dan service center number.(Tim
Penelitian, 2005 : 16)
1. Length
Berupa jumlah pasangan heksadesimal SMSC dalam bilangan
heksadesimal.
20
2. Type of Number
Apabila SMSC dalam bentuk kode nasional, maka sub-header-nya 81
atau dalam bentuk kode internasional, maka sub-header-nya 91.
3. Service center number
Berupa pasangan heksadesimal yang dibalik-balik dari nomor SMSC. Jika
pada pasangan heksa terakhir berakhiran F, maka angka tersebut tidak memiliki
angka pasangan.
Sebagai contoh untuk nomor SMSC dari Excelcom dapat dijelaskan
dalam 2 cara, yaitu :
- Menggunakan National Code
Isi SCA = 06818081440590, maka akan diubah menjadi :
• 06 karena memiliki 6 pasang heksadesimal yaitu 5 pasang nomor SMSC
dan 1 pasang untuk National Code.
• 81 (National Code)
• 08 – 18 – 44 – 50 – 09 (nomor SMSC yang dibolak-balik)
Sehingga nomor SMSC-nya adalah 0818445009
- Menggunakan International code
Isi SCA = 07912618485400F9, maka diubah menjadi :
• 07 karena memiliki 7 pasang heksadesimal yaitu 6 pasang nomor SMSC
dan 1 pasang untuk International Code.
• 91 (International Code)
21
• 62 – 81 – 84 – 45 – 00 – 9F (Nomor SMSC yang dibolak-balik, dimana F
merupakan panambahan karena satu angka tidak memiliki pasangan
heksadesimal).
Sehingga nomor SMSC-nya adalah 62818445009.
B.2 PDU Type
Nilai default dari PDU Type untuk SMS Penerima adalah 04
heksadesimal atau 00000100 biner. Penjelasan tiap bit adalah pada Tabel 2.8
Tabel 2.8 PDU Type
Bit ke 7 6 5 4 3 2 1 0
Nama RP UDHI SRI <nn> <nn> MMS MTI MTI
Nilai 0 0 0 0 0 1 0 0
Keterangan :
Reply Path (RP) : Parameter yang menunjukkan bahwa terdapat alur
jawaban.
User Data Header Indicator (UDHI) : Bit ini bernilai 1 jika data pengirim
dimulai dengan suatu judul/tema.
Status Report Indication (SRI) : Bit ini bernilai 1 jika laporan status
dikembalikan ke SME.
More Message to Send (MMS) : Bit ini bernilai 0 jika ada pesan lebih
yang akan dikirim.
Message Type Indicator (MTI) : Bit ke-1 dan ke-0 ini bernilai 0 untuk
menunjukkan bahwa PDU ini adalah SMS Pengirim. (Tim Penelitian, 2005 : 18)
22
B.3 Originator Address (OA)
OA adalah alamat (nomor) dari pengirim, yang terdiri atas yaitu length,
type of number, dan originator number. (Gunawan, 2003 : 23)
1. Length
Berupa jumlah bilangan desimal nomor pengirim dalam bilangan
heksadesimal.
2. Type of Number
Apabila nomor pengirim dalam bentuk kode nasional, maka sub-header-
nya 81 atau dalam bentuk kode internasional, maka sub-header-nya 91.
3. Originator number
Berupa pasangan heksadesimal yang dibolak-balik dari nomor pengirim.
Jika pada pasangan heksa terakhir berakhiran F, maka angka tersebut tidak
memiliki angka pasangan.
Isi OA dapat dijelaskan dalam 2 cara, yaitu :
- Menggunakan National Code
Isi OA = 0B818065033308F8, maka akan diubah menjadi :
• 0B karena memiliki 11 angka pada nomor pengirim, sehingga 11 desimal =
0B heksadesimal.
• 81 (National Code)
• 08 – 56 – 30 – 33 – 80 – 8F (Nomor pengirim yang dibolak-balik, dimana F
merupakan panambahan karena satu angka tidak memiliki pasangan
heksadesimal).
23
Sehingga nomor pengirimnya adalah 08563033808.
- Menggunakan International code
Isi OA = 0C91625836308380, maka diubah menjadi :
• 0C karena memiliki 12 angka pada nomor pengirim, sehingga 12 desimal =
0C heksadesimal.
• 91 (International Code)
• 62 – 85 – 63 – 03 – 38 – 08 (Nomor pengirim yang dibolak-balik).
Sehingga nomor pengirimnya adalah 628563033808.
B.4 Protocol Identifier (PID)
Protocol Identifier adalah tipe atau format dari cara pengiriman pesan
yang biasanya diatur dari HP pengirim. Misalnya tipe Standard Text, Fax, E-mail,
Telex, X400, dan lain-lain. Nilai default dari PID adalah 00 (Standard Text).
Jika dikirim sebagai Telex, nilai PID-nya 01 dan jika dikirim sebagai
Fax, nilai PID-nya 02. (Tim Penelitian, 2005 : 18)
B.5 Data Coding Scheme (DCS)
Data Coding Scheme adalah rencana dari pengkodean data untuk
menentukan kelas dari pesan tersebut apakah berupa SMS teks standar, Flash
SMS, atau Blinking SMS. Jika yang digunakan adalah skema 7 bit, maka DCS
bernilai 00. Jika yang digunakan adalah skema 8 bit, maka DCS bernilai angka
heksadesimal lebih dari nol. (Tim Penelitian, 2005 : 19)
24
B.6 Service Center Time Stamps (SCTS)
Menurut Tim Penelitian (2005 : 19) SCTS adalah waktu penerimaan
pesan dari SMSC penerima. SCTS terdiri atas tahun, bulan, tanggal, jam, menit,
detik, dan zona waktu. Misal nilai SCTS adalah 60609102955382, maka
penjelasannya adalah sebagai berikut :
60 – Tahun 2006
60 – Bulan 06 (Juni)
91 – Tanggal 19
02 – Jam 20 (8 malam)
95 – Menit 59
53 – Detik 35
82 – Zona Waktu 28 (dengan 1 unit = 15 menit, jadi (28 x 15) / 60 menit
= 7 jam. Sehingga menjadi GMT +07.00).
B.7 User Data Length (UDL)
User Data Length adalah panjang pesan SMS yang telah diterima dengan
bentuk teks standar dalam angka heksadesimal.
B.8 User Data (UD)
User Data adalah isi pesan yang telah diterima dalam format
heksadesimal. Berdasarkan pada Tabel 2.5, pengkodean dari heksadesimal
menjadi nilai teks standar dilakukan seperti pada Tabel 2.9
25
Tabel 2.9 Konversi 8 bit ke 7 bit
Heksa Skema 7 bit Skema 8 bit Karakter CD 1001101 1 1001101 M 67 1001111 01 100111 O 11 1000101 000 10001 E 99 1001000 1001 1001 H 04 1001001 00000 100 I
dummy
2.2 SIEMENS AT Command
AT Command yang berarti Attention Command merupakan sekumpulan
perintah-perintah yang digunakan komputer untuk mengakses modem handphone.
Pada handphone dengan vendor SIEMENS, perintah AT Command akan diterima
melalui interface handphone. Sedangkan kontroler berupa mikrokontroler atau
komputer sebagai pengirim perintah akan mengirimkan perintah tersebut melalui
serial interface. Sehingga komunikasi antara handphone dan kontroler adalah
komunikasi secara serial.
Protokol yang digunakan oleh handphone SIEMENS untuk proses
pengiriman atau penerimaan SMS adalah PDU. Protokol ini merupakan
sekumpulan angka-angka heksadesimal yang merepresentasikan data-data header
berupa identitas dan isi SMS.
Cara penggunaan perintah AT Command adalah pengetikan perintah
selalu diawali oleh at atau AT kemudian dilanjutkan dengan perintah yang
diinginkan. Jika perintah yang diberikan tidak ada kesalahan, maka HP akan
memberikan jawaban dari perintah yang dikirim. Sebaliknya, jika terdapat
kesalahan perintah, maka jawaban yang diterima oleh host pengirim adalah
ERROR. (Kellerek, 2000)
26
Tabel 2.10 Beberapa perintah AT Command
Perintah Fungsi
AT+CBC Battery Charge AT+CSQ Kualitas sinyal keluaran AT+CSMS Pilih Message Service AT+CMGF Format SMS AT+CSCA Alamat SMSC AT+CMGL Daftar SMS AT+CMGR Baca SMS AT+CMGD Hapus SMS AT+CMGS Kirim SMS
2.3 Komunikasi Serial RS232
Menurut Mazidi (2000 : 184) transmisi data secara serial adalah transmisi
data dimana data tersebut akan dikirimkan tiap bit dalam satu waktu. Terdapat 2
cara dalam mentransmisikan data secara serial, yaitu secara Synchronous dan
Asynchronous. Dari kedua cara tersebut yang membedakan adalah sinyal clock
yang dipakai untuk sinkronisasi dalam mengirim data.
Transmisi secara Synchronous yaitu pengiriman data serial bersamaan
dengan sinyal clock, sedangkan Asynchronous yaitu pengiriman data serial tidak
bersamaan dengan sinyal clock sehingga receiver harus membangkitkan sinyal
clock sendiri (tidak perlu sinkronisasi). (Nalwan, 2003 : 41-42)
Berdasarkan arah proses komunikasi serial terdapat 3 metode, yaitu
Simplex, Half-Duplex dan Full-Duplex. (Mazidi, 2000 : 185)
27
Simplex Transmitter Receiver
Receiver
Receiver
Transmitter
Transmitter
Half-Duplex
Transmitter Receiver
Full-Duplex Receiver Transmitter
Gambar 2.4 Arah komunikasi serial
Satuan kecepatan transfer data (baudrate) pada komunikasi serial adalah
bits per second (bps). Untuk menjaga kompatibilitas dari beberapa peralatan
komunikasi data yang dibuat oleh beberapa pabrik, pada tahun 1960 Electronics
Industries Association (EIA) menstandarkan antarmuka serial dengan nama
RS232.
Output yang dihasilkan oleh RS232 tidak sesuai dengan output
Transistor-Transistor Logic (TTL) yang sudah ada. Dalam RS232, logika 1
direpresentasikan dengan tegangan -3 s.d. -25 volt sedangkan logika 0
direpresentasikan dengan tegangan +3 s.d. +25 volt. Hasil tak terdefinisi jika
berada diantara tegangan -3 s.d +3 volt. IBM PC atau komputer yang berbasis x86
(8086, 286, 386, 486 dan Pentium) secara umum prosesor yang digunakan
memiliki dua port COM. Keduanya merupakan konektor jenis RS232 yaitu DB25
dan DB9. (Mazidi, 2000 : 187) (Peacock, 1998)
28
Gambar 2.5 Pinout konektor jarum DB25
Tabel 2.11 Keterangan pinout DB25
No. Pin Nama Keterangan
1 GND Ground 2 TD Transmit Data (TxD/Tx) 3 RD Receive Data (RxD/Rx) 4 RTS Request To Send 5 CTS Clear To Send 6 DSR Data Set Ready 7 SGND Signal Ground 8 CD Carrier Detect (DCD) 9 - Disediakan untuk percobaan data set 10 - Disediakan untuk percobaan data set 11 - Tidak berfungsi 12 SDCD Secondary Carrier Detect 13 SCTS Secondary Clear to send 14 STD Secondary Transmit Data 15 DB Transmit Clock (TCLK/TxCLK) 16 SRD Secondary Receive Data 17 DD Receive Clock (RCLK) 18 LL Local Loopback 19 SRTS Secondary Request to Send 20 DTR Data Terminal Ready 21 RL/SQ Signal Quality Detector/Remote loopback 22 RI Ring Indicator 23 CH/CI Signal Rate selector 24 DA Auxiliary Clock (ACLK) 25 - Tidak berfungsi
Gambar 2.6 Pinout Konektor jarum DB9
29
Tabel 2.12 Keterangan pinout DB9
No. Pin Nama Keterangan
1 DCD Data Carrier Detect 2 RD Receive Data (RxD/Rx) 3 TD Transmit Data (TxD/Tx) 4 DTR Data Terminal Ready 5 SGND Ground 6 DSR Data Set Ready 7 RTS Request To Send 8 CTS Clear To Send 9 RI Ring Indicator
Untuk pengiriman data sebesar 1 byte pada proses komunikasi serial
diawali oleh 1 start bit (low), 8 data bit, 1 atau lebih stop bit (high). Satu paket
data ini disebut frame.
Gambar 2.7 Pembagian bit dalam 1 frame
2.4 Mikrokontroler MCS-51
Mikrokontroler sebagai komponen pengendali berupa program yang telah
kita buat dan masukkan ke dalamnya. Sebagai contoh mikrokontroler MCS-51
adalah Mikrokontroler AT89S52. Mikrokontroler ini memiliki karakteristik
sebagai berikut (ATMEL Corporation, 2005 : 1) :
- In-System Programmable (ISP) Flash Memory sebesar 8 kByte. Dengan
menggunakan flash chip ini, mengijinkan program memori dapat diprogram
ulang dalam sistem. Sehingga mikrokontroler ini tidak membutuhkan
mikrokontroler lain sebagai master untuk proses download program.
IDLE 8 Data Bits STOP +12
-
START START START
IDLE
30
- Memiliki Random Access Memory (RAM) sebesar 256 Byte.
- 32 jalur atau bit input dan output yang terbagi menjadi 4, yaitu P0, P1, P2, P3.
- Memiliki Watchdog timer.
- Memiliki 2 buah data pointer.
- Memiliki 3 buah timer dan counter 16 bit
- Memiliki Full duplex serial port sehingga memungkinkan pengiriman dan
penerimaan data secara serial dapat berlangsung bersamaan.
Mikrokontroler tersebut mempunyai 40 kaki, 32 kaki di antaranya adalah
kaki untuk keperluan port paralel. Tiap port paralel terdiri dari 8 kaki, dengan
demikian 32 kaki tersebut membentuk 4 buah port paralel, yang masing–masing
dikenal sebagai Port 0, Port 1, Port 2 dan Port 3. Nomor dari masing–masing jalur
(kaki) dari port paralel mulai dari dari 0 sampai 7, jalur (kaki) pertama Port 0
disebut sebagai P0.0 dan jalur terakhir untuk Port 3 adalah P3.7. (Putra, 2002 : 69)
Gambar 2.8 Pin out Microcontroller ATMEL 89S52
31
2.4.1 Fungsi–fungsi Kaki (Pin)
- VCC : Suplai tegangan
- GND : Ground atau pentanahan
- RST : Masukan reset. Kondisi ’1’ selama 2 siklus mesin selama
osilator bekerja akan mereset mikrokontroler yang bersangkutan
- ALE / PROG : Keluaran ALE atau Adreess Latch Enable menghasilkan pulsa–
pulsa untuk mengancing byte rendah (low byte) alamat selama
mengakses memori eksternal. Kaki ini juga berfungsi sebagai
masukan pulsa program (the program pulse input) atau PROG
selama pemrograman flash. Pada operasi normal, ALE akan
berpulsa dengan laju 1/6 dari frekuensi kristal dan dapat
digunakan sebagai pewaktuan (timing) atau pendetakan
(clocking) rangkaian eksternal. Catatan, ada satu pulsa yang
dilompati selama selama pengaksesan memori data eksternal.
Jika dikehendaki, operasi ALE bisa dimatikan dengan cara
mengatur bit 0 dari SFR lokasi 8Eh. Jika isinya ’1’, ALE hanya
akan aktif selama dijumpai instruksi MOVX atau MOVC. Selain
itu, kaki ini akan secara lemah di-pulled high. Mematikan bit
ALE tidak akan ada efeknya jika mikrokontroler mengeksekusi
program secara eksternal.
- PSEN : Program Store Enable merupakan sinyal baca untuk memori
program eksternal. Saat mikrokontroler menjalankan program
dari memori eksternal, PSEN akan diaktifkan dua kali per siklus
32
mesin, kecuali dua aktivasi PSEN dilompati (diabaikan) saat
mengakses memori data eksternal.
- EA/VPP : External Access Enable. EA harus selalu dihubungkan ke-
ground, jika mikrokontroler akan mengeksekusi program dari
memori eksternal lokasi 0000h hingga FFFFh. Selain dari itu, EA
harus dihubungkan ke VCC agar mikrokontroler mengakses
program secara internal, yaitu pada lokasi 0000h sampai 1FFFh
sedangkan lokasi 2000h sampai FFFFh pada memori eksternal.
Kaki ini juga berfungsi menerima tegangan 12 Volt (VPP) selama
pemrograman flash, khususnya untuk tipe mikrokontroler 12 Volt
VPP.
2.4.2 Spesifikasi Masing-masing Port
Keempat port pada mikrokontroler bersifat dwi-arah dan masing-masing
memiliki sebuah pengancing (latch), yang diacu dalam program sebagai Register
Fungsi Khusus (RFK atau SFR) sebagai P0, P1, P2 dan P3. Selain itu juga
memiliki sebuah penggerak keluaran (output driver) dan sebuah penyangga
masukan (input buffer) pada masing-masing kaki port.
Penggerak–penggerak keluaran Port 0 dan 2 serta penyangga masukan
dari Port 0 digunakan dalam pengaksesan memori eksternal. Pada aplikasi
semacam ini, Port 0 mengeluarkan byte rendah alamat memori eksternal,
dimultipleks secara waktu dengan byte yang akan dituliskan atau dibaca (ke/dari
memori eksternal). Port 2 mengeluarkan byte tinggi dari alamat memori eksternal
jika lebar alamatnya 16-bit, selain itu kaki–kaki Port 2 tetap meneruskan
33
menghasilkan isi SFR dari P2. Berikut ini akan dijelaskan masing–masing port
pada mikrokontroler. (Putra, 2002 : 71)
A. Port 0
Port 0 merupakan keluaran/masukan (I/O) bertipe open drain
bidirectional. Sebagai port keluaran, masing–masing kaki dapat menyerap arus
(sink) delapan masukan TTL (sekitar 3,8 mA). Pada saat ’1’ dituliskan ke kaki–
kaki Port 0 ini, maka kaki–kaki Port 0 dapat digunakan sebagai masukan–
masukan berimpedansi tinggi.
Jika Port 0 dapat dikonfigurasikan sebagai bus alamat/data bagian
rendah (low byte) selama proses pengaksesan memori data dan program eksternal.
Jika digunakan dalam mode ini Port 0 memiliki pullup internal.
Port 0 juga menerima kode–kode yang dikirim kepadanya selama proses
pemrograman dan mengeluarkan kode–kode selama proses varifikasi program
yang telah tersimpan dalam flash. Dalam hal ini dibutuhkan pullup eksternal
selama proses verifikasi program.
B. Port 1
Port 1 merupakan I/O dwi–arah yang dilengkapi dengan pullup internal.
Penyangga keluaran Port 1 mampu memberikan/menyerap arus empat masukan
TTL (sekitar 1,6 mA).
Jika ’1’dituliskan ke kaki–kaki Port 1, maka masing–masing kaki akan
di-pulled high dengan pullup internal sehingga dapat digunakan sebagai masukan.
Sebagai masukan, jika kaki–kaki Port 1 dihubungkan ke ground (di-low pulled),
34
maka masing–masing kaki akan memberikan arus (source) karena di-pulled high
secara internal. Port 1 juga menerima alamat bagian rendah (low byte) selama
pemrograman dan verifikasi flash.
C. Port 2
Port 2 merupakan I/O dwi–arah yang dilengkapi dengan pullup internal.
Penyangga keluaran port 1 mampu memberikan/menyerap arus empat masukan
TTL (sekitar 1,6 mA).
Jika ’1’ dituliskan ke kaki–kaki Port 2, maka masing–masing kaki akan
di-pulled high dengan pullup internal sehingga dapat digunakan sebagai masukan.
Sebagai masukan, jika kaki–kaki Port 2 dihubungkan ke ground (di-pulled low),
maka masing–masing kaki akan memberikan arus (source) karena di-pulled high
secara internal.
Port 2 akan memberikan byte alamat bagian tinggi (high byte) selama
pengambilan instruksi dari memori program eksternal dan selama pengaksesan
memori data eksternal yang menggunakan perintah dengan alamat 16-bit. Dalam
aplikasi ini, jika ingin mengirimkan ’1’, maka digunakan pullup internal yang
sudah disediakan. Selama pengaksesan memori data eksternal yang menggunakan
perintah dengan alamat 8-bit, Port 2 akan mengirimkan isi dari SFR P2. Port 2
juga menerima alamat bagian tinggi selama pemrograman dan verifikasi flash.
35
D. Port 3
Port 3 merupakan port I/O dwi–arah dengan dilengkapi pullup internal.
Penyangga keluaran Port 3 mampu memberikan/menyerap arus empat masukan
TTL (sekitar 1,6 mA).
Jika ’1’ dituliskan ke kaki–kaki port 3, maka masing–masing kaki akan
di-pulled high dengan pullup internal sehingga dapat digunakan sebagai masukan.
Sebagai masukan, jika kaki–kaki port 3 dihubungkan ke ground (di-pulled low),
maka masing–masing kaki akan memberikan arus (source) karena di-pulled high
secara internal.
Port 3, sebagaimana Port 1, memiliki fungsi–fungsi alternatif antara lain
menerima sinyal–sinyal kontrol (P3.6 dan P3.7), bersama–sama dengan port 2
(P2.6 dan P2.7) selama pemrograman dan verifikasi flash. (Putra, 2002 : 75)
(Mazidi, 2000 : 5)
Tabel 2.13 Fungsi–fungsi khusus kaki–kaki port 3
Port Pin Alternate Function P3.0 RXD (serial input port) P3.1 TXD (serial output port) P3.2 INT0 (external interrupt 0) P3.3 INT1 (external interrupt 1) P3.4 T0 (timer 0 external input) P3.5 T1 (timer 1 external input) P3.6 WR (external data memory write strobe) P3.7 RD (external data memory read strobe)
2.4.3 Timer/Counter
Keluarga mikrokontroler MCS-51 dilengkapi dengan tiga perangkat
Timer/Counter, masing-masing dinamakan sebagai Timer/Counter 0,
Timer/Counter 1, dan Timer 2.
36
Untuk mengakses Timer/Counter tersebut digunakan register khusus
yang tersimpan dalam Special Function Register (SFR). Pencacah biner Timer 0
diakses melalui register TL0 (Timer 0 Low Byte, memori internal alamat 6Ah) dan
register TH0 (Timer 0 High Byte, memori internal alamat 6Ch). Pencacah biner
Timer 1 diakses melalui register TL1 (Timer 1 Low Byte, memori internal alamat
6Bh) dan register TH1 (Timer 1 High Byte, memori internal alamat 6Dh).
Pencacah biner Timer/Counter pada MCS-51 merupakan pencacah biner
16 bit naik (count up binary counter) yang mencacah 0000h sampai FFFFh, saat
kondisi pencacah berubah dari FFFFh kembali ke 0000h akan timbul sinyal
berlebihan (overflow).
Untuk mengatur kerja Timer/Counter tersebut digunakan 2 register
tambahan, yaitu register TCON (Timer Control Register, memori data internal
alamat 88h, bisa diberi alamat per bit). Dan register TMOD (Timer Mode
Register, memori data internal alamat 89h, tidak bisa diberi alamat per bit). (Putra,
2002 : 112 - 115)
Tabel 2.14 Susunan bit dalam register TCON
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Timer 1 Timer 0
Keterangan:
- TF1 : overflow flag Timer 1/Counter 1 (1 = overflow)
- TR1 : Enable Timer 1/Counter 1
- TF0 : overflow flag Timer 0/Counter 0 (1 = overflow)
37
- TR0 : Enable Timer 0/Counter 0
- IE1 : External Interrupt 1 edge flag
- IT1 : Interrupt 1 type control bit. Set/clear oleh program untuk menspesifikasi
sisi turun/level rendah trigger dari interupsi eksternal.
- IE0 : External Interrupt 0 edge flag
- IT0 : Interrupt 0 type control bit. Set/clear oleh program untuk menspesifikasi
sisi turun/level rendah trigger dari interupsi eksternal.
Tabel 2.15 Susunan bit dalam register TMOD
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 GATE C/T M1 M0 GATE C/T M1 M0
Timer 1 Timer 0
- GATE : merupakan bit pengatur sinyal detak. Jika GATE = 0, Timer/Counter
akan berjalan saat TR0 atau TR1 pada register TCON (TRx) = 1. Jika GATE =
1, Timer/Counter akan berjalan saat TRx = 1 atau INT1 untuk Timer 1 dan
INT0 untuk Timer 0 (INTx) = 1.
- C/T : dipakai untuk mengatur sumber sinyal detak yang diberikan kepada
pencacah biner. Jika C/T = 0, maka Timer akan aktif dengan sinyal detak
diperoleh dari osilator kristal yang frekuensinya sudah dibagi 12. Jika C/T = 1,
maka Counter akan aktif dengan sinyal detak diperoleh dari kaki T0 (untuk
Timer 0) dan kaki T1 (untuk Timer 1).
- M0 dan M1 : dipakai untuk menentukan Mode Timer/Counter.
38
Tabel 2.16 Mode Operasi Timer/Counter
M1 M0 Mode Operasi 0 0 0 Timer/ Counter 13 bit 0 1 1 Timer/Counter 16 bit 1 0 2 Timer auto reload 8 bit 1 1 3 TL0 adalah timer/Counter 8 bit yang dikontrol
oleh kontrol bit Timer 0 (TF0). TH0 adalah Timer/Counter 8 bit yang dikontrol oleh kontrol bit Timer 1 (TF1).
Untuk menghitung clock frequency adalah menggunakan perhitungan
berikut :
T = osilatorfrekuensi×
121
1 (2.1)
Sehingga, dengan menggunakan Mode 1 dapat dihitung waktu tunda
yang diperlukan dengan perhitungan berikut :
Delay = ( ) Tn ×−65536 (2.2)
Dengan n adalah nilai desimal dari nilai heksadesimal THxTLx. (Mazidi, 2000 :
159 - 160)
2.4.4 Interupsi
Interupsi adalah suatu keadaan eksternal atau internal yang
mengakibatkan mikrokontroler menunda proses yang sedang berjalan untuk
menjalankan proses lain. Mikrokontroler MCS-51 menyediakan enam sumber
interupsi, yaitu dua interupsi eksternal, tiga interupsi timer, dan satu interupsi
serial. Masing-masing sumber interupsi tersebut dapat diaktifkan dan
dinonaktifkan sendiri-sendiri dengan mengatur bit-bit yang terkait dalam register
39
IE (Interrupt Enable) di alamat memori internal A8h. (Putra, 2002 : 156) (Mazidi,
2000 : 211)
Tabel 2.17 Susunan bit dalam register IE
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 EA - ET2 ES ET1 EX1 ET0 EX0
Keterangan:
- EA : Enable semua interupsi (0 = non aktif, 1 = aktif).
- ET2 : Enable Timer 2 overflow atau menangkap interupsi (0 = non aktif, 1 =
aktif).
- ES : Enable interupsi serial (0 = non aktif, 1 = aktif).
- ET1 : Enable Timer 1 overflow (0 = non aktif, 1 = aktif).
- EX1 : Enable eksternal interupsi 1 (0 = non aktif, 1 = aktif).
- ET0 : Enable Timer 0 overflow (0 = non aktif, 1 = aktif).
- EX0 : Enable eksternal interupsi 0 (0 = non aktif, 1 = aktif).
Program yang tergabung dalam sistem interupsi disebut Interrupt Service
Routine (ISR) atau interrupt handler. Jika terjadi interupsi, mikrokontroler akan
mengeksekusi ISR. Setiap program interupsi berada pada lokasi memori internal
tertentu dan tidak berpindah-pindah. Pada Tabel 2.18 menunjukkan alamat ISR
pada memori internal mikrokontroler.
40
Tabel 2.18 Alamat ISR
No. Nama ROM Address
Alat Interupsi
1. Reset 0000h Power on Reset (pin 9) 2. INT0 0003h Interupsi 0 hardware eksternal (pin 12) 3. Timer 0 000Bh Overflow Timer 0 (TF0) 4. INT1 0013h Interupsi 1 hardware eksternal (pin 13) 5. Timer 1 001Bh Overflow Timer 1 (TF1) 6. Serial
COM 0023h Port I/O Serial
Secara default, apabila dalam suatu proses yang sedang berjalan terdapat
beberapa interupsi yang datang bersamaan, maka urutan prioritas interupsi yang
dikerjakan sesuai dengan urutan pada Tabel 2.18. Jika ingin mengatur prioritas
dari suatu interupsi, dapat diatur dalam register Interrput Priority (IP). (Mazidi,
2000 : 228)
Tabel 2.19 Susunan bit dalam register IP
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 - - PT2 PS PT1 PX1 PT0 PX0
Keterangan:
- PT2 : prioritas interupsi Timer 2 (0 = prioritas rendah, 1 = prioritas tinggi).
- PS : prioritas interupsi Serial (0 = prioritas rendah, 1 = prioritas tinggi).
- PT1 : prioritas interupsi Timer 1 (0 = prioritas rendah, 1 = prioritas tinggi).
- PX1 : prioritas interupsi INT1 (0 = prioritas rendah, 1 = prioritas tinggi).
- PT0 : prioritas interupsi Timer 0 (0 = prioritas rendah, 1 = prioritas tinggi).
- PX0 : prioritas interupsi INT0 (0 = prioritas rendah, 1 = prioritas tinggi).
41
2.4.5 Port Serial
Port serial pada mikrokontroler MCS-51 dapat digunakan dalam empat
Mode, kerja yang berbeda. Satu Mode diantaranya bekerja secara sinkron dan tiga
lainnya bekerja secara asinkron. (Putra, 2002 : 133)
A. Mode 0
Mode ini bekerja secara sinkron, data serial dikirim dan diterima melalui
kaki P3.0 (Rx), sedangkan kaki P3.1 (Tx) digunakan untuk menyalurkan detak
pendorong data serial yang dibangkitkan mikrokontroler. Data dikirim/diterima 8
bit sekaligus, dimulai dari bit ke-0 sampai dengan bit ke-7. Kecepatan pengiriman
data (baudrate) adalah 121 frekuensi kristal yang digunakan.
B. Mode 1
Mode ini tetap, yaitu data dikirim melalui kaki P3.1 (Tx) dan diterima
melalui kaki P3.0 (Rx), secara asinkron (juga seperti Mode 2 dan Mode 3). Data
dikirim/diterima 10 bit sekaligus, diawali dengan 1 bit start, 8 bit data mulai dari
bit ke-0 sampai dengan bit ke-7, dan 1 bit stop. Pada MCS-51 yang berfungsi
sebagai penerima bit stop adalah RB8 pada register SCON. Baud rate dapat diatur
sesuai keperluan. Mode 1, Mode 2, dan Mode 3 dikenal dengan Universal
Asynchronous Receiver/Transmitter (UART).
C. Mode 2
Data dikirim/diterima 11 bit sekaligus, diawali dengan 1 bit start, 8 bit
data mulai dari bit ke-0 sampai dengan bit ke-7, bit ke-9 dan 1 bit stop. Pada
42
MCS-51 yang berfungsi sebagai pengirim, bit ke-9 berasal data bit TB8 dalam
register SCON. Pada MCS-51 yang berfungsi sebagai penerima, bit ke-9
ditampung di data bit RB8 dalam register SCON, sedangkan bit stop tidak
ditampung. Baud rate bisa dipilih 321 atau
641 frekuensi kristal yang digunakan.
D. Mode 3
Mode ini sama dengan mode 2, tetapi baud rate dapat diatur sesuai
dengan keperluan. (Putra, 2002 : 134)
Tabel 2.20 Susunan bit dalam register SCON
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 SM0 SM1 SM2 REN TB8 RB8 TI RI
Keterangan :
- SM0 dan SM1 : untuk menentukan mode kerja port serial
Tabel 2.21 Mode port serial
SM0 SM1 Mode Keterangan Baudrate 0 0 0 Register geser
Tetap (121 x frek. osilator)
0 1 1 UART 8 bit Dapat diubah-ubah (dengan Timer) 1 0 2 UART 9 bit
Tetap (321 atau
641 x frek. Osilator)
1 1 3 UART 9 bit Dapat diubah-ubah (dengan Timer)
- SM2 : untuk komunikasi multiprosesor.
- REN : untuk mengaktifkan kemampuan port serial menerima data.
- TB8 : bit ke-8 dari data yang akan dikirim (Mode 2 dan Mode 3).
43
- RB8 : bit ke-8 dari data yang telah diterima (Mode 2 dan Mode 3).
- TI : bernilai 1 jika data telah dikirim.
- RI : bernilai 1 jika data telah diterima.
E. Baudrate
Baud rate menunjukkan laju kecepatan pengiriman data digital secara
seri. Laju baud rate sama dengan banyaknya bit yang dikirim setiap detik. Pada
MCS-51 pengiriman secara serial ditentukan oleh Mode yang telah ditentukan.
Baud rate yang digunakan juga bersesuaian dengan Mode yang digunakan. Mode
0 Baud rate yang digunakan adalah (Putra, 2002 : 136):
Baudrate = 12
osilasifrekuensi (2.3)
Baud rate yang digunakan pada Mode 2 tergantung dari isi bit SMOD
yang ada pada register PCON.
Tabel 2.22 Susunan bit dalam register PCON
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 SMOD - - - GF1 GF0 PD IDL
Jika SMOD = 0 Baud rate yang digunakan adalah 641K = . Jika SMOD
= 1 Baud rate yang digunakan 321K = .
Baudrate = K osilasifrekuensi× (2.4)
Baud rate yang digunakan untuk Mode 1 dan 3 dapat ditentukan melalui
register Timer 1 dan juga bit SMOD pada register PCON. Jika SMOD = 0 Baud
rate yang digunakan adalah K=1. Jika SMOD = 1 Baud rate yang digunakan K=2.
44
Baudrate = ([ )]12561232 THosilasifrekuensiK−×
× (2.5)
2.4.6 Reset
C110uF/16v
R210k
S1
VCC
RST
R1100
Gambar 2.9 Skema rangkaian reset
Reset dapat dilakukan secara manual maupun otomatis saat power
diaktifkan (Power On Reset). Saat terjadi reset isi dari register akan berubah
sesuai yang ada pada Tabel 2.23 (Nalwan, 2003 : 27 - 28)
Tabel 2.23 Isi Register setelah reset
Register Isi Register Program Counter 0000H Akumulator 00H Register B 00H PSW 00H Stack Pointer (A) 07H DPTR 0000H Port 0 – 3 FFH Interrupt Priority (IP) XXX00000B Interrupt Enable (IE) 0XX00000B Register Timer 00H SCON 00H SBUF 00H PCON (HMOS) 0XXXXXXXB PCON (CMOS) 0XXX0000B
45
Reset terjadi dengan adanya logika 1 selama minimal 2 cycle pada kaki
RST. Setelah kondisi pin RST kembali low, mikrokontroler akan mulai
menjalankan program dari alamat 0000H. Kondisi pada internal RAM tidak
terjadi perubahan selama reset.
Gambar 2.10 merupakan gambar rangkaian reset yang bekerja secara
manual atau otomatis saat sumber daya diaktifkan. Saat sumber daya diaktifkan,
maka kapasitor C1 sesuai dengan sifat kapasitor akan terhubung singkat pada saat
itu sehingga rangkaian ekivalennya tampak pada Gambar 2.10A. Arus mengalir
dari VCC langsung ke kaki RST sehingga kaki tersebut berlogika 1. Kemudian
kapasitor terisi hingga tegangan pada kapasitor (VC) yaitu tegangan antara VCC
dan titik antara kapasitor C1 dan resistor R2 mencapai VCC, otomatis tegangan
pada R2 atau tegangan RST akan turun menjadi 0 sehingga kaki RST akan
berlogika 0 (Gambar 2.10B) dan proses reset selesai.
R210k
R1100
S1
C110uF/16v
R210k
S1
RST
VCC
RST
VCC
A
VR2
VC
R1100
B
Gambar 2.10 Aliran arus dan perubahan tegangan pada reset otomatis
Jika saklar S1 ditekan, reset kembali bekerja secara manual, aliran arus
akan mengalir dari VCC melalui R1 menuju kaki RST (Gambar 2.11). Tegangan
pada kaki RST atau VR2 akan berubah menjadi : (Nalwan, 2003 : 29)
46
21
22RR
xVCCRVR+
= (2.6)
Yaitu 4,95 volt dengan nilai VCC = 5 volt.
R210k
R1100
C110uF/16v
RST
VCC
B
Gambar 2.11 Rangkaian ekivalen saat saklar S1 ditekan
Tegangan 4,94 volt pada kaki RST menyebabkan kaki ini berlogika 1
pada saat saklar tersebut ditekan. Saat saklar dilepas, aliran arus dari VCC melalui
R1 akan terhenti dan tegangan pada kaki RST akan menurun menuju nol sehingga
logika pada kaki ini menjadi 0 dan proses reset selesai.
2.5 Octal Data Latch
Octal Data Latch merupakan komponen untuk me-latch (menahan) 8
data dengan kecepatan tinggi. (National Semiconductor, 1996 : 1). Komponen ini
dapat digunakan untuk memisahkan antara data dan alamat yang dikirimkan dari
mikrokontroler. Sebagai contoh komponen ini adalah 74LS373 dan 74LS573.
Pada kedua contoh tersebut hanya berbeda pada pin-out yang diberikan.
47
Gambar 2.12 Pin-out 74LS573 dan 74373
Sebagai contoh Octal Data Latch adalah 74LS573 yang dibangun dari
delapan buah komponen D-flip flop. Sehingga pronsip kerja yang digunakan
adalah jika Latch Enable (LE) pada pin nomor 11 dalam kondisi ’1’, maka data
yang dikeluarkan melalui jalur output (O0 s.d. O7) akan sesuai dengan data yang
masuk pada jalur input (D0 s.d. D7). Jika LE dalam kondisi ’0’, maka data yang
dikeluarkan melalui jalur output sesuai dengan data yang dimasukkan
sebelumnya. Hal ini sesuai dengan Tabel 2.24. (Barry, 2002 : 341)
Pada saat mikrokontroler mengirimkan alamat, maka sinyal ALE akan
me-latch proses tersebut dengan memberikan sinyal clock. Jadi, Port 0 akan
berupa jalur alamat jika ALE berlogika 1 atau Port 0 akan berupa jalur data jika
ALE berlogika 0. (Barry, 2002 : 334).
DM74LS573WM
48
Tabel 2.24 Octal Data Latch Truth table
2.6 RAM (Random Access Memory)
RAM disebut juga memori sementara (volatile memory). Ketika power
IC RAM dalam keadaan off, maka data yang tersimpan di dalamnya akan hilang.
Pengaksesan RAM dapat dilakukan dengan perintah menulis atau membaca, hal
ini berbeda dengan ROM (Read Only Memory) yang hanya bisa dibaca. Kode IC
yang diberikan RAM adalah 61xx atau 62xx. Tanda xx disesuaikan dengan
kapasitas yang dibawa dalam satuan kbit. (Mazidi, 2000 : 279)
Sebagai contoh untuk RAM dengan kapasitas 16 kbit atau 2 kByte (1
Byte = 8 bit), digunakan RAM 6116. Penentuan kapasitas RAM yang akan
digunakan berdasarkan banyak data yang akan disimpan pada RAM tersebut.
Pada RAM ini berjenis SRAM (Static RAM), berarti sel penyimpanan
dalam memori ini terbuat dari flip-flop dan tidak membutuhkan refreshing dalam
perintah untuk menyimpan data.
Karena alamat bit ke-0 (A0) sampai dengan bit ke-7 (A7) dan data bit ke-
0 (D0) sampai dengan bit ke-7 (D7) menempati kaki pin yang sama, maka untuk
mengakses RAM, diperlukan komponen pemisah antara alamat dan data.
49
Gambar 2.13 Pinout RAM 6116
2.7 CMOS Analog Multiplexer/Demultiplexer
4051 merupakan salah satu contoh komponen multiplekser 8-channel yang
memiliki tiga angka biner input kontrol, yaitu A, B, C dan sebuah input inhibit.
Sinyal tiga angka biner tersebut memilih 1 dari 8 channel yang akan diaktifkan
dan menghubungkan 1 dari 8 input ke output. (Fairchild Semiconductor, 2002 :
1).
Gambar 2.14 Pinout 4051
50
Tabel 2.25 Tabel Kebenaran Mux/Demux 4051
Inhibit (INH)
C B A Channel IN/OUT
0 0 0 0 0 0 0 0 1 1 0 0 1 0 2 0 0 1 1 3 0 1 0 0 4 0 1 0 1 5 0 1 1 0 6 0 1 1 1 7 1 X X X NONE
Sesuai dengan Tabel 2.25 komponen 4051 akan berfungsi sebagai
Multiplekser (satu jalur masukan pada pin 3 dengan satu pilihan jalur keluaran)
atau Demultiplekser (satu pilihan jalur masukan dengan satu jalur keluaran pada
pin 3) jika pin INH berlogika ’0’. Pilihan masukan atau keluaran disesuaikan
dengan kombinasi bit C, B, A.
2.8 RS232 Transmitter/Receiver
RS232 Transmitter/Receiver merupakan komponen penghubung inteface
RS232 yang memiliki 2 buah transmitter/receiver. Komponen ini mengubah
tegangan masukan berupa tegangan TTL menjadi tegangan keluaran RS232 atau
sebaliknya. (Intercil ICL232, 1997 : 1)
Tegangan keluaran (pin TxD) atau masukan (pin RxD) dari
mikrokontroler masih berupa tegangan TTL. Sehingga untuk mengubah tegangan
tersebut menjadi tegangan RS232, maka digunakan komponen MAX232 atau
ICL232. Dengan perubahan tegangan menjadi RS232, maka data yang dikirim
secara serial dapat berlangsung walaupun jarak antara pengirim dan penerima
sangat jauh (maksimal 50 kaki).
51
Gambar 2.15 Pinout ICL232
Gambar 2.16 Rangkaian fungsional ICL232
2.9 Keyboard
Keyboard digunakan sebagai alat input karena memiliki banyak tombol
yang memudahkan bagi user untuk menginputkan huruf atau angka. Jenis
keyboard yang akan digunakan adalah jenis keyboard untuk IBM PC-AT.
Setiap salah satu tombol keyboard ditekan atau dilepas, keyboard akan
mengirimkan kode ke host (host adalah komputer kalau keyboard dihubungkan ke
52
komputer, atau berupa mikrokontroler kalau keyboard dihubungkan dengan
peralatan berbasis mikrokontroler). Kode tersebut dinamakan sebagai Scan Code.
(Sutanto, 2000)
Setiap tombol pada keyboard memiliki scan code yang berbeda-beda.
Scan code dari masing-masing tombol dapat dilihat pada Gambar 2.17
Gambar 2.17 Scan code tombol keyboard
Konektor yang digunakan oleh keyboard adalah konektor PS2. Pada
konektor tersebut hanya terdapat empat pin penting yaitu VCC +5 volt, Ground,
Data dan Clock.
Gambar 2.18 Konektor PS2 (Keyboard) model lubang
Data yang dikirimkan dari keyboard berbentuk data serial dengan
pengiriman tiap bit data disertai dengan clock. Dengan demikian, mikrokontroler
sebagai host pengakses keyboard tidak perlu membangkitkan clock yang sama
53
untuk menerima data. Sinyal komunikasi data dari keyboard terdapat pada
Gambar 2.19
Gambar 2.19 Sinyal komunikasi data serial dari keyboard
Sesuai dengan Gambar 2.19 setiap pengiriman 1 byte data scan code
akan diawali dengan bit start (active low) kemudian diikuti oleh susunan delapan
bit data diawali bit Least Significant Bit (LSB) yaitu bit ke-0 sampai bit Most
Significant Bit (MSB) yaitu bit ke-7. Proses pengiriman tiap satu bit data terjadi
sesaat setelah kondisi clock berpindah dari logika 1 ke logika 0.
2.10 LCD (Liquid Crystal Display)
LCD digunakan sebagai output device yang mampu menampilkan huruf,
angka maupun karakter tertentu. Pengaksesan LCD dilakukan dengan
mengirimkan kode perintah seperti bentuk kursor, operasi kursor dan bersih layar
dan mengirimkan kode data yang merupakan kode ASCII dari karakter yang akan
ditampilkan.
54
Gambar 2.20 Karakter-karakter pada LCD
Pengaksesan LCD dari mikrokontroler menggunakan jalur alamat dan
data. Terdapat dua jalur alamat input yang digunakan, yaitu sebagai Instruction
Input dan Data Input. (EL-TECH ELECTRONICS, : 8)
Beberapa LCD memiliki pin-out yang berbeda-beda, tetapi mempunyai
deskripsi pin yang sama. Pin-pin tersebut adalah sebagai berikut :
- Vss : Ground
- VCC : +5V Power Supply
- VEE : Power Supply pengatur kecerahan
- RS : RS = 0, memilih Instruction Input
RS = 1, memilih Data Input
R/W : R/W = 0, tulis
R/W = 1, baca
55
- E : Enable
- DB7 – DB0 : 8 bit data bus
Proses menampilkan karakter pada LCD sama dengan proses menulis
data pada LCD. Ketika proses penulisan pada LCD, kondisi sinyal dari masing-
masing pin pada LCD adalah sesuai dengan Gambar 2.21
Gambar 2.21 Karakteristik pewaktuan proses menulis pada LCD
Dari Gambar 2.21 terlihat bahwa dalam proses penulisan LCD sinyal
yang berpengaruh adalah Enable (E) dan Read/Write (R/W). Sehingga untuk
dapat melakukan proses penulisan pada LCD sesuai dengan Tabel 2.26
Tabel 2.26 Tabel kebenaran pengoperasian LCD
Selector Active low
R/W Enable LCD
0 0 1 0 1 0 1 0 0 1 1 0
Sesuai dengan Tabel 2.26, tabel kebenaran tersebut sama dengan tabel
kebenaran dari gerbang logika not OR (NOR).
56
Tabel 2.27 Tabel Instruksi-instruksi dalam pengoperasian LCD
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Instruksi
0 0 0 0 0 0 0 0 0 1 Display Clear 0 0 0 0 0 0 0 0 1 - Cursor Home 0 0 0 0 0 0 0 1 I/D S Entry Mode Set 0 0 0 0 0 0 1 D C B Display ON/OFF 0 0 0 0 0 1 S/C R/L - - Cursor/Display shift 0 0 0 0 1 DL 1 - - - Function Set 1 0 Data Data Write
Keterangan : I/D = 1 : Increment C = 1 : Cursor ON R/L = 1 : Right Shift I/D = 0 : Decrement C = 0 : Cursor OFF R/L = 0 : Left Shift S = 1 : Display Shift B = 1 : Blink ON DL = 1 : 8 bit S = 0 : No Display Shift B = 0 : Blink OFF DL = 0 : 4 bit D = 1 : Display ON S/C = 1 : Display Shift D = 0 : Display OFF S/C = 0 : Cursor Movement
2.11 1 of 8 Decoder
Sebagai contoh dekoder adalah komponen 74LS138. Pada komponen
tersebut memiliki tiga bit masukan Enable, yaitu dua active low (E1 dan E2) dan
satu active high (E3). Dekoder dapat menerima kombinasi tiga bit masukan A1,
A2, dan A3 dengan delapan bit keluaran active low (O0 s.d. O7). Semua bit
keluaran akan berlogika high jika E1 dan E2 tidak dalam kondisi low dan E3 tidak
dalam kondisi high. (MOTOROLA 1 OF 8 DECODER/DEMULTIPLEXER, : 1)
57
Gambar 2.22 Pin out 74LS138
Tabel 2.28 Tabel kebenaran 74LS138
BAB III
METODE PENELITIAN
Metode penelitian yang digunakan dalam perancangan perangkat keras
adalah studi kepustakaan berupa data-data literatur dari masing-masing
komponen, informasi dari internet dan konsep-konsep teoritis dari buku-buku
penunjang. Sedangkan dalam perancangan perangkat lunak berdasarkan teori dan
aplikasi dari buku-buku penunjang sehingga dapat dilakukan percobaan langsung
baik pada perangkat keras maupun pada komputer.
Keseluruhan sistem pada penelitian ini sesuai dengan blok diagram pada
Gambar 3.1.
IBM PC
Port Paralel
atauPort USB
Port Serial 1(COM1)
Port Serial 2(COM2)
PRINTER
TERMINALSELECTOR
TERMINAL1 TERMINAL 2 TERMINAL 3
MOBILE PHONE
Gambar 3.1 Blok Diagram sistem secara keseluruhan
58
59
3.1 Perancangan Perangkat Keras
Perancangan perangkat keras pada Terminal dan Terminal Selector
disesuaikan dengan fungsi dari masing-masing sistem.
Fungsi Terminal Selector adalah sebagai perangkat pemilih Terminal
yang akan mengirimkan data ke komputer atau menerima data dari komputer.
Sedangkan fungsi Terminal adalah sebagai perangkat yang digunakan oleh user
untuk mengetik dan mengirim SMS atau membaca SMS.
Blok diagram dari masing-masing sistem tersebut adalah sebagai berikut:
Gambar 3.2 Blok diagram sistem Terminal Selector
60
Gambar 3.3 Blok diagram sistem Terminal
3.1.1 Minimum Sistem AT89S52
Rangkaian Minimum sistem AT89S52 yang digunakan Terminal dan
Terminal Selector memiliki perbedaan dalam penggunaan Port 1 pada
mikrokontroler.
Y1
11.5092 Mhz
RESET
AD5
C1 33 pF
AD1AD5
U1
AT89S52
9
18
19
20
29
30
3140
12345678
2122232425262728
1011121314151617
3938373635343332
RST
XTAL2
XTAL1
GN
D
PSEN
ALE/PROG
EA
/VP
P
VC
CP1.0P1.1P1.2P1.3P1.4P1.5/MOSIP1.6/MISOP1.7/SCK
P2.0/A8P2.1/A9
P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15
P3.0/RXDP3.1/TXDP3.2/INTOP3.3/INT1P3.4/TOP3.5/T1P3.6/WRP3.7/RD
P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7
A10
En_Mux
TR
5 vAD1AD6
AD2AD4
C
R5
R Pack 10k
123456789
RD
A9
SCK
AD7
AD6
C2 33 pF
Rx
C
AD2
AD0
A8
5 vAD0..AD7A8..A10A13..A15ALE
ALE
AD7
WR
A
AD3
C4
0,1uF
AD0
MISO
B
Tx
R6
4k7
AD4
En_DeMux
MOSI AD3
Gambar 3.4 Minimum system Mikrokontroler AT89S52 pada Terminal Selector
61
C2 33 pF
AD0..AD7A8..A10A13..A15ALEKbd_dataKbd_clkWRRD
Tx
AD3
MISO
A10
AD2
U1
AT89S52
9
18
19
2029
30
3140
12345678
2122232425262728
1011121314151617
3938373635343332
RST
XTAL2
XTAL1
GN
DPSEN
ALE/PROG
EA
/VP
P
VC
CP1.0P1.1P1.2P1.3P1.4P1.5/MOSIP1.6/MISOP1.7/SCK
P2.0/A8P2.1/A9
P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15
P3.0/RXDP3.1/TXDP3.2/INTOP3.3/INT1P3.4/TOP3.5/T1P3.6/WRP3.7/RD
P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7
A15
AD5
Rx
Kbd_data
AD4MOSI
C7
0,1uF
AD0
A9
AD6
5 v
A14
Kbd_clk
WR
Y1
11.5092 Mhz
ALE
AD1
TR
A13
SCK
RD
RESET
C1 33 pF
R6
4k7
AD7
A8
Gambar 3.5 Minimum system Mikrokontroler AT89S52 pada Terminal
Karena terdapat beberapa sistem yang akan berkomunikasi dengan
mikrokontroler di Terminal Selector, maka digunakan Multiplekser /
Demultiplekser sebagai pemilih. Dalam penggunaannya membutuhkan bit-bit
pemilih dan pengaktif. Sehingga bit-bit pada Port 1 digunakan sebagai pengakses
Multiplekser/Demultiplekser.
Berbeda dengan Terminal, karena tidak adanya rangkaian Mux/Demux
pada Terminal, sehingga bit-bit untuk mengakses Mux/Demux tersebut dapat
dihilangkan. Sebagai pengganti, pada beberapa bit pada Port 1 akan digunakan
untuk mengakses Keyboard.
62
Pada pin VCC diberi masukan tegangan operasi berkisar antara 4,5 volt
sampai dengan 5,5 volt. Pin RST berfungsi untuk masukan reset program secara
otomatis atau manual. Pin RxD dan TxD dihubungkan ke komponen
Multiplekser/DeMultiplekser untuk mengakses MAX232 sehingga mikrokontroler
pada Terminal Selector dapat melakukan komunikasi serial dengan Terminal-
Terminal dan komputer secara bergantian. Pin WR dan RD dihubungkan ke
memory data eksternal yaitu RAM, agar mikrokontroler dapat membaca atau
menulis data pada memori tersebut.
Pin XTAL1 dan XTAL2 dihubungkan dengan komponen XTAL sebesar
11,0592 MHz. Pemilihan frekuensi osilasi dari XTAL tersebut berdasarkan
penggunaan mikrokontroler untuk komunikasi serial. Pin EA/VPP dihubungkan
ke VCC karena mikrokontroler akan mengeksekusi program dari memori internal.
Pin ALE/PROG dihubungkan pada memory data eksternal karena berfungsi
sebagai penghasil pulsa-pulsa untuk memisahkan antara Address dan Data pada
saat mengakses memori tersebut. Karena tidak menggunakan memori program
eksternal, maka pin PSEN tidak dihubungkan (not connect).
A. Program Downloader
Untuk melakukan proses downloading program dalam format .HEX dari
komputer ke dalam memory program internal mikrokontroler, penulis
menggunakan kabel downloader dengan interface DB25 yang dihubungkan pada
port LPT1 pada komputer. Sedangkan software yang digunakan adalah ISP-Flash.
(Khan, 2004).
63
P2DB25
13 25 12 24 11 23 10 22 9 21 8 20 7 19 6 18 5 17 4 16 3 15 2 14 1
J2conn_downloader
123456
MIS
OM
OS
IT
R
SC
KR
ES
ET
Gambar 3.6 Rangkaian kabel downloader pada port LPT1
Gambar 3.7 Software ISP-Flash Progammer ver3.0a
Konektor 6 pin pada Gambar 3.8 dihubungkan terlebih dahulu pada
Mikrokontroler AT89S52 di Terminal atau Terminal Selector jika akan
melakukan proses download program.
64
TRJ2
downloader
123456
MOSI
SCKMISO
RESET
Gambar 3.8 konektor downloader pada Mikrokontroler AT89S52
B. Komunikasi Serial
Terdapat beberapa mode serial dalam mikrokontroler. Penulis
menggunakan Serial Mode 1 dengan baudrate sebesar 19200 bps. Sehingga
pengaturan register SCON dan PCON adalah sebagai berikut :
Tabel 3.1 Susunan bit dalam register SCON
SM0 SM1 SM2 REN TB8 RB8 TI RI 0 1 0 1 0 0 0 0
Sehingga SCON bernilai 0x50.
Tabel 3.2 Susunan bit dalam register PCON
SMOD - - - GF1 GF0 PD IDL 1 0 0 0 0 0 0 0
Sehingga PCON bernilai 0x80.
Nilai yang diisikan pada register TH1 untuk menghasilkan baudrate
sebesar 19200 bps didapat dari perhitungan berikut :
Baudrate = ( )[ ]12561232 THosilasifrekuensiK−×
× (3.1)
Karena SMOD = 1, maka nilai K = 2.
65
19200 = ( )[ ]125612100592,11
322 6
TH−××
× (3.2)
Sehingga TH1 bernilai 253 atau 0xFD.
Setelah mendapatkan nilai-nilai dari beberapa register, maka register-
register tersebut dapat digunakan sebagai inisialisasi proses komunikasi serial
pada mikrokontroler. Inisialisasi tersebut diberikan pada program fungsi berikut :
void Serial_init() SCON = 0x50; //serial mode 1, REN = 1(Rx enable) PCON = 0x80; //baudrate 19200 pake mode 1, klo yg 9600 pake mode 0 TH1 = 0xFD; //baudrate 9600 bps ato 19200 bps TR1 = 1; TI = 1; //TI = 1; hrs ditulis kalo kita pake printf(); lama(10);
3.1.2 RAM 6116 (2 kByte)
Dalam RAM 6116 terdapat 11 bit alamat dan 8 bit data, sehingga
pengorganisasian memori-nya adalah 211x8 atau 2k x 8 (terdapat 2048 alamat
memori, dimana masing-masing alamat menampung 8 bit data).
Karena data yang akan disimpan ke dalam RAM berupa karakter
sebanyak maksimal 627 karakter (berupa 608 karakter isi SMS, 12 angka nomor
tujuan, 4 karakter pemisah, 1 karakter jumlah SMS, 2 karakter identitas
Terminal), sehingga data yang akan disimpan sebesar 627 Byte. Penggunaan
RAM dengan kapasitas 2 kByte sudah mencukupi untuk menyimpan data sebesar
627 Byte.
Terminal dan Terminal Selector memiliki kapasitas RAM yang sama.
RAM pada kedua sistem tersebut diakses dari mikrokontroler. Karena pada RAM
memiliki sebelas jalur Alamat dan delapan jalur Data yang berbeda, maka dari
delapan jalur Alamat Data (AD0 s.d. AD7) dari mikrokontroler perlu di-latch
menggunakan komponen 74LS573.
66
A. Terminal Selector
RAM yang digunakan pada Terminal Selector akan aktif ketika sistem
dalam keadaan aktif dan akan menyimpan sementara dari data yang masuk.
5 v
A5AD6
A8
ALE
A4
A6
A7
AD0
AD5
WR
A0
AD1
AD0..AD7A8..A10ALE C6
0,1 uF
AD7
AD4
AD6A3AD5
AD0
U3
74LS573
1
10 11
20
1918171615141312
23456789
OE
GND LE
VCC
1Q2Q3Q4Q5Q6Q7Q8Q
1D2D3D4D5D6D7D8D
A1
AD2
A2
A4
A1
U2
6116
87654321
232219
182021
910111314151617
24
12
A0A1A2A3A4A5A6A7A8A9A10
CEOEWE
D0D1D2D3D4D5D6D7
VCC
VSS
5 v
AD7
C5
0,1uF
AD4
A0AD3
A2
AD1
A6
A3
A9
A7
AD3A5AD2
A10
RD
Gambar 3.9 Rangkaian RAM pada Terminal Selector
Penyimpanan data di RAM terjadi pada saat data yang masuk secara
interupsi serial. Penulisan pada program adalah sebagai berikut :
void Receive_char() interrupt 4 using 1//interrupt serial dijalankan pake BANK 1 if (RI) bypass = SBUF; if (save) RAM_luar[index_RAM] = bypass; index_RAM++; RI = 0;
Sedangkan pengambilan data dari RAM terjadi pada saat Terminal
Selector akan mengirimkan data ke sistem lain. Penulisan pada program adalah
sebagai berikut :
67
--- set_kirim(); for (i=0; i<index_RAM; i++) printf("%c",RAM_luar[i]);//Send_char(RAM[i]); index_RAM = 0; ---
B. Terminal
Selain RAM, terdapat komponen LCD diakses secara Alamat dan Data.
Sehingga keduanya tidak dapat aktif secara bersamaan. Pemilihan keduanya
melalui selektor alamat pada komponen 74LS138.
A2
A9
C5
0,1uF
AD1AD0
AD3
AD7
A3AD4
WR
A0U3
74LS573
1
10 11
20
1918171615141312
23456789
OE
GND LE
VCC
1Q2Q3Q4Q5Q6Q7Q8Q
1D2D3D4D5D6D7D8D
ALE
A0
AD5
5 v
AD2
AD6
A1
5 v
RAMRD
LCD
U8
74LS138
123
6
45
15141312111097
16
8
ABC
G1
G2AG2B
Y0Y1Y2Y3Y4Y5Y6Y7
VC
C
GND
A3
A7 AD4
A7
A8
A4
A6
AD1AD0
A1
A5
RAM
A6
A4
A15
AD5
A5
AD0..AD7A8..A10A13..A15ALERDWR
5 v
U2
6116
87654321
232219
182021
910111314151617
24
12
A0A1A2A3A4A5A6A7A8A9A10
CEOEWE
D0D1D2D3D4D5D6D7
VCC
VSS
A10
A14
AD2
A2
AD7
AD3
AD6
C6
0,1 uF
A13
Gambar 3.10 Rangkaian RAM pada Terminal
68
Tabel 3.3 Pengalamatan RAM dan LCD
A15 A14 A13 A12…AD0 Nilai Address Keterangan 1 1 0 0 0xC000 Enable RAM 1 1 1 0 0xE000 Enable LCD
Deklarasi awal program untuk penulisan alamat RAM adalah sebagai
berikut :
at 0x0C000 xdata unsigned char RAM[650];
Penggunaan RAM pada Terminal sebagai tempat penyimpanan karakter
yang diketik oleh user sehingga dapat ditampilkan pada LCD. Jika karakter yang
ditulis berada pada indeks paling akhir, maka jumlah karakter dan pointer akan
bertambah. Tetapi jika karakter yang ditulis berada pada tengah-tengah kalimat,
maka semua karakter yang tersimpan di RAM akan digeser per indeks sehingga
karakter yang diketik dapat disisipkan. Penulisan program fungsi untuk
penyimpanan karakter yang diketik oleh user tersebut adalah sebagai berikut :
void tulis_char(unsigned char kode) if (index_RAM == char_akir) //penulisan karakter pd index paling akhir LCD_D = kode; lama(3); RAM [index_RAM] = kode; lama(3); index_RAM++; index_LCD++; kursor++; char_akir++; if (index_RAM%16 == 0) baris ++; ganti_brs(); ganti_lyr(); else if (index_RAM < char_akir) //penulisan karakter selain pd index paling akhir (tengah2 kalimat) for (i=char_akir; i>index_RAM; i--) RAM[i] = RAM[i-1]; lama(3); LCD_D = kode; lama(3); RAM [index_RAM] = kode; lama(3); index_RAM++; index_LCD++; kursor++; char_akir++; if (index_RAM%16 == 0) baris ++; ganti_brs(); tem_kur = kursor; tem_ind = index_LCD; tem_brs = baris; tem_RAM = index_RAM; data_RAM(); kursor = tem_kur; index_LCD = tem_ind; baris = tem_brs; index_RAM = tem_RAM; ganti_lyr(); LCD_C = kursor; lama(3); lama(5);
69
Pengambilan data dari RAM digunakan untuk menampilkan teks SMS
pada LCD. Data yang diambil mulai dari indeks RAM yang ditunjuk sampai
dengan karakter terakhir atau selama baris LCD sudah penuh. Dalam hal ini
menggunakan program fungsi berikut :
void data_RAM() for (i=index_RAM; i<char_akir && index_LCD<48; i++) LCD_D = RAM [i]; lama(3); kursor++; index_LCD++; index_RAM++; if (index_LCD < 48) if (index_RAM%16 == 0) //jika dalam 1 baris sdh penuh, pindah brs berikutnya baris++; ganti_brs(); if (index_LCD == 48) index_LCD = 47; kursor = 0x9F; LCD_C = kursor; lama(3); index_RAM--;
Sedangkan untuk menyimpan data SMS yang masuk dari Terminal
Selector dilakukan penyimpanan tiap karakter (hal ini sesuai dengan pengiriman
data serial 8 bit) kemudian indeks RAM akan di-increment. Penjelasan tersebut
sesuai dengan program fungsi berikut :
void Receive_char() if (RI) aceka = SBUF; if (save) RAM [index_RAM] = aceka; index_RAM++; char_akir++; RI = 0;
3.1.3 LCD 4x16
LCD hanya digunakan pada Terminal. Karena pada sistem ini LCD
beralamatkan 0xE000 dan RS sebagai pemilih antara Instruction Input dan Data
Input yang dihubungkan dengan jalur alamat bit ke-0 (A0), maka sesuai dengan
70
Tabel 3.3 untuk mengakses Instruction Input jalur alamat yang digunakan adalah
0xE000 sedangkan untuk Data input jalur alamat yang digunakan adalah 0xE001.
Deklarasi alamat tersebut digunakan pada program yang ditulis sebagai berikut :
at 0x0E000 xdata unsigned char LCD_C; // XDATA -> external data address at 0x0E001 xdata unsigned char LCD_D;
Berdasarkan timing diagram pada Gambar 2.21, Enable LCD didapat dari :
Enable (pada LCD) = LCD (dari 74LS138) NOR R/W (dari mikrokontroler)
AD0..AD7A0WRLCD
J1LCD
246810121416
13579
111315
D21N4002
R41k
13
2
5 v
5 v
VDD
R/W
VSSVEE
AD2 D2AD0 D0
AD6 D6AD4 D4
LCD
WR
EAD1D1
AD5D5AD3D3
AD7D7
A0RS
U6A
74LS02
2
31
14
7
5 v
Gambar 3.11 Rangkaian konektor LCD
Sesuai dengan daftar instruksi pada Tabel 2.27, jika ingin
mengoperasikan LCD, inisialisasi awal pada program ditulis dalam program
fungsi berikut :
void LCD_init() LCD_C = 0x01; lama (3); //Clear LCD_C = 0x38; lama (3); //Function Set LCD_C = 0x0F; lama (3); //Display On/Off LCD_C = 0x06; lama (15); //Entry Mode /* Baris 1 = 0x80, baris 2 = 0xC0, baris 3 = 0x90, baris 4 = 0xD0 */
71
Instruksi LCD_D = ... berfungsi untuk menampilkan karakter. Beberapa
program fungsi yang menggunakan instruksi tersebut untuk menampilkan
karakter yang diketik user atau data yang diambil dari RAM adalah sebagai
berikut :
void tulis_char(unsigned char kode) if (index_RAM == char_akir) //penulisan karakter pd index paling akhir LCD_D = kode; lama(3); RAM [index_RAM] = kode; lama(3); index_RAM++; index_LCD++; kursor++; char_akir++; if (index_RAM%16 == 0) baris ++; ganti_brs(); ganti_lyr(); else if (index_RAM < char_akir) //penulisan karakter selain pd index paling akhir (tengah2 kalimat) for (i=char_akir; i>index_RAM; i--) RAM[i] = RAM[i-1]; lama(3); LCD_D = kode; lama(3); RAM [index_RAM] = kode; lama(3); index_RAM++; index_LCD++; kursor++; char_akir++; if (index_RAM%16 == 0) baris ++; ganti_brs(); tem_kur = kursor; tem_ind = index_LCD; tem_brs = baris; tem_RAM = index_RAM; data_RAM(); kursor = tem_kur; index_LCD = tem_ind; baris = tem_brs; index_RAM = tem_RAM; ganti_lyr(); LCD_C = kursor; lama(3); lama(5); void data_RAM() for (i=index_RAM; i<char_akir && index_LCD<48; i++) LCD_D = RAM [i]; lama(3); kursor++; index_LCD++; index_RAM++; if (index_LCD < 48) if (index_RAM%16 == 0) baris++; ganti_brs(); if (index_LCD == 48) index_LCD = 47; kursor = 0x9F; LCD_C = kursor; lama(3); index_RAM--;
Jika dalam satu baris sudah penuh dengan karakter yang ditampilkan,
maka untuk karakter yang baru diketik harus berada pada baris berikutnya.
72
Sebagai penanda baris sudah penuh adalah nilai dari kursor penunjuk LCD.
Sedangkan jika kursor penunjuk LCD berada pada baris ke-4, berarti LCD sudah
penuh dan harus dilakukan pembersihan layar sebagai tanda scrolling.
void ganti_brs() //ganti baris dilakukan jika dlm 1 brs sdh penuh if (kursor == 0x90) //jk brs 1 penuh,mk pindah brs 2 LCD_C = 0xC0; lama(3); kursor = 0xC0; else if (kursor == 0xD0) //jk brs 2 penuh,mk pindah brs 3 LCD_C = 0x90; lama (3); kursor = 0x90; void ganti_lyr() //ganti layar dilakukan jika 3 brs awal LCD sdh penuh if (kursor == 0xA0) //jk brs 3 penuh,mk pindah brs 4 clrscr(); baris = baris - 2; index_RAM = baris * 16; data_RAM(); void clrscr() //untuk membersihkan Layar LCD dan mereset pointer kursor LCD_C = 0x01; lama(3); LCD_C = 0xD0; lama(3); LCD_D = 'F'; lama(3); LCD_D = '1'; lama(3); LCD_D = '='; lama(3); LCD_D = 'S'; lama(3); LCD_D = 'e'; lama(3); LCD_D = 'n'; lama(3); LCD_D = 'd'; lama(3); LCD_C = 0x80; lama(3); kursor = 0x80; index_LCD = 0; void reset_lyr() //untuk mereset semua status editing dan indeks-indeks clrscr(); index_RAM = 0; s_code = 0; s_code2 = 0; char_akir = 0; baris = 0; panah = 0; caps = 0; total = 1; RI = 0;
3.1.4 MAX232 RS232 Transmitter/Receiver
Penggunaan komponen ini dimaksudkan agar komunikasi antara
Terminal, Terminal Selector dan komputer dapat digunakan walaupun jarak dari
ketiga sistem tersebut cukup jauh. Pada penelitian ini jarak dari masing-masing
sistem tersebut adalah 2 meter.
Karena pada Terminal Selector sebagai pemilih Terminal atau komputer,
maka Multiplekser/Demultiplekser akan memilih jalur data serial yang masuk
atau keluar pada Terminal Selector.
73
C15
10u/16v
T1_Tx
Rx Terminal 2
Tx Terminal 1
T2_Tx
P1
DB9
59
48
37
26
1
C1410u/16v
PC_Tx
U5
MAX232
13
8
11
10
1
3
4
5
2
6
12
9
14
7
1615
R1IN
R2IN
T1IN
T2IN
C+
C1-
C2+
C2-
V+
V-
R1OUT
R2OUT
T1OUT
T2OUT
VC
CG
ND
T1_Rx
T3_TxJ5
RJ45_T3
12345678
J3
RJ45_T1
12345678
C910u/16v
12 vC1610u/16v
U4
MAX232
13
8
11
10
1
3
4
5
2
6
12
9
14
716
15
R1IN
R2IN
T1IN
T2IN
C+
C1-
C2+
C2-
V+
V-
R1OUT
R2OUT
T1OUT
T2OUTV
CC
GN
D
C1010u/16v
T2_Rx
Rx Terminal 3
C1210u/16v
12 v
PC_Rx
T3_Rx
C1310u/16v
12 v
Tx Terminal 3
J4
RJ45_T2
5 v
12345678Tx Terminal 2
5 v
C11
10u/16v
Rx Terminal 1
Gambar 3.12 Rangkaian MAX232 pada Terminal Selector
Penggunaan rangkaian MAX232 pada Terminal berguna untuk
melakukan komunikasi serial dengan Terminal Selector.
74
U4
MAX232
13
8
11
10
1
3
4
5
2
6
12
9
14
7
1615
R1IN
R2IN
T1IN
T2IN
C+
C1-
C2+
C2-
V+
V-
R1OUT
R2OUT
T1OUT
T2OUT
VC
CG
ND
C10
10u/16v
Tx
C310u/16v
Rx Terminal
Tx Terminal
12v
C1110u/16v
5 v
C810u/16v
J3
RJ45
12345678
Rx
Gambar 3.13 Rangkaian MAX232 pada Terminal
3.1.5 4051 Multiplekser/Demultiplekser
Rangkaian Multiplekser/Demultiplekser hanya digunakan pada Terminal
Selector. Karena proses komunikasi serial yang dilakukan dari Terminal Selector
ke komputer atau salah satu dari ketiga Terminal secara bergantian, maka
mikrokontroler pada Terminal Selector harus mampu memilih diantara empat
sistem tersebut.
Apabila dari mikrokontroler ingin mengirim data ke salah satu sistem,
maka yang akan diaktifkan (logika 0 pada pin INH) adalah Multiplekser. Hal ini
dilakukan karena jalur Transmitter dari mikrokontroler akan dihubungkan dengan
salah satu jalur Transmitter dari salah satu sistem (sesuai kombinasi bit A, B, C)
ke komponen MAX232 sehingga proses pengiriman data secara serial dapat
dilakukan.
75
C8
0,1uF
5 v
En_Mux
Tx
T2_TxT1_TxPC_Tx
T3_Tx
U9
4051 Mux
X013
X114
X215
X312
X41
X55
X62
X74
INH6
A11
B10
C9
X3VDD
16
VSS8
VEE7
C
AB
Gambar 3.14 Rangkaian Multiplekser 4051
Sedangkan apabila dari mikrokontroler ingin menerima data dari salah
satu sistem, maka yang akan diaktifkan (logika 0 pada pin INH) adalah
Demultiplekser. Hal ini dilakukan karena jalur Receiver dari mikrokontroler akan
dihubungkan dengan salah satu jalur Receiver dari salah satu sistem (sesuai
kombinasi bit A, B, C) ke komponen MAX232 sehingga proses penerimaan data
secara serial dapat dilakukan.
Rx
5 v
C7
0,1uF
En_DeMux
T1_RxPC_Rx
T2_RxT3_Rx
U10
4051 DeMux
X013
X114
X215
X312
X41
X55
X62
X74
INH6
A11
B10
C9
X3VDD
16
VSS8
VEE7A
BC
Gambar 3.15 Rangkaian Demultiplekser 4051
76
Kombinasi bit-bit A, B, dan C sebagai penentu sistem yang dipilih.
Kombinasi tersebut sesuai dengan Tabel 3.4
Tabel 3.4 Kombinasi A, B, C sebagai pemilih sistem
C B A Sistem 0 0 0 Komputer 0 0 1 Terminal 1 0 1 0 Terminal 2 0 1 1 Terminal 3
Pemilihan keempat sistem tersebut ditulis dalam program sebagai
berikut:
while(1) //---------------------------------------------------------------------// PC set_terima(); cc = 0; bb = 0; aa = 0; //Pilih PC lama (3); if (bypass == '0') --- //---------------------------------------------------------------------// T1 set_terima(); cc = 0; bb = 0; aa = 1; //Pilih T1 lama (3); if (bypass == '1') --- //---------------------------------------------------------------------// T2 set_terima(); cc = 0; bb = 1; aa = 0; //Pilih T2 lama (3); if (bypass == '2') --- //---------------------------------------------------------------------// T3 set_terima(); cc = 0; bb = 1; aa = 1; //Pilih T3 lama(3); if (bypass == '3') --- //---------------------------------------------------------------------//
77
3.1.6 Keyboard
Keyboard yang digunakan hanya pada Terminal terhubung ke
mikrokontroler melalui Port 1
Kbd_clkKbd_data
Kbd_data
JS2
PS2
123456
5 vKbd_clk
Gambar 3.16 Konektor PS2 (jarum) keyboard pada mikrokontroler
Berdasarkan timing diagram pada Gambar 2.19, pengambilan data 1 byte
scan code sebagai identitas dari masing-masing tombol diawali dengan
pengambilan start bit. Setelah mendapatkan data bit dilakukan pergeseran bit ke
kanan, hal ini dilakukan karena data bit yang diterima berawal dari bit LSB dan
berakhir sampai bit MSB. Setiap pengambilan satu bit data dilakukan setelah
mendapatkan sinyal clock dalam kondisi low. Pengambilan data 8 bit dilakukan
dua kali karena untuk mengetahui perbedaan tombol 8 bit dan tombol 16 bit.
Proses tersebut ditulis dalam fungsi program berikut :
void Tekan_tombol() B = 0x00; //definisi u/ tpt scancode while (Kclk); while (!Kclk); start = Kdata; // ambil start bit if (!start) // jika start bit = 0, brarti data scancode bs diambil for (i=0; i<8; i++) //ambil 8 bit pertama while (Kclk); while (!Kclk); B = B >> 1; B7 = Kdata; s_code = B; B = 0; for (i=0; i<8; i++) //ambil 8 bit kedua while (Kclk); while (!Kclk); B = B >> 1; B7 = Kdata; s_code2 = B; lama(5);
78
Untuk mengetahui tombol yang ditekan, perlu diketahui scan code yang
diberikan dari keyboard. Setelah mendapatkan scan code dari tombol yang
ditekan, kemudian disesuaikan dengan fungsi tombol tersebut. Khusus untuk
tombol F1 berfungsi untuk mengirim SMS dan tombol F2 untuk menerima SMS.
Pendeteksian tombol yang ditekan pada program adalah sebagai berikut :
while (1) tampil_jum(); shift = 0; do Tekan_tombol(); if (s_code == 0x12 || s_code == 0x59) //cek tombol shift shift = 1; while (s_code == 0 || s_code == 0x12 || s_code == 0x59 || s_code == 0xF0); //jk hbs nekan shift ki/ka ato lepas tombol, ulang lg ---
Penekanan tombol F2 hanya untuk membaca SMS yang masuk. Proses
yang terjadi adalah Terminal akan menunggu ijin pengiriman data dari Terminal
Selector. Apabila ijin tersebut telah diterima maka Terminal akan mengirimkan
tanda ke Terminal Selector bahwa siap menerima data. Kemudian setiap data
karakter yang masuk akan disimpan ke RAM sampai dengan karakter penutup
(karakter 0xAE). Kemudian data yang telah tersimpan tersebut akan ditampilkan
di LCD.
--- / ///////////////////////////////////////////////////////////////// if (s_code == 0x06 && char_akir == 0) //Press F2, untuk baca SMS / //////////////
LCD_C = 0x01; lama(3); LCD_C = 0xC0; lama(3); for (i = 0; i < 16; i++) LCD_D = SMS_msk[i]; lama(3); do Receive_char(); while(aceka != '4'); //tunggu ijin kirim data lama(5); printf(")"); lama(2); //beri ijin terima data save = 1; do Receive_char();
79
while(aceka != '«'); //mulai terima data sampe tanda tutup save = 0; clrscr(); index_RAM = 0; baris = 0; char_akir--; //char_akir-1, biar tanda tutup data ga ikut disimpan for (i=0; i<char_akir; i++) LCD_D = RAM [i]; lama(3); index_LCD++; kursor++; index_RAM++; if (index_RAM%16 == 0) baris++; ganti_brs(); if (kursor == 0xA0) //jk brs 3 penuh,mk pindah brs 4 lama(1000); clrscr(); ---
Penekanan tombol F1 hanya untuk mengirim SMS. Proses yang terjadi
adalah setelah pengguna menekan F1, maka pengguna diminta untuk
memasukkan nomor tujuan. Sebelum SMS dikirimkan, Terminal akan mengirim
ijin pengiriman data ke Terminal Selector. Apabila ijin tersebut telah dibalas,
maka Terminal akan mengirimkan SMS yang diambil dari RAM ke Terminal
Selector. Terminal akan menunggu status dari pengiriman SMS tersebut
kemudian menampilkannya.
--- ///////////////////////////////////////////////////////////////////////////////// else if (s_code == 0x05) //Press F1, untuk kirim SMS RAM [index_RAM] = 0xF0; lama(3);//tanda akir isi sms index_RAM++; ketik_nomor(); do metu = 0; do Tekan_tombol(); while (s_code == 0 || s_code == 0xF0); if ((s_code == 0x66) && kursor > 0xC1) //Press BACKSPACE kursor --; index_RAM--; LCD_C = kursor; lama(1); LCD_D = 0xA0; lama(1); LCD_C = kursor; lama(1); else if ((s_code == 0x16 ||s_code == 0x1E ||s_code == 0x26 ||s_code == 0x25 ||s_code == 0x2E ||s_code == 0x36 ||s_code == 0x3D ||s_code == 0x3E ||s_code == 0x46 ||s_code == 0x45) && kursor < 0xCF) LCD_D = tabel_scan[s_code]; lama(3); RAM [index_RAM] = tabel_scan[s_code]; lama(3); kursor++; index_RAM++;
80
else if (s_code == 0x05 || s_code == 0x76) metu = 1; while(!metu); if (s_code == 0x05) //Press F1 for (i=0; i<4; i++) //tanda akir no.tujuan + identitas terminal RAM [index_RAM] = T_id[i]; lama(3); index_RAM++; //-- klo nambah checksum disini --// RAM [index_RAM] = total + 0x30; lama(3); index_RAM++; RAM [index_RAM] = 0xAE; lama(3); index_RAM++; //stop bit paket data («) LCD_C = 0x01; lama(3); LCD_C = 0xC1; lama(3); for (i = 0; i < 13; i++) LCD_D = psn[i]; lama(3); aceka = '0'; // tunggu ijin kirim data do printf("1"); lama(3); Receive_char(); while(aceka != ')'); lama(3); for (i=0; i<index_RAM; i++) //-- mulai kirim paket data --// printf("%c", RAM [i]); lama(3); //Send_char(RAM [i]); lama(1); aceka = '0'; // tunggu status SMS do Receive_char(); while(aceka != 'D' && aceka != 'P'); LCD_C = 0x01; lama(3); LCD_C = 0xC1; lama(3); if (aceka == 'D') for (i = 0; i < 12; i++) LCD_D = sukses[i]; lama(3); else if (aceka == 'P') for (i = 0; i < 12; i++) LCD_D = tunda[i]; lama(3); lama(5000); reset_lyr(); else if (s_code == 0x76) //Press ESC clrscr(); index_RAM = 0; baris = 0; for (i=0; i<char_akir; i++) LCD_D = RAM [i]; lama(3); index_LCD++; kursor++; index_RAM++; if (index_RAM%16 == 0) baris++; ganti_brs();
81
if (kursor == 0xA0) //jk brs 3 penuh,mk pindah brs 4 lama(1000); clrscr(); ---
Jika pengguna menekan tombol Capslock, maka akan mengaktifkan flag
capslock dan akan menampilkan indikatornya pada LCD.
--- ///////////////////////////////////////////////////////////////////////////////// else if (s_code == 0x58) //Press capslock tem_kur = kursor; if (!caps) caps = 1; LCD_C = 0xD7; lama(3); LCD_D = 'c'; lama(3); LCD_D = 'a'; lama(3); LCD_D = 'p'; lama(3); LCD_D = 's'; lama(3); else caps = 0; LCD_C = 0xD7; lama(3); LCD_D = ' '; lama(3); LCD_D = ' '; lama(3); LCD_D = ' '; lama(3); LCD_D = ' '; lama(3); LCD_C = kursor; lama(3); ---
Jika pengguna menekan tombol panah kanan, maka akan menggerakkan
kursor LCD ke kanan. Jika telah sampai di kolom paling kanan, maka akan pindah
ke baris berikutnya dan mengaktifkan flag panah.
--- ///////////////////////////////////////////////////////////////////////////////// else if (s_code2 == 0xA2) //Press Right arrow if (index_RAM < char_akir) //jk uda sampe akir karakter ga boleh ke kanan lg kursor++; index_RAM++; index_LCD++; if (index_RAM%16 == 0) baris++; ganti_brs(); ganti_lyr(); LCD_C = kursor; lama(3); panah = 1; lama(3); ---
Jika pengguna menekan tombol panah kiri, maka akan menggerakkan
kursor LCD ke kiri. Jika telah sampai di kolom paling kiri, maka akan pindah ke
baris sebelumnya dan mengaktifkan flag panah.
82
--- / ///////////////////////////////////////////// else if (s_code2 == 0x5A) //Press Left arrow / //////////////////////////////////
if (baris != 0 || kursor != 0x80) //jk nyampe brs 1 kolom 1 ga boleh ke kiri lg if (kursor == 0x80) //jk nyampe baris 1 pd LCD, hrs ganti clrscr(); baris --; index_RAM = baris * 16; data_RAM(); LCD_C = kursor; lama(3); else kursor --; index_RAM --; index_LCD --; if (index_RAM%16 == 15) baris--; if (kursor == 0x8F) //awal baris 3 - 1 hrs ke akhir baris 2 kursor = 0xCF; if (kursor == 0xBF) //awal baris 2 - 1 hrs ke akhir baris 1 kursor = 0x8F; LCD_C = kursor; lama(3); panah = 1; lama(3); ---
Jika pengguna menekan tombol panah atas, maka akan menampilkan
data pada layar sebelumnya (scrolling). Penekanan tombol ini dilakukan jika
kursor berada di baris paling atas dalam satu layar LCD dan akan mengaktifkan
flag panah.
--- / ///////////////////////////////////////////////////////////// else if (s_code2 == 0xAA && s_code != 0x15) //Press Up arrow / //////////////////
tem_brs = kursor & 0x80; //panah atas dipake kalo kursor di baris 1 pd LCD if (baris != 0 && tem_brs == 0x80)
clrscr(); baris --; index_RAM = baris * 16; data_RAM(); LCD_C = kursor; lama(3); panah = 1; lama(3); ---
Jika pengguna menekan tombol panah bawah, maka akan menampilkan
data pada layar selanjutnya (scrolling). Penekanan tombol ini dilakukan jika
kursor berada di baris paling bawah dalam satu layar LCD dan akan mengaktifkan
flag panah.
83
--- ///////////////////////////////////////////////////////////////////////////////// else if (s_code2 == 0x92 && s_code != 0x32) //Press Down arrow got = ((baris + 2) * 16) - 1; tem_brs = kursor & 0x90; if (tem_brs == 0x90) //panah atas dipake kalo kursor di baris 3 pd LCD if (char_akir >= got) baris++; index_RAM = baris * 16; clrscr(); data_RAM(); panah = 1; lama(3); ---
Jika pengguna menekan tombol Backspace, maka indeks semua data
yang tersimpan di RAM akan digeser satu indeks ke kiri mulai dari posisi indeks
penunjuk RAM sampai dengan indeks dari data terakhir. Karena arah pergerakan
kursor adalah ke kiri, maka perubahan posisi kursor sama dengan jika ditekan
tombol panah kiri.
--- / /////////////////////////////////////////// else if (s_code == 0x66) //Press BACKSPACE / ////////////////////////////////////
if (baris != 0 || kursor != 0x80) if (kursor == 0x80) clrscr(); baris --; index_RAM = baris * 16; char_akir--; data_RAM(); LCD_C = kursor; lama(1); LCD_D = 0xA0; lama(1); LCD_C = kursor; lama(1); for (i=index_RAM; i<char_akir; i++) RAM[i] = RAM[i+1]; lama(3); else kursor--; index_RAM--; index_LCD--; char_akir--; if (index_RAM%16 == 15) baris--; if (kursor == 0x8F) //awal baris 3 - 1 hrs ke akhir baris 2 kursor = 0xCF; if (kursor == 0xBF) //awal baris 2 - 1 hrs ke akhir baris 1 kursor = 0x8F; LCD_C = kursor; lama(1); LCD_D = 0xA0; lama(1); LCD_C = kursor; lama(1); for (i=index_RAM; i<char_akir; i++)
84
RAM[i] = RAM[i+1]; lama(3); tem_kur = kursor; tem_ind = index_LCD; tem_brs = baris; tem_RAM = index_RAM; data_RAM(); kursor = tem_kur; index_LCD = tem_ind; baris = tem_brs; index_RAM = tem_RAM; ganti_lyr(); LCD_C = kursor; lama(3); lama(3); ---
Jika pengguna menekan tombol huruf atau angka, maka sebelum
ditampilkan atau disimpan perlu di-cek terlebih dahulu kondisi tombol Shift atau
Capslock. Hal ini dapat diketahui dari nilai flag kedua tombol tersebut. Huruf
kapital akan ditampilkan sesuai dengan database huruf tabel_scan2 […] jika salah
satu dari kedua flag tersebut aktif.
--- /////////////////////////////////////////////////////////Press SHIFT + character, maks isi sms = 608 karakter
//////////////////////////
else if ((shift == 1 || caps == 1) && char_akir < 609) tulis_char(tabel_scan2 [s_code]); else if ((shift == 0)&& char_akir < 609) if (!panah) //agar panah dilepas ga ngeluarin huruf tulis_char(tabel_scan [s_code]); else panah = 0; lama (7);
3.1.7 Format Data yang Dikirimkan Oleh Sistem
Karena komunikasi yang digunakan oleh antar sistem adalah
komunikasi serial dengan pengiriman beberapa bagian data secara berurutan
seperti identitas sistem, isi SMS, nomor tujuan dan total SMS, maka penggunaan
format data pengiriman ini berguna untuk mempermudah pemrograman di setiap
sistem dalam mengambil bagian-bagian data tersebut.
85
A. Pengiriman SMS
Format data SMS yang dikirim dari Terminal menuju Terminal Selector
kemudian dari Terminal Selector diteruskan ke komputer adalah sebagai berikut :
A B C D E F G H
Gambar 3.17 Format data pengiriman SMS dari Terminal ke komputer
Keterangan : A : Isi SMS E : Identitas Terminal pengirim
B : Karakter 0xF0 F : Karakter 0xF2
C : Nomor Tujuan G : Total SMS
D : Karakter 0xF1 H : Karakter 0xAE
B. Penerimaan SMS
Format data SMS yang dikirim dari komputer ke Terminal Selector
sebagai SMS yang akan dibaca oleh user di Terminal adalah sebagai berikut :
A B C
Gambar 3.18 Format data penerimaaan SMS
Keterangan : A : Identitas Terminal tujuan
B : Isi SMS
C : Karakter 0xAE
Sedangkan format data SMS yang dikirim dari Terminal Selector ke
Terminal adalah sebagai berikut :
86
A B
Gambar 3.19 Format data pengiriman SMS dari Terminal Selector ke Terminal
Keterangan : A : Isi SMS
B : Karakter 0xAE
3.2 Perancangan Perangkat Lunak
Hasil perancangan perangkat lunak akan diterapkan pada komputer
sebagai penampil program aplikasi yang berbasis Graphical User Interface
(GUI), Terminal Selector, dan Terminal. Sehingga dari ketiga sistem tersebut
dapat saling berkomunikasi.
3.2.1 Terminal Selector
Diagram alir perangkat lunak pada Terminal Selector sesuai pada
Gambar 3.20
87
Gambar 3.20 Diagram alir perangkat lunak pada Terminal Selector
3.2.2 Terminal
Diagram alir perangkat lunak pada Terminal sesuai pada Gambar 3.21
88
START
Tekan tombol KIRIM
Kirim data ke Terminal Selector
Tekan tombolPanah
Ambil dataDari RAM
TampilkanKe LCD
Tekan tombolHuruf/Angka
Ketik nomortujuan
Tampilkan di LCD & simpan di RAM
T
T
Y
Y
Bersihkan layarLCD
Ambil semua dataDari RAM
Simpan datadi RAM
Y
Y
Koneksi dgn Terminal Selector
T
Tekan TombolBaca SMS
Koneksi dgn Terminal Selector
Terima data dr Terminal
Selector&simpan ke RAM
Tampilkan di LCD
Y
TLCD kosong Y Y
TT
T
Gambar 3.21 Diagram alir perangkat lunak pada Terminal
3.2.3 Komputer
Secara umum, perangkat lunak pada komputer bertujuan untuk menerima
data dari Terminal Selector berupa SMS yang akan dikirim dan mengirimkan
SMS yang dipesan oleh user ke Terminal melalui Terminal Selector. Diagram alir
perangkat lunak dari aplikasi tersebut adalah sesuai dengan Gambar 3.22.
89
START
Terima datadr Terminal
Selector
Ubah jd format PDU
Kirim SMS
Simpan & Cetak Transaksi
Y
Pesanan baca SMST
T
Kirim ke Terminal Selector
Y
Gambar 3.22 Diagram alir perangkat lunak pada komputer
A. Informasi Handphone
Beberapa informasi handphone yang perlu diambil sebelum mengirim
dan menerima SMS adalah nama provider selular, nomor SMS Center, kapasitas
battery, dan kualitas sinyal. Sebelum mendapatkan informasi-informasi tersebut
program akan melakukan tes koneksi dengan handphone setelah meng-klik
tombol REFRESH yaitu dengan mengirim perintah AT<Enter> sampai didapat
status OK.
//Fungsi untuk mendapatkan status handphone dan SIM card procedure TFdepan.BBRefreshClick(Sender: TObject); var aw, ak : ShortInt; begin if Serial1.PortOpen then Serial1.PortOpen := False;
90
//Serial1.CommPort := SetPort.HPPort.ItemIndex + 1; //Serial1.Settings := SetPort.HPBaud.Text + ',n,8,1'; Serial1.PortOpen := True; lama := NOW; //*** Status Koneksi **************************// Serial1.Output := 'AT'#13; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0) or (Pos('ERROR', samp) > 0) or (SecondsBetween(NOW, lama) > 3); if (Pos('OK', samp) > 0) then begin BBRefresh.Visible := True; kedip.Enabled := False; StatusBar1.Panels[1].Text := ''; StatusBar1.Panels[0].Text := ''; LKondisi.Caption := 'OK'; //*** Nomor SMSC ***************************// Serial1.Output := 'AT+CSCA?'#13; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0)or (Pos('ERROR', samp) > 0); if (Pos('OK', samp) > 0) then begin aw := Pos('"+', samp) + 2; ak := Pos('",', samp); samp := copy(samp, aw , ak - aw); LSmsc.Caption := samp; smsc := samp; end; //*** Nama provider ***********************// Serial1.Output := 'AT+COPS?'#13; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0)or (Pos('ERROR', samp) > 0); if (Pos('OK', samp) > 0) then begin aw := Pos(',"', samp) + 2; ak := Pos('"'+Char($0D), samp); samp := copy(samp, aw , ak - aw); LSimcard.Caption := samp; end; //*** Kapasitas battery ********************// Serial1.Output := 'AT+CBC'#13; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0)or (Pos('ERROR', samp) > 0); if (Pos('OK', samp) > 0) then begin aw := Pos('0,', samp) + 2; samp := copy(samp, aw, (Pos('OK', samp) - aw) - 4); batteray.Position := StrToInt(samp); end; //*** Kualitas Sinyal *********************// Serial1.Output := 'AT+CSQ'#13; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0)or (Pos('ERROR', samp) > 0);
91
if (Pos('OK', samp) > 0) then begin aw := Pos(': ', samp) + 2; samp := copy(samp, aw , Pos(',', samp)-aw); signal.Position := StrToInt(samp) + 1; end; //******************************************// if LSimcard.Caption = 'IND TELKOMSEL' then //Telkomsel begin LSmsc.Caption := '6281100000'; smsc := '6281100000'; c_pulsa := 'ATD["*888#"];' end else if LSimcard.Caption = 'IND SATELINDOCEL' then //IM3 begin LSmsc.Caption := '62855000000'; smsc := '62855000000'; c_pulsa := 'ATD["*388#"];' end else if LSimcard.Caption = 'proXL' then //pro XL Jempol begin LSmsc.Caption := '62818445009'; smsc := '62818445009'; c_pulsa := 'ATD["*123#"];' end; else if LSimcard.Caption = 'IND SATELINDOCEL' then //Mentari begin LSmsc.Caption := '62816124'; smsc := '62816124'; c_pulsa := 'ATD[*555#];' end; Serial2.Active := True; end else if (Pos('ERROR', samp) > 0) then begin LKondisi.Caption := 'ERROR'; end; end;
Gambar 3.23 Tampilan form utama
92
B. Konversi Teks Menjadi PDU dan Sebaliknya
Sebelum teks SMS dikirimkan, teks SMS tersebut harus diubah menjadi
format PDU. Sedangkan SMS yang diambil dari handphone masih dalam bentuk
PDU. Sehingga untuk membacanya perlu diubah menjadi bentuk teks.
B.1 Konversi Teks Menjadi PDU
Proses yang dilakukan untuk mengubah teks menjadi PDU adalah
mengubah data 8 bit menjadi data 7 bit. Proses diawali dari huruf pertama dari
teks. Untuk mendapatkan nilai ASCII dari huruf tersebut menggunakan perintah
ord(...). Nilai ASCII tersebut adalah 8 bit, maka untuk mengubah menjadi 7 bit
yaitu dengan mengambil bit ke-8 untuk dimasukkan ke huruf berikutnya. Proses
ini dilakukan sampai dengan huruf terakhir. Program fungsi berikut digunakan
untuk mengubah teks SMS menjadi PDU :
//Fungsi program untuk ubah teks jadi PDU function TFdepan.PDUdecoder(kal:String):String; // created by IIK var ulang, temp, panjang, index, hexa : Integer; huruf_1, huruf_2, mask, masking : Integer; hasil : String; begin panjang := length(kal); hasil := ''; hasil := hasil + IntToHex(panjang, 2); ulang := 1; mask := 255; for index := 1 to panjang do begin if ulang = 1 then huruf_1 := ord(kal[index]) else huruf_1 := huruf_2; if ulang = 8 then ulang := 1 else begin huruf_2 := ord(kal[index+1]); masking := mask shr (8 - ulang); temp := huruf_2 and masking; temp := temp shl (8 - ulang); hexa := huruf_1 or temp; hasil := hasil + IntToHex(hexa, 2); huruf_2 := huruf_2 shr ulang; inc(ulang); end; end; result := hasil; end;
93
B.2 Konversi PDU Menjadi Teks
Proses yang dilakukan untuk mengubah PDU menjadi teks adalah
mengubah data 7 bit menjadi data 8 bit. Proses diawali dari dua pasang pertama
huruf heksa dari PDU untuk mengetahui panjang teks. Kemudian mengambil satu
pasang heksa berikutnya untuk di-decode menjadi huruf. Proses tersebut
dilakukan sampai dengan panjang teks yang telah didapatkan pada awal proses.
Program fungsi berikut digunakan untuk mengubah PDU menjadi bentuk teks :
//Fungsi program untuk ubah PDU jadi teks // created by IIK @ April, 29 12:34 am function TFdepan.PDUencoder(kal:String):String; var hsl, var_str : String; hsl_int, i, stat, sisa, index, mask, mask1, mask2, pjg_PDU, pjg_kal : Integer; int_akhir, putar, temp : Integer; begin mask := 255; hsl := ''; pjg_PDU := length(kal); //cek 2 bit ato 3 bit awal hexa pd PDU if pjg_PDU <= 452 then begin pjg_kal := 0; var_str := copy (kal, 1, 1); // ambil bit1 dr PDU pjg_kal := pjg_kal + (16 * HexToDec(var_str)); var_str := copy (kal, 2, 1); // ambil bit2 dr PDU pjg_kal := pjg_kal + HexToDec(var_str); stat := 2; // mencatat index awal kal end else begin pjg_kal := 0; var_str := copy (kal, 1, 1); // ambil bit1 dr PDU pjg_kal := pjg_kal + (256 * HexToDec(var_str)); var_str := copy (kal, 2, 1); // ambil bit2 dr PDU pjg_kal := pjg_kal + (16 * HexToDec(var_str)); var_str := copy (kal, 3, 1); // ambil bit3 dr PDU pjg_kal := pjg_kal + HexToDec(var_str); stat := 3; // mencatat index awal kal end; index := 1; putar := 1; temp := 0; for i := 1 to pjg_kal do begin if putar = 8 then begin putar := 1; temp := 0; sisa := 0; end else begin hsl_int := 0; var_str := copy (kal, stat + index, 1); hsl_int := hsl_int + (16 * HexToDec(var_str)); var_str := copy (kal, stat + index + 1, 1); hsl_int := hsl_int + HexToDec(var_str); mask1 := mask shl (8 - putar); sisa := hsl_int and mask1; sisa := sisa shr (8 - putar);
94
mask2 := mask shr putar; int_akhir := hsl_int and mask2; int_akhir := int_akhir shl (putar - 1); int_akhir := int_akhir or temp; temp := sisa; hsl := hsl + chr(int_akhir); if putar = 7 then hsl := hsl + chr(sisa); index := index + 2; putar := putar + 1; end; end; result := hsl; end;
C. Pengiriman SMS
Pengiriman SMS, dilakukan setelah komputer menerima data dari
Terminal Selector. Data tersebut kemudian dipilah-pilah sehingga terdapat teks
SMS, nomor tujuan, identitas Terminal dan jumlah SMS. Setelah penambahan
header-header pada format PDU, maka SMS segera dikirim.
Setelah pengiriman SMS, komputer akan menyimpan SMS tersebut pada
form Outbox kemudian menunggu status report dari pengiriman tersebut. Jika
dalam waktu yang ditentukan tidak terdapat status report, maka pengiriman SMS
masih tertunda. Status dari pengiriman SMS (Tertunda atau Terkirim) segera
dikirim ke Terminal Selector untuk diteruskan ke Terminal. Sesaat kemudian
komputer akan mencetak hasil transaksi pengiriman SMS sebagai laporan kepada
user. Proses memilah-milah data tersebut ditulis dalam program fungsi berikut :
//Fungsi program untuk pengiriman SMS procedure TFdepan.Ngirim(); var m, n, v, q, r : Integer; sdhqrim, w : ShortInt; teksQrim : String; begin //data dari Terminal Selector hanya bs diproses stlh diterima stop bit if Pos(Char($AE), data_in) > 0 then begin q := Pos(Char($F0), data_in); teks_sms := copy(data_in, 1, q-1); r := Pos(Char($F1), data_in); no_tuj := copy (data_in, q+1, r-(q+1)); id := copy(data_in, r+1, 2); q := Pos(Char($F2), data_in);
95
tot := copy(data_in, q+1, 1);
Setelah didapatkan data-data tersebut, kemudian ditampilkan pada kolom
yang sesuai dengan Terminal yang mengirim.
--- pjg_SMS := length(teks_sms); if id = 'T1' then begin report1.Caption := 'Pending'; LNoTrans1.Caption := IntToStr(noTrans); LPj1.Caption := IntToStr(pjg_SMS); IsiSMS1.Lines.Text := teks_sms; LNo_tuj1.Caption := no_tuj; waktu := DateTimeToStr(NOW); LWaktu1.Caption := waktu; Inc(noTrans); data_in := ''; end else if id = 'T2' then begin report2.Caption := 'Pending'; LNoTrans2.Caption := IntToStr(noTrans); LPj2.Caption := IntToStr(pjg_SMS); IsiSMS2.Lines.Text := teks_sms; LNo_tuj2.Caption := no_tuj; waktu := DateTimeToStr(NOW); LWaktu2.Caption := waktu; Inc(noTrans); data_in := ''; end else if id = 'T3' then begin report3.Caption := 'Pending'; LNoTrans3.Caption := IntToStr(noTrans); LPj3.Caption := IntToStr(pjg_SMS); IsiSMS3.Lines.Text := teks_sms; LNo_tuj3.Caption := no_tuj; waktu := DateTimeToStr(NOW); LWaktu3.Caption := waktu; Inc(noTrans); data_in := ''; end; ---
Penyusunan header-header PDU diawali dengan nomor SMS Center dan
diakhiri dengan teks yang akan dikirim. Jumlah karakter teks yang dikirim
disesuaikan dengan jumlah SMS yang dikirim.
--- if smsc = '62818445009' then //proXL PDU := '07912618485400F9' else if smsc = '62855000000' then //IM3 PDU := '07912658050000F0' else if smsc = '62816125' then //Mentari PDU := '079126181652' else if smsc = '6281100000' then //Telkomsel PDU := '07912618010000F0'; n := length(PDU); //pjg SMSC PDU := PDU + '31'; //SMS type w/ REPORT STATUS PDU := PDU + '00'; //SMS Reference number PDU := PDU + no_tuj2PDU(no_tuj);
96
PDU := PDU + '00'; //SMS form as SMS PDU := PDU + '00'; //7 bits Encoding Data I/O scheme PDU := PDU + 'FF'; //SMS expired time sdhqrim := 0; notsend := False; for w := 1 to StrToInt(tot) do begin if w = 1 then teksQrim := copy(teks_sms, 1, 160) else if w = 2 then teksQrim := copy(teks_sms, 161, 144) else if w >= 3 then teksQrim := copy(teks_sms, 305+((w-3)*152), 152); PDUqrim := PDU + PDUdecoder(teksQrim); m := length(PDUqrim); //pjg smua PDU v := (m - n) div 2; StatusBar1.Panels[1].Text := PDUqrim; if length(no_tuj) > 4 then begin Serial1.Output := 'AT+CMGS=' + IntToStr(v) + #13; //mulai kirim SMS samp := ''; repeat samp := samp + Serial1.Input; until (Pos('>', samp) > 0) or (Pos('ERROR', samp) > 0); end else begin MessageDlg('NOMOR TUJUAN BERBAHAYA !!', mtInformation, [mbYes], 0); samp := 'ERROR'; end; if (Pos('>', samp) > 0) then begin Serial1.Output := PDUqrim + #$1A; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0) or (Pos('ERROR', samp) > 0); end; if (Pos('OK', samp) > 0) then Inc(sdhqrim) else if (Pos('ERROR', samp) > 0) then begin notsend := TRUE; //kirim status TERTUNDA ke Terminal Selector Serial2.SendString(Chr($50)); Break; end; end; ---
Setelah pesan terkirim, maka program akan menghitung biaya yang
dibebankan pada pengguna dan akan menunggu status report dari pengiriman
tersebut.
--- dbyr := sdhqrim * tarip; if id = 'T1' then begin if notsend = TRUE then report1.Caption := 'NOT SENT' else begin LByr1.Caption := IntToStr(dbyr); p := 0; FOutbox.SimpanOutbox(no_tuj, waktu, IntToStr(pjg_SMS), teks_SMS); delay_cekreport.Enabled := True; end; end
97
else if id = 'T2' then begin if notsend = TRUE then report2.Caption := 'NOT SENT' else begin LByr2.Caption := IntToStr(dbyr); p := 0; FOutbox.SimpanOutbox(no_tuj, waktu, IntToStr(pjg_SMS), teks_SMS); delay_cekreport.Enabled := True; end; end else if id = 'T3' then begin if notsend = TRUE then report3.Caption := 'NOT SENT' else begin LByr3.Caption := IntToStr(dbyr); p := 0; FOutbox.SimpanOutbox(no_tuj, waktu, IntToStr(pjg_SMS), teks_SMS); delay_cekreport.Enabled := True; end; end; end; end; ---
Untuk mendapatkan status report dari SMS yang dikirim yaitu dengan
menunggu adanya SMS baru sampai waktu yang telah ditentukan. Status terkirim
atau tertunda akan dikirimkan ke Terminal yang mengirim SMS dan akan dicetak
pada bon transaksi.
//Fungsi program untuk mengetahui status pengiriman SMS procedure TFdepan.cek_report(); var PD : boolean; r : ShortInt; pendel, q, stt, smsin : String; begin Serial1.Output := 'at+cmgl=0'#13; lama := NOW; samp := ''; PD := False; repeat samp := samp + Serial1.Input; until (Pos(samp, 'OK') > 0) or (SecondsBetween(NOW, lama) > 3); if (Pos('+CMGL:', samp) > 0) then begin smsin := copy(samp, Pos('+CMGL:', samp)+17, 70); //ambil PDU q := copy (smsin, 2, 1); r := StrToInt(q); stt := copy (smsin, (r*2)+3, 2); //ambil kode status stlh kode SMS center if stt = '06' then begin if id = 'T1' then report1.Caption := 'Delivered' else if id = 'T2' then report2.Caption := 'Delivered' else if id = 'T3' then report3.Caption := 'Delivered'; Serial2.SendString(Chr($44)); //kirim status TERKIRIM ke Terminal Selector pendel := 'TERKIRIM'; PD := True; end; end else if PD = False then begin Serial2.SendString(Chr($50)); //kirim status TERTUNDA ke Terminal Selector pendel := 'TERTUNDA';
98
Edit1.Text := 'PENDING'; end; delay_cekreport.Enabled := False; //perintah ini jgn ditaruh dibwh sendiri if (id = 'T1') And (CB1.Checked = True)then Cetak_Bon('1', pendel) else if (id = 'T2') and (CB2.Checked = True) then Cetak_Bon('2', pendel) else if (id = 'T3') and (CB3.Checked = True) then Cetak_Bon('3', pendel); end; //Fungsi program untuk mencetak BON procedure TFdepan.Cetak_Bon(iden, stadus : String); begin HslCetak.Font.Name := 'Verdana'; HslCetak.Font.Size := 10; HslCetak.Lines.Clear; HslCetak.Lines.Add(' Waröeng SMS'+Chr(13)+Chr(10)); HslCetak.Lines.Add(' Terminal ' + iden); HslCetak.Lines.Add(' Tujuan'+Chr(9)+': ' + no_tuj); HslCetak.Lines.Add(' Waktu'+Chr(9)+': ' + waktu); HslCetak.Lines.Add(' Panjang'+Chr(9)+': ' + IntToStr(pjg_SMS)+' karakter'); HslCetak.Lines.Add(' Biaya'+Chr(9)+': Rp ' + IntToStr(dbyr)); HslCetak.Lines.Add(' Status'+Chr(9)+': '+stadus+Chr(13)+Chr(10)); HslCetak.Lines.Add(' [Bluebit]'); HslCetak.Print('c:\bon.txt'); //PASTIKAN FILE INI ADA DI DRIVE C: end;
D. Penerimaan SMS
Untuk mengetahui ada atau tidak SMS yang masuk, pengecekan
dilakukan pada form Inbox. Jika ada SMS yang masuk, maka SMS tersebut akan
disimpan. Karena SMS yang diterima dalam bentuk PDU, maka perlu dipilah-
pilah untuk diambil nomor pengirim, waktu pengiriman, dan isi SMS. Jika SMS
telah tersimpan pada program, maka SMS tersebut akan terhapus dari handphone.
Penulisan pada program adalah sebagai berikut :
//Fungsi program untuk mengambil data-data SMS dr PDU SMS yang masuk procedure TFInbox.UbahPDU2Text(var datasms, pengirim, tanggal, jam, isi: string); var pdu, smsc, tipe, bentuk, skema,batas: string; p,i: integer; begin pdu := datasms; smsc := ''; p := StrToInt('$' + copy(pdu, 1, 2)) - 1; pdu := copy(pdu,5,length(pdu)-4); for i := 1 to p do begin smsc := smsc + pdu[i*2]; smsc := smsc + pdu[i*2-1]; end; if smsc[length(smsc)] = 'F' then smsc := copy(smsc, 1, length(smsc) - 1); pdu := copy(pdu, p*2+1,length(pdu)-p*2); tipe := copy(pdu, 1, 2); if tipe = '06' then begin pengirim := 'SMS Center';
99
tanggal := '-'; jam := '-'; isi := 'SMS Report'; end else begin pdu := copy(pdu, 3, length(pdu)-2); pengirim := ''; p := StrToInt('$'+copy(pdu,1,2)); if p mod 2 = 1 then inc(p); pdu := copy(pdu,5,length(pdu)-4); for i := 1 to p div 2 do begin pengirim := pengirim + pdu[i*2]; pengirim := pengirim + pdu[i*2-1]; end; if pengirim[length(pengirim)] = 'F' then pengirim := copy(pengirim, 1, length(pengirim) - 1); pdu := copy(pdu,p+1,length(pdu)-p); bentuk := copy(pdu,1,2); pdu := copy(pdu, 3, length(pdu)-2); skema := copy(pdu,1,2); pdu := copy(pdu, 3, length(pdu)-2); tanggal := pdu[6]+pdu[5] + '/' + pdu[4]+pdu[3] + '/' + pdu[2]+pdu[1]; jam := pdu[8]+pdu[7] + ':' + pdu[10]+pdu[9] + ':' + pdu[12]+pdu[11]; pdu := copy(pdu, 13, length(pdu)-12); batas := copy(pdu,1,2); pdu := copy(pdu, 3, length(pdu)-2); isi := Fdepan.PDUencoder(pdu); end; end; //Fungsi program untuk tutup form procedure TFInbox.Button2Click(Sender: TObject); begin Close; end; //Fungsi program untuk men-cek SMS baru procedure TFInbox.BceknewsmsClick(Sender: TObject); var s, isi, tanggal, jam, pengirim : String; index_sms, samp : string; save_all : textfile; lama : TDateTime; begin Fdepan.Serial1.Output := 'AT+CMGL=0'#13; //cek SMS baru lama := NOW; samp := ''; repeat samp := samp + Fdepan.Serial1.Input; until (Pos('OK', samp) > 0) or (Pos('ERROR', samp) > 0) or (SecondsBetween(NOW, lama) > 180); if Pos('+CMGL:', samp) > 0 then //kalo ada SMS, langsung proses begin assignfile(save_all, 'SMS_in.txt'); rewrite(save_all); write(save_all, samp); closefile(save_all); reset(save_all); readln(save_all, samp); while (not EOF(save_all)) do begin readln(save_all, samp); if copy(samp, 1, 7) = '+CMGL: ' then begin index_sms := copy(samp, 8, pos(',', samp) - 8);
100
readln(save_all, samp); UbahPDU2Text(samp, pengirim, tanggal, jam, isi); tbInbox.Append; tbInbox['Pengirim'] := pengirim; tbInbox['Tanggal'] := tanggal; tbInbox['Jam'] := jam; tbInbox['Isi SMS'] := isi; tbInbox.Post; Fdepan.Serial1.Output := 'AT+CMGD=' + index_SMS + #13; //hapus SMS lama := NOW; repeat s := Fdepan.Serial1.Input; until (Pos('OK', s) > 0) or (Pos('ERROR', s) > 0) or (SecondsBetween (NOW, lama) > 180); end; end; closefile(save_all); end else MessageDlg('Ga ada SMS baru !', mtInformation, [mbYes], 0); end;
Gambar 3.24 Tampilan form Inbox
E. Pengiriman SMS ke Terminal
Jika dari SMS yang disimpan dalam form Inbox terdapat SMS yang
ingin dibaca oleh user, maka operator Billing memilih SMS tersebut untuk
101
dikirim ke Terminal melalui Terminal Selector. Penulisan pada program adalah
sebagai berikut :
1. Pada form Inbox
//Fungsi program kirim SMS ke form Utama procedure TFInbox.BkirimterminalClick(Sender: TObject); begin Fdepan.IsiSMSUC.Clear; Fdepan.TerTuj.Caption := ''; Fdepan.IsiSMSUC.Lines.Text := DBRichEdit1.Text; Fdepan.TerTuj.Caption := ComboBox1.Text; Fdepan.delay_ijin.Enabled := True; end;
2. Pada form Utama
//Fungsi program ijin kirin SMS ke Terminal Selector procedure TFdepan.delay_ijinTimer(Sender: TObject); begin Serial2.SendString('0'); e nd;
//Fungsi program kirim SMS ke Terminal Selector procedure TFdepan.BKirimClick(Sender: TObject); begin SMSUC := TerTuj.Caption + IsiSMSUC.Text + '«'; Serial2.SendString(SMSUC); BKirim.Enabled := False; end;
Gambar 3.25 Tampilan form Outbox
BAB IV
PENGUJIAN SISTEM
Pengujian sistem yang dilakukan penulis merupakan pengujian terhadap
perangkat keras dan perangkat lunak dari sistem Terminal, Terminal Selector dan
komputer yang telah selesai dibuat.
4.1 Pengujian Keyboard
4.1.1 Tujuan
Pengujian keyboard ini hanya dilakukan pada Terminal dan bertujuan
untuk mengetahui bahwa mikrokontroler dapat membaca data dan clock yang
dikirimkan oleh keyboard.
4.1.2 Alat yang Digunakan
1. Terminal yang sudah terhubung dengan Terminal Selector
2. Catu daya +12 volt
3. Keyboard
4. Osiloskop
5. Multimeter
4.1.3 Prosedur Pengujian
1. Hubungkan keyboard ke Terminal.
2. Hubungkan catu daya ke Terminal Selector dan lampu indikator power di
Terminal Selector dan Terminal akan menyala.
102
103
3. Download program untuk pengujian keyobard berikut ke dalam
mikrokontroler.
#include <reg52.h> sbit Kdata = P1^0; sbit Kclk = P1^1; bit start; sbit P30 = P3^0; sbit B7 = B^7; unsigned int i, s_code, s_code2; void lama (int e) //delay 10 ms int y; for (y=1; y<=e; y++) TH0 = 0xD8; TL0 = 0xF0; TR0 = 1; while (!TF0); TR0 = 0; TF0 = 0; void main() TMOD = 0x01; lama(10); while (1) s_code = 0; s_code2 = 0; do P30 = 0; //berlogika 0 jika ga ada penekanan tombol B = 0x00; //definisi u/ tpt scancode while (Kclk); while (!Kclk); //tunggu ada penekanan tombol start = Kdata; // ambil start bit if (!start) // jika start bit = 0, brarti data scancode bs diambil for (i=0; i<8; i++) //ambil 8 bit pertama while (Kclk); while (!Kclk); B = B >> 1; B7 = Kdata; s_code = B; B = 0; for (i=0; i<8; i++) //ambil 8 bit kedua while (Kclk); while (!Kclk); B = B >> 1; B7 = Kdata; s_code2 = B; lama(5); while (s_code == 0 || s_code == 0xF0); P30 = 1; lama(300); //berlogika 1 jika ada penekanan tombol
4. Dengan menggunakan osiloskop, gambarlah sinyal data pada Port 1.0 (pin 1)
mikrokontroler ketika ada penekanan tombol keyboard.
104
5. Dengan menggunakan multimeter, catatlah tegangan yang dikeluarkan oleh
Port 3.0 mikrokontroler (pin 10) ketika ada penekanan tombol keyboard.
4.1.4 Hasil Dari Pengujian
Hasil dari pengujian ini adalah sesuai dengan program pada prosedur
pengujian. Pada program tersebut Port 3.0 sebagai indikator penekanan tombol,
jika ada penekanan tombol maka Port 3.0 akan berlogika 1, sedangkan bila tidak
ada penekanan tombol maka Port 3.0 akan berlogika 0.
Tegangan yang dikeluarkan pada Port 3.0 saat belum ada penekanan
tombol keyboard adalah 0,45 volt (logika 0). Sedangkan tegangan pada Port 3.0
ketika ada penekanan tombol keyboard ditunjukkan pada Tabel 4.1
Tabel 4.1 Hasil pengujian keyboard
Tekan tombol
Tegangan pada Port 3.0 (volt)
Logika
A 4,89 1 S 4,89 1 D 4,89 1 F 4,89 1 G 4,89 1
Pembacaan sinyal dimulai dari sebelah kiri secara berurutan ke kanan,
mulai saat sinyal dalam keadaan low sebagai tanda start bit kemudian data bit ke-0
sampai bit ke-7, parity bit bernilai 0 (bit data yang bernilai 1 adalah ganjil)
kemudian stop bit dalam keadaan high.
Pada Gambar 4.1 sampai dengan Gambar 4.5 didapat dengan konfigurasi
osiloskop sebagai berikut :
Voltage Scale : 2,00 volt
105
Coupling : DC
Time/Div : 100,0 µs
Berikut ini adalah gambar-gambar sinyal dari data penekanan tombol
keyboard sesuai Tabel 4.1 :
V
t
Gambar 4.1 Sinyal data tombol A
Sehingga Gambar 4.1 dibaca 00011100001. Berarti data scan code
tombol A adalah 00011100 biner atau 0x1C heksadesimal.
V
t
Gambar 4.2 Sinyal data tombol S
Sehingga Gambar 4.2 dibaca 01101100001. Berarti data scan code
tombol S adalah 00011011 biner atau 0x1B heksadesimal.
106
V
t
Gambar 4.3 Sinyal data tombol D
Sehingga Gambar 4.3 dibaca 01100010001. Berarti data scan code
tombol D adalah 00100011 biner atau 0x23 heksadesimal.
V
t
Gambar 4.4 Sinyal data tombol F
Sehingga Gambar 4.4 dibaca 01101010001. Berarti data scan code
tombol F adalah 00101011 biner atau 0x2B heksadesimal.
V
t
Gambar 4.5 Sinyal data tombol G
107
Sehingga Gambar 4.5 dibaca 00010110001. Berarti data scan code
tombol G adalah 00110100 biner atau 0x34 heksadesimal.
4.2 Pengujian Pengiriman Data
Dalam pengujian ini dilakukan pengiriman beberapa header dari format
pengiriman SMS, yaitu karakter 0xF0, 0xF1, 0xF2, 0xAE dan karakter isi SMS.
Gambar-gambar sinyal merupakan sinyal TTL (sebelum atau sesudah
berubah menjadi sinyal RS232) yang diambil dari pin Tx mikrokontroler pada
Terminal dan pin Rx mikrokontroler pada Terminal Selector.
4.2.1 Tujuan
Pengujian ini bertujuan untuk mengetahui apakah data yang telah dikirim
oleh Terminal sesuai dengan data yang diterima oleh Terminal Selector dan dapat
dikirimkan ke komputer.
4.2.2 Alat yang Digunakan
1. Salah satu Terminal yang sudah terhubung dengan Terminal Selector
2. Seperangkat komputer
3. Catu daya +12 volt
4. Osiloskop
4.2.3 Prosedur Pengujian
1. Hubungkan catu daya ke Terminal Selector dan lampu indikator power di
Terminal Selector dan Terminal akan menyala.
108
2. Hubungkan komputer dengan Terminal Selector dengan menggunakan kabel
serial silang.
3. Download program untuk pengiriman data berikut ke dalam mikrokontroler.
Data yang dikirimkan berganti-ganti yaitu karakter 0xF0, 0xF1, 0xF2, 0xAE
dan huruf-huruf sebagai isi SMS. Penggantian pengiriman data, lihat baris ke-
15 pada Terminal dan baris ke-29 dan baris ke-33 pada Terminal Selector.
Program pada Terminal :
#include <reg52.h> #include <stdio.h> void lama(int suwi); void Serial_init(); void Interrupt_init(); void main() TMOD = 0x21; lama(300); //Timer1 16 bit auto reload, Timer0 16 bit Serial_init(); Interrupt_init(); while (1) printf("%c", 0xF0); // Pilih data yg akan dikirim //printf("%c", 0xF1); //printf("%c", 0xF2); //printf("%c", 0xAE); //printf("ABCDEFGHIJKLMNOP"); lama(300); void lama (int suwi) //waktu tunda 10 ms unsigned int w; for (w=1; w<=suwi; w++) TH0 = 0xD8; TL0 = 0xF0; TR0 = 1; while (!TF0); TR0 = 0; TF0 = 0; void Serial_init() SCON = 0x50; //serial mode 1, REN = 1(Rx enable) PCON = 0x80; //baudrate mode 1, klo yg 9600 pake mode 0 TH1 = 0xFD; //baudrate 19200 bps TR1 = 1; TI = 1; lama(5); //TI = 1 hrs ada klo pake printf(); void Interrupt_init() IE = 0x90; //interrupt enable (EA) = 1, interrupt serial (ES) = 1; IP = 0x10; //interrupt serial priority (PS) = 1;
109
Program pada Terminal Selector:
#include <reg52.h> #include <stdio.h> sbit aa = P1^0; sbit bb = P1^1; sbit cc = P1^2; sbit En_Demux = P1^3; sbit En_Mux = P1^4; unsigned int i, indx; unsigned char RAM_dlm[40]; void lama(int suwi); void Serial_init(); void Interrupt_init(); void set_kirim(); void set_terima(); void main() TMOD = 0x21; lama(10); //Timer1 16 bit auto reload, Timer0 16 bit Serial_init(); Interrupt_init(); indx = 0; while (1) cc = 0; bb = 1; aa = 0; //Pilih T2 set_terima(); if (indx == 16) //sesuai jumlah data yg mo dikirim ato diterima cc = 0; bb = 0; aa = 0; //Pilih PC set_kirim(); //printf("%c", RAM_dlm[0]); for (i = 0; i < indx; i++) //buat ngirim kalimat printf("%c", RAM_dlm[i]); lama(1); lama(2); indx = 0; void lama (int suwi) //waktu tunda 10 ms unsigned int w; for (w=1; w<=suwi; w++) TH0 = 0xD8; TL0 = 0xF0; TR0 = 1; while (!TF0); TR0 = 0; TF0 = 0; void Serial_init() SCON = 0x50; //serial mode 1, REN = 1(Rx enable) PCON = 0x80; //baudrate mode 1, klo yg 9600 pake mode 0 TH1 = 0xFD; //baudrate 19200 bps TR1 = 1; TI = 1; lama(5); //TI = 1 hrs ada klo pake printf(); void Interrupt_init() IE = 0x90; //interrupt enable (EA) = 1, interrupt serial (ES) = 1; IP = 0x10; //interrupt serial priority (PS) = 1;
110
void Receive_char() interrupt 4 using 1 //interrupt serial dijalankan pake BANK 1 if (RI) RAM_dlm[indx] = SBUF; indx++; RI = 0; void set_terima() En_Mux = 1; En_Demux = 0; //terima data (enable-nya active low) void set_kirim() En_Mux = 0; En_Demux = 1; //kirim data (enable-nya active low)
4. Dengan menggunakan Osiloskop, gambarlah sinyal yang dikeluarkan dari pin
Tx mikrokontroler pada Terminal dan bandingkan dengan sinyal Rx
mikrokontroler pada Terminal Selector.
5. Dengan menggunakan software SerialNG Basic Demo, lihat data serial yang
diterima oleh komputer.
Konfigurasi port serial pada SerialNG Basic Demo adalah sebagai
berikut :
- Port : COM1
- Baudrate : 19200 bps
- Parity : NONE
- Flowcontrol : NONE
- Databit : 8 bit
- Stop bit : 1 bit
4.2.4 Hasil Pengujian
Hasil dari pengujian ini adalah sesuai dengan program pada prosedur
pengujian. Data yang dikirimkan tiap 2 detik dari Terminal akan diteruskan ke
komputer oleh Terminal Selector.
111
Tabel 4.2 Hasil pengiriman data
Data dari Terminal Data yang diterima komputer
Durasi Ket
Karakter 0xF0 Karakter 0xF0 < 1 detik Sesuai Karakter 0xF1 Karakter 0xF1 < 1 detik Sesuai Karakter 0xF2 Karakter 0xF2 < 1 detik Sesuai Karakter 0xAE Karakter 0xAE < 1 detik Sesuai
Huruf ’A’ Huruf ’A’ < 1 detik Sesuai Kalimat
’ABCDEFGHIJKLMNOP’Kalimat
’ABCDEFGHIJKLMNOP’< 1 detik Sesuai
Pembacaan sinyal data TTL pada Terminal dan Terminal Selector
dimulai dari sebelah kiri berurutan mulai start bit (low), 8 bit data mulai LSB
sampai MSB kemudian ditutup stop bit (high).
Gambar-gambar sinyal data pada Terminal dan Terminal Selector didapat
dengan konfigurasi Osiloskop sebagai berikut :
Voltage Scale : 2,00 volt
Coupling : DC
Time/Div : 5,0 µs
A. Sinyal Data Karakter 0xF0
Sinyal data 0xF0 yang dikirimkan oleh Terminal dapat diteruskan ke
komputer oleh Terminal Selector. Hal ini sesuai dengan Gambar 4.6, Gambar 4.7
dan Gambar 4.8.
112
V
t
Gambar 4.6 Sinyal data 0xF0 yang dikirim oleh Terminal
V
t
Gambar 4.7 Sinyal data 0xF0 yang diterima oleh Terminal Selector
Gambar 4.8 Data 0xF0 yang diterima oleh komputer
113
B. Sinyal Data Karakter 0xF1
Sinyal data 0xF1 yang dikirimkan oleh Terminal dapat diteruskan ke
komputer oleh Terminal Selector. Hal ini sesuai dengan Gambar 4.9, Gambar 4.10
dan Gambar 4.11.
V
t
Gambar 4.9 Sinyal data 0xF1 yang dikirim oleh Terminal
V
t
Gambar 4.10 Sinyal data 0xF1 yang diterima oleh Terminal Selector
114
Gambar 4.11 Data 0xF1 yang diterima oleh komputer
C. Sinyal Data Karakter 0xF2
Sinyal data 0xF2 yang dikirimkan oleh Terminal dapat diteruskan ke
komputer oleh Terminal Selector. Hal ini sesuai dengan Gambar 4.12, Gambar
4.13 dan Gambar 4.14.
V
t
Gambar 4.12 Sinyal data 0xF2 yang dikirim oleh Terminal
115
V
t
Gambar 4.13 Sinyal data 0xF2 yang diterima oleh Terminal Selector
Gambar 4.14 Data 0xF2 yang diterima oleh komputer
D. Sinyal Data Karakter 0xAE
Sinyal data 0xAE yang dikirimkan oleh Terminal dapat diteruskan ke
komputer oleh Terminal Selector. Hal ini sesuai dengan Gambar 4.15, Gambar
4.16 dan Gambar 4.17.
116
V
t
Gambar 4.15 Sinyal data 0xAE yang dikirim oleh Terminal
V
t
Gambar 4.16 Sinyal data 0xAE yang diterima oleh Terminal Selector
Gambar 4.17 Data 0xAE yang diterima oleh komputer
117
E. Sinyal Data Kalimat ’ABCDEFGHIJKLMNOP’
Karena data yang dikirimkan dari Terminal sangat banyak, maka penulis
tidak mengambil sinyal data pada Terminal dan Terminal Selector. Sehingga
untuk mengetahui keberhasilan pengiriman data, dapat dilihat langsung di
komputer.
Gambar 4.18 Data kalimat ’ABCDEFGHIJKLMNOP’ yang diterima oleh komputer
F. Pengiriman SMS
Sebelum dilakukan pengiriman SMS, komputer akan menerima data
SMS yang akan dikirim dari Terminal. Pada Tabel 4.3 merupakan hasil uji coba
penerimaan data pada komputer.
118
Tabel 4.3 Uji coba penerimaan data SMS dari Terminal pada Komputer
Terminal Asal (secara acak)
Isi SMS Nomor Tujuan Status di
Komputer1 Daftar 4444 Diterima 3 Daftar 4444 Diterima 2 Daftar 4444 Diterima 3 Ubah 4444 Diterima 2 Ya.. Forward aja.. Kl km
mo pake, pake aja. Tulis no asalny ya?
4444 Diterima
1 Uji coba Terminal 1 08563033808 Diterima 2 Uji coba Terminal 2 081703355558 Diterima 1 Uji coba Terminal 1 08133444404 Diterima 1 Coba lagi ahh… 123456 Diterima 3 Uda ah, capek nih.. 0318494454 Diterima
Karena waktu yang diperlukan untuk menerima status report yang
diberikan oleh SMS Center tiap provider selular berbeda-beda, maka setelah
pengiriman SMS diberikan waktu selama 10 detik untuk menunggu status report.
Jika dalam waktu tersebut tidak terdapat status report maka SMS yang dikirim
dianggap Tertunda.
Tabel 4.3 terdapat beberapa contoh pengiriman SMS ke berbagai nomor
tujuan. Dalam hal ini pengiriman SMS menggunakan nomor kartu 081703355558
(proXL). Isi SMS berupa kalimat ”ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz 1234567890”
119
Tabel 4.4 Pengiriman SMS ke beberapa nomor handphone
No Tujuan Waktu kirim Waktu terima (sesuai SMSC)
Status
081330997480 12:56:05 12:57:28 Terkirim 08563033808 13:00:42 13:01:43 Terkirim 085234585658 13:04:16 13:05:17 Terkirim 081931532107 13:07:46 13:08:47 Terkirim
4444 -- -- Tidak terkirim
G. Penerimaan SMS
Setelah menerima SMS baru dan apabila SMS tersebut akan dibaca oleh
user, maka isi SMS tersebut akan dikirimkan ke Terminal. Pada Tabel 4.5
merupakan hasil uji coba penerimaan data pada Terminal.
Tabel 4.5 Uji coba penerimaan data SMS dari Komputer pada Terminal
Terminal Tujuan
(secara acak)
Isi SMS Status di Terminal
2 Pesan utk Anda:Nomor 081703626398 dapat dihubungi kembali.
Diterima
3 Pesan utk Anda:Nomor 081703626398 dapat dihubungi kembali.
Diterima
1 Pesan utk Anda:Nomor 081703626398 dapat dihubungi kembali.
Diterima
2 Kartu Prabayar xl anda sudah terdaftar dengan Pin 31806339.Untuk perubahan data ketik UBAH ke
4444 atau datang ke xl center terdekat.Terima kasih
Diterima
2 Njajal maning soo..n Diterima 3 Selamat menempuh suasana hidup baru..
Ihtiar,tawakal,bersabarlah
Diterima
2 ABCDEFGHIJ Diterima 1 Boz HPmu ada SMS.mo diforward lagi ga? Diterima 1 Tes Terminal 1 Diterima 3 Tes Terminal 3 Diterima
120
4.3 Pengujian Program Billing
4.3.1 Tujuan
Dalam pengujian ini bertujuan untuk mengetahui apakah program Billing
dapat menerima data dari Terminal Selector, mengirim dan membaca SMS dari
handphone.
4.3.2 Alat yang Digunakan
1. Keyboard dan LCD yang sudah terhubung dengan Terminal.
2. Terminal Selector yang sudah terhubung dengan Terminal.
3. Seperangkat komputer yang sudah terhubung dengan HP dan Terminal
Selector.
4. Catu daya +12 volt.
4.3.3 Prosedur Pengujian
1. Hubungkan Terminal Selector dan komputer melalui port COM2.
2. Hubungkan handphone dan komputer melalui port COM1.
3. Download program lengkap masing-masing Terminal dan Terminal Selector.
4. Pastikan komputer sudah terkoneksi dengan handphone, yaitu dengan meng-
klik tombol REFRESH pada program Billing sampai status koneksi dalam
keadaan OK.
4.3.4 Hasil Pengujian
Program Billing akan menerima data dari Terminal Selector dan
menampilkannya melalui Status bar. Setelah data diterima, header data tersebut
121
diidentifikasi untuk ditampilkan pada kolom Terminal kemudian dikirimkan
sebagai SMS.
Gambar 4.19 Program Billing menerima data dari Terminal Selector
Setiap SMS yang dikirim akan disimpan dalam form Outbox. Untuk
menampilkan form tersebut yaitu dengan meng-klik tab Cek – Outbox.
122
Gambar 4.20 Program Billing menyimpan SMS yang dikirim
Apabila ingin mengetahui ada atau tidaknya SMS baru dan
menyimpannya pada program, dapat meng-klik tab Cek – Inbox kemudian meng-
klik tombol Cek SMS Baru.
Gambar 4.21 Program Billing menyimpan SMS baru
BAB V
PENUTUP
5.1 Kesimpulan
Setelah melakukan penelitian ini, penulis mengambil kesimpulan sebagai
berikut :
1. Dengan menggunakan baudrate yang semakin tinggi, maka transmisi data
serial semakin cepat. Tetapi apabila digunakan untuk jarak yang cukup jauh,
kemungkinan hilangnya data (data looses) semakin besar.
2. Setelah mengirimkan data serial dari mikrokontroler harus diberikan waktu
tunda selama kurang lebih 10 ms sebelum menjalankan instruksi selanjutnya.
Hal ini bertujuan agar mikrokontroler benar-benar selesai dalam mengirimkan
data.
3. Sebelum mengirimkan data serial dari perangkat satu ke perangkat lain,
diperlukan pengiriman data ijin untuk mengirimkan data kemudian data akan
dikirim setelah menerima keadaan siap dari perangkat tujuan.
4. Untuk mengakses RAM dan LCD secara bergantian diperlukan waktu tunda
bagi mikrokontroler untuk menulis atau membaca data ke RAM dan waktu
tunda setelah menulis pada LCD. Hal ini dilakukan karena kedua perangkat
tersebut sama-sama diakses melalui address dan data sehingga hilangnya data
yang ditransmisikan dapat dihindari.
5. Durasi waktu yang dibutuhkan untuk mendapatkan status report dari SMS yang
telah dikirim tergantung dari respon SMS Center provider selular yang
digunakan.
123
124
5.2 Saran
Sebagai pengembangan dari penelitian yang telah dilakukan, penulis
memberikan saran sebagai berikut :
1. Jika jarak transmisi data yang ditempuh cukup jauh dan jumlah data yang
dikirim sangat banyak, sebaiknya komunikasi serial yang digunakan
menggunakan baudrate yang kecil.
2. Apabila transmisi data serial tidak dapat menggunakan RS232 dikarenakan
jarak tempuh yang sangat jauh, maka transmisi data serial dapat menggunakan
RS485.
3. Dengan tipe RAM yang sama tetapi merk yang berbeda akan memiliki waktu
akses yang berbeda. Sebaiknya sebelum memilih RAM, teliti dahulu waktu
akses yang diperlukan melalui datasheet yang diberikan.
4. Dalam penelitian ini jika dilakukan pengiriman SMS lebih dari 160 karakter,
maka handphone tujuan akan menerima SMS secara terpisah sesuai dengan
jumlah karakter dalam setiap pengiriman. Sehingga diperlukan header
tambahan apabila ingin menggabungkan beberapa SMS tersebut.
5. Setelah didukung oleh perangkat hasil pnelitian penulis yang mampu mengirim
SMS dengan cepat dan dapat digunakan untuk umum, maka perlu adanya
kerjasama dengan provider selular untuk diberikannya jalur prioritas dalam
pengiriman SMS.
DAFTAR PUSTAKA
Agus, L. 2003. Belajar Sendiri Mengolah Database dengan Borland Delphi 7. Jakarta : PT Elex Media Komputindo.
ATMEL Corporation. 2005. 8-bit Microcontroller with 8K Bytes In-System
Programmable Flash AT89S52. (Online). (http://www.atmel.com, diakses 12 Mei 2006)
Brey, B. B. 2002. Mikroprosesor Intel : 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, dan Pentium pro : Arsitektur, Pemrograman Antarmuka Edisi kelima Jilid I. Jakarta : Erlangga.
Divisi Penelitian. 2002. Pemrograman Borland Delphi 7 Lengkap dengan Contoh Aplikasi ( jilid 1). Yogyakarta : ANDI.
EL-TECH ELECTRONICS. --. LCD MODULE USER MANUAL. Surabaya : EL-
TECH ELECTRONICS.
FAIRCHILD SEMICONDUCTOR. 2001. FAIRCHILD SEMICONDUCTOR DM74LS373 DM74LS374 3-STATE Octal D-Type Transparent Latches and Edge-Triggered Flip-Flops. (Online). (http://www.fairchildsemi.com, diakses 16 Januari 2004).
FAIRCHILD SEMICONDUCTOR. 2002. CD4051BC CD4052BC CD4053BC Single 8-Channel Analog Multiplexer/Demultiplexer Dual 4-Channel Analog Multiplexer/Demultiplexer Triple 2-Channel Analog Multiplexer/Demultiplexer. (Online). (http://www.fairchildsemi.com, diakses 14 April 2005).
Gunawan, F. 2003. Membuat Aplikasi SMS Gateway Server dan Client dengan Java dan PHP. Jakarta : PT Elex Media Komputindo.
Hartono, J. 2002. Konsep Dasar Pemrograman Bahasa C. Yogyakarta : ANDI. Intersil. 1997. Intersil ICL232. (Online). (http://www.intersil.com, diakses 19
November 2004).
125
126
Kellerek. 2000. Manual Reference AT Command Set for the SIEMENS Mobile Phone S35i, C35i, M35i. (Online). (http://www.siemens.com, diakses 21 Juli 2006).
Khan, M. A. 2004. Asim’s ISP Loader 89Sxxxx. (Online). (http://www.kmitl.ac.th/~kswichit/cheapcable/index.html, diakses 21 Juli 2006).
Khang, B. 2003. Trik Pemrograman Aplikasi Berbasis SMS. Jakarta : PT Elex
Media Komputindo.
Maria, A. 2000. AT Command Set for Nokia GSM Products. (Online). (http:// www.dipol.com.ua/NOKIA_AT-help.pdf, diakses 21 Juli 2006).
Mazidi, M.A. 2000. The 8051 MICROCONTROLLER & Embedded System. New
Jersey : Printice Hall.
MOTOROLA. --. MOTOROLA 1 OF 8 DECODER/DEMULTIPLEXER. (Online). (http://ece-www.colorado.edu/~mcclurel/sn74ls138rev5.pdf, diakses 21 Juli 2006).
Nalwan, P. A. 2003. Panduan Praktis Teknik Antarmuka dan Pemrograman Mikrokontroler AT89C51. Jakarta : PT Elex Media Komputindo.
National Semiconductor. 1996. National Semiconductor DM74LS573 Octal D Latch with TRI-STATE Outputs. (Online). (http:// wolverine.caltech.edu/datashet/74LS573.pdf, diakses 21 Juli 2006).
Noname. 2006. LCD Interfacing Reference Page. (Online).
(http://www.myke.com/44780LCD.htm, diakses 11 Mei 2006).
Peacock, C. 1998. Interfacing the Serial / RS232 Port.V5.0. (Online). (http://www.beyondlogic.org/serial/serial.pdf, diakses 21 Juli 2006).
Pettersson, L. SMS And PDU Format. (Online). (http://www.dreamfabric.com/sms, diakses 5 Maret 2006).
127
Putra, A. E. 2002. Belajar Mikrokontroler AT89C51/52/55 Teori dan Aplikasi. Yogyakarta : Gava Media.
Sutanto, B. 2000. Keyboard IBM PC. (Online). (http://alds.stts.edu, diakses 12
April 2002). Tim Penelitian. 2005. Pengembangan Aplikasi Sistem Informasi Akademik
Berbasis SMS dengan JAVA. Semarang : Wahana Komputer.
128
Lampiran 1 : Rangkaian Skematik Terminal
U2 6116
A08
A17
A26
A35
A44
A53
A62
A71
A823
A922
A10
19
CE18
OE20
WE
21
D09
D110
D211
D313
D414
D515
D616
D717VCC24 VSS 12
U1 AT89
S52
RST
9
XTAL
218
XTAL
119
GND 20
PSEN
29
ALE/
PROG
30
EA/VPP31
VCC40P1
.01
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
/MOS
I6
P1.6
/MIS
O7
P1.7
/SCK
8
P2.0
/A8
21P2
.1/A
922
P2.2
/A10
23P2
.3/A
1124
P2.4
/A12
25P2
.5/A
1326
P2.6
/A14
27P2
.7/A
1528
P3.0
/RXD
10
P3.1
/TXD
11
P3.2
/INTO
12
P3.3
/INT1
13
P3.4
/TO
14
P3.5
/T1
15
P3.6
/WR
16
P3.7
/RD
17
P0.0
/AD0
39
P0.1
/AD1
38
P0.2
/AD2
37
P0.3
/AD3
36
P0.4
/AD4
35
P0.5
/AD5
34
P0.6
/AD6
33
P0.7
/AD7
32
U3 74LS
573
OE1
GND
10LE
11
VCC
20
1Q19
2Q18
3Q17
4Q16
5Q15
6Q14
7Q13
8Q12
1D2
2D3
3D4
4D5
5D6
6D7
7D8
8D9
A10
A8A9AD2
AD0
AD5
AD3
AD7
AD1
AD6
AD4
TR
A1A0 A5A4 A7
Y1
11.5
092
Mhz
C5
0,1u
F
C233
pF
C133
pF
J1LC
D
2 4 6 8 10 12 14 16
1 3 5 7 9 11 13 15
C6 0,1
uF
R4 1k1
3
2
D21N
4002
5 v
5 v
5 v
A6
AD0
J3 RJ45
1 2 3 4 5 6 7 8
Rx T
erm
inal
Tx T
erm
inal
12v
AD1
U5 LM78
05VI
1
GND 2
VO3
5 v
VDD
12v
AD2
C12
2200
uF/2
5vC1
310
0uF/
25v
AD3
C10 10u/
16v
AD4
5 v
AD5
U4 MAX2
32
R1IN
13
R2IN
8
T1IN
11
T2IN
10
C+1
C1-
3
C2+
4
C2-
5
V+2
V-6
R1OU
T12
R2OU
T9
T1OU
T14
T2OU
T7
VCC16 GND 15
R/W
VSS
C810
u/16
v
Tx
VEE
AD6
C11
10u/
16v
C310
u/16
v
Rx
AD7
5 v
D3 LED
A2 A3
AD0
D0AD
2D2
C
R5 R Pa
ck 1
0k1
2 3 4 5 6 7 8 9
AD4
D4AD
6D6
WR
LCD
EAD
1D1
AD3
D3AD
5D5
AD7
D7
A0RS
U6A
74LS
02
2 31
14 7
5 v
U8 74LS
138
A1
B2
C3
G16
G2A
4
G2B
5
Y015
Y114
Y213
Y312
Y411
Y510
Y69
Y77
VCC16
GND
8
A15
5 v
A14
A13
C9
10uF
/16v
RAM
Kbd_
clk
LCD
Kbd_
data
SW1
rese
t
5 v
R2 10k
A15
A14
Title
Size
Docu
men
t Num
ber
Rev
Date
:Sh
eet
of
<Doc
><R
evCo
de>
Term
inal
Cust
om
11
Frida
y, J
uly 2
8, 2
006
5 v
C4 10uF
/16v
C7
0,1u
F
R327
0
A13
5 v
JS2
PS2
12
34
56
R1 100
Kbd_
data
Kbd_
clk
A6A2 A4A3A0 A5A1 A7 A10
A8 A9AD
5AD
4
AD6
AD1
AD7
AD0
AD3
AD2
RESE
T
RESE
T
J2
down
loade
r
1 2 3 4 5 6
MOSI
TR
Tx
RESE
TSC
KMI
SO
Rx
ALE
ALE
5 v
R6 4k7
5 v
MOSI
SCK
MISO
WR
WR
RD
RDRAM
AD1
AD0
AD3
AD2
AD4
AD7
AD5
AD6
129
Lampiran 2 : Rangkaian Skematik Terminal Selektor
U2
6116
A0
8
A1
7
A2
6
A3
5
A4
4
A5
3
A6
2
A7
1
A8
23
A9
22
A10
19
CE
18
OE
20
WE
21
D0
9
D1
10
D2
11
D3
13
D4
14
D5
15
D6
16
D7
17
VC
C24
VS
S12
U3
74LS
573
OE
1
GN
D10
LE11
VC
C20
1Q19
2Q18
3Q17
4Q16
5Q15
6Q14
7Q13
8Q12
1D2
2D3
3D4
4D5
5D6
6D7
7D8
8D9
C16
10u/
16v
A B C
C13
10u/
16v
C15 10
u/16
vU
5
MA
X232
R1I
N13
R2I
N8
T1IN
11
T2IN
10
C+
1
C1-
3
C2+
4
C2-
5
V+
2
V-
6
R1O
UT
12
R2O
UT
9
T1O
UT
14
T2O
UT
7
VCC16
GND15
5 v
C14
10u/
16v
T2_T
x
T2_R
x
T3_T
x
T3_R
x
Tx T
erm
inal
2
Rx
Term
inal
2
Tx T
erm
inal
3
Rx
Term
inal
3
A B C
J5 RJ4
5_T3
1 2 3 4 5 6 7 8J4 RJ4
5_T2
1 2 3 4 5 6 7 8
12 v
A1
A4
A5
A7
Y1
11.5
092
Mhz
C1
33 p
F
C2
33 p
F
C5
0,1u
F
C6
0,1
uF
J6 CO
NN
Pow
er
1 2
WR
12 v
A6
TR
A B C
5 v
5 v
C7
0,1u
F
C8 0,
1uF
En_
DeM
ux
En_
Mux
En_
Mux
En_
DeM
uxR
x Tx
A2
A3
T2_R
xT3
_Rx
PC
_Rx
T1_R
x
AD
1A
D2
AD
0
AD
3
AD
5A
D4
AD
6
C
R5
R P
ack
10k
123456789
AD
7
5 v
T1_T
xT2
_Tx
T3_T
x
PC
_Tx
5 v
RD
WR
RD
SW
1
12 v
U9
4051
Mux
X013
X114
X215
X312
X41
X55
X62
X74
INH
6
A11
B10
C9
X3
VDD16
VS
S8
VE
E7
U10
4051
DeM
ux
X013
X114
X215
X312
X41
X55
X62
X74
INH
6
A11
B10
C9
X3
VDD16
VS
S8
VE
E7
R2
10k C
1610
u/16
v
C15 10
u/16
vC
1310
u/16
v
5 v
U5
MA
X232
R1I
N13
R2I
N8
T1IN
11
T2IN
10
C+
1
C1-
3
C2+
4
C2-
5
V+
2
V-
6
R1O
UT
12
R2O
UT
9
T1O
UT
14
T2O
UT
7
VCC16
GND15
5 v
C14
10u/
16v
C3
10uF
/16v
T2_T
x
T3_R
x
T3_T
x
T2_R
x
Tx T
erm
inal
2
C4
0,1u
F
Tx T
erm
inal
3
Rx
Term
inal
2
Rx
Term
inal
3
J4 RJ4
5_T2
1 2 3 4 5 6 7 8 J5 RJ4
5_T3
1 2 3 4 5 6 7 8
12 v
12 v
RE
SE
T
RE
SE
T
R1
100
A6
A4
A3
A2
A5
A7
A0
A1
A8
A10
A9
AD
4A
D5
AD
6A
D7
AD
1A
D0
AD
3A
D2
RE
SE
T
J1 FA
N
1 2 3
AD
0
C19
10uF
/16v
D1
LED
AD
1
R3 270
J2 dow
nloa
der
1 2 3 4 5 6
U6
LM78
05
VI
1
GND2
VO
3
AD
2
TR MO
SI
5 v
Tx
MIS
OS
CK
12 v
AD
3
Rx
ALE
C17
2200
uF/2
5vC
1810
0uF
/25v
AD
4
5 v
U1
AT8
9S52
RS
T9
XTA
L218
XTA
L119
GND20
PS
EN
29
ALE
/PR
OG
30
EA/VPP31
VCC40
P1.
01
P1.
12
P1.
23
P1.
34
P1.
45
P1.
5/M
OS
I6
P1.
6/M
ISO
7
P1.
7/S
CK
8
P2.
0/A
821
P2.
1/A
922
P2.
2/A
1023
P2.
3/A
1124
P2.
4/A
1225
P2.
5/A
1326
P2.
6/A
1427
P2.
7/A
1528
P3.
0/R
XD10
P3.
1/TX
D11
P3.
2/IN
TO12
P3.
3/IN
T113
P3.
4/TO
14
P3.
5/T1
15
P3.
6/W
R16
P3.
7/R
D17
P0.
0/A
D0
39
P0.
1/A
D1
38
P0.
2/A
D2
37
P0.
3/A
D3
36
P0.
4/A
D4
35
P0.
5/A
D5
34
P0.
6/A
D6
33
P0.
7/A
D7
32
AD
5
R6
4k7
5 v
AD
6A
D7
ALE
MO
SI
SC
KM
ISO
A10
A9
A8
A0
AD
0A
D1
AD
4
AD
2A
D3
AD
7
AD
5A
D6
130
Lampiran 3 : Listing Program Terminal #include <reg52.h> #include <stdio.h> at 0x0E000 xdata unsigned char LCD_C; // XDATA -> external data address at 0x0E001 xdata unsigned char LCD_D; at 0x0C000 xdata unsigned char RAM[650]; //uda cukup buat nampumg maks 627 karakter // CODE u/ nyimpen di ROM. alamatnya t'serah. unsigned -> biar ga ada tanda min /*at 0x500*/ code unsigned char tabel_scan[128] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, '`', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'q', '1', 0x00, 0x00, 0x00, 'z', 's', 'a', 'w', '2', 0x00, 0x00, 'c', 'x', 'd', 'e', '4', '3', 0x00, 0x00, ' ', 'v', 'f', 't', 'r', '5', 0x00, 0x00, 'n', 'b', 'h', 'g', 'y', '6', 0x00, 0x00, 0x00, 'm', 'j', 'u', '7', '8', 0x00, 0x00, ',', 'k', 'i', 'o', '0', '9', 0x00, 0x00, '.', '/', 'l', ';', 'p', '-', 0x00, 0x00, 0x00, 0x27, 0x00, '[', '=', 0x00, 0x00, 0x00, 0x00, ' ', ']', 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, '1', 0x00, '4', '7', 0x00, 0x00, 0x00, '0', '.', '2', '5', '6', '8', 0x1B, 0x00, 0x00, '+', '3', '-', '*', '9', 0x00, 0x00; code unsigned char tabel_scan2[96] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, '~', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'Q', '!', 0x00, 0x00, 0x00, 'Z', 'S', 'A', 'W', '@', 0x00, 0x00, 'C', 'X', 'D', 'E', '$', '#', 0x00, 0x00, ' ', 'V', 'F', 'T', 'R', '%', 0x00, 0x00, 'N', 'B', 'H', 'G', 'Y', '^', 0x00, 0x00, 0x00, 'M', 'J', 'U', '&', '*', 0x00, 0x00, '<', 'K', 'I', 'O', ')', '(', 0x00, 0x00, '>', '?', 'L', ':', 'P', '_', 0x00, 0x00, 0x00, '"', 0x00, '', '+', 0x00, 0x00, 0x00, 0x00, ' ', '', 0x00, '|', 0x00, 0x00; code unsigned char str_notjan[14] = "Nomor Tujuan :"; code unsigned char SMS_msk[16] = "SMS segera masuk"; code unsigned char str_notjan2[16] = "F1=Send ESC=Back"; code unsigned char psn[13] = "Please Wait.."; code unsigned char sukses[12] = "SMS Terkirim"; code unsigned char tunda[12] = "SMS Tertunda"; code unsigned char T_id[4] = 0xF1, 'T', '1', 0xF2; //jgn lupa ubah jg baris 173 sbit Kdata = P1^0; sbit Kclk = P1^1; sbit B7 = B^7; bit shift, start, panah, caps, metu, save; unsigned char tem_kur, tem_ind, kursor, index_LCD, s_code, s_code2, aceka; unsigned int i, index_RAM, tem_RAM, char_akir, baris, tem_brs, got, dig1, dig2, dig3, sisa, total, sarah; void lama(int suwi); void LCD_init(); void Serial_init(); void Interrupt_init(); //void Send_char(unsigned char w); void Tekan_tombol(); void ganti_lyr(); void ganti_brs(); void data_RAM(); void clrscr(); void tampil_jum(); void ketik_nomor(); void tulis_char(unsigned char kode); void reset_lyr(); void Receive_char(); void main()
131
TMOD = 0x21; lama(50); //Timer1 8 bit auto reload, Timer0 16 bit LCD_init(); Serial_init(); Interrupt_init(); reset_lyr(); aceka = 0; save = 0; while(1) tampil_jum(); shift = 0; do Tekan_tombol(); if (s_code == 0x12 || s_code == 0x59) //cek tombol shift shift = 1; while (s_code == 0 || s_code == 0x12 || s_code == 0x59 || s_code == 0xF0); //jk hbs nekan shift ki/ka ato lepas tombol, ulang lg ///////////////////////////////////////////////////////////////////////////////// if (s_code == 0x06 && char_akir == 0) //Press F2 LCD_C = 0x01; lama(3); LCD_C = 0xC0; lama(3); for (i = 0; i < 16; i++) LCD_D = SMS_msk[i]; lama(3); do Receive_char(); while(aceka != '4'); //tunggu ijin kirim data lama(5); printf(")"); lama(2); //beri ijin terima data save = 1; do Receive_char(); while(aceka != '«'); //mulai terima data sampe tanda tutup save = 0; clrscr(); index_RAM = 0; baris = 0; char_akir--; //char_akir-1, biar tanda tutup data ga ikut disimpan for (i=0; i<char_akir; i++) LCD_D = RAM [i]; lama(3); index_LCD++; kursor++; index_RAM++; if (index_RAM%16 == 0) baris++; ganti_brs(); if (kursor == 0xA0) //jk brs 3 penuh,mk pindah brs 4 lama(1000); clrscr(); ///////////////////////////////////////////////////////////////////////////////// else if (s_code == 0x05) //Press F1 index_RAM = char_akir; RAM [index_RAM] = 0xF0; lama(3);//tanda akir isi sms index_RAM++; ketik_nomor(); do metu = 0; do Tekan_tombol();
132
while (s_code == 0 || s_code == 0xF0); if ((s_code == 0x66) && kursor > 0xC1) //Press BACKSPACE kursor --; index_RAM--; LCD_C = kursor; lama(1); LCD_D = 0xA0; lama(1); LCD_C = kursor; lama(1); else if ((s_code == 0x16 ||s_code == 0x1E ||s_code == 0x26 ||s_code == 0x25 ||s_code == 0x2E ||s_code == 0x36 ||s_code == 0x3D ||s_code == 0x3E ||s_code == 0x46 ||s_code == 0x45) && kursor < 0xCF) LCD_D = tabel_scan[s_code]; lama(3); RAM [index_RAM] = tabel_scan[s_code]; lama(3); kursor++; index_RAM++; else if (s_code == 0x05 || s_code == 0x76) metu = 1; while(!metu); if (s_code == 0x05) //Press F1 for (i=0; i<4; i++) //tanda akir no.tujuan + identitas terminal RAM [index_RAM] = T_id[i]; lama(3); index_RAM++; //-- klo nambah checksum disini --// RAM [index_RAM] = total + 0x30; lama(3); index_RAM++; RAM [index_RAM] = 0xAE; lama(3); index_RAM++; //stop bit paket data («) LCD_C = 0x01; lama(3); LCD_C = 0xC1; lama(3); for (i = 0; i < 13; i++) LCD_D = psn[i]; lama(3); // tunggu ijin kirim data aceka = '0'; do printf("1"); lama(3); Receive_char(); while(aceka != ')'); lama(3); //-- mulai kirim paket data --// for (i=0; i<index_RAM; i++) printf("%c", RAM [i]); lama(3); //Send_char(RAM [i]); lama(1); // tunggu status SMS aceka = '0'; do Receive_char(); while(aceka != 'D' && aceka != 'P'); LCD_C = 0x01; lama(3); LCD_C = 0xC1; lama(3); if (aceka == 'D') for (i = 0; i < 12; i++) LCD_D = sukses[i]; lama(3);
133
else if (aceka == 'P') for (i = 0; i < 12; i++) LCD_D = tunda[i]; lama(3); lama(5000); reset_lyr(); else if (s_code == 0x76) //Press ESC clrscr(); index_RAM = 0; baris = 0; for (i=0; i<char_akir; i++) LCD_D = RAM [i]; lama(3); index_LCD++; kursor++; index_RAM++; if (index_RAM%16 == 0) baris++; ganti_brs(); if (kursor == 0xA0) //jk brs 3 penuh,mk pindah brs 4 lama(1000); clrscr(); ///////////////////////////////////////////////////////////////////////////////// else if (s_code == 0x58) //Press capslock tem_kur = kursor; if (!caps) caps = 1; LCD_C = 0xD7; lama(3); LCD_D = 'c'; lama(3); LCD_D = 'a'; lama(3); LCD_D = 'p'; lama(3); LCD_D = 's'; lama(3); else caps = 0; LCD_C = 0xD7; lama(3); LCD_D = ' '; lama(3); LCD_D = ' '; lama(3); LCD_D = ' '; lama(3); LCD_D = ' '; lama(3); LCD_C = kursor; lama(3); ///////////////////////////////////////////////////////////////////////////////// else if (s_code2 == 0xA2) //Press Right arrow if (index_RAM < char_akir) //jk uda sampe akir karakter ga boleh ke kanan lg kursor++; index_RAM++; index_LCD++; if (index_RAM%16 == 0) baris++; ganti_brs(); ganti_lyr(); LCD_C = kursor; lama(3); panah = 1; lama(3); ///////////////////////////////////////////////////////////////////////////////// else if (s_code2 == 0x5A) //Press Left arrow if (baris != 0 || kursor != 0x80) //jk nyampe brs 1 kolom 1 ga boleh ke kiri lg if (kursor == 0x80) //jk nyampe baris 1 pd LCD, hrs ganti clrscr(); baris --; index_RAM = baris * 16; data_RAM();
134
LCD_C = kursor; lama(3); else kursor --; index_RAM --; index_LCD --; if (index_RAM%16 == 15) baris--; if (kursor == 0x8F) //awal baris 3 - 1 hrs ke akhir baris 2 kursor = 0xCF; if (kursor == 0xBF) //awal baris 2 - 1 hrs ke akhir baris 1 kursor = 0x8F; LCD_C = kursor; lama(3); panah = 1; lama(3); ///////////////////////////////////////////////////////////////////////////////// else if (s_code2 == 0xAA && s_code != 0x15) //Press Up arrow tem_brs = kursor & 0x80; if (baris != 0 && tem_brs == 0x80) //panah atas dipake kalo kursor di baris 1 pd LCD clrscr(); baris --; index_RAM = baris * 16; data_RAM(); LCD_C = kursor; lama(3); panah = 1; lama(3); ///////////////////////////////////////////////////////////////////////////////// else if (s_code2 == 0x92 && s_code != 0x32) //Press Down arrow got = ((baris + 2) * 16) - 1; /*tem_brs = kursor & 0xC0; if (tem_brs == 0xC0) //jika brs 2 ke brs 3 if (char_akir >= got) index_RAM = got; baris++; index_LCD = 47; kursor = 0x9F; LCD_C = kursor; lama(5); tem_brs = kursor & 0x80; if (tem_brs == 0x80) //jika brs 1 ke brs 2 if (char_akir >= got) index_RAM = got; baris++; index_LCD = 31; kursor = 0xCF; LCD_C = kursor; lama(5); */ tem_brs = kursor & 0x90; if (tem_brs == 0x90) ////panah atas dipake kalo kursor di baris 3 pd LCD if (char_akir >= got) baris++; index_RAM = baris * 16; clrscr(); data_RAM(); panah = 1; lama(3); /////////////////////////////////////////////////////////////////////////////////
135
else if (s_code == 0x66) //Press BACKSPACE if (baris != 0 || kursor != 0x80) if (kursor == 0x80) clrscr(); baris --; index_RAM = baris * 16; char_akir--; data_RAM(); LCD_C = kursor; lama(1); LCD_D = 0xA0; lama(1); LCD_C = kursor; lama(1); for (i=index_RAM; i<char_akir; i++) RAM[i] = RAM[i+1]; lama(3); else kursor--; index_RAM--; index_LCD--; char_akir--; if (index_RAM%16 == 15) baris--; if (kursor == 0x8F) //awal baris 3 - 1 hrs ke akhir baris 2 kursor = 0xCF; if (kursor == 0xBF) //awal baris 2 - 1 hrs ke akhir baris 1 kursor = 0x8F; LCD_C = kursor; lama(1); LCD_D = 0xA0; lama(1); LCD_C = kursor; lama(1); for (i=index_RAM; i<char_akir; i++) RAM[i] = RAM[i+1]; lama(3); tem_kur = kursor; tem_ind = index_LCD; tem_brs = baris; tem_RAM = index_RAM; data_RAM(); kursor = tem_kur; index_LCD = tem_ind; baris = tem_brs; index_RAM = tem_RAM; ganti_lyr(); LCD_C = kursor; lama(3); lama(3); ///////////////////////////////////////////////////////////////////////////////// /*else if (s_code == 0x5A) //Press ENTER clrscr(); index_RAM = 0; baris = 0; for (i=0; i<char_akir; i++) LCD_D = RAM [i]; lama(5); //printf("%c", RAM [i]); lama(1); //Send_char(RAM [i]); lama(1); index_LCD++; kursor++; index_RAM++; if (index_RAM%16 == 0) baris++; ganti_brs(); if (kursor == 0xA0) //jk brs 3 penuh,mk pindah brs 4 lama(1000); clrscr(); */ ///////////////////////////////////////////////////////////////////////////////// else if ((shift == 1 || caps == 1) && char_akir < 609) //Press SHIFT + character, maks isi sms = 608 karakter tulis_char(tabel_scan2 [s_code]);
136
else if ((shift == 0)&& char_akir < 609) //Press character, maks isi sms = 608 karakter if (!panah) //agar panah dilepas ga ngeluarin huruf tulis_char(tabel_scan [s_code]); else panah = 0; lama (7); void Receive_char() //interrupt 4 using 1 //interrupt serial dijalankan pake BANK 1 if (RI) aceka = SBUF; if (save) RAM [index_RAM] = aceka; index_RAM++; char_akir++; RI = 0; void tulis_char(unsigned char kode) if (index_RAM == char_akir) //penulisan karakter pd index paling akhir LCD_D = kode; lama(3); RAM [index_RAM] = kode; lama(3); index_RAM++; index_LCD++; kursor++; char_akir++; if (index_RAM%16 == 0) baris ++; ganti_brs(); ganti_lyr(); else if (index_RAM < char_akir) //penulisan karakter selain pd index paling akhir (tengah2 kalimat) for (i=char_akir; i>index_RAM; i--) RAM[i] = RAM[i-1]; lama(3); LCD_D = kode; lama(3); RAM [index_RAM] = kode; lama(3); index_RAM++; index_LCD++; kursor++; char_akir++; if (index_RAM%16 == 0) baris ++; ganti_brs(); tem_kur = kursor; tem_ind = index_LCD; tem_brs = baris; tem_RAM = index_RAM; data_RAM(); kursor = tem_kur; index_LCD = tem_ind; baris = tem_brs; index_RAM = tem_RAM; ganti_lyr(); LCD_C = kursor; lama(3); lama(5); void data_RAM() for (i=index_RAM; i<char_akir && index_LCD<48; i++) LCD_D = RAM [i]; lama(3); kursor++; index_LCD++; index_RAM++; if (index_LCD < 48) if (index_RAM%16 == 0) baris++; ganti_brs();
137
if (index_LCD == 48) index_LCD = 47; kursor = 0x9F; LCD_C = kursor; lama(3); index_RAM--; void ganti_brs() if (kursor == 0x90) //jk brs 1 penuh,mk pindah brs 2 LCD_C = 0xC0; lama(3); kursor = 0xC0; else if (kursor == 0xD0) //jk brs 2 penuh,mk pindah brs 3 LCD_C = 0x90; lama (3); kursor = 0x90; void ganti_lyr() if (kursor == 0xA0) //jk brs 3 penuh,mk pindah brs 4 clrscr(); baris = baris - 2; index_RAM = baris * 16; data_RAM(); void clrscr() LCD_C = 0x01; lama(3); LCD_C = 0xD0; lama(3); LCD_D = 'F'; lama(3); LCD_D = '1'; lama(3); LCD_D = '='; lama(3); LCD_D = 'S'; lama(3); LCD_D = 'e'; lama(3); LCD_D = 'n'; lama(3); LCD_D = 'd'; lama(3); LCD_C = 0x80; lama(3); kursor = 0x80; index_LCD = 0; void reset_lyr() clrscr(); index_RAM = 0; s_code = 0; s_code2 = 0; char_akir = 0; baris = 0; panah = 0; caps = 0; total = 1; RI = 0; void Tekan_tombol() B = 0x00; //definisi u/ tpt scancode while (Kclk); while (!Kclk); start = Kdata; // ambil start bit if (!start) // jika start bit = 0, brarti data scancode bs diambil for (i=0; i<8; i++) //ambil 8 bit pertama while (Kclk); while (!Kclk); B = B >> 1; B7 = Kdata; s_code = B; B = 0; for (i=0; i<8; i++) //ambil 8 bit kedua while (Kclk); while (!Kclk); B = B >> 1; B7 = Kdata; s_code2 = B; lama(5); void tampil_jum()
138
dig1 = char_akir / 100; sisa = char_akir % 100; dig2 = sisa / 10; dig3 = sisa % 10; //jum pengiriman tiap total karakter = 160, 304, 456, 608 if (char_akir <= 160) total = 1; else if (char_akir > 160 && char_akir <= 304) total = 2; else if (char_akir > 304 && char_akir <= 456) total = 3; else if (char_akir > 456 && char_akir <= 608) total = 4; tem_kur = kursor; LCD_C = 0xDB; lama(3); LCD_D = dig1 + 0x30; lama(5); LCD_D = dig2 + 0x30; lama(3); LCD_D = dig3 + 0x30; lama(3); LCD_D = '/'; lama(3); LCD_D = total + 0x30; lama(3); kursor = tem_kur; LCD_C = kursor; lama(3); void ketik_nomor() LCD_C = 0x01; lama(5); LCD_C = 0x81; lama(5); for (i = 0; i < 14; i++) LCD_D = str_notjan[i]; lama(3); LCD_C = 0xD0; lama(5); for (i = 0; i < 16; i++) LCD_D = str_notjan2[i]; lama(3); kursor = 0xC1; LCD_C = kursor; lama(3); void lama (int suwi) //waktu tunda 1 ms unsigned int w; for (w=1; w<=suwi; w++) TH0 = 0xFC; TL0 = 0x18; TR0 = 1; while (!TF0); TR0 = 0; TF0 = 0; void LCD_init() LCD_C = 0x01; lama (3); //Clear LCD_C = 0x38; lama (3); //Function Set LCD_C = 0x0F; lama (3); //Display On/Off LCD_C = 0x06; lama (15); //Entry Mode //LCD_C = 0x18; lama (5); //Cursor/display shift /* Baris 1 = 0x80, baris 2 = 0xC0, baris 3 = 0x90, baris 4 = 0xD0 */ void Serial_init() SCON = 0x50; //serial mode 1, REN = 1(Rx enable) PCON = 0x80; //baudrate 19200 pake mode 1, klo yg 9600 pake mode 0 TH1 = 0xFD; //baudrate 9600 bps ato 19200 bps TR1 = 1; TI = 1; //TI = 1; hrs ditulis kalo kita pake printf(); lama(10); void Interrupt_init()
139
IE = 0x90; //interrupt enable (EA) = 1, interrupt serial (ES) = 1; IP = 0x10; //interrupt serial priority (PS) = 1; /*void Send_char(unsigned char w) //fungsi ini alternatif dr printf(); TI = 0; SBUF = w; while(!TI); */
140
Lampiran 4 : Listing Program Terminal Selector #include <reg52.h> #include <stdio.h> at 0x00000 xdata unsigned char RAM_luar[650]; //uda cukup buat 627 karakter sbit aa = P1^0; sbit bb = P1^1; sbit cc = P1^2; sbit En_Demux = P1^3; sbit En_Mux = P1^4; bit save; unsigned int i, index_RAM; unsigned char id_T, bypass; void lama(unsigned int suwi); void Serial_init(); void Interrupt_init(); void Send_char(unsigned char w); void set_kirim(); void set_terima(); void kirim_SMS(); void main() TMOD = 0x21; lama(5); //Timer1 16 bit auto reload, Timer0 16 bit Interrupt_init(); Serial_init(); save = 0; index_RAM = 0; bypass= 0; while(1) //---------------------------------------------------------------------// PC set_terima(); cc = 0; bb = 0; aa = 0; //Pilih PC lama (3); if (bypass == '0') set_kirim(); printf(")"); //tanda balas siap terima data lama(1); set_terima(); save = 1; while(bypass != '«'); //data yg masuk langsung disimpan ke RAM luar (liat void Receive_char()). 0xAE = stop bit dr Terminal save = 0; lama(3); id_T = RAM_luar[0]; if (id_T == '1') cc = 0; bb = 0; aa = 1; //Pilih T1 else if (id_T == '2') cc = 0; bb = 1; aa = 0; //Pilih T2 else if (id_T == '3') cc = 0; bb = 1; aa = 1; //Pilih T3 else break; set_kirim(); printf("4");lama(2); //kirim ijin mo ngirim SMS ke Terminal set_terima(); bypass = 0; while(bypass != ')'); //tunggu sampe Terminal siap
141
lama(5); set_kirim(); for (i=1; i<index_RAM; i++) printf("%c",RAM_luar[i]);//Send_char(RAM[i]); lama(3); index_RAM = 0; bypass = 0; //---------------------------------------------------------------------// T1 set_terima(); cc = 0; bb = 0; aa = 1; //Pilih T1 lama (3); if (bypass == '1') kirim_SMS(); cc = 0; bb = 0; aa = 0; //Pilih PC, u/ nrima status SMS set_terima(); while(bypass != 'D' && bypass != 'P'); cc = 0; bb = 0; aa = 1; //Pilih T1 set_kirim(); printf("%c", bypass); lama(3); //---------------------------------------------------------------------// T2 set_terima(); cc = 0; bb = 1; aa = 0; //Pilih T2 lama (3); if (bypass == '2') kirim_SMS(); cc = 0; bb = 0; aa = 0; //Pilih PC, u/ nrima status SMS set_terima(); while(bypass != 'D' && bypass != 'P'); cc = 0; bb = 1; aa = 0; //Pilih T2 set_kirim(); printf("%c", bypass); lama(3); //---------------------------------------------------------------------// T3 set_terima(); cc = 0; bb = 1; aa = 1; //Pilih T3 lama(3); if (bypass == '3') kirim_SMS(); cc = 0; bb = 0; aa = 0; //Pilih PC, u/ nrima status SMS set_terima(); while(bypass != 'D' && bypass != 'P'); cc = 0; bb = 1; aa = 1; //Pilih T3 set_kirim(); printf("%c", bypass); lama(3); //---------------------------------------------------------------------// void set_terima() En_Mux = 1; En_Demux = 0; //terima data (enable-nya active low) void set_kirim() En_Mux = 0; En_Demux = 1; //kirim data (enable-nya active low)
142
void lama (unsigned int suwi) //waktu tunda 1 ms unsigned int w; for (w=1; w<=suwi; w++) TH0 = 0xFC; TL0 = 0x18; TR0 = 1; while (!TF0); TR0 = 0; TF0 = 0; void Serial_init() SCON = 0x50; //serial mode 1, REN = 1(Rx enable) PCON = 0x80; //baudrate 19200 pake mode 1, klo yg 9600 pake mode 0 TH1 = 0xFD; //baudrate 9600 bps ato 19200 bps TR1 = 1; TI = 1; //TI = 1; hrs ditulis kalo kita pake printf(); lama(10); void Interrupt_init() IE = 0x90; //interrupt enable (EA) = 1, interrupt serial (ES) = 1; IP = 0x10; //interrupt serial priority (PS) = 1; void Send_char(unsigned char w) //fungsi ini jika dipake, sbg pengganti printf(); TI = 0; SBUF = w; while(!TI); void kirim_SMS() set_kirim(); printf(")"); //tanda balas siap terima data lama(1); set_terima(); save = 1; while(bypass != 0xAE); //data yg masuk langsung disimpan ke RAM luar (liat void Receive_char()). 0xAE = stop bit dr Terminal save = 0; cc = 0; bb = 0; aa = 0; //Pilih PC, u/ pengiriman data set_kirim(); for (i=0; i<index_RAM; i++) printf("%c",RAM_luar[i]);//Send_char(RAM[i]); lama(1); index_RAM = 0; bypass = 0; void Receive_char() interrupt 4 using 1//interrupt serial dijalankan pake BANK 1 if (RI) bypass = SBUF; if (save) RAM_luar[index_RAM] = bypass; index_RAM++; RI = 0;
143
Lampiran 5 : Listing Program Billing Komputer
- Form Utama unit FUtama; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, jpeg, ExtCtrls, ComCtrls, Menus, OleCtrls, MSCommLib_TLB, SerialNG, XPMan; type TFdepan = class(TForm) GroupBox1: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label5: TLabel; report1: TLabel; LNo_tuj1: TLabel; LWaktu1: TLabel; LPj1: TLabel; Label12: TLabel; Label13: TLabel; LNoTrans1: TLabel; Label15: TLabel; LByr1: TLabel; Label17: TLabel; View1: TCheckBox; GroupBox2: TGroupBox; Label18: TLabel; LNoTrans2: TLabel; Label20: TLabel; LNo_tuj2: TLabel; Label26: TLabel; Label28: TLabel; LWaktu2: TLabel; LPj2: TLabel; Label34: TLabel; Label36: TLabel; report2: TLabel; Label40: TLabel; LByr2: TLabel; Label44: TLabel; View2: TCheckBox; GroupBox3: TGroupBox; Label21: TLabel; Label22: TLabel; LNoTrans3: TLabel; LNo_tuj3: TLabel; Label27: TLabel; Label29: TLabel; LWaktu3: TLabel; LPj3: TLabel; Label35: TLabel; Label37: TLabel; report3: TLabel; Label41: TLabel; LByr3: TLabel; Label45: TLabel; View3: TCheckBox; GroupBox4: TGroupBox; Image2: TImage; Label7: TLabel; Label8: TLabel; Label9: TLabel; Image3: TImage; GroupBox5: TGroupBox; Label46: TLabel; Label47: TLabel; Label48: TLabel;
144
LKondisi: TLabel; BBRefresh: TBitBtn; MainMenu1: TMainMenu; Setting1: TMenuItem; Port1: TMenuItem; Serial1: TMSComm; Label50: TLabel; LSmsc: TLabel; LSimcard: TLabel; Label49: TLabel; batteray: TProgressBar; signal: TProgressBar; Serial2: TSerialPortNG; IsiSMS1: TMemo; IsiSMS2: TMemo; IsiSMS3: TMemo; XPManifest1: TXPManifest; delay_cekreport: TTimer; Cek1: TMenuItem; Inbox1: TMenuItem; HslCetak: TRichEdit; GroupBox6: TGroupBox; IsiSMSUC: TMemo; Label4: TLabel; TerTuj: TLabel; BKirim: TBitBtn; CheckBox4: TCheckBox; delay_ijin: TTimer; Bcekpulsa: TButton; GroupBox7: TGroupBox; RECekpulsa: TRichEdit; arif1: TMenuItem; Outbox1: TMenuItem; StatusBar1: TStatusBar; Image5: TImage; kedip: TTimer; Laporan1: TMenuItem; ransaksi1: TMenuItem; CB1: TCheckBox; CB2: TCheckBox; CB3: TCheckBox; function HexToDec(huruf:String):integer; function PDUencoder(kal:String):String; function PDUdecoder(kal:String):String; function no_tuj2PDU (nomer : String) : String; procedure Ngirim(); procedure cek_report(); procedure Cetak_Bon (iden, stadus : String); procedure Port1Click(Sender: TObject); procedure BBRefreshClick(Sender: TObject); procedure arif1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure View1Click(Sender: TObject); procedure View2Click(Sender: TObject); procedure View3Click(Sender: TObject); procedure Serial2RxClusterEvent(Sender: TObject); procedure FormActivate(Sender: TObject); procedure delay_cekreportTimer(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Inbox1Click(Sender: TObject); procedure CheckBox4Click(Sender: TObject); procedure BKirimClick(Sender: TObject); procedure delay_ijinTimer(Sender: TObject); procedure BcekpulsaClick(Sender: TObject); procedure Outbox1Click(Sender: TObject); procedure kedipTimer(Sender: TObject); procedure ransaksi1Click(Sender: TObject); private Private declarations public Public declarations end; var
145
Fdepan: TFdepan; dbyr, pjg_SMS, tarip, byr, noTrans : Integer; p : ShortInt; c_pulsa, waktu, id, no_tuj, tot, samp, smsc : String; SMSUC, PDUqrim, PDU, data_in, teks_sms : WideString; lama : TDateTime; kdip, notsend : boolean; implementation uses DateUtils, FSetPort, formTarif, FormInbox, FormOutbox, FormTrans; $R *.dfm procedure TFdepan.Ngirim(); var m, n, v, q, r : Integer; sdhqrim, w : ShortInt; teksQrim : String; begin //data dari Terminal Selector hanya bs diproses stlh diterima stop bit if Pos(Char($AE), data_in) > 0 then begin StatusBar1.Panels[1].Text := data_in; q := Pos(Char($F0), data_in); teks_sms := copy(data_in, 1, q-1); r := Pos(Char($F1), data_in); no_tuj := copy (data_in, q+1, r-(q+1)); id := copy(data_in, r+1, 2); q := Pos(Char($F2), data_in); tot := copy(data_in, q+1, 1); pjg_SMS := length(teks_sms); if id = 'T1' then begin report1.Caption := 'Pending'; LByr1.Caption := '0'; LNoTrans1.Caption := IntToStr(noTrans); LPj1.Caption := IntToStr(pjg_SMS); IsiSMS1.Lines.Text := teks_sms; LNo_tuj1.Caption := no_tuj; waktu := DateTimeToStr(NOW); LWaktu1.Caption := waktu; Inc(noTrans); data_in := ''; end else if id = 'T2' then begin report2.Caption := 'Pending'; LByr2.Caption := '0'; LNoTrans2.Caption := IntToStr(noTrans); LPj2.Caption := IntToStr(pjg_SMS); IsiSMS2.Lines.Text := teks_sms; LNo_tuj2.Caption := no_tuj; waktu := DateTimeToStr(NOW); LWaktu2.Caption := waktu; Inc(noTrans); data_in := ''; end else if id = 'T3' then begin report3.Caption := 'Pending'; LByr3.Caption := '0'; LNoTrans3.Caption := IntToStr(noTrans); LPj3.Caption := IntToStr(pjg_SMS); IsiSMS3.Lines.Text := teks_sms; LNo_tuj3.Caption := no_tuj; waktu := DateTimeToStr(NOW); LWaktu3.Caption := waktu; Inc(noTrans); data_in := ''; end;
146
if smsc = '62818445009' then //proXL Jempol PDU := '07912618485400F9' else if smsc = '62855000000' then //IM3 PDU := '07912658050000F0' else if smsc = '62816124' then //Mentari PDU := '079126181642' else if smsc = '6281100000' then //Telkomsel PDU := '07912618010000F0'; n := length(PDU); //pjg SMSC PDU := PDU + '31'; //SMS type w/ REPORT STATUS PDU := PDU + '00'; //SMS Reference number PDU := PDU + no_tuj2PDU(no_tuj); PDU := PDU + '00'; //SMS form as SMS PDU := PDU + '00'; //7 bits Encoding Data I/O scheme PDU := PDU + 'FF'; //SMS expired time sdhqrim := 0; notsend := False; for w := 1 to StrToInt(tot) do begin if w = 1 then teksQrim := copy(teks_sms, 1, 160) else if w = 2 then teksQrim := copy(teks_sms, 161, 144) else if w >= 3 then teksQrim := copy(teks_sms, 305+((w-3)*152), 152); PDUqrim := PDU + PDUdecoder(teksQrim); m := length(PDUqrim); //pjg smua PDU v := (m - n) div 2; StatusBar1.Panels[1].Text := PDUqrim; if length(no_tuj) > 4 then begin Serial1.Output := 'AT+CMGS=' + IntToStr(v) + #13; //mulai kirim SMS samp := ''; repeat samp := samp + Serial1.Input; until (Pos('>', samp) > 0) or (Pos('ERROR', samp) > 0); end else begin MessageDlg('NOMOR TUJUAN BERBAHAYA !!', mtInformation, [mbYes], 0); samp := 'ERROR'; end; if (Pos('>', samp) > 0) then begin Serial1.Output := PDUqrim + #$1A; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0) or (Pos('ERROR', samp) > 0); end; if (Pos('OK', samp) > 0) then Inc(sdhqrim) else if (Pos('ERROR', samp) > 0) then begin notsend := TRUE; //kirim status TERTUNDA ke Terminal Selector Serial2.SendString(Chr($50)); Break; end; end; dbyr := sdhqrim * tarip; if id = 'T1' then begin if notsend = TRUE then report1.Caption := 'NOT SENT' else begin LByr1.Caption := IntToStr(dbyr); p := 1; FOutbox.SimpanOutbox(no_tuj, waktu, IntToStr(pjg_SMS), teks_SMS); StatusBar1.Panels[0].Text := 'Tunggu Report..';
147
delay_cekreport.Enabled := True; end; end else if id = 'T2' then begin if notsend = TRUE then report2.Caption := 'NOT SENT' else begin LByr2.Caption := IntToStr(dbyr); p := 1; FOutbox.SimpanOutbox(no_tuj, waktu, IntToStr(pjg_SMS), teks_SMS); StatusBar1.Panels[0].Text := 'Tunggu Report..'; delay_cekreport.Enabled := True; end; end else if id = 'T3' then begin if notsend = TRUE then report3.Caption := 'NOT SENT' else begin LByr3.Caption := IntToStr(dbyr); p := 1; FOutbox.SimpanOutbox(no_tuj, waktu, IntToStr(pjg_SMS), teks_SMS); // simpan SMS StatusBar1.Panels[0].Text := 'Tunggu Report..'; delay_cekreport.Enabled := True; end; end; end; end; procedure TFdepan.cek_report(); var PD : boolean; r : ShortInt; pendel, q, stt, smsin : String; begin Serial1.Output := 'AT+CMGL=0'#13; //cek SMS baru lama := NOW; samp := ''; PD := False; repeat samp := samp + Serial1.Input; until (Pos(samp, 'OK') > 0) or (SecondsBetween(NOW, lama) > 3); if (Pos('+CMGL:', samp) > 0) then begin smsin := copy(samp, Pos('+CMGL:', samp), 70); //ambil PDU baris 2 samp := copy(smsin, Pos(Chr($0A), smsin)+1, 60); //ambil PDU baris 3 q := copy (samp, 2, 1); r := HexToDec(q); stt := copy (samp, (r*2)+3, 2); //ambil kode status stlh kode SMS center if stt = '06' then begin if id = 'T1' then report1.Caption := 'Delivered' else if id = 'T2' then report2.Caption := 'Delivered' else if id = 'T3' then report3.Caption := 'Delivered'; Serial2.SendString(Chr($44)); //kirim status TERKIRIM ke Terminal Selector pendel := 'TERKIRIM'; PD := True; StatusBar1.Panels[0].Text := ''; StatusBar1.Panels[1].Text := ''; end; p := 0; end; if (PD = False) Or (stt <> '06') then begin Serial2.SendString(Chr($50)); //kirim status TERTUNDA ke Terminal Selector pendel := 'TERTUNDA'; StatusBar1.Panels[0].Text := ''; StatusBar1.Panels[1].Text := ''; p := 0;
148
end; delay_cekreport.Enabled := False; //perintah ini jgn ditaruh dibwh sendiri if (id = 'T1') And (CB1.Checked = True)then Cetak_Bon('1', pendel) else if (id = 'T2') and (CB2.Checked = True) then Cetak_Bon('2', pendel) else if (id = 'T3') and (CB3.Checked = True) then Cetak_Bon('3', pendel); end; procedure TFdepan.Cetak_Bon(iden, stadus : String); begin HslCetak.Font.Name := 'Verdana'; HslCetak.Font.Size := 10; HslCetak.Lines.Clear; HslCetak.Lines.Add(' Waröeng SMS'+Chr(13)+Chr(10)); HslCetak.Lines.Add(' Terminal ' + iden); HslCetak.Lines.Add(' Tujuan'+Chr(9)+': ' + no_tuj); HslCetak.Lines.Add(' Waktu'+Chr(9)+': ' + waktu); HslCetak.Lines.Add(' Panjang'+Chr(9)+': ' + IntToStr(pjg_SMS)+' karakter'); HslCetak.Lines.Add(' Biaya'+Chr(9)+': Rp ' + IntToStr(dbyr)); HslCetak.Lines.Add(' Status'+Chr(9)+': '+stadus+Chr(13)+Chr(10)); HslCetak.Lines.Add(' [Bluebit]'); HslCetak.Print('c:\bon.txt'); //PASTIKAN FILE INI ADA DI DRIVE C: end; function TFdepan.HexToDec(huruf:String):integer; begin if huruf = 'A' then result := 10 else if huruf = 'B' then result := 11 else if huruf = 'C' then result := 12 else if huruf = 'D' then result := 13 else if huruf = 'E' then result := 14 else if huruf = 'F' then result := 15 else result := StrToInt(huruf); end; function TFdepan.PDUdecoder(kal:String):String; // created by IIK var ulang, temp, panjang, index, hexa : Integer; huruf_1, huruf_2, mask, masking : Integer; hasil : String; begin panjang := length(kal); hasil := ''; hasil := hasil + IntToHex(panjang, 2); ulang := 1; mask := 255; for index := 1 to panjang do begin if ulang = 1 then huruf_1 := ord(kal[index]) else huruf_1 := huruf_2; if ulang = 8 then ulang := 1 else begin huruf_2 := ord(kal[index+1]); masking := mask shr (8 - ulang); temp := huruf_2 and masking; temp := temp shl (8 - ulang); hexa := huruf_1 or temp; hasil := hasil + IntToHex(hexa, 2); huruf_2 := huruf_2 shr ulang; inc(ulang); end; end; result := hasil; end; function TFdepan.PDUencoder(kal:String):String; // created by IIK @ April, 29 12:34 am var
149
hsl, var_str : String; hsl_int, i, stat, sisa, index, mask, mask1, mask2, pjg_PDU, pjg_kal : Integer; int_akhir, putar, temp : Integer; begin mask := 255; hsl := ''; pjg_PDU := length(kal); //cek 2 bit ato 3 bit awal hexa pd PDU if pjg_PDU <= 452 then begin pjg_kal := 0; var_str := copy (kal, 1, 1); // ambil bit1 dr PDU pjg_kal := pjg_kal + (16 * HexToDec(var_str)); var_str := copy (kal, 2, 1); // ambil bit2 dr PDU pjg_kal := pjg_kal + HexToDec(var_str); stat := 2; // mencatat index awal kal end else begin pjg_kal := 0; var_str := copy (kal, 1, 1); // ambil bit1 dr PDU pjg_kal := pjg_kal + (256 * HexToDec(var_str)); var_str := copy (kal, 2, 1); // ambil bit2 dr PDU pjg_kal := pjg_kal + (16 * HexToDec(var_str)); var_str := copy (kal, 3, 1); // ambil bit3 dr PDU pjg_kal := pjg_kal + HexToDec(var_str); stat := 3; // mencatat index awal kal end; index := 1; putar := 1; temp := 0; for i := 1 to pjg_kal do begin if putar = 8 then begin putar := 1; temp := 0; sisa := 0; end else begin hsl_int := 0; var_str := copy (kal, stat + index, 1); hsl_int := hsl_int + (16 * HexToDec(var_str)); var_str := copy (kal, stat + index + 1, 1); hsl_int := hsl_int + HexToDec(var_str); mask1 := mask shl (8 - putar); sisa := hsl_int and mask1; sisa := sisa shr (8 - putar); mask2 := mask shr putar; int_akhir := hsl_int and mask2; int_akhir := int_akhir shl (putar - 1); int_akhir := int_akhir or temp; temp := sisa; hsl := hsl + chr(int_akhir); if putar = 7 then hsl := hsl + chr(sisa); index := index + 2; putar := putar + 1; end; end; result := hsl; end; function TFdepan.no_tuj2PDU (nomer : String) : String; var kmbali, help : String; q, i, j, k : ShortInt; s : Char; begin
150
q := length(nomer); kmbali := IntToHex(q, 2); help := copy(nomer, 1, 1); if help = '0' then kmbali := kmbali + '81' else kmbali := kmbali + '91'; //bolak-balik no_tujuan if q mod 2 = 1 then nomer := nomer + 'F'; q := length(nomer); j := q div 2; i := 1; for k := 1 to j do begin s := nomer [i]; nomer [i] := nomer [i+1]; nomer [i+1] := s; i := i + 2; end; kmbali := kmbali + nomer; Result := kmbali; end; procedure TFdepan.Port1Click(Sender: TObject); begin SetPort.Show; end; procedure TFdepan.BBRefreshClick(Sender: TObject); var aw, ak : ShortInt; begin if Serial1.PortOpen then Serial1.PortOpen := False; //Serial1.CommPort := SetPort.HPPort.ItemIndex + 1; //Serial1.Settings := SetPort.HPBaud.Text + ',n,8,1'; Serial1.PortOpen := True; //*** Status Koneksi **************************// lama := NOW; Serial1.Output := 'AT'#13; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0) or (Pos('ERROR', samp) > 0) or (SecondsBetween(NOW, lama) > 3); if (Pos('OK', samp) > 0) then begin BBRefresh.Visible := True; kedip.Enabled := False; StatusBar1.Panels[1].Text := ''; StatusBar1.Panels[0].Text := ''; LKondisi.Caption := 'OK'; //*** Nomor SMSC ***************************// Serial1.Output := 'AT+CSCA?'#13; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0)or (Pos('ERROR', samp) > 0); if (Pos('OK', samp) > 0) then begin aw := Pos('"+', samp) + 2; ak := Pos('",', samp); samp := copy(samp, aw , ak - aw); LSmsc.Caption := samp; smsc := samp; end; //*** Nama provider ***********************// Serial1.Output := 'AT+COPS?'#13; samp := '';
151
repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0)or (Pos('ERROR', samp) > 0); if (Pos('OK', samp) > 0) then begin aw := Pos(',"', samp) + 2; ak := Pos('"'+Char($0D), samp); samp := copy(samp, aw , ak - aw); LSimcard.Caption := samp; end; //*** Kapasitas battery ********************// Serial1.Output := 'AT+CBC'#13; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0)or (Pos('ERROR', samp) > 0); if (Pos('OK', samp) > 0) then begin aw := Pos('0,', samp) + 2; samp := copy(samp, aw, (Pos('OK', samp) - aw) - 4); batteray.Position := StrToInt(samp); end; //*** Kualitas Sinyal *********************// Serial1.Output := 'AT+CSQ'#13; samp := ''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0)or (Pos('ERROR', samp) > 0); if (Pos('OK', samp) > 0) then begin aw := Pos(': ', samp) + 2; samp := copy(samp, aw , Pos(',', samp)-aw); signal.Position := StrToInt(samp) + 1; end; //******************************************// if LSimcard.Caption = 'IND TELKOMSEL' then //Telkomsel begin LSmsc.Caption := '6281100000'; smsc := '6281100000'; c_pulsa := 'ATD["*888#"];' end else if LSimcard.Caption = 'IND SATELINDOCEL' then //IM3 begin LSmsc.Caption := '62855000000'; smsc := '62855000000'; c_pulsa := 'ATD["*388#"];' end else if LSimcard.Caption = 'proXL' then //pro XL Jempol begin LSmsc.Caption := '62818445009'; smsc := '62818445009'; c_pulsa := 'ATD["*123#"];' end; else if LSimcard.Caption = 'IND SATELINDOCEL' then //Mentari begin LSmsc.Caption := '62816124'; smsc := '62816124'; c_pulsa := 'ATD[*555#];' end; Serial2.Active := True; end else if (Pos('ERROR', samp) > 0) then begin LKondisi.Caption := 'ERROR'; end; end;
152
procedure TFdepan.arif1Click(Sender: TObject); begin Tarif.Show; end; procedure TFdepan.FormCreate(Sender: TObject); begin noTrans := 1; data_in := ''; kdip := TRUE; kedip.Enabled := True; StatusBar1.Panels[1].Text := '== tekan REFRESH sekarang !! =='; end; procedure TFdepan.View1Click(Sender: TObject); begin if View1.Checked then IsiSMS1.Visible := True else IsiSMS1.Visible := False; end; procedure TFdepan.View2Click(Sender: TObject); begin if View2.Checked then IsiSMS2.Visible := True else IsiSMS2.Visible := False; end; procedure TFdepan.View3Click(Sender: TObject); begin if View3.Checked then IsiSMS3.Visible := True else IsiSMS3.Visible := False; end; procedure TFdepan.Serial2RxClusterEvent(Sender: TObject); begin data_in := data_in + Serial2.ReadNextClusterAsString; if Pos(data_in, ')') > 0 then begin delay_ijin.Enabled := False; BKirim.Enabled := True; data_in := ''; SMSUC := ''; end else Ngirim(); end; procedure TFdepan.FormActivate(Sender: TObject); begin tarip := StrToInt(Tarif.ETarif.Text); end; procedure TFdepan.delay_cekreportTimer(Sender: TObject); begin if p = 2 then //waktu tunggu cek report begin cek_report(); end; Inc(p); end; procedure TFdepan.FormClose(Sender: TObject; var Action: TCloseAction); begin if Serial1.PortOpen then Serial1.PortOpen := False; if Serial2.Active then Serial2.Active := False; end; procedure TFdepan.Inbox1Click(Sender: TObject); begin FInbox.Show; end; procedure TFdepan.CheckBox4Click(Sender: TObject); begin if CheckBox4.Checked then IsiSMSUC.Visible := True
153
else IsiSMSUC.Visible := False; end; procedure TFdepan.BKirimClick(Sender: TObject); begin SMSUC := TerTuj.Caption + IsiSMSUC.Text + '«'; Serial2.SendString(SMSUC); BKirim.Enabled := False; end; procedure TFdepan.delay_ijinTimer(Sender: TObject); begin Serial2.SendString('0'); end; procedure TFdepan.BcekpulsaClick(Sender: TObject); var pulsa : String; begin lama := NOW; Serial1.Output := c_pulsa + #13; //tekan CALL/YES/OK samp:=''; repeat samp := samp + Serial1.Input; until (Pos('OK', samp) > 0) or (Pos('ERROR', samp) > 0) or (SecondsBetween(NOW, lama) > 5); if (Pos('OK', samp) > 0) then begin pulsa := copy(samp, 16, Pos('OK',samp)-2); RECekpulsa.Text := pulsa; end else if (Pos('ERROR', samp) > 0) then MessageDlg('Network Failed !!', mtInformation, [mbYes], 0); Serial1.Output := 'AT+CHUP'#13; //tekan tutup telpon end; procedure TFdepan.Outbox1Click(Sender: TObject); begin FOutbox.Show; end; procedure TFdepan.kedipTimer(Sender: TObject); begin if (kdip = False) then begin BBRefresh.Visible := True; kdip := True; end else if (kdip = True) then begin BBRefresh.Visible := False; kdip := False; end; end; procedure TFdepan.ransaksi1Click(Sender: TObject); begin FTrans.Show; end; end.
- Form Inbox
unit FormInbox; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, StdCtrls, ComCtrls, DBCtrls, Mask, ExtCtrls, DB, DBTables;
154
type TFInbox = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; dsInbox: TDataSource; DBNavigator1: TDBNavigator; DBEdit1: TDBEdit; DBEdit2: TDBEdit; DBEdit3: TDBEdit; DBRichEdit1: TDBRichEdit; DBGrid1: TDBGrid; tbInbox: TTable; Bceknewsms: TButton; Button2: TButton; Label5: TLabel; ComboBox1: TComboBox; Bkirimterminal: TButton; procedure UbahPDU2Text(var datasms, pengirim, tanggal, jam, isi: string); procedure Button2Click(Sender: TObject); procedure BceknewsmsClick(Sender: TObject); procedure BkirimterminalClick(Sender: TObject); private Private declarations public Public declarations end; var FInbox: TFInbox; implementation uses FUtama, DateUtils; $R *.dfm procedure TFInbox.UbahPDU2Text(var datasms, pengirim, tanggal, jam, isi: string); var pdu, smsc, tipe, bentuk, skema,batas: string; p,i: integer; begin pdu := datasms; smsc := ''; p := StrToInt('$' + copy(pdu, 1, 2)) - 1; pdu := copy(pdu,5,length(pdu)-4); for i := 1 to p do begin smsc := smsc + pdu[i*2]; smsc := smsc + pdu[i*2-1]; end; if smsc[length(smsc)] = 'F' then smsc := copy(smsc, 1, length(smsc) - 1); pdu := copy(pdu, p*2+1,length(pdu)-p*2); tipe := copy(pdu, 1, 2); if tipe = '06' then begin pengirim := 'SMS Center'; tanggal := '-'; jam := '-'; isi := 'SMS Report'; end else begin pdu := copy(pdu, 3, length(pdu)-2); pengirim := ''; p := StrToInt('$'+copy(pdu,1,2)); if p mod 2 = 1 then inc(p); pdu := copy(pdu,5,length(pdu)-4); for i := 1 to p div 2 do begin pengirim := pengirim + pdu[i*2]; pengirim := pengirim + pdu[i*2-1]; end;
155
if pengirim[length(pengirim)] = 'F' then pengirim := copy(pengirim, 1, length(pengirim) - 1); pdu := copy(pdu,p+1,length(pdu)-p); bentuk := copy(pdu,1,2); pdu := copy(pdu, 3, length(pdu)-2); skema := copy(pdu,1,2); pdu := copy(pdu, 3, length(pdu)-2); tanggal := pdu[6]+pdu[5] + '/' + pdu[4]+pdu[3] + '/' + pdu[2]+pdu[1]; jam := pdu[8]+pdu[7] + ':' + pdu[10]+pdu[9] + ':' + pdu[12]+pdu[11]; pdu := copy(pdu, 13, length(pdu)-12); batas := copy(pdu,1,2); pdu := copy(pdu, 3, length(pdu)-2); isi := Fdepan.PDUencoder(pdu); end; end; procedure TFInbox.Button2Click(Sender: TObject); begin Close; end; procedure TFInbox.BceknewsmsClick(Sender: TObject); var s, isi, tanggal, jam, pengirim : String; index_sms, samp : string; save_all : textfile; lama : TDateTime; begin Fdepan.Serial1.Output := 'AT+CMGL=0'#13; //cek SMS baru lama := NOW; samp := ''; repeat samp := samp + Fdepan.Serial1.Input; until (Pos('OK', samp) > 0) or (Pos('ERROR', samp) > 0) or (SecondsBetween(NOW, lama) > 180); if Pos('+CMGL:', samp) > 0 then //kalo ada SMS, langsung proses begin assignfile(save_all, 'SMS_in.txt'); rewrite(save_all); write(save_all, samp); closefile(save_all); reset(save_all); readln(save_all, samp); while (not EOF(save_all)) do begin readln(save_all, samp); if copy(samp, 1, 7) = '+CMGL: ' then begin index_sms := copy(samp, 8, pos(',', samp) - 8); readln(save_all, samp); UbahPDU2Text(samp, pengirim, tanggal, jam, isi); tbInbox.Append; tbInbox['Pengirim'] := pengirim; tbInbox['Tanggal'] := tanggal; tbInbox['Jam'] := jam; tbInbox['Isi SMS'] := isi; tbInbox.Post; Fdepan.Serial1.Output := 'AT+CMGD=' + index_SMS + #13; //hapus SMS lama := NOW; repeat s := Fdepan.Serial1.Input; until (Pos('OK', s) > 0) or (Pos('ERROR', s) > 0) or (SecondsBetween (NOW, lama) > 180);
156
end; end; closefile(save_all); end else MessageDlg('Ga ada SMS baru !', mtInformation, [mbYes], 0); end; procedure TFInbox.BkirimterminalClick(Sender: TObject); begin Fdepan.IsiSMSUC.Clear; Fdepan.TerTuj.Caption := ''; Fdepan.IsiSMSUC.Lines.Text := DBRichEdit1.Text; Fdepan.TerTuj.Caption := ComboBox1.Text; Fdepan.delay_ijin.Enabled := True; Close; end; end.
- Form Outbox unit FormOutbox; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, DBCtrls, DB, DBTables, Grids, DBGrids, StdCtrls, Mask, ComCtrls; type TFOutbox = class(TForm) dsOutbox: TDataSource; DBGrid1: TDBGrid; tbOutbox: TTable; DBNavigator1: TDBNavigator; Label1: TLabel; Label2: TLabel; DBEdit1: TDBEdit; DBEdit2: TDBEdit; Label3: TLabel; DBEdit3: TDBEdit; Label4: TLabel; Label5: TLabel; DBRichEdit1: TDBRichEdit; Button1: TButton; procedure SimpanOutbox (notuj, waktu, dhowo, isine : String); procedure Button1Click(Sender: TObject); private Private declarations public Public declarations end; var FOutbox: TFOutbox; implementation uses FUtama; $R *.dfm procedure TFOutbox.SimpanOutbox(notuj, waktu, dhowo, isine : String); begin tbOutbox.Append; tbOutbox['No_Tujuan'] := notuj; tbOutbox['Waktu'] := waktu; tbOutbox['Pjg_Isi'] := dhowo; tbOutbox['Isi_SMS'] := isine; tbOutbox.Post; end; procedure TFOutbox.Button1Click(Sender: TObject);
157
begin Close; end; end.
- Form Tarif unit formTarif; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TTarif = class(TForm) Label1: TLabel; ETarif: TEdit; Label2: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); private Private declarations public Public declarations end; var Tarif: TTarif; implementation uses FUtama; $R *.dfm procedure TTarif.Button1Click(Sender: TObject); begin tarip := StrToInt(ETarif.Text); Close; end; end.
- Form Transaksi
unit FormTrans; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFTrans = class(TForm) Label1: TLabel; LJumTrans: TLabel; Label3: TLabel; Label4: TLabel; LPulsaOut: TLabel; Label6: TLabel; LIncome: TLabel; Label8: TLabel; LLaba: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormActivate(Sender: TObject); private Private declarations
158
public Public declarations end; var FTrans: TFTrans; implementation uses FUtama, formTarif; $R *.dfm procedure TFTrans.Button1Click(Sender: TObject); begin Close; end; procedure TFTrans.FormActivate(Sender: TObject); var pulsa, income, laba : Integer; begin pulsa := (noTrans-1) * 350; income := (noTrans-1) * tarip; LJumTrans.Caption := IntToStr(noTrans-1); LPulsaOut.Caption := 'Rp ' + IntToStr(pulsa); LIncome.Caption := 'Rp ' + IntToStr(income); LLaba.Caption := 'Rp ' + IntToStr(income - pulsa); end; end.
159
Lampiran 6 : Petunjuk Penggunaan Alat
1. Hubungkan handphone SIEMENS C45, C35 atau M35 ke komputer pada port
COM1 dengan menggunakan kabel data handphone tersebut.
2. Hubungkan Terminal Selector dengan komputer pada port COM2 dengan
menggunakan kabel serial DB9 yang tersedia.
3. Hubungkan printer dengan komputer melalui port LPT1 atau USB kemudian
nyalakan.
4. Hubungkan Terminal 1 dengan Terminal Selector dengan menggunakan kabel
UTP yang berlabel TS1 dan T1.
Catatan : Sesuaikan label kabel TS1 dengan konektor yang berlabel TS1 pada
Terminal Selector dan label kabel T1 dengan konektor yang berlabel T1 pada
Terminal 1.
5. Lakukan langkah no. 4 pada Terminal 2 dengan menggunakan kabel UTP
berlabel TS2 dan T2.
6. Lakukan langkah no. 4 pada Terminal 3 dengan menggunakan kabel UTP
berlabel TS3 dan T3.
7. Hubungkan ketiga keyboard pada ketiga Terminal melalui konektor PS2.
8. Buat file kosong bernama bon.txt kemudian simpan di drive C:\
9. Jalankan program WarungSMS.exe di komputer. Akan tampil form utama
dengan tombol REFRESH berkedip. Klik tombol tersebut sampai status
koneksi dalam kondisi OK.
10. Hubungkan kabel power Terminal Selector pada sumber listrik AC dan lampu
tombol power akan menyala. Kemudian tekan tombol power tersebut dan
160
pastikan indikator power (LED biru) pada masing-masing Terminal dan
Terminal Selector menyala.
11. Pada tiap Terminal akan siap untuk mengirim dan menerima SMS
Langkah-langkah mengirim SMS ke Terminal
1. Pada Terminal tujuan yang kosong harus dalam keadaan siap menerima SMS,
yaitu dengan menekan tombol F2.
2. Buka form Inbox pada program WarungSMS melalui tab Cek-Inbox.
3. Klik tombol Cek SMS Baru jika ingin menampilkan SMS baru.
4. Jika SMS yang akan dikirim ke Terminal terdapat dalam daftar, maka pilih
SMS tersebut kemudian pilih Terminal tujuan kemudian klik tombol Upload.
5. Tunggu tombol Kirim pada form utama menjadi aktif kemudian klik tombol
tersebut dan SMS akan terkirim ke Terminal tujuan.
161
Lampiran 7
BIODATA PENULIS
Nama : Ihyauddin
Kelahiran : Kediri, 19 Juni 1984
Alamat : Jl. Wonocolo Pabrik Kulit 3/15
Surabaya 60237
No telepon : 031-8494454
0856 303 3808
E-mail : [email protected]
Riwayat pendidikan :
1. SD Muhammadiyah 6 Surabaya, lulus tahun 1996.
2. SMP Negeri 12 Surabaya, lulus tahun 1999.
3. SMA Muhammadiyah 1 Yogyakarta, lulus tahun 2002.
4. Sekolah Tinggi Manajemen Informatika & Teknik Komputer Surabaya
(STIKOM), mengikuti ujian Tugas Akhir pada periode Agustus 2006.