找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机新手疑惑,我的蜂鸣器怎么不响啊?

[复制链接]
跳转到指定楼层
楼主
放假焊了一个倒计时器。设想,倒计时时间结束后蜂鸣器鸣响。但是实际上蜂鸣器压根没动静。但是单独使用时蜂鸣器声音很大。困惑了一天了。
使用的STC11F02E和74HC595搭建的。数码管是0.36共阴,晶振使用12MHz的,电容是22PF的,蜂鸣器是5V无源的。

电路原理图如下:


制作出来的实物图如下:


放一下单片机代码。
#include <stc11f02e.h>
#include <intrins.h>

sbit BEE = P3^7;
sbit ADDR3 = P1^0;
sbit ADDR2 = P1^1;
sbit ADDR1 = P1^2;
sbit ADDR4 = P1^3;

sbit KEY0 = P3^2;
sbit KEY1 = P3^3;

sbit P_HC595_SER = P1^4;        //串行数据输入
sbit OE = P1^5;                    //输出允许控制
sbit P_HC595_RCLK = P1^6;        //三态输出锁存器的时钟输入
sbit P_HC595_SRCLK = P1^7;        //移位寄存器的时钟输入

unsigned char code t_display[] = {0x05,0x7d,0x46,0x54,0x3c,0x94,0x84,0x5d,0x04,0x14};
unsigned char LED4[4];
unsigned char display_index = 0;    //位选指示标志

unsigned int Time_User;    //预设时间
unsigned char cnt = 0;    //1s指示标志
bit B_P;            //蜂鸣器指示

void Init_System();        //初始化函数
void Send_595(unsigned char dat);   
void DisplayScan(void);
void Delay_1ms(void);
void Delay_10ms(void);
void Buzzer(void);        //蜂鸣器函数

void main(void)
{
    Init_System();
    while(1)
    {   
        while(B_P==1)
        {
            Buzzer();
        }
        
        LED4[0] = ~(t_display[Time_User/60/10]);   
        LED4[1] = ~(t_display[Time_User/60%10]&0xfb);
        LED4[2] = ~(t_display[Time_User%60/10]);
        LED4[3] = ~(t_display[Time_User%60%10]);
        
        DisplayScan();

    }
   
}

void Init_System()
{
    TMOD = 0x01;
    TH0 = (65536-50000)/256;
    TL0 = (65536-50000)%256;
    ET0 = 1;
    TR0 = 0;
        
    EX0 = 1;
    IT0 = 1;
    EX1 = 1;
    IT1 = 1;
   
    EA = 1;
    OE = 0;
    B_P=0;
   
    Time_User=180;
   
}

void Send_595(unsigned char dat)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        if(dat & 0x80)      P_HC595_SER = 1;
        else                P_HC595_SER = 0;
        P_HC595_SRCLK = 1;
        P_HC595_SRCLK = 0;
        dat = dat<<1;
    }
}

void DisplayScan(void)
{
    switch(display_index)
    {
        case(0):ADDR1=0;ADDR2=1;ADDR3=1;ADDR4=1;Send_595(LED4[0]);display_index++;break;
        case(1):ADDR1=1;ADDR2=0;ADDR3=1;ADDR4=1;Send_595(LED4[1]);display_index++;break;
        case(2):ADDR1=1;ADDR2=1;ADDR3=0;ADDR4=1;Send_595(LED4[2]);display_index++;break;
        case(3):ADDR1=1;ADDR2=1;ADDR3=1;ADDR4=0;Send_595(LED4[3]);display_index=0;break;
        default:break;
    }
    P_HC595_RCLK=0;
    _nop_();
    _nop_();
    P_HC595_RCLK=1;
    Delay_1ms();
}
   
void timer0(void) interrupt 1
{
    TH0 = (65536-50000)/256;
    TL0 = (65536-50000)%256;
    cnt++;
    if(cnt==20)
    {
        cnt = 0;
        Time_User--;
    }
    if(Time_User==0)
    {
        B_P=1;
        TR0=0;
    }
}

void exint0(void) interrupt 0
{
    if(KEY0==0)
    {
        Delay_10ms();
        if(KEY0==0)
        {
            if(Time_User==0)    TR0=0;
            else   
            {
                TR0=!TR0;
            }
            B_P=0;
        }
        while(!KEY0);
    }
}

void exint1(void) interrupt 2
{
    if(KEY1==0)
    {
        Delay_10ms();
        if(KEY1==0)
        {
            TR0=0;
            Time_User+=15;
            if(Time_User==3600)    Time_User=0;
            B_P=0;
        }
        while(!KEY1);
    }
}

void Delay_1ms(void)
{
    unsigned char i,j;
    _nop_();
    _nop_();
    i = 12;
    j = 168;
    do
    {
        while(--j);
    }while(--i);
}

void Delay_10ms(void)
{
    unsigned char i,j;
   
    _nop_();
    _nop_();
    i=117;
    j=183;
    do
    {
        while(--j);
    }while(--i);
}

void buzzer(void)
{
        BEE = 0;
        Delay_1ms();
        BEE = 1;
        Delay_1ms();
}

放一下图片


index2.jpg (155.2 KB, 下载次数: 40)

这是背面

这是背面
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:236982 发表于 2019-2-2 16:40 | 只看该作者
1、首先说蜂鸣器:
你说的单独试蜂鸣器声音很大,估计你买的蜂鸣器是有源的。
2、其次,有木有可能没有按“开始按钮(KEY0)”?
回复

使用道具 举报

板凳
ID:213173 发表于 2019-2-2 16:48 | 只看该作者
你的无源蜂鸣器函数不对,只振荡一个周期1ms哪能听到响?
给你一个简单的无源蜂鸣器函数(12MHz 1T),如果用定时器做振荡源更好些。
0.24ms半周期蜂鸣器程序
void buzzer(unsigned int x)                //2x为1个振荡周期
{                                                                 //x=1000可以鸣响0.24S
        unsigned char t;
        while(x--)
        {       
                BEE=~BEE;                                //蜂鸣器谐振频率2048Hz
                for(t=0;t<210;t++);                //0.24ms半周期=2083Hz
        }                                                       
        BEE=1;       
}
回复

使用道具 举报

地板
ID:342822 发表于 2019-2-2 18:04 | 只看该作者
pnp管与npn管电压极性有区别~~

b3b7d0a20cf431ad762dda5d4236acaf2fdd98d3.png (27.57 KB, 下载次数: 41)

b3b7d0a20cf431ad762dda5d4236acaf2fdd98d3.png
回复

使用道具 举报

5#
ID:342822 发表于 2019-2-2 18:11 | 只看该作者
换个npn管试一试~~
回复

使用道具 举报

6#
ID:161151 发表于 2019-2-2 20:00 | 只看该作者
蜂鸣器子程序里的延时太短了吧,无源蜂鸣器按这个延时出来的声音频率太高,不在听觉范围内所以听不到。
回复

使用道具 举报

7#
ID:399129 发表于 2019-2-2 23:27 来自手机 | 只看该作者
suuy79 发表于 2019-2-2 16:40
1、首先说蜂鸣器:
你说的单独试蜂鸣器声音很大,估计你买的蜂鸣器是有源的。
2、其次,有木有可能没有按 ...

我表达失误了,是只循环蜂鸣器函数时声音很大。蜂鸣器确实是无源的,有源的尺寸比这个大一圈。按键的话我不知道怎么修改。
回复

使用道具 举报

8#
ID:399129 发表于 2019-2-2 23:32 来自手机 | 只看该作者
taotie 发表于 2019-2-2 18:11
换个npn管试一试~~

注释掉其他的内容,只循环蜂鸣器函数,蜂鸣器可以发声,应该不是三极管的问题。谢谢了。
回复

使用道具 举报

9#
ID:399129 发表于 2019-2-2 23:36 来自手机 | 只看该作者
y_z_q3963 发表于 2019-2-2 20:00
蜂鸣器子程序里的延时太短了吧,无源蜂鸣器按这个延时出来的声音频率太高,不在听觉范围内所以听不到。

尝试增加了时长还是听不到。但是只运行蜂鸣器函数可以听到声音。费解。
回复

使用道具 举报

10#
ID:399129 发表于 2019-2-2 23:43 来自手机 | 只看该作者
wulin 发表于 2019-2-2 16:48
你的无源蜂鸣器函数不对,只振荡一个周期1ms哪能听到响?
给你一个简单的无源蜂鸣器函数(12MHz 1T),如果 ...

谢谢老师了。我临时有事不能继续完成这个小制作,我回头试试。
回复

使用道具 举报

11#
ID:474677 发表于 2019-2-3 18:02 | 只看该作者
蜂鸣器函数延时太短了,再增加一个循环函数试试
回复

使用道具 举报

12#
ID:399129 发表于 2019-2-6 15:14 | 只看该作者
本帖最后由 cheng51 于 2019-2-6 17:22 编辑

解决了。是蜂鸣器运行时干扰或者是负载太大,导致单片机直接复位,原来的代码问题不大。在正负极间装了一个104独石电容和10uf的点解电容后就好了。谢谢大家了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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