标题: 51单片机怎么实现蜂鸣器和数显管同时工作? [打印本页]

作者: lilraymond    时间: 2018-11-6 08:09
标题: 51单片机怎么实现蜂鸣器和数显管同时工作?
如何用51单片机实现数显管和蜂鸣器一起工作

作者: mengzhixinheng    时间: 2018-11-6 09:42
有源蜂鸣器还是无源蜂鸣器,只是简单的发出一种频率吗?一直响,还是间歇响?
作者: 付荣颜    时间: 2018-11-6 10:11
将蜂鸣器使能引脚与数显管的使能引脚一起置位就好了

作者: zzzz1z    时间: 2018-11-6 10:56
数码管与蜂鸣器连接起来
作者: yzwzfyz    时间: 2018-11-6 13:03
好好按排一下,轮流处理两者,时间足够。
作者: devcang    时间: 2018-11-6 13:03

如果是無源的,還有浪費一點的做法,就是另外用一個MCU來發聲。

作者: Jason_Jay    时间: 2018-11-6 13:55
程序都可以实现呀
作者: 老火靓TOM    时间: 2018-11-6 14:39
你在这指的是功率上怎么解决还是指电路怎么实现或者软件怎么写呢?前两者的话用三极管驱动蜂鸣器,用锁存器控制数显再找相关应用电路就很好解决,至于程序的话可以百度一下相关例程,移植组合一下就行了
作者: 只是个无常    时间: 2018-11-6 15:26
引脚接好
作者: ljh961031    时间: 2018-11-6 16:46
数码管与蜂鸣器连接起来,用三极管驱动蜂鸣器,用锁存器控制数显再找相关应用电路就很好解决
作者: ljh961031    时间: 2018-11-6 16:47
蜂鸣器使能引脚与数显管 相连接
加上程序代码可以实现
作者: Yonina    时间: 2018-11-6 17:02
使用定时器来控制蜂鸣器的开启和关闭
作者: Yonina    时间: 2018-11-6 17:03
使用定时器来控制蜂鸣器的开启和关闭
作者: Yonina    时间: 2018-11-6 17:04
# include "reg52.h" # define u16 unsigned int  typedef unsigned char u8; sbit k1 = P3^1;     //  位定义 k1 sbit k2 = P3^0;     //  位定义 k2 sbit k3 = P3^2;        //  位定义 k3 sbit k4 = P3^3;        //  位定义 k4 sbit beep = P1^5;    //  定义P1^5为蜂鸣器 sbit a = P2^2;     //     sbit b = P2^3; sbit c = P2^4; u8 h,m; u8 code n[]={0x79,0x3e,0x3f,0x38}; // 显示L o v  # define smg P0     //  宏定义 数码管 u8 p=0, q=0;    void delay(u16 i)  //  延时函数 { while (i--); } void love()    //  数码管显示LOVE  { u8 i=100;         while (i--)   //  该循环可以跳出 即可执行其下程序 {   for(h=0;h<=7;h+=2)   {    switch (h)           //  位选,选择点亮的数码管,    {     case 0: a=0;b=0;c=0;break; //显示第0位     case 2: a=0;b=1;c=0;break; //    2     case 4: a=0;b=0;c=1;break; //    4     case 6: a=0;b=1;c=1;break; //    6    }       m=h/2;              smg=n[m];         //  发送段码    delay(100);   } } }     void sound()   //  蜂鸣器响 { u8 i=100; while (i--)     // 只要不是死循环(while(1))即可 {   beep=~beep;   delay(500); } } void key()            //  判断哪个开关按下 { if (k1==0)  //  开 {   delay(1000);  // 消抖   if (k1==0)     {    q=1;    }   while (!k1); } if (k2==0)   // 关 {   delay(1000);  // 消抖   if (k2==0)     {    q=0;    }   while (!k2); } if (k3==0)    //  开 {   delay(1000);  // 消抖   if (k3==0)     {    p=1;    }   while (!k3); } if (k4==0)  //  关 {   delay(1000);     if (k4==0)     {    p=0;    }   while (!k4); } } void main() { while (1) { key();   if (q == 1)  LOVE   {    love();    }   else    {    smg=0x00;   }      key();      if (p == 1)    {    sound();    }   else     {    beep = 1;   } } }
作者: JM123456    时间: 2018-11-6 17:42
将蜂鸣器使能引脚与数显管的使能引脚一起置位就好了
作者: ansy2001    时间: 2018-11-6 17:49
这两个器件使能肯定要连接在一起。
作者: g08970    时间: 2018-11-6 18:09
楼上正解 新人学习了
作者: Wang-tg    时间: 2018-11-6 18:41
这个不难,只是可能你还没写过这类似程序,单片机运行速度是很快的,所以单片机可以在很短的时间内做很多事情,以至于让你感觉这些事情是同时做的。你可以使用标志位控制蜂鸣器,比如你想让蜂鸣器发声标志位置1,关闭蜂鸣器置0;还可以使用定时器控制蜂鸣器发声频率。
作者: hsxuan    时间: 2018-11-6 19:20
写在一个for循环里 for{数码管=1 ;delay(2500);数码管=0;delay(2500);beep=~beep;delay(1);}
作者: tzjcx    时间: 2018-11-6 20:48
三极管驱动蜂鸣器,程序的话用轮流处理也ok
作者: tzjcx    时间: 2018-11-6 21:07
蜂鸣器最好还是用另外的供电?不要直接用引脚啊,接个三极管驱动。
作者: 魑同甘共苦    时间: 2018-11-6 21:45
使用定时器来控制蜂鸣器的开启和关闭
作者: 魑同甘共苦    时间: 2018-11-6 21:45
使用定时器来控制蜂鸣器的开启和关闭
作者: kevingao    时间: 2018-11-6 21:45
51没有进程的,也不能(微观)同时;(宏观)是可以的,增大晶振,减少数据的时长。
作者: admin    时间: 2018-11-7 00:57
看这http://www.51hei.com/bbs/dpj-140577-1.html
作者: 857502711    时间: 2018-11-7 11:49
程序调试好可以实现,MCU没试过,找机会试试
作者: 简单的跌宕之美    时间: 2018-11-7 15:12
让控制蜂鸣器的端口有效,也让控制LED的端口有效.或者说考虑为单片机驱动不足,可添加三极管辅助驱动.
作者: 17660448216    时间: 2018-11-7 18:45
把他们的io口分别配置好吧

作者: Dremt    时间: 2018-11-8 13:00
#include<reg51.h>

//--定义使用的IO--//
#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char DisplayData[8];
//用来存放要显示的8位数的值

//--声明全局函数--//
void DigDisplay(); //动态显示函数
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                DisplayData[i]=DIG_CODE[i];       
        }
        while(1)
        {
                DigDisplay();
        }                               
}
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能                   : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DigDisplay()
{
        unsigned char i;
        unsigned int j;
        for(i=0;i<8;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位       
                }
                GPIO_DIG=DisplayData[i];//发送段码
                j=10;                                                 //扫描间隔时间设定
                while(j--);       
                GPIO_DIG=0x00;//消隐
        }
}

作者: @lingyang    时间: 2018-11-8 14:18
数码管与蜂鸣器连接起来,就好了吧
作者: 林木乍青    时间: 2018-11-8 17:37
你是说两者一起工作吗?设定一个基础时间,一个时间变量控制数码管点亮,一个时间变量控制蜂鸣器。蜂鸣器随数码管变化而工作的话,定时器中断扫描数码管,再设定标志判断蜂鸣器的状工作态




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1