The following sketches show how to make a note close to Middle C and a note close
to High C on a piezo buzzer. The table below shows the relevant parameters:

Note Approximate Frequency Period Half-Period # of Vibrations for a 1s sound
“Middle C” 250 Hz 4 ms 2 ms 250
“High C” 500 Hz 2 ms 1 ms 500

The sketches make a sound of a given frequency by:

  1. Setting the buzzer into a HIGH state for the half-period of the desired sound, then
  2. Setting the buzzer into a LOW state for the half-period of the desired sound.

Version 1, using delay()

The following sketch uses delay() to set the buzzer in its HIGH then LOW states.
The delay() function takes one argument, which is of type long int, meaning
it can take any integer value from -2,147,483,647 to 2,147,483,647. (Negative
values would however make no sense.) The argument to delay() is time in units
of ms, so the smallest half-period it can make is 1 ms.

int BUZZER=7;

void setup (void) {
    pinMode(BUZZER, OUTPUT);    
    digitalWrite(BUZZER, LOW);
}

void loop (void) {
    for (int i=0; i<250; i++) { 
        digitalWrite(BUZZER, HIGH);   // Set the buzzer on a HIGH voltage
        delay(2);                     // Leave it HIGH for only 1 ms.
        digitalWrite(BUZZER, LOW);    // Set the buzzer on a LOW voltage
        delay(2);                     // Leave it LOW for 1 ms.
    }

    delay(1000);                      // Wait a second between tones.
}

Version 2, using delayMicroseconds()

Since delay() cannot use any argument smaller than 1 to make a sound, the
highest frequency sound it can make is 500 Hz, which is actually not quite as
high as a real “High C” note. So, rather than use delay() to make high
frequency sound, use delayMicroseconds(), which can produce much shorter
delays. delayMicroseconds() takes one argument, which is an
unsigned integer value in units of microsec.

delay(1) = delayMicroseconds(1000)

(Recall, an unsigned int can take on values from 0 through 65,535; therefore,
the maximum delay that delayMicroseconds() can cause is 65 ms. Longer delays
require the use of the standard delay() function.)

Using delayMicroseconds(), the previous sketch can be revised this way:

    for (int i=0; i<250; i++) { 
        digitalWrite(BUZZER, HIGH);   
        delayMicroseconds(2000);      
        digitalWrite(BUZZER, LOW);    
        delayMicroseconds(2000);      
    }

(To make a “real” Middle C, the argument to delayMicroseconds() should actually be
1911, not 2000.)