qldzthrzy 2024-09-29 12:34 采纳率: 33.3%
浏览 1

c语言编写51单片机

总问题:无法通过单片机设置蜂鸣器发声时长,蜂鸣器发声的时候LCD读秒暂停响完后跳到正常时间
具体问题:代码设定的数值不能实现目的,例如:设置的发声5000毫秒在执行的时候远小于5000毫秒
代码目的;单片机独立按键按下的时候切换蜂鸣器发声时长,到设定时间时蜂鸣器响同时LCD正常计时
注意:引用文件里的代码正常

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"
#include "Key.h"
#include "Buzzer.h"
unsigned char Sec,Min,Hour;
unsigned char Keynumber,LCDmode,a,Buzzer_number,Buzzer_time;
void main()
{
    LCD_Init();
    Timer0_Init();
    LCD_ShowString(1,1,"Clock:");
    LCD_ShowString(2,3,":");
    LCD_ShowString(2,6,":");
    LCD_ShowString(1,9,"Buzzer:");
    
    while(1)
{
    LCD_ShowNum(2,1,Hour,2);
    LCD_ShowNum(2,4,Min,2);
    LCD_ShowNum(2,7,Sec,2);
    LCD_ShowNum(2,11,Buzzer_number,2);
    Keynumber=Key();
    if    (Keynumber!=0)
    {
        if(Keynumber==1)
        LCDmode++;
        if(LCDmode==1)
        { 
        if(Keynumber==2)
        Hour++;
        if(Keynumber==3)
        Hour--;
        }
        if(LCDmode==2)
        { 
        if(Keynumber==2)
        Min++;
        if(Keynumber==3)
        Min--;
        }
        if(LCDmode==3)
        { 
        if(Keynumber==2)
        Sec++;
        if(Keynumber==3)
        Sec--;
        }
        if(LCDmode==4)
        { 
        if(Keynumber==2)
        Buzzer_number=5;    
        Buzzer_time=5000;
        if(Keynumber==3)
        Buzzer_number=10;    
        Buzzer_time=10000;
        if(Keynumber==4)
        Buzzer_number=15;    
        Buzzer_time=15000;
        }
        
    
        if(LCDmode==5)
        {if(Keynumber==4)
        TR0=!TR0;
        }
        LCDmode%=5;
    }
        if(Hour==01&&Min==01&&Sec==10)
        {
            Buzzer_Time(Buzzer_time);
        }
        
    }
}
void  Timer0_Routine() interrupt 1
{  static unsigned int T0count;
    TL0 = 0x18;                
    TH0 = 0xFC;
     T0count++;
     if(T0count>=1000) 
     {
         T0count=0;
      Sec++;
    if(Sec>=60)
    {Sec=0;
    Min++;
    }
    if(Min>=60)
    {Min=0;
    Hour++;
    }
    if(Hour>=24)
    {Hour=0;
    }

}
     }

  • 写回答

3条回答 默认 最新

  • 一轮明月照丘壑 2024-09-29 12:35
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    首先,让我们分析代码中的问题。在代码中,您使用了定时器中断来控制时间的流逝,并在特定时间触发蜂鸣器。然而,您设置的蜂鸣器发声时间似乎并不准确。这可能是由于以下几个原因造成的:

    1. 定时器中断频率问题:您的定时器中断可能不是按照预期的频率触发,这会影响时间的准确性。您需要确保定时器的配置是正确的,并且触发的频率适合您的应用需求。
    2. 延时函数准确性问题:如果您使用的延时函数(如Buzzer_Time)实现不准确或不可靠,这可能会导致实际延时时间与设定值有很大差异。您需要检查这个函数的实现并确保它的准确性。
    3. 时间计算问题:在中断服务程序(Timer0_Routine)中,您增加秒、分和时的逻辑可能在某些条件下出现问题。特别是在处理进位时(例如,当秒或分到达最大值时),需要确保逻辑的准确性。

    为了解决这个问题,您可以采取以下步骤:

    • 确保定时器配置正确,以提供稳定的时间基准。
    • 重新检查Buzzer_Time函数的实现,确保它能提供准确的延时。
    • 在中断服务程序中仔细检查时间计算的逻辑,确保没有错误。

    此外,对于蜂鸣器发声时LCD暂停更新的问题,您可以在中断服务程序中添加逻辑来处理这个需求。当蜂鸣器发声时,可以暂时禁用LCD的更新,并在蜂鸣器停止时恢复更新。这样,LCD的显示就不会在蜂鸣器发声时发生变化。

    针对代码中的其他部分,我建议您检查以下几点:

    • 确保所有的库文件(如REGX52.HDelay.h等)都正确无误,并且与您的硬件平台兼容。
    • 检查按键处理逻辑,确保正确识别按键并更新相应的变量。
    • 对于LCD显示的逻辑,确保正确更新显示的时间和其他信息。

    总之,解决这个问题的关键在于确保定时器的准确性和延时函数的可靠性,并仔细检查代码中的逻辑错误。希望这些建议能帮助您解决问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 9月29日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?