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

  • #1
Maniac_XOX
86
5
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.
1651513689302.png

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;
      
    }
}
 
Engineering news on Phys.org
  • #2
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.
 
  • #3
Borek said:
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:
  • #4
Borek said:
What kind of a buzzer?
This is an electrical engineering forum. If the buzzer BUZ1 now includes a magnet coil, then you will need to add a parallel flyback diode, to protect the BJT Q1 from the flyback voltage spike.
 
Back
Top