这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 学习AI8051开发板例程:17AI8051使用PWM+输入按键驱动无源蜂鸣器功

共1条 1/1 1 跳转至

学习AI8051开发板例程:17AI8051使用PWM+输入按键驱动无源蜂鸣器功能

高工
2025-12-17 20:02:37     打赏

    在之前的帖子中,分享了AI8051输出PWM的方式,今天和大家分享一下使用PWM驱动板载的蜂鸣器功能。

一:蜂鸣器原理图:

17-1.png

二:按键输入监测电路:

17-2.png

三:软件代码如下:

3.1 按键的监测:

void IO_KeyScan(void)    //50ms call
{
    u8  j;

    j = IO_KeyState1;   //保存上一次状态

    P0 = 0xf0;  //X低,读Y
    IO_KeyDelay();
    IO_KeyState1 = P0 & 0xf0;

    P0 = 0x0f;  //Y低,读X
    IO_KeyDelay();
    IO_KeyState1 |= (P0 & 0x0f);
    IO_KeyState1 ^= 0xff;   //取反
    
    if(j == IO_KeyState1)   //连续两次读相等
    {
        j = IO_KeyState;
        IO_KeyState = IO_KeyState1;
        if(IO_KeyState != 0)    //有键按下
        {
            F0 = 0;
            if(j == 0)  F0 = 1; //第一次按下
            else if(j == IO_KeyState)
            {
                if(++IO_KeyHoldCnt >= 20)   //1秒后重键
                {
                    IO_KeyHoldCnt = 18;
                    F0 = 1;
                }
            }
            if(F0)
            {
                j = T_KeyTable[IO_KeyState >> 4];
                if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0)) 
                    KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16;    //计算键码,17~32
            }
        }
        else    IO_KeyHoldCnt = 0;
    }
    P0 = 0xff;
}

3.2 PWM的初始化:

    PWMB_CCER1 = 0x00;  //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMB_CCMR1 = 0x30;  //通道模式配置,翻转模式
    PWMB_CCER1 = 0x01;  //配置通道输出使能和极性

    PWMB_ARRH = 0x07;   //设置周期时间
    PWMB_ARRL = 0xff;

    PWMB_ENO = 0x01;    //PWM5使能输出
    PWMB_PS = 0x03;     //高级 PWM 通道输出脚选择位, P50

    PWMB_BKR = 0x80;    //使能主输出
    PWMB_CR1 |= 0x01;   //开始计时

3.3 主函数如下所示:

        if(B_1ms)   //1ms到
        {
            B_1ms = 0;
            if(++cnt50ms >= 50)     //50ms扫描一次行列键盘
            {
                cnt50ms = 0;
                IO_KeyScan();
            }
            
            if(KeyCode > 0)     //有键按下
            {
                PWMB_ENO = 0x01;    //PWM5使能输出
                delay_ms(250);
                PWMB_ENO = 0x00;    //PWM5关闭输出
                KeyCode = 0;
            }
        }

可见,使用PWM实现驱动蜂鸣器,可使用调节脉宽的方式,从而发出不同的音效。




关键词: AI8051     驱动     蜂鸣器    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]