Program je implementáciou prehrávača Morseovho kódu pre ATmega328P pomocou reproduktora na pine PD6. Písmená a čísla sú reprezentované pomocou Morseovho kódu, ktorý je uložený v tabuľkách morseovkaPISMENA a morseovkaCISLA. Každé písmeno alebo číslo je kódované ako sekvencia bodiek (".") a čiar ("-").
Reproduktor je použitý na prehrávanie zvukových signálov, ktoré odpovedajú Morseovým kódom. Rýchlosť prehrávania je možné meniť pomocou premennej rychlost, ktorá určuje dĺžku pauzy medzi jednotlivými bodkami, čiarkami a písmenami.
Schéma zapojenia
Algoritmus a program
Zdrojový kód:
#define F_CPU 16000000UL // Definícia frekvencie CPU#define BAUDRATE 9600 // Požadovaná rýchlosť pre sériovú komunikáciu#define BAUD_PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1) #include<avr/io.h>#include<util/delay.h>// Definícia makier pre nastavenie a vynulovanie bitu#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))#define repracik PD6 // Definícia pinu pre reproduktorunsignedcharznak;// Tabuľka Morseových kódov pre písmenáconstchar*morseovkaPISMENA[]={".-",// A"-...",// B"-.-.",// C"-..",// D".",// E"..-.",// F"--.",// G"....",// H"..",// I".---",// J"-.-",// K".-..",// L"--",// M"-.",// N"---",// O".--.",// P"--.-",// Q".-.",// R"...",// S"-",// T"..-",// U"...-",// V".--",// W"-..-",// X"-.--",// Y"--..",// Z" ",// Medzera};// Tabuľka Morseových kódov pre číslaconstchar*morseovkaCISLA[]={"-----",// 0".----",// 1"..---",// 2"...--",// 3"....-",// 4".....",// 5"-....",// 6"--...",// 7"---..",// 8"----.",// 9};// Inicializácia reproduktoravoidhrajreprak(void){DDRD|=(1<<repracik);// Nastavenie pinu reproduktora ako výstupnýTCCR0A=(1<<COM0A0)|(1<<WGM01);// Nastavenie PWM výstupuTCCR0B=(1<<CS02);// Nastavenie preddelečníka časovača}// Prehrávanie Morseovho kóduvoidprehrajmorseovku(constchar*morseovkaPISMENA){intrychlost=100;// Rychlost prehravanie (mozne zmenit podla potreby)while(*morseovkaPISMENA!='\0'){if(*morseovkaPISMENA=='.'){// Bodka '.'set_bit(PORTD,repracik);// Zapnutie reproduktoraOCR0A=100;_delay_ms(rychlost);// dlzka bodky clear_bit(PORTD,repracik);// Vypnutie reproduktoraOCR0A=0;_delay_ms(rychlost);// Pauza po bodke}elseif(*morseovkaPISMENA=='-'){// čiarka '-'set_bit(PORTD,repracik);// Zapnutie reproduktoraOCR0A=100;_delay_ms(3*rychlost);// dlzka čiarkyclear_bit(PORTD,repracik);// Vypnutie reproduktoraOCR0A=0;_delay_ms(rychlost);// Pauza po čiarke}elseif(*morseovkaPISMENA==' '){// Pre medzeruOCR0A=0;_delay_ms(7*rychlost);// Pauza pre medzeru}morseovkaPISMENA++;// Posunutie na ďalší znak_delay_ms(3*rychlost);// Pauza po každom znaku}}intmain(void){UBRR0=BAUD_PRESCALE;// Nastavenie hodnoty predelečníka UBRRUCSR0C=(1<<UCSZ01)|(1<<UCSZ00);// Nastavenie počtu bitov pre UARTUCSR0B=(1<<RXEN0)|(1<<TXEN0);// Aktivácia RX a TX pre UARThrajreprak();// Inicializácia reproduktorawhile(1){while(!(UCSR0A&(1<<RXC0))){};// Čakanie na príchod znakuznak=UDR0;// Uloženie prijatého znakuif((znak>='A'&&znak<='Z')||(znak>='a'&&znak<='z')){// Pre písmenáif(znak>='a'&&znak<='z'){// Ak je znak malé písmeno, premeníme ho na veľkéznak-=32;}constchar*morseovkaznak=morseovkaPISMENA[znak-'A'];// Získanie Morseovho kódu pre písmenoprehrajmorseovku(morseovkaznak);// Prehratie Morseovho kódu}elseif(znak>='0'&&znak<='9'){// Pre číslaconstchar*morseovkacislo=morseovkaCISLA[znak-'0'];// Získanie Morseovho kódu pre čísloprehrajmorseovku(morseovkacislo);// Prehratie Morseovho kódu}while(!(UCSR0A&(1<<UDRE0))){};// Čakanie na možnosť odoslať znakUDR0=znak;// Odoslanie prijatého znaku}return0;}