单片机整点蜂鸣器报时

求让AT89S52 LED数码显示管在显示整点的时候蜂鸣器会响起

添加函数判断分和秒都等于零,条件满足就驱动蜂鸣器产生相应响应,如果蜂鸣器是无源的,就可以加一个循环,让蜂鸣器响的时间长一点。最后在主函数里面调用即可。下面是我的想法,蜂蜜昂起的打开关闭根据自己的实际开发板填写。(但愿有所帮助)

#define uint unsigned int
sbit BUZZ = P1^5;//定义蜂鸣器的引脚

void delayms(uint t)//这是我用过的STC89C52的延时函数
{
    uint i,j;
    for(i = t;i >0;i --)
        for(j = 110;j > 0;j--);    
}


void On_Time_Alarm(void)//整点报时函数
{
    
    if((fen == 0)&&(maio == 0))//判断分和秒的值
    {
        BUZZ = 0;//开蜂鸣器
        delayms(5);//延时函数
        BUZZ = 1;//关闭蜂鸣器
        delayms(5);
    }
}


On_Time_Alarm ()//主函数里面的调用

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7526556
  • 你也可以参考下这篇文章:基于AT89S52单片机的汽车LED尾灯控制器设计
  • 除此之外, 这篇博客: 利用AT89C52单片机8个独立(非自锁)按键单控8个LED灯亮灭中的 程序代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <reg52.h>
    
    void delay(unsigned int n)//延时函数
    {
    	unsigned char i;
    	while(--n)
    		for(i=0;i<45;i++);  //根据单片机的运行频率不一样,自作调整,这是起到软件消抖的作用。
    }
    
    void main()
    {
    	unsigned char i = 0;
    	unsigned int temp;
    	P0=0xff;  //p0端口制一关闭LED
    	P3=0xff;  //设置p3端口初始值
    	while(1)  //循环
    	{
    		if(P3!=0xff) //如果无按键反应,则跳出
    		{
    			temp=(P3^P0)^0xff;	//将上一状况与本次状况合并
    			P0=temp;		    //送至p0口
    		}
    		delay(500);	//延时	
    	}
    }
    
    

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    根据提供的参考资料和问题要求,可以通过以下步骤实现在AT89S52单片机上实现整点时LED数码显示管和蜂鸣器的功能:

    1. 设置系统时钟:在AT89S52单片机上设置一个定时器,用来定时检测当前时间是否为整点。

    2. 开关LED数码显示管和蜂鸣器:当检测到当前时间为整点时,通过设置相应的I/O管脚控制LED数码显示管和蜂鸣器的开关。

    下面是示例代码,可以在Keil软件中编写和调试:

    #include <regx52.h>
    
    sbit buzzer = P1^0;  // 设置蜂鸣器的I/O管脚
    sbit led = P1^1;  // 设置LED数码显示管的I/O管脚
    
    void delay_ms(unsigned int ms) {
        unsigned int i, j;
        for(i = 0; i < ms; i++) {
            for(j = 0; j < 120; j++);  // 调整延迟时间的细节
        }
    }
    
    void main() {
        TMOD = 0x01;  // 设置定时器0为工作方式1(16位定时器)
        TH0 = 0xFF;  // 设置定时器0初始值
        TL0 = 0xFB;
        ET0 = 1;  // 允许定时器0中断
        EA = 1;  // 允许总中断
        TR0 = 1;  // 启动定时器0
    
        while(1) {
            if(led == 1 && buzzer == 1) {
                led = 0;  // 点亮LED数码显示管
                buzzer = 0;  // 打开蜂鸣器
                delay_ms(500);  // 延时500ms,控制蜂鸣器发声时间
                led = 1;  // 熄灭LED数码显示管
                buzzer = 1;  // 关闭蜂鸣器
            }
        }
    }
    
    void timer0_isr() interrupt 1  // 定时器0中断处理函数
    {
        static unsigned int count = 0;  // 记录中断次数
    
        count++;
        if(count == 60000) {  // 当中断次数达到60000时,即60秒
            led = 1;  // 熄灭LED数码显示管
            buzzer = 1;  // 关闭蜂鸣器
            count = 0;  // 重置中断次数
        }
    }
    

    请注意,以上代码仅是示例,并未考虑实际的硬件连接和具体的定时器设置,例如定时器的工作方式、计时频率、中断处理函数等。具体的实现细节可能因硬件环境和需求而有所不同,请根据实际情况进行调整。

    如果您对AT89S52单片机的编程不熟悉或者没有相应的硬件环境和调试工具,建议您参考相关的开发文档和资料,或者咨询专业的嵌入式开发人员来获取更准确的指导和支持。

你有什么问题吗