找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5670|回复: 30
打印 上一主题 下一主题
收起左侧

51单片机怎么实现蜂鸣器和数显管同时工作?

  [复制链接]
回帖奖励 50 黑币 回复本帖可获得 50 黑币奖励! 每人限 1 次(中奖概率 50%)
跳转到指定楼层
楼主
ID:417679 发表于 2018-11-6 08:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何用51单片机实现数显管和蜂鸣器一起工作
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:1 发表于 2018-11-7 00:57 | 只看该作者

回帖奖励 +50 黑币

回复

使用道具 举报

板凳
ID:89515 发表于 2018-11-6 09:42 | 只看该作者
有源蜂鸣器还是无源蜂鸣器,只是简单的发出一种频率吗?一直响,还是间歇响?
回复

使用道具 举报

地板
ID:421526 发表于 2018-11-6 10:11 | 只看该作者
将蜂鸣器使能引脚与数显管的使能引脚一起置位就好了
回复

使用道具 举报

5#
ID:421569 发表于 2018-11-6 10:56 | 只看该作者
数码管与蜂鸣器连接起来
回复

使用道具 举报

6#
ID:123289 发表于 2018-11-6 13:03 | 只看该作者
好好按排一下,轮流处理两者,时间足够。
回复

使用道具 举报

7#
ID:277550 发表于 2018-11-6 13:03 | 只看该作者

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

使用道具 举报

8#
ID:386762 发表于 2018-11-6 13:55 | 只看该作者
程序都可以实现呀
回复

使用道具 举报

9#
ID:354498 发表于 2018-11-6 14:39 | 只看该作者
你在这指的是功率上怎么解决还是指电路怎么实现或者软件怎么写呢?前两者的话用三极管驱动蜂鸣器,用锁存器控制数显再找相关应用电路就很好解决,至于程序的话可以百度一下相关例程,移植组合一下就行了
回复

使用道具 举报

10#
ID:421165 发表于 2018-11-6 15:26 来自手机 | 只看该作者
引脚接好
回复

使用道具 举报

11#
ID:421836 发表于 2018-11-6 16:46 | 只看该作者
数码管与蜂鸣器连接起来,用三极管驱动蜂鸣器,用锁存器控制数显再找相关应用电路就很好解决
回复

使用道具 举报

12#
ID:421836 发表于 2018-11-6 16:47 | 只看该作者
蜂鸣器使能引脚与数显管 相连接
加上程序代码可以实现
回复

使用道具 举报

13#
ID:421859 发表于 2018-11-6 17:02 | 只看该作者
使用定时器来控制蜂鸣器的开启和关闭
回复

使用道具 举报

14#
ID:421859 发表于 2018-11-6 17:03 | 只看该作者
使用定时器来控制蜂鸣器的开启和关闭
回复

使用道具 举报

15#
ID:421859 发表于 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;   } } }
回复

使用道具 举报

16#
ID:421883 发表于 2018-11-6 17:42 | 只看该作者
将蜂鸣器使能引脚与数显管的使能引脚一起置位就好了
回复

使用道具 举报

17#
ID:115473 发表于 2018-11-6 17:49 | 只看该作者
这两个器件使能肯定要连接在一起。
回复

使用道具 举报

18#
ID:243982 发表于 2018-11-6 18:09 | 只看该作者
楼上正解 新人学习了
回复

使用道具 举报

19#
ID:413632 发表于 2018-11-6 18:41 | 只看该作者
这个不难,只是可能你还没写过这类似程序,单片机运行速度是很快的,所以单片机可以在很短的时间内做很多事情,以至于让你感觉这些事情是同时做的。你可以使用标志位控制蜂鸣器,比如你想让蜂鸣器发声标志位置1,关闭蜂鸣器置0;还可以使用定时器控制蜂鸣器发声频率。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

20#
ID:396996 发表于 2018-11-6 19:20 | 只看该作者
写在一个for循环里 for{数码管=1 ;delay(2500);数码管=0;delay(2500);beep=~beep;delay(1);}
回复

使用道具 举报

21#
ID:421986 发表于 2018-11-6 20:48 | 只看该作者
三极管驱动蜂鸣器,程序的话用轮流处理也ok
回复

使用道具 举报

22#
ID:421986 发表于 2018-11-6 21:07 | 只看该作者
蜂鸣器最好还是用另外的供电?不要直接用引脚啊,接个三极管驱动。
回复

使用道具 举报

23#
ID:422033 发表于 2018-11-6 21:45 | 只看该作者
使用定时器来控制蜂鸣器的开启和关闭
回复

使用道具 举报

24#
ID:422033 发表于 2018-11-6 21:45 | 只看该作者
使用定时器来控制蜂鸣器的开启和关闭
回复

使用道具 举报

25#
ID:422024 发表于 2018-11-6 21:45 | 只看该作者
51没有进程的,也不能(微观)同时;(宏观)是可以的,增大晶振,减少数据的时长。
回复

使用道具 举报

26#
ID:420218 发表于 2018-11-7 11:49 | 只看该作者
程序调试好可以实现,MCU没试过,找机会试试
回复

使用道具 举报

27#
ID:421812 发表于 2018-11-7 15:12 | 只看该作者
让控制蜂鸣器的端口有效,也让控制LED的端口有效.或者说考虑为单片机驱动不足,可添加三极管辅助驱动.
回复

使用道具 举报

28#
ID:420363 发表于 2018-11-7 18:45 | 只看该作者
把他们的io口分别配置好吧
回复

使用道具 举报

29#
ID:419294 发表于 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;//消隐
        }
}
回复

使用道具 举报

30#
ID:422973 发表于 2018-11-8 14:18 | 只看该作者
数码管与蜂鸣器连接起来,就好了吧
回复

使用道具 举报

31#
ID:311157 发表于 2018-11-8 17:37 | 只看该作者
你是说两者一起工作吗?设定一个基础时间,一个时间变量控制数码管点亮,一个时间变量控制蜂鸣器。蜂鸣器随数码管变化而工作的话,定时器中断扫描数码管,再设定标志判断蜂鸣器的状工作态
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表