// Program z pomocą buzzera odgrywa krótką melodyjkę. // Buzzer
Transkrypt
// Program z pomocą buzzera odgrywa krótką melodyjkę. // Buzzer
// Program z pomocą buzzera odgrywa krótką melodyjkę. // Buzzer na napięcie 3V, włączony między PB0 i PB1 przez opornik ~300 Ω // Stałe liczbowe we funkcji beep() są dobrane dla ATmega8 1MHz #include <avr/io.h> #include <util/delay.h> int K[][2]={ 523,125, 587,125, 659,250, 698,125, 659,125, 587,250, 523,250, 1047,250, 784,250, 523,250, 1047,250, 784,250, 523,250, 1047,250, 784,1000 }; // Tablica dzwięków: częstotliwość(Hz), czas_trwania(ms) // Funkcja generuje sygnał prostokątny na wyprowadzeniach PB0 i PB1, gdzie przyłączony jest buzzer. // Funkcja przyjmuje argumenty: częstotliwość (Hz) sygnału i długość czasu trwania sygnału (ms). void beep(unsigned int czestotliwosc, unsigned int czas) { unsigned int i,t,n; T = 125000/czestotliwosc; // czas jednego impulsu n = (250*czas)/T; // liczba impulsów } PORTB |= 0x01; PORTB &= ~0x02; // PB0 ustaw na 1 // PB1 skasuj, czyli ustaw na 0 for(i=0; i < n; i++) { PORTB ^= 0x01; PORTB ^= 0X02; _delay_loop_2(T); } // XOR PB0, czyli zmień PB0 na przeciwny (0 na 1, lub 1 na 0) // XOR PB1, // poczekaj, 16-bitowy licznik odlicza od 0 do T int main(void) { DDRB = 0x03; PORTB = 0x00; // PB0,PB1 jako wyjścia // na początku oba: PB0 i PB1 w stanie 0 int ile = sizeof(K)/sizeof(K[0]); // liczba nut w tablicy K, obliczana jako // rozmiar całej tablicy / rozmiar jednego wiersza while (1) { } } for(int i=0; i<ile; i++) beep(K[i][0], K[i][1]); // graj kolejne nuty, gdzie: // K[i][0] - częstotliwość, K[i][1] - czas _delay_ms(6000); // przerwa po odegraniu całej melodyjki return 0;