// 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;

Podobne dokumenty