Breaking News
Tampilkan postingan dengan label MCS-51. Tampilkan semua postingan
Tampilkan postingan dengan label MCS-51. Tampilkan semua postingan

Jumat, Mei 11, 2012

Audiometer otomatis berbasis Mikrokontroler AT89S51




Otomatis Audiometer adalah aplikasi mikrokontroler dalam medis untuk menyelidiki ambang pendengaran dalam Hz 0 sampai 22.000 rentang frekuensi Hz dan dB -20 sampai 100 dB SPL jangkauan. Ini berjalan pada perangkat keras yang sangat sederhana, termasuk headphone, tekan tombol dan tidak memerlukan perangkat milik eksternal atau internal. Hal ini sangat tepat, mudah digunakan dan, karena stabilitas sirkuit digital, perlu dikalibrasi hanya sekali.

Otomatis Audiometer akan meningkatkan frekuensi dan SPL setelah pasien tidak mendengar apa pun dari headphone. Jika pasien mendengar suara dari telepon kepala, kemudian Poli harus menekan tombol untuk menunjukkan bahwa Dia mendengar suara dari headphone, dan mikrokontroler secara otomatis akan meningkatkan frekuensi ini akan terjadi sampai 8k Hz, maka SPL wil desibel peningkatan ..


;=======================================================
;  Automatic AUDIOMETER 
;  by : Triwiyanto
;; Prosedur operasi
;===============================================================
;R0 = to save  transfer data Frequency
;R1 = to save  transfer data Decibel
;R2 = to save data Counter Down in  Convert Data DB dan Frequency subroutine
MUX                equ P0 ; 
DAC_Prnt        equ P2 ;
ttombol              bit P3.2 ; INT0 = interupsi dari tombol pasien
DataFreq         equ 30h; RAM location for Data Frequency
DataDb            equ 31h; Ram location for DataDB
Count200         equ 32h;RAM location for counter 200 
CounterDFreq equ 36h;RAM location for Counter Frequency
CounterDDB    equ 37h;RAM location for counter DB
;40h s/d 4fh data array for frequency
;50h s/d 5fh data array for decibel
;
          org 00h
sjmp   Start
;
          org 03h ; interrupt external 0 address 
ljmp Xternal_Interupsi_0; jump to subroutineinterrupt external 0 address INT0
           reti
;
           org 0bh ;  timer interrupt 0 address
ljmp Timer_Interupsi_0 ; jump to  timer interrupt 0 TF0
;
           org 13h;  no interrupt 
           reti
;
           org 23h;no interrupt
           reti
           ;
Start:     call Init_Interupsi_Xternal_Timer; call timer external interrupt
           Setb TR0                                   ; timer 0 run 
           ;
           mov DataFreq,#0         ;initiate data datafreq=0
           mov CounterDFreq,#40h   ;RAM location for DFreq -> address 40h
           mov CounterDDB,#50h     ;RAM location for DDB-> address 50h
           ;
           Clr A
           mov DPTR,#DataDecibel   ;save address DataDecibel in DPTR
           Movc A,@A+DPTR          ;look up table and take to A
           Mov DataDB,A            ;saving data A to DataDB
           ;
;As you see in this subroutine. program will stack to this subroutine
; and jumps out to the others subroutine if there is an interruption 
Forever:
           mov MUX,DataFreq    ; Choosing address in  Multiplexer 4051
           mov DAC_Prnt,DataDb ; Outputing data to  DAC
           sjmp Forever        ;  Program will hang to this routine
           ;
Xternal_Interupsi_0:
           jnb P3.2,$                                     
           call Simpan_DataDBdanDataFreq
           Mov Count200,#20   ;After interruption Xternal happen, Counter Down Timer will be Reset 
           call Inc_Freq      ;call  subroutine increment Frequency 
           reti
           ;
Inc_DB_Fr_Xternal:
           Clr A
           inc DPTR       ;Increment ROM Address Data Decibel
           movc A,@A+DPTR ;look up table data ROM and save to A
           cjne A,#'S',SendDb;Compare A and 'S' character if not equal will jump to SendDb
           call inc_Freq    ;if A = 'S' then call subroutine inC_Freq
SendDb: 
           mov DataDB,A        ;save data A in DataDB
           ret
           ;
Inc_Freq:
           inc DataFreq    ;Increment dataFreq this increment will happen if  DataDb in maximum limit 
           mov A,DataFreq  ;save dataFreq to A
           cjne A,#7,GO_Inc;Compare A and #7,ifnotequalthen jump to Go_inc 
           Clr TR0         ;Shutdown Timer 0
           Clr EA          ;Shutdown all Interrupt
quit:     sjmp quit
;
GO_Inc: 
           clr A                                  ; 
           mov DPTR,#DataDecibel ;look up tabel Datadecibel from ROM
           movc A,@A+DPTR
           mov DataDB,A 
           ret
           ;
Timer_Interupsi_0:                ;This interruption will happen every 0.05s and must be reload
           mov tl0,#0afh          ; by loading data 3CAFh to TL0 and TH0 will create an interruption 
           mov th0,#03ch          ;to TF0 every 0.05 second. 
           djnz Count200,EndIntr  ;Counter down = 200 x 0.05s = 10 detik
           mov Count200,#20 ;If there is no interruption external then DataDB  
                                                                           ;or DataFreq will increment every 10 second
           call Inc_DB_Fr_Xternal ;
EndIntr:
           reti
           ;
Init_interupsi_XTernal_Timer:
           mov R0,#40h
           mov R1,#50h
           mov Count200,#200   ; initiate for interruption every 10 second
           mov tl0,#0afh
           mov th0,#03ch
           mov TMOD,#00000001b ; mode 1 timer 0 16 bit
           setb ET0                          ; Enable timer 0 interrupt
           ;
           Setb IT0   ;Activate negative transition interrupt external 0
           Setb EX0 ;Activate external interrupt 0
           Setb EA   ;Master Enable All Interrupt
           Setb PX0 ;First Interrupt for External Interruption 
           ret
           ;
Simpan_DataDBdanDataFreq:
           mov R0,CounterDFreq
           mov R1,CounterDDB 
           mov @R0,DataFreq      ;saving dataFreq to RAM
           mov @R1,DataDb         ;saving dataDb to RAM
           inc CounterDFreq          ;increment Address RAM for Frequency
           inc CounterDDB            ;increment Address RAM for Frequency
           ret
           ;
DataDecibel:
        DB 10,20,30,40,50,60,70,80,90,100,110,'S'
          end

Read more ...

Jumat, April 27, 2012

Kontrol Kecepatan Motor DC Melalui Komunikasi Serial VB


Kontrol Motor dengan Komunikasi Serial
Sama seperti artikel sebelumnya hanya saja disini sebagai inputnya yaitu melalui komunikasi serial PC. Sebagai tampilannya menggunakan Visual Basic 6. Simulasi disini sudah dicoba secara hardware dan hasilnya berhasil. Untuk menghubungkan mikrokontrole pada proteus dengan PC yaitu pada proteus menggunakan komponen COMPIM
sehingga mikrokontroler pada proteus dapat berkomunikasi Serial Port pada PC. Com pada mikro misalnya kita setting COM4 sedangkan pada PC kita setting COM3. Agar COM 3 dan COM dapat berkomunikasi yaitu menggunakan program “virtual serial Port”. Pada tampilan vb yaitu menggunakan scrollbar, nilai dari scrollbar ini dikirim melalui serial yaitu menggunakan mscomm.
Pada mikrokontroler yaitu menggunakan AVR ATMega16. Menggunakan fasilitas interupt serial receive. Jadi saat ada data masuk melalui serial maka otomatis AVR akan menjalankan program yang ada pada subrutin USART Receiver interrupt. Berikut setting programnya pada codevision AVR :
serial1serial2
serial3 serial4
Programnya :
#include
#include
#include
unsigned char cek,input; char lcd_buffer[33];
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm
#include
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<#define PARITY_ERROR (1<#define DATA_OVERRUN (1<#define DATA_REGISTER_EMPTY (1<#define RX_COMPLETE (1<
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
PORTD.2=0; PORTD.3=1; OCR0=data; //Data serial untuk mengatur  //kecepatan motor
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,”Data Receive:%d”,data);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,1);
if(OCR0==0){lcd_putsf(“Motor Mati  “);}
else if(OCR0>0 && OCR0<150){lcd_putsf(“Motor pelan”);}
else{lcd_putsf(“Motor Cepat”);}
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm(“cli”)
–rx_counter;
#asm(“sei”)
return data;
}
#pragma used-
#endif
// Standard Input/Output functions
#include
// Declare your global variables here
void main(void)
{ unsigned char data_rx[25],input,sip;
unsigned char i,j,k,l; //Declare your local variables here
PORTA=0×00;
DDRA=0×00;
PORTB=0×00;
DDRB=0×08;
PORTC=0×00;
DDRC=0×00;
PORTD=0×00;
DDRD=0xff;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 43.200 kHz
// Mode: Fast PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x6D;
TCNT0=0×00;
OCR0=0×00;
TCCR1A=0×00;
TCCR1B=0×00;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
ASSR=0×00;
TCCR2=0×00;
TCNT2=0×00;
OCR2=0×00;
MCUCR=0×00;
MCUCSR=0×00;
TIMSK=0×00;
UCSRA=0×00;
UCSRB=0×98;
UCSRC=0×86;
UBRRH=0×00;
UBRRL=0×47;
ACSR=0×80;
SFIOR=0×00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm(“sei”)
while (1)
{
};
}
Sedangkan pada tampilan vb nya :
vb musbikhin
Private Sub Form_Load()
Text1 = 0
MSComm1.PortOpen = True
End Sub
Private Sub out_Change()
Dim nilai As Integer
nilai = out.Value
If nilai > 0 And nilai < 125 Then
Text1.BackColor = vbGreen
ElseIf nilai = 125 Then
Text1.BackColor = vbYellow
ElseIf nilai > 175 And nilai < 255 Then
Text1.BackColor = vbRed
End If
Text1 = nilai
MSComm1.Output = “” + Chr$(nilai)
End Sub




Read more ...

Sistem Kendali Jarak Jauh Motor Stepper Melalui RS-232 Berbasis Mikrokontroler MCS-51


P1010056
Sebuah system kendali jarak jauh melalui RS-232 untuk motor stepper dengan spesifikasi hardware:
  • Sistem minimum AT89S51 dengan clock 11.0592 MHz dilengkapi dengan downloader ISP dan komunikasi serial RS-232 ke PC.

  • Motor stepper tipe unipolar 4 fase (kutub) 1.8 derajat/step dengan driver transistor/uln 2803 dan tegangan supplai 12 V.
  • Sistem terhubung via RS-232 ke PC dengan pengaturan via hyperterminal pada baudrate 19200bps.
Cara kerja system :
Bila salah satu tombol [0] s.d [9] pada keyboard PC ditekan maka motor akan berputar searah jarum jam. Semakin besar nilai tombol maka motor stepper tersebut berputar lebih cepat dan bila ditekan tombol ‘0’ maka motor berhenti.
Kecepatan putar stepper = nilai tombol * RPM (putaran/menit).
Solusi :
1. Perhitungan Baudrate
Listing program untuk inisialisasi baudrate :
Mensetting register TMOD dengan nilai 20H, menggunakan timer 8 bit mode 2, auto reload jadi saat overflow nilai TH-1 sama dengan nilai saat disetting. Pada saat auto reload ini, TH yang diisikan dengan nilai awalan cacahan akan menyalin isinya pada TL. Yang selanjutnya TL akan selalu mencacah mulai dari nilai seperti isi TH. Sementara itu isi TH sendiri tidak berubah. Listing program : MOV TMOD,#20h ;Timer-1, Mode-2, auto-reload
Register SCON adalah register 8-bit yang digunakan untuk memprogram bit start dan bit stop pada pembingkaian data, dan hal lainnya. Register SCON diisi dengan nilai 52h, yang berarti serial mode-1, 8-bit data yang dibingkai dengan start dan stop bit. Listing program : MOV SCON,#52h.
Dengan tidak mengubah frekuensi kristal osilator, kita dapat mendua-kalikan baud rate dengan membuat SMOD menjadi = 1 . Saat bit SMOD pada register PCON ini = 1, peralatan serial beralih menggunakan frekuensi yang 1/16 dari siklus mesin ( sebelumnya
1/32 ). Sehingga perhitungannya menjadi MC (Siklus Mesin) = 11.0592 MHz / 12 = 921600 Hz. Baud dasar = 921.6 kHz / 16 = 57,600 Hz (SMOD =1) sehingga untuk menghasilkan frekuensi yang diinginkan yaitu 19200 maka 57600/3= 19200. Nilai 3 diisikan pada register TH1= -3.
Listing program :
MOV A,PCON ;A = PCON
SETB ACC.7 ;Buat D7 = 1 (Double rate)
MOV PCON,A ;
MOV TH1,#-3 ;dengan SMOD=1 === 57600/3 = 19200
2. Perhitungan Kecepatan motor
Pada motor stepper dengan spesifikasi 1,8 derajat/step. Sehingga untuk mencapai satu putaran penuh membutuhkan : 1 putaran = 360 derajat maka banyak step dalam 1 putaran 360/1.8 = 200 step. Crystal yang dipakai yaitu 11059200 Hz. Timer yang akan digunakan yaitu Timer 0 mode 1 sehingga TH0 dan TL0 dapat diisi masing-masing 8 bit.
Kecepatan putar stepper = nilai Tombol * 10 RPM (putaran/menit). Maka untuk mendapatkan nilai yang diisi pada register TH0 adalah dengan perhitungan :
11059200/12 = 921600 Hz sehingga 1 langkah/klik timer 1/921600= 1,085 us. Untuk 10 RPM maka jumlah step 200 step * 10 = 2000 step . Maka tiap step membutuhkan waktu :
60/2000 = 0.03. Untuk mendapatkan nilai TL0 dan TH0 dengan 10 RPM : 0.03 s/1,085 us = 0.03/0.000001085 = 27649 langkah. TL0 dan TH0 bisa diisi dengan 65536-27649=37888. Nilai hexadecimal dari 37887 adalah 93ffh sehingga TL0 =0FFh dan TH0= 93h.


Read more ...

Membuat Gelombang Kotak 5 KHz Pada MCS-51

GelKotak5KHz_thumb.jpg
Membuat gelombang kotak dengan menggunakan fasilitas timer yang ada pada MCS-51, Disini dimisalkan membuat gelombang kotak 5 KHz bisa juga dengan frekuensi yang lain seperti yang kita inginkan. Disini kita menggunakan crystal 11.0592 MHz. Sehingga perhitungannya adalah sebagai berikut :

Perhitungan :
Xtal yang dipakai 11.0592MHz sehingga frekuensi timer 1/12 11059200Hz=921600Hz
Waktu yang dibutuhkan timer untuk sekali mencacah =1/921600Hz=1.085 us
Periode Gelombang  T=1/f=1/5000Hz=0.0002 detik=200uS
½ untuk periode tinggi dan rendah ½ 200us= 100us
Timer yang dipakai : Timer 1 mode 1
Isi register TH1 dan TL1 = 65536-(100us/1.085us)=65536-92=65444 Desimal    => FFA4 h
Isi registerter TH1=FFh dan TL1=A4h

Rangkaian menggunakan simulasi proteus :
GelKotak5KHz settingICmikro
Programnya menggunakan assembly :
MOV TMOD,#10h ;Timer-1 Mode-1 (16-bit)
start: MOV TL1,#0A4h ;TL1=0, low byte
MOV TH1,#0ffh ;TH1=DCh, high byte
SETB TR1 ;jalankan Timer
loop: JNB TF1,loop ;Monitor Timer Flag
CLR TR1 ;Matikan Timer
CPL P0.1 ;Mentoggle out untuk tinggi rendah
CLR TF1 ;Reset TF
SJMP start ;reload Timer karena mode-1
END
Disini program diketik pada software IDE yaitu Menggunakan M-IDE Studio for MCS-51. Jika belum punya dapat dicari pada google atau dapat didownlod
hxxp://www.4shared.com/file/r48rUb9t/mide-51.html
Note: ganti hxxp dengan http
Berikut Hasil setelah dirun :
 HasilOsciloscope
Bila masih kurang jelas dapat dilihat pada video berikut :
Read more ...
Designed By