当前位置:   article > 正文

51单片机实现按键提示音_51单片机按键控制蜂鸣器程序

51单片机按键控制蜂鸣器程序

目录

1.  蜂鸣器

 1.1 无源蜂鸣器驱动方式

 2.实现独立按键音(无源蜂鸣器)

2.1 Buzzer.h

2.2 IndKey.h 独立按键模块

 2.3 DigitalTube.h 数码管模块

 2.4 Delay.h 延时模块

2.5 main() 主函数入口


 

1.  蜂鸣器

         蜂鸣器(Buzzer)是一种将电信号转换为声音的器件,由电信号的周期性脉冲产生震动频率,可以用来产生设备的按键音、报警音等提示信号

    蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器

  • 有源蜂鸣器:内部自带振荡源,通上直流电压即可产生固定频率,持续发声。

  • 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发生震动,进而发                                    声,调整提供振荡脉冲的频率,可发出不同频率的声音

 1.1 无源蜂鸣器驱动方式

(1)三极管启动:三极管可通过根据PN结原理做成的NPN、PNP用小电流控制大电流,完成驱动功能

 

 (2)集成电路驱动:通过ULN2003D芯片驱动P25输入电平到BEEP完成驱动功能。

        单片机上蜂鸣模块就是无源Buzzer。

 2.实现独立按键音(无源蜂鸣器)

2.1 Buzzer.h

  1. #include <REGX52.H>
  2. #include <INTRINS.H>
  3. #include "Delay.h"
  4. sbit Buzzer_sbit = P2^5;//操作P25口
  5. /*以1000hz响xms毫秒*/
  6. void Buzzer_Time(unsigned int xms)
  7. {
  8. xms = 2*xms;//500us循环一次,循环2次为1ms
  9. while(xms--)
  10. {
  11. Buzzer_sbit=!Buzzer_sbit;
  12. Delay_500us(1);
  13. }
  14. }

2.2 IndKey.h 独立按键模块

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. #include "Buzzer.h"
  4. /*返回按下的按键,否则返回0,按下同时有提示音*/
  5. unsigned char getIndKey()
  6. {
  7. unsigned char Key = 0;
  8. if(P3_1 == 0) {Delay_ms(20);while(P3_1 == 0);Delay_ms(20);Key = 1;Buzzer_Time(100);}
  9. if(P3_0 == 0) {Delay_ms(20);while(P3_0 == 0);Delay_ms(20);Key = 2;Buzzer_Time(100);}
  10. if(P3_2 == 0) {Delay_ms(20);while(P3_2 == 0);Delay_ms(20);Key = 3;Buzzer_Time(100);}
  11. if(P3_3 == 0) {Delay_ms(20);while(P3_3 == 0);Delay_ms(20);Key = 4;Buzzer_Time(100);}
  12. return Key;
  13. }

 2.3 DigitalTube.h 数码管模块

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  4. /*在第loc个数码管显示num*/
  5. void DigitalTube(unsigned char loc,num) {
  6. switch(loc)
  7. {
  8. case 1: P2_4 = 1;P2_3 = 1;P2_2 = 1;break;
  9. case 2: P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
  10. case 3: P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
  11. case 4: P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
  12. case 5: P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
  13. case 6: P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
  14. case 7: P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
  15. case 8: P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
  16. }
  17. P0 = NixieTable[num];
  18. }

 2.4 Delay.h 延时模块

  1. #include <INTRINS.H>
  2. void Delay1ms() //@11.0592MHz
  3. {
  4. unsigned char i, j;
  5. _nop_();
  6. i = 2;
  7. j = 199;
  8. do
  9. {
  10. while (--j);
  11. } while (--i);
  12. }
  13. void Delay500us() //@11.0592MHz
  14. {
  15. unsigned char i;
  16. _nop_();
  17. i = 227;
  18. while (--i);
  19. }
  20. void Delay_ms(unsigned int xms)
  21. {
  22. while(xms--) Delay1ms();
  23. }
  24. void Delay_500us(unsigned int x500us)
  25. {
  26. while(x500us--) Delay500us();
  27. }

2.5 main() 主函数入口

  1. #include <REGX52.H>
  2. #include "IndKey.h"
  3. #include "DigitalTube.h"
  4. unsigned char num;
  5. void main()
  6. {
  7. DigitalTube(1,0);
  8. while(1)
  9. {
  10. num = getIndKey();
  11. if(num)//如果按键按下
  12. {
  13. DigitalTube(1,num);
  14. }
  15. }
  16. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/1007064
推荐阅读
相关标签
  

闽ICP备14008679号