• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

51单片机有源蜂鸣器一次响声小,一次正常

Wu雨雨雨 2017-03-06 浏览量:1538
下面是程序,其他的都很简单,红色标出了蜂鸣器部分



#include <reg52.h>                    //52系列单片机头文件     
#define uchar unsigned char

//申明变量和位口 
sbit     K1=P3^4;     //对应按钮K1
sbit     K2=P3^5;    //对应按钮K2
            
sbit    dula=P2^6;     //段选申明 
sbit    wela=P2^7;     //位选申明 

sbit    beep=P2^3;        //蜂鸣器申明 

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //0~9,A~F的16进制

void delayms(unsigned int xms);       //延时函数申明

unsigned char numt0=0,miao=0,fen=0,lunci=0;    //  计数变量

unsigned char CK1=0,CK2=0;   //串口接收变量(全局)




//延时函数
void delayms(unsigned int xms)                                
{
        unsigned int i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
                for(j=112;j>0;j--);
}



//计时器初始化函数
void init()   
{

    //********计时器**********
        TMOD=0x21;                 //模式设置,00100001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
        TR0=0;                         //不打开定时器
        TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
        TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
        ET0=1;                         //开定时器0中断
        EA=1;                         //开总中断 


        //***************串口通信********************** 
    TMOD=0X21;                        ////模式设置,00100001,可见采用的是定时器1,工作与模式1(M1=0,M0=1)
        SCON=0X50;                        //设置为工作方式1
        PCON=0X00;                        //0x00不加倍    0x80加倍
        TH1=0XFD;                    //计数器初始值设置,注意波特率是4800的
        TL1=0XF3D;                                                         
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                            //打开计数器                         

}



//数码管显示函数 
void display(uchar fen1,uchar miao1)
{
        
        //*******分钟操作*********        
        unsigned char fenshi,fenge;
        unsigned char  miaoshi,miaoge;
        fenshi=fen1/10;
        fenge=fen1%10;
        
          
        dula=1;                //秒钟十位赋值    
        P0=table[fenshi];      
        dula=0;                 
       P0=0xff;                
        wela=1;
        P0=0xF7;
        wela=0;                 
        delayms(5);
                
        dula=1;                 //分钟十位赋值 
        P0=table[fenge];
        dula=0;                
       P0=0xff;               
        wela=1;
        P0=0xEF;
        wela=0;                
        delayms(5);

        
        //********中间的一个横线*****
        dula=1;                
        P0=0x40;      
        dula=0;                 //打开段选位 .....秒钟个位赋值......关闭闭段选位
    P0=0xff;                //送段选数据前关闭所有所有显示,防止打开位选锁存器 
        wela=1;
        P0=0xFB;
        wela=0;                 //打开段选位 、赋值、关闭闭段选位
        delayms(5);
        
        
        //*******秒钟操作*********        
        miaoshi =  miao1/10;
        miaoge  =  miao1%10;          //参数处理 
            
        dula=1;                
        P0=table[miaoshi];      
        dula=0;                 //打开段选位 .....秒钟个位赋值......关闭闭段选位
    P0=0xff;                //送段选数据前关闭所有所有显示,防止打开位选锁存器 
        wela=1;
        P0=0xFE;
        wela=0;                 //打开段选位 、赋值、关闭闭段选位
        delayms(5);
                
        dula=1;                 //秒钟十位赋值 
        P0=table[miaoge];
        dula=0;                
       P0=0xff;               
        wela=1;
        P0=0xFD;
        wela=0;                
        delayms(5);        
}



//判断按键函数
unsigned char keyscan()
{
        unsigned char keyValue = 0; //保存键值

        if (K1==0)                        //检测按键K1是否按下
        {
                delayms(10);           //消除抖动

                if (K1==0)              //再次检测按键是否按下
                {
                        TR0=~TR0;        //启动或开始计时器******一开始时,这个按键按下去后才会启动 
                          while(!K1);    //等待按键释放        
                }
        }
        if (K2==0)                //检测按键K1是否按下
        {
                delayms(10);        //消除抖动

                if (K2==0)        //再次检测按键是否按下
                {
                        miao=0;
                        fen=0;          //清零
                        lunci=0;         //清零同时,判别变量清零
                    while(!K2);    //等待按键释放        
                }
        }

        return keyValue;   //将读取到键值的值返回
}


//开始次一轮函数
void NextTurn ( unsigned char fenstop)
{     &
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 整段程序没有beep什么事啊,你的beep代码在哪里?还有测试beep的话,简单的给个电平,不就知道是不是beep的问题了?不是beep的问题,就是程序代码中的问题了。把beep换个led显示一下看看正常不,知道代码某一段是不是出问题
    • 发布于 2017-03-07
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:10
  • 代码要理解其中含义的,不是随便发段代码让别人去猜谜语,不懂的地方可以问一下,全不懂的话,还是要自己学习一下的。毕竟能教你一次,不能总是教你啊,还是要自己学习一下C语言的。
    • 发布于2017-03-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 我就做个猜想:①:你单片机的P2口上电默认电平为高电平,因为你的程序中没有初始化P2口的电平状态,所以P2^3一直为高电平。②:在①的基础上,你蜂鸣器驱动三极管为NPN型三极管,这时候三极管一直处于放大作用。③:在前面2个假设的基础上,你这个蜂鸣器的不是很理想的蜂鸣器,所以流过蜂鸣器的电流非常大,这个时候电源供电不稳定,导致单片机一直处于掉电复位状态,所以导致蜂鸣器声音时大时小。      现在问题来了:上面都是我的猜测,这时你应该给个完整的程序出来+电路图。好让我再帮你多瞎猜几次
    • 发布于2017-03-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 蜂鸣器两脚上并一个0.1uF左右的电容试试。以前遇到过质量不太好的蜂鸣器会有这种现象~~~~~~~~
    • 发布于2017-03-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这也没有蜂鸣器相关代码啊,所以目前看不出是硬件还是软件的问题,建议你先排查一下硬件,也许是硬件驱动的问题
    • 发布于2017-03-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这个蜂鸣器能响说明程序代码部分没有问题,那么问题应该出现在硬件上面

    蜂鸣器需要靠8550那一类三极管驱动的,而且一般要加电容

    现在原因应该是蜂鸣器间隔时间过短,建议尝试将两次蜂鸣器响之间的间隔拉长一点试试

    • 发布于2017-03-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 从供电上找原因,也许有惊喜
    • 发布于2017-03-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 同樣的問題

    程式碼不完全也不是很好講問題

    但如果有聲音出來只是大小聲問題的話,參考以下電路

    檢查流過R7的電流,如果是不同BJT也最好量測Vbe(B-E端)電壓ˋ值,看是否超過Vt(Threshold voltage)

    以上供參考


    • 发布于2017-03-08
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

51单片机有源蜂鸣器一次响声小,一次正常