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

Click For Summary

Discussion Overview

The discussion revolves around programming a buzzer to work with a PIC18F452 microcontroller using PROTEUS and MPLAB IDE. Participants explore various aspects of buzzer functionality, including types of buzzers, coding challenges, and circuit considerations.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant shares initial code for controlling a buzzer, setting TRISC pins as output and using a delay function.
  • Another participant questions the type of buzzer being used, noting that some buzzers require an external oscillator while others may work directly with voltage.
  • A participant suggests testing a loop with a 1ms delay to produce sound at approximately 500Hz, mentioning that some buzzers are designed for specific frequencies.
  • One participant reports success with a DC-operated buzzer and provides updated code, indicating a switch interface for controlling the buzzer.
  • A participant raises a concern about the __delay_ms(5000) function not working as expected within a while loop, questioning if the loop structure affects its functionality.
  • Another participant emphasizes the need for a flyback diode if the buzzer includes a magnet coil, highlighting a circuit protection consideration.

Areas of Agreement / Disagreement

Participants express differing views on the types of buzzers and their operational requirements. The discussion remains unresolved regarding the specific issue of the delay function within the while loop.

Contextual Notes

There are limitations regarding the assumptions about buzzer types and their operational characteristics. The discussion does not clarify the specific requirements for the __delay_ms function in the context of the while loop.

Maniac_XOX
Messages
86
Reaction score
5
TL;DR
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
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.
 
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:
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.
 

Similar threads

  • · Replies 8 ·
Replies
8
Views
2K
Replies
2
Views
3K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 7 ·
Replies
7
Views
18K
  • · Replies 1 ·
Replies
1
Views
2K