weixin_70996210 2023-03-24 20:59 采纳率: 75%
浏览 12
已结题

为什么在进入结束函数时只是关闭了中断,BUZZ没有取反,蜂鸣器却不响l呢。

使用51单片机中的无源蜂鸣器 在进入启动函数后进入中断,BUZZ端口取反,问题是为什么在进入结束函数时只是关闭了中断,BUZZ没有取反,蜂鸣器却不响l呢。

#include<reg52.h>

sbit BUZZ=P1^6;                         //蜂鸣器控制引脚

unsigned char T0RH=0;                 //T0重载值高字节
unsigned char T0RL=0;                 //T0重载值低字节

void OpenBuzz(unsigned int frequ);     //打开蜂鸣器
void StopBuzz();                     //关闭蜂鸣器

void main()
{
    unsigned int i;
    TMOD=0x01;                           //指定模式  但不启动
    EA=1;                               //中断总使能

    while(1)
    {
        OpenBuzz(4000);                    //以4khz的频率启动蜂鸣器
        for(i=0;i<40000;i++);            //延时
        StopBuzz();
        for(i=0;i<40000;i++);
        OpenBuzz(1000);                    //以1khz的频率启动蜂鸣器
        for(i=0;i<40000;i++);
        StopBuzz();
        for(i=0;i<40000;i++);
    }
}

void OpenBuzz(unsigned int frequ)
{
    unsigned int reload;

    reload=65536-(11059200/12)/(frequ*2);             //计算所需的定时器重载值    强制类型转换
    T0RH=(unsigned char)(reload>>8);                  //由给定频率计算定时器重载值      reload两个字节,把16位reload进行转换后得到的低8位移出,把高八位给到T0RH 
    T0RL=(unsigned char)reload;                          //16位重载值分解为高低两个字节  把reload低八位赋值给T0RL
    TH0=0xFF;
    TL0=0xFE;                                          //设定接近溢出的初值,让定时器马上投入工作   随意给定的
    ET0=1;                                              //使能t0中断
    TR0=1;                                              //启动t

}
void StopBuzz()
{
    ET0=0;                                              //关闭定时器和中断
    TR0=0;
}

/*t0中断服务函数,用于控制蜂鸣器发声*/
void interrupttimer0() interrupt 1
{
    TH0=T0RH;                                           //重新加载重载值
    TL0=T0RL;
    BUZZ=~BUZZ;                                           //反转蜂鸣器控制点平
}

  • 写回答

2条回答 默认 最新

  • IT_service_mesh 2023-03-24 21:02
    关注

    参考GPT和自己的思路:根据代码和描述来看,可能是由于结束函数没有将BUZZ端口重新设置为高电平,导致蜂鸣器始终处于反转状态,无法响应。建议在结束函数中添加BUZZ=1这行代码来解决问题。另外,建议在中断服务函数中添加一个延迟,使蜂鸣器可以持续一段时间后再停止,而不是立即停止。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含