Microcontroller Kits
Programmer and Target 89s51
Simple Mikrokontroller 89s51 Trainer
Standart
Mikrokontroller 89s51 Trainer
Super Mikrokontroller Trainer 89s51
All Item Include
ย
Automatic Audiometer base on Microcontroller AT89S51
Automatic Audiometer is a microcontroller application in medical for investigating hearing thresholds in a 0 Hz to 22,000 Hz frequency range and -20 dB to 100 dB SPL range. It runs on very simple hardware, including headphone, push button and does not require any external or internal proprietary devices. It is very precise, easy to use and, due to the stability of digital circuitry, needs to be calibrated only once.
Automatic Audiometer will increase frequency and SPL after patient do not hear anything from headphone. If patient hear a sound from head phone, then patien must push the button to indicate that He hears a sound from headphone, and microcontroller will automatically increase frequency this will happen till 8k Hz, then SPL wil increase decibel.. ( Download File asm : audio.zip , Download complete circuit : audiometer.pdf
;=======================================================
; 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
Comments, questions and discussion about this topic