Skip to main content

Generate Sound And Melody Using PIC Microcontroller Tutorial


                                                            Facebook Page


Sound is a function of frequency. This concept has been used to generate sound from the microcontroller. Different types of sounds can be produced by varying the frequency.

This article explains the concept behind generating sound from the PIC microcontroller . This concept can be used to generate sound with any MCU. It can be used to generate specific sounds or alarms. This circuit has wide applications like in cars to produce sound while reversing, in electronic piano to generate different tones, or in electronic toys to generate tones.


Sound Library


The mikroC PRO for PIC provides a Sound Library to supply users with routines necessary for sound signalization in their applications. Sound generation needs additional hardware, such as piezo-speaker (example of piezo-speaker interface is given on the schematic at the bottom of this page).
Library Routines
Sound_Init
Prototype
void Sound_Init(char *snd_port, char snd_pin);
Returns
Nothing.
Description
Configures the appropriate MCU pin for sound generation.
Parameters :
  • snd_port: sound output port address
  • snd_pin: sound output pin
Requires
Nothing.
Example
// Initialize the pin RC3 for playing sound
Sound_Init(&PORTC, 3);
Sound_Play
Prototype
void Sound_Play(unsigned freq_in_hz, unsigned duration_ms);
Returns
Nothing.
Description
Generates the square wave signal on the appropriate pin.
Parameters :
  • freq_in_hz: signal frequency in Hertz (Hz)
  • duration_ms: signal duration in miliseconds (ms)
  Note : Frequency range is limited by Delay_Cyc parameter. Maximum frequency that can be produced by this function is Freq_max = Fosc/(80*3). Minimum frequency is Freq_min = Fosc/(80*255). Generated frequency may differ from the freq_in_hz parameter due to integer arithmetics.
Requires
In order to hear the sound, you need a piezo speaker (or other hardware) on designated port. Also, you must call Sound_Init to prepare hardware for output before using this function.
Example
// Play sound of 1KHz in duration of 100ms
Sound_Play(1000, 100);


Example Program

The example is a simple demonstration of how to use the Sound Library for playing tones on a piezo speaker


/************************************************************************/
 /*************************Embedded Projects******************************/
 /********************* fb.com/EmbeddedProjects **************************/
 /********* http://microcontrollerprojects00.blogspot.in/ ****************/





 void Tone1() {
  Sound_Play(659, 250);   // Frequency = 659Hz, duration = 250ms
}

void Tone2() {
  Sound_Play(698, 250);   // Frequency = 698Hz, duration = 250ms
}

void Tone3() {
  Sound_Play(784, 250);   // Frequency = 784Hz, duration = 250ms
}

void Melody() {           // Plays the melody "Yellow house"
  Tone1(); Tone2(); Tone3(); Tone3();
  Tone1(); Tone2(); Tone3(); Tone3();
  Tone1(); Tone2(); Tone3();
  Tone1(); Tone2(); Tone3(); Tone3();
  Tone1(); Tone2(); Tone3();
  Tone3(); Tone3(); Tone2(); Tone2(); Tone1();
}

void ToneA() {
  Sound_Play( 880, 50);
}
void ToneC() {
  Sound_Play(1046, 50);
}
void ToneE() {
  Sound_Play(1318, 50);
}

void Melody2() {
  unsigned short i;
  for (i = 9; i > 0; i--) {
    ToneA(); ToneC(); ToneE();
  }
}

void main() {



  TRISB  = 0xF8;                     // Configure RB7..RB3 as input

  Sound_Init(&PORTC, 3);
  Sound_Play(880, 1000);             // Play sound at 880Hz for 1 second

  while (1) {
    if (Button(&PORTB,7,1,1))        // RB7 plays Tone1
      Tone1();
    while (RB7_bit) ;                // Wait for button to be released

    if (Button(&PORTB,6,1,1))        // RB6 plays Tone2
      Tone2();
    while (RB6_bit) ;                // Wait for button to be released

    if (Button(&PORTB,5,1,1))        // RB5 plays Tone3
      Tone3();
    while (RB5_bit) ;                // Wait for button to be released

    if (Button(&PORTB,4,1,1))        // RB4 plays Melody2
      Melody2();
    while (RB4_bit) ;                // Wait for button to be released

    if (Button(&PORTB,3,1,1))        // RB3 plays Melody
      Melody();
    while (RB3_bit) ;                // Wait for button to be released
  }
}




Circuit Diagram 



MikroC Sound Library

 

Popular posts from this blog

PIC Microcontroller Based Electronic Lock

Circuit Diagram

Security is a prime concern in our day-today life. Everyone wants to be as much secure as possible. An access control for doors forms a vital link in a security chain. The microcontroller based digital lock for Doors is an access control system that allows only authorized persons to access a restricted area. An electronic lock or digital lock is a device which has an electronic control assembly attached to it. They are provided with an access control system. This system allows the user to unlock the device with a password. The password is entered by making use of a keypad. The user can also set his password to ensure better protection. The major components include a Keypad, LCD and the controller PIC16F877A. This article describes the making of an electronic code lock using the 16F877A microcontroller.
The system is fully controlled by the 8 bit microcontroller 16F877A which has a 8Kbytes of ROM for the program memory. The password is stored in the EPROM so that we …

PIC Serial Communication Tutorial (UART)

First, a quick history of RS232. What is RS232? It's just a name for a standard that has propagated from generation to generation of computers. The first computers had serial ports that used RS232, and even current computers have serial ports (or at least USB ports that act like RS232 ports). Back in the day, serial information needed to be passed from devices like printers, joysticks, scanners, etc to the computer. The simplest way to do this was to pass a series of 1s and 0s to the computer. Both the computer and the device agreed on a speed of information - 'bits per second'. A computer would pass image data to a printer at 9600 bits per second and the printer would listen for this stream of 1s and 0s expecting a new bit every 1/9600 = 104us (104 micro-seconds, 0.000104 seconds). As long as the computer output bits at the pre-determined speed, the printer could listen.
Zoom forward to today. Electronics have changed a bit. Before they were relatively high power, high …