如何修改单片机程序 按键增加蜂鸣器声音等

1因为原的按键按它是没有声音的   想改成所有的按键都有蜂鸣器声音     按一次响一次  

2按开始定时就开始蜂鸣器就跟着秒滴滴响,数码管到10秒蜂鸣器节奏就越来越快,到2秒 蜂鸣器就一直响

加个led和蜂鸣器一样工作
仿真+程序:https://pan.baidu.com/s/1bNzX_FD43EVYomd82GfZAQ 
提取码:41q1

img

img


#include<reg51.h> 
#include<intrins.h>
#include<absacc.h>       //头文件
#define ui unsigned int
#define uc unsigned char   //宏定义

uc code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};       //码表0~9
uc code tab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};       //码表带点0~9
sbit jiabaiwei=P1^0;    //加百位按键(分加)
sbit daojishi=P1^1;        //倒计时
sbit zhanting=P1^2;        //暂停
sbit jiashiwei=P1^3;    //加十位(秒十位)
sbit jiagewei=P1^4;        //加个位(秒个位)
sbit baojing=P3^7;        //蜂鸣器
bit flag1;    //标志位

uc n;
char qian,bai,shi,ge,miao,fen;//变量

void delay(ui k)   //延时函数
{
    ui i,j;
    for(i=0;i<k;i++)
        for(j=0;j<10;j++);
}

void init()       //初始化函数
{
    TMOD=0x01;      //定时器0工作方式1
    EA=1;          //开总中断
    ET0=1;          //定时器0中断开
    TH0=0x3c;
    TL0=0xb0;      //附初值
    flag1=1;      //变量附1
}

void xianshi()      //显示子函数
{
    qian=fen/10;  //分十位
    bai=fen%10;      //分个位
    shi=miao/10;  //秒十位
    ge=miao%10;      //秒个位
    P0=0x00;
    P2=0xf7;       //让数码管第一个位亮(送位选信号)
    P0=tab1[ge];   //送段
    delay(10);       //延时
    P0=0x00;
    P2=0xfb;       //让数码管第二个位亮(送位)
    P0=tab1[shi];  //送位选信号
    delay(10);       //延时
    P0=0x00;
    P2=0xfd;       //让数码管第三个位亮(送位选信号)
    P0=tab2[bai];  //送位选信号
    delay(10);       //延时
    P0=0x00;
    P2=0xfe;       //让数码管第四个位亮(送位选信号)
    P0=tab1[qian]; //送位选信号
    delay(10);       //延时
    P0=0x00;
}

void anjian()      //按键子函数
{
    if(jiabaiwei==0)   //加百位按键(分加)
    {
        delay(30);       //延时去抖
        if(jiabaiwei==0)   //确定按键按下
        {
            fen=fen+1;      //分自加
            if(fen>59)      //如果分大于59
            fen=0;          //分归零
        }
        while(!jiabaiwei); //等待按键释放
    }
    else if(daojishi==0)
    {
        delay(30);       //延时去抖
        if(daojishi==0)        //确定按键按下
        {
            if((miao!=0)||(fen!=0))    //如果分和秒不同时等于0
            TR0=1;             //定时器0开         
            flag1=1;         //开始倒计时标志位
        }
        while(!daojishi); //等待按键释放
    }
    else if(zhanting==0)    //如果暂停按键按下
    {
        delay(30);         //延时去抖
        if(zhanting==0)      //确定按键按下
        {
            TR0=0;          //关定时器
        }
        while(!zhanting); //等待按键释放
    }
    else if(jiashiwei==0)     //如果秒十位加按键按下
    {
        delay(30);      //延时去抖
        if(jiashiwei==0) //确定按键按下
        {
            miao=miao+10;  //秒自加10
            if(miao>59)        //如果秒大于59
            miao=miao%10;   //秒取余
        }
        while(!jiashiwei); //等待按键释放
    }
    else if(jiagewei==0)   //如果加秒个位的按键按下
    {
        delay(30);       //延时去抖
        if(jiagewei==0)      //确定按键按下
        {
            miao=miao+1;   //秒+1
            if(miao>59)        //如果秒大于59
            {
            miao=0;            //秒归零
            fen++;            //分+1
            }
        }
        while(!jiagewei); //等待按键释放
    }
        
}

void main()             //主函数
{
    init();            //初始化函数
    while(1)
    {
        anjian();      //按键函数
        xianshi();      //显示函数
    }
}

void zhongduan() interrupt 1 //定时器0
{
    TH0=0x3c;
    TL0=0xb0;      //重附初值50ms
    n++;
    if(n>=20)      //如果到1s(n=20就是1s的时间)
    {
        n=0;                         //n 清零
        if(flag1==1)                //如果 flag1等于1的时候
        {
            miao--;
            if(miao<0)
            {
                if(fen>0)
                {
                    fen--;
                    miao=59;
                }
                else
                {
                    fen=miao=0;
                }
            }
            
            if((miao<=10)&&(fen==0)) //如果秒小于10并且分等于0
            {
                baojing=~baojing;    //报警取反
                if(miao==0)            //如果秒等于1
                {    
                    flag1=0;         
                    miao=0;            //秒清零
                    fen=0;             //分清零
                    TR0=0;            //关定时器
                    baojing=1;        //报警关
                }
            }
        }
    }
}

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
修改单片机程序,使按键按下时有蜂鸣器声音响,以及加入定时器后随着时间递增,蜂鸣器节奏越来越快,到2秒蜂鸣器就一直响的要求。分以下几个步骤进行:

  1. 修改anjan()函数,增加按键按下时的蜂鸣器声音效果,具体方法是在按键按下的那个分支中加入蜂鸣器控制语句,如下:
if(jiabaiwei==0)   //加百位按键(分加)
    {
        delay(30);       //延时去抖
        if(jiabaiwei==0)   //确定按键按下
        {
            fen=fen+1;      //分自加
            if(fen>59)      //如果分大于59
            fen=0;          //分归零
            
            // 按键按下时,使蜂鸣器响一声
            baojing = 0;
            delay(100);
            baojing = 1;
        }
        while(!jiabaiwei); //等待按键释放
    }

这样,其余的按键分支也需要加入相应的蜂鸣器控制语句。

  1. 加入“随时间递增,蜂鸣器节奏越来越快”的功能,具体实现方式如下:
  • 在zhongduan()函数中,增加一个变量count,来计数时间
  • 在每次进入zhongduan()函数后,count+1,如果count < 40,则蜂鸣器不响,否则蜂鸣器响1次;如果count < 20,则延时50ms;如果count < 10,则延时40ms;如果count < 5,则延时30ms;如果count < 2,则延时20ms;如果count < 1,则延时10ms。
  • 当count >= 40时,重置count为0。

代码如下:

void zhongduan() interrupt 1 //定时器0
{
    TH0=0x3c;
    TL0=0xb0;      //重附初值50ms
    n++;
    count++;       // 新增:计时器加1
    if(n>=20)      //如果到1s(n=20就是1s的时间)
    {
        n=0;                         //n 清零
        if(flag1==1)                //如果 flag1等于1的时候
        {
            miao--;
            if(miao<0)
            {
                if(fen>0)
                {
                    fen--;
                    miao=59;
                }
                else
                {
                    fen=miao=0;
                }
            }
            
            if((miao<=10)&&(fen==0)) //如果秒小于10并且分等于0
            {
                // 每次倒计时时,判断count的值,以确定蜂鸣器的响应时间和频率
                if (count >= 40) {
                    baojing = ~baojing;
                    count = 0;
                } else if (count >= 20) {
                    delay(50);
                } else if (count >= 10) {
                    delay(40);
                } else if (count >= 5) {
                    delay(30);
                } else if (count >= 2) {
                    delay(20);
                } else if (count >= 1) {
                    delay(10);
                }
                
                if(miao==0)            //如果秒等于1
                {    
                    flag1=0;         
                    miao=0;            //秒清零
                    fen=0;             //分清零
                    TR0=0;            //关定时器
                    baojing=1;        //报警关
                }
            }
        }
    }
}

这样,每次倒计时时,蜂鸣器的响应时间就会随着时间的推移而越来越短,频率越来越高,直到最后只剩下连续短促的响声。

完整代码如下:
如果我的回答解决了您的问题,请采纳!

该回答引用GPTᴼᴾᴱᴺᴬᴵ
要修改单片机程序以添加蜂鸣器声音和LED指示灯,需要了解基本的51单片机编程知识和C语言编程语言。下面是一个大致的步骤:

  1. 首先要确定你的单片机的输入/输出引脚,将按键和蜂鸣器和LED连接到正确的引脚上。这个需要根据你使用的具体型号的单片机来确定,可以参考单片机的手册或者开发板的引脚图。

  2. 接下来,要编写程序来控制这些输入/输出引脚。可以使用C语言编写程序。如果你不熟悉C语言,建议先学习一下。

  3. 对于第一个要求,即所有按键按下时都有蜂鸣器声音,需要在按键按下的中断函数中添加控制蜂鸣器的代码。在按键按下时,通过输出高电平信号控制蜂鸣器发声。然后通过延时函数控制蜂鸣器响一段时间后停止。

  4. 对于第二个要求,即在开始定时后,蜂鸣器会根据时间滴滴响,需要编写定时器中断函数来实现。在每次定时器中断时,通过输出高电平信号控制蜂鸣器发声。然后通过变量来控制蜂鸣器的节奏速度。当时间到达一定值后,蜂鸣器一直响,并且LED指示灯也会亮起。

  5. 最后,需要将程序下载到单片机中,可以使用Keil等开发软件进行编译和下载。

总之,要实现这些功能,需要了解单片机的基本编程知识和C语言编程,同时需要理解中断、延时、定时器等相关知识。

参考GPT和自己的思路,为了增加按键的蜂鸣声和定时器的蜂鸣器,您需要修改现有代码。首先,您需要在头文件中声明一个新的常量“BUZZER”,该常量将被分配为连接蜂鸣器的单片机引脚。例如,您可以将其定义为:

#define BUZZER P3^7   //连接蜂鸣器的引脚

然后,您需要创建一个新的函数“buzzer()”,它将使蜂鸣器响起。该函数应该通过在引脚上交替设置低电平和高电平来实现。以下是buzzer()函数的代码:

void buzzer()
{
    BUZZER = 1; //蜂鸣器引脚为高电平
    delay(100); //延时
    BUZZER = 0; //蜂鸣器引脚为低电平
    delay(100); //延时
}

现在您可以在适当的地方调用buzzer()函数来启用蜂鸣器声音。例如,在按键按下时,您可以添加以下代码:

if(jiabaiwei==0)   //加百位按键(分加)
{
    delay(30);       //延时去抖
    if(jiabaiwei==0)   //确定按键按下
    {
        fen=fen+1;      //分自加
        if(fen>59)      //如果分大于59
            fen=0;          //分归零
        buzzer(); //触发蜂鸣器
    }
    while(!jiabaiwei); //等待按键释放
}

同样的,您也可以在定时器函数中调用buzzer()函数来触发蜂鸣器声音。以下是改进的定时器函数的代码:

void timer0() interrupt 1   //定时器0中断函数
{
    TH0=0x3c;
    TL0=0xb0;      //附初值
    if(flag1==1)      //如果需要开始倒计时
    {
        miao=miao-1;  //秒自减
        if(miao==-1)  //如果秒减到-1
        {
            miao=59;   //秒归59
            fen=fen-1;   //分自减
        }
        if((miao==10)||(miao==5))  //如果剩余10秒或5秒
        {
            buzzer();  //触发蜂鸣器
        }
        if((miao==2)||(fen==0&&miao==0))  //如果剩余2秒或计时结束
        {
            while(1)  //循环触发蜂鸣器
            {
                buzzer();
            }
        }
        if((fen==0)&&(miao==0))  //如果计时结束
        {
            flag1=0;  //清除倒计时标志位
            TR0 = 0; //关闭定时器0
            TH0 = 0; //清零定时器08位
            TL0 = 0; //清零定时器08//执行其他操作
}

基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦💕(最新版更智能,功能更加强大):
您的查询似乎与使用蜂鸣器和LED的单片机编程有关。以下是一个8051单片机(基于reg51.h头文件)的示例程序,其中包含了一些按键功能和计时功能,同时也包含了蜂鸣器和数码管显示。您可以参考这段代码来了解如何实现您所需要的功能:

#include<reg51.h> 
#include<intrins.h>
#include<absacc.h>       //头文件
#define ui unsigned int
#define uc unsigned char   //宏定义
 
uc code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};       //码表0~9
uc code tab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};       //码表带点0~9
sbit jiabaiwei=P1^0;    //加百位按键(分加)
sbit daojishi=P1^1;        //倒计时
sbit zhanting=P1^2;        //暂停
sbit jiashiwei=P1^3;    //加十位(秒十位)
sbit jiagewei=P1^4;        //加个位(秒个位)
sbit baojing=P3^7;        //蜂鸣器
bit flag1;    //标志位
 
uc n;
char qian,bai,shi,ge,miao,fen;//变量
 
void delay(ui k)   //延时函数
{
    ui i,j;
    for(i=0;i<k;i++)
        for(j=0;j<10;j++);
}
 
void init()       //初始化函数
{
    TMOD=0x01;      //定时器0工作方式1
    EA=1;          //开总中断
    ET0=1;          //定时器0中断开
    TH0=0x3c;
    TL0=0xb0;      //附初值
    flag1=1;      //变量附1
}
 
void xianshi()      //显示子函数
{
    qian=fen/10;  //分十位
    bai=fen%10;      //分个位
    shi=miao/10;  //秒十位
    ge=miao%10;      //秒个位
    P0=0x00;
    P2=0xf7;       //让数码管第一个位亮(送位选信号)
    P0=tab1[ge];   //送段
    delay(10);       //延时
    P0=0x00;
    P2=0xfb;       //让数码管第二个位亮(送位)
    P0=tab1[shi];  //送位选信号
    delay(10);       //延时
    P0=0x00;
    P2=0xfd;       //让数码管第三个位亮(送位选信号)
    P0=tab2[bai];  //


无非就是 gpio 的输出,根据你的设备手册编写

要修改单片机程序,您需要首先选择合适的开发工具:

  1. 集成开发环境(IDE):这是一种集成了编译器、调试器、代码编辑器等多种工具的软件环境。常见的单片机IDE包括Keil μVision、MPLAB X IDE、Atmel Studio等。

  2. 编辑器:如果您只需要修改代码,可以使用任何文本编辑器,如Notepad++、Sublime Text、Atom等。

接下来,您可以按照以下步骤进行修改单片机程序:

  1. 打开单片机程序的源代码文件。

  2. 根据需要对代码进行修改。注意保存您的修改。

  3. 编译程序,以确保您的修改没有导致编译错误。如果有错误出现,您需要对代码进行修复。

  4. 将编译后的程序通过下载器或其他足够指引允许得出执行代码的方式,并烧录进入您的目标单片机。确保您已经充分了解您所要操作的芯片并遵从其清晰的说明。

  5. 运行程序,测试您的修改是否正常工作。

请牢记,修改单片机程序需要谨慎操作,特别是在实际设备上烧录时,一定要小心谨慎,以防意外损坏设备。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^