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

二:按键输入监测电路:

三:软件代码如下:
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实现驱动蜂鸣器,可使用调节脉宽的方式,从而发出不同的音效。
我要赚赏金
