1:首先是蜂鸣器

         蜂鸣器简单发生很简单,P0-6给1就响,重点是ULN2003,看小蜜蜂的视频得知这是达林顿管,见上图,最主要的就是达林顿管内加了非门,输入与输出反向;

        但是在写程序的时候要注意,蜂鸣器给电之后,延时一段时间,要断电即给0;不然会一直响,继电器也应该同理。

2:然后就是继电器

        继电器的简单操作跟蜂鸣器一样简单,P04给1就吸合,最主要的还是达林顿管的部分,输入与输出反向。同时也并联着一个led灯,用于限流和显示继电器吸合情况。

     3:最后总结,考验的还是关于继电器的配置

4:代码例子:

#include <REGX52.H>

sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;

//首先是初始化。用switch语句选择
void registerr(unsigned char x)  //寄存器选择
{
    switch(x)
    {
        case 4 :{HC138_A=0;HC138_B=0;HC138_C=1;}break;//Y4C为1
        case 5 :{HC138_A=1;HC138_B=0;HC138_C=1;}break;//Y5c为1
    }
}


void delay(unsigned int t)  //延时函数
{
    int i,j;
    for(i=0;i<t;i++)
    for(j=0;j<110;j++);
}

void led_run()//亮灯
{    
    unsigned char i;
    for(i=0;i<5;i++)
    {
        P0=0xff;
        delay(1000);
        P0=0x00;
        delay(1000);
    }
}
void buzzer()  //蜂鸣器
{
    P0=0x40;
    delay(1000);
    P0=0x00;
}

void relay()  //继电器
{
    P0=0x10;
    delay(1000);
    P0=0x00;
    delay(1000);
}

void main()  //主函数
{
    unsigned char i;
    P0=0x00;
    
    while(1)
    {
        registerr(4);
        led_run();
        registerr(5);
        for(i=0;i<3;i++)
        {
            buzzer();
            delay(10000);
        }
        for(i=0;i<3;i++)
        {
            relay();
            delay(10000);
        }
    }
}

        5:代码现象:

一排灯亮三次,再到蜂鸣器响三次,再到继电器吸合三次

6:不足

在上电时蜂鸣器会响,在主函数的一开始就把P0赋为0,还是会响;

2025-2-26:改进了一点,再程序里面加入一个close函数,用来关闭蜂鸣器,但是还是有不足,不知为何他有时候还是会响,有时候就能成功。

2025-3-21 一上电就会响,已经解决了,只需要在main函数的外面打开蜂鸣器寄存器,再给p0赋值00就可以了

 

 

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐