# How to program a buzzer to a PIC18F452 with PROTEUS and MPLAB IDE?

Maniac_XOX
TL;DR Summary
I have connected the Buzzer to the RC0 pin of PORTC but it is not working, I need it to sound with a period of 5 seconds on and 5 off. I can definitely handle the periods with timers or delay functions but I need the circuit to be working first.

crystal frequency is 4MHz
The code i have tried is:

Code:
#include <p18cxxx.h>
#include <xc.h>

void main(void)
{
TRISC = 0;     // making TRISC pins output
ADCON1 = 0x07;   // making them digital pins

while(1)
{
RC0 = 1;
__delay_ms(5000);
RC0 = 0;

}
}

## Answers and Replies

Mentor
What kind of a buzzer? Some will work just after applying voltage, some are just "speakers" that need an external oscillator/generator.

Check if a loop with 1ms delay between on/off states will produce any sound, you should get around 500Hz. Some buzzers are designed with a specific frequency in mind (like 2700 Hz) so it can be quiet, but at least you will know if it works.

Maniac_XOX
What kind of a buzzer? Some will work just after applying voltage, some are just "speakers" that need an external oscillator/generator.

Check if a loop with 1ms delay between on/off states will produce any sound, you should get around 500Hz. Some buzzers are designed with a specific frequency in mind (like 2700 Hz) so it can be quiet, but at least you will know if it works.
Nevermind haha I have managed to make it through with some work, i had to also switch to a DC operated buzzer

Here is the code I have used:

Code:
#define _XTAL_FREQ 4000000
#define switch3 PORTBbits.RB4 // SWITCH INTERFACED
#define buzzer PORTCbits.RC0 // BUZZER INTERFACED

void BuzzerFunc(void);

void main (void)
{
BuzzerFunc();
}

void BuzzerFunc(void)
{
TRISBbits.RB4 = 1;     // RB4 is input
TRISCbits.RC0 = 0;     // RC0 BUZZER IS OUTPUT
buzzer = 0;           // initial value for buzzer

while(1)
{
if (switch3 == 0)
{
buzzer = 1;
}
}
}

A problem I am facing at the moment is why doesn't the __delay_ms(5000) work after the buzzer = 1 line?? For example, if I make the while loop such that I want the buzzer to turn on and off at 5 second periods each:
Code:
 while(1)
{
if (switch3 == 0)
{
buzzer = 1;
__delay_ms(5000)
buzzer = 0;                // to turn it off
__delay_ms(5000)
buzzer = 1;                // to turn it back on
__delay_ms(5000)      // wait another 5 seconds before turning it back on
}
}
Has it got to do with the while loop by any chance?

Last edited: