generate_tone (frekans , süresi)
ses driver
TONES.C (kodları okuyamayanlar için TIKLAYIN)
#ifndef MUSIC_NOTES#define MUSIC_NOTES // NOTE FREQUENCY // Octave0 Octave1 Octave2 Octave3 const long C_NOTE[4] ={ 262, 523, 1047, 2093}; const long Db_NOTE[4] ={ 277, 554, 1109, 2217}; const long D_NOTE[4] ={ 294, 587, 1175, 2349}; const long Eb_NOTE[4] ={ 311, 622, 1245, 2489}; const long E_NOTE[4] ={ 330, 659, 1329, 2637}; const long F_NOTE[4] ={ 349, 698, 1397, 2794}; const long Gb_NOTE[4] ={ 370, 740, 1480, 2960}; const long G_NOTE[4] ={ 392, 784, 1568, 3136}; const long Ab_NOTE[4] ={ 415, 831, 1661, 3322}; const long A_NOTE[4] ={ 440, 880, 1760, 3520}; const long Bb_NOTE[4] ={ 466, 923, 1865, 3729}; const long B_NOTE[4] ={ 494, 988, 1976, 3951}; #endif #define TONE_PIN PIN_B0 void do_delay(int ms_delay, int num_ms, int us_delay, int num_us) { int i; for(i=0;i<num_ms;i++) delay_ms(250); delay_ms(ms_delay); for(i=0;i<num_us;i++) delay_us(250); delay_us(us_delay); } void generate_tone(long frequency, long duration) { int32 total_delay_time; // in microseconds long total_ms_delay_time, total_us_delay_time; int num_us_delays, num_ms_delays, ms_delay_time, us_delay_time; long num_periods; total_delay_time = (1000000/frequency)/2-10; // calculate total delay time (10 for error) total_ms_delay_time = total_delay_time/1000; // total delay time of ms num_ms_delays = total_ms_delay_time/250; // number of 250ms delays needed ms_delay_time = total_ms_delay_time%250; // left over ms delay time needed total_us_delay_time = total_delay_time%1000; // total delay time of us (ms already acounted for) num_us_delays = total_us_delay_time/250; // number of 250us delays needed us_delay_time = total_us_delay_time%250; // left over us delay time needed num_periods = ((int32)duration*1000)/(1000000/frequency); while((num_periods--) != 0) { do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays); output_high(TONE_PIN); do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays); output_low(TONE_PIN); } return; }
Örnek Uygulama (Kodları okuyamayanlar TIKLAYIN)
/****************************************************************** PIC16F877 ile Ses Uygulaması *******************************************************************/ #include <16f877.h> // Kullanılacak denetleyicinin başlık // dosyası tanıtılıyor. #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları #use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor. #include <TONES.c> // TONES.c dosyası programa ekleniyor // Ses tonlarından oluşan dizi tanımlanıyor const char muzik[48]={C_NOTE[0],C_NOTE[1],C_NOTE[2],C_NOTE[3],Db_NOTE[0],Db_NOTE[1],Db_NOTE[2],Db_NOTE[3], D_NOTE[0],D_NOTE[1],D_NOTE[2],D_NOTE[3],Eb_NOTE[0],Eb_NOTE[1],Eb_NOTE[2],Eb_NOTE[3], E_NOTE[0],E_NOTE[1],E_NOTE[2],E_NOTE[3],F_NOTE[0],F_NOTE[1],F_NOTE[2],F_NOTE[3], Gb_NOTE[0],Gb_NOTE[1],Gb_NOTE[2],Gb_NOTE[3],G_NOTE[0],G_NOTE[1],G_NOTE[2],G_NOTE[3], Ab_NOTE[0],Ab_NOTE[1],Ab_NOTE[2],Ab_NOTE[3],A_NOTE[0],A_NOTE[1],A_NOTE[2],A_NOTE[3], Bb_NOTE[0],Bb_NOTE[1],Bb_NOTE[2],Bb_NOTE[3],B_NOTE[0],B_NOTE[1],B_NOTE[2],B_NOTE[3] }; int i; // Tam sayı tipinde değişken tanımlanıyor //******************* ANA PROGRAM FONKSİYONU ******************* void main () { setup_psp(PSP_DISABLED); // PSP birimi devre dışı setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok setup_adc(ADC_OFF); // ADC birimi devre dışı setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı output_low(pin_b0); // RB0 çıkışı ilk anda lojik-0 while(1) // Sonsuz döngü { for(i=0;i<48;i++) { generate_tone(muzik[i],100); delay_ms(50); // Sırayla muzık[] dizisindeki } // tonlar oluşturuluyor }
PROJEYİ İNDİR
0 yorum:
Yorum Gönder