Linuxwilliam hill官网
直播中

12cszheng

9年用户 8经验值
擅长:MEMS/传感技术 EMC/EMI设计 存储技术 接口/总线/驱动 控制/MCU
私信 关注
[资料]

按键控制蜂鸣器(嵌入式应用程序)

今天又看了看mini2440开发板用户手册上应用开发里的一些例程,就自己花了点时间把其中的测试按键和PWM  控制蜂鸣器这两个程序综合了一下,写一个按键控制蜂鸣器的程序。
实现效果如下:
QQ截图20150327234649.png

代码如下:
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include time.h>
  11. #include
  12. #define PWM_IOCTL_STOP 2
  13. #define PWM_IOCTL_SET_FREQ  1
  14. static int fd = -1;  //定义蜂鸣器的文件标示符
  15. static void close_buzzer(void); //关蜂鸣器
  16. static void open_buzzer(void)//开蜂鸣器
  17. {
  18.         fd = open("/dev/pwm", 0);  //打开蜂鸣器设备
  19.         if (fd < 0) {
  20.            perror("open pwm_buzzer device");
  21.            exit(1);
  22.         }
  23.    // any function exit call will stop the buzzer
  24.         atexit(close_buzzer);  //注册蜂鸣器关闭程序
  25. }
  26. static void close_buzzer(void)
  27. {
  28.         if (fd >= 0) {
  29.           ioctl(fd, PWM_IOCTL_STOP);  //关闭蜂鸣器控制I/O
  30.           close(fd);//关闭设备文件
  31.           fd = -1;
  32.         }
  33. }
  34. static void set_buzzer_freq(int freq)  //由于蜂鸣器是无源的,因此需要PWM控制
  35. {
  36.         // this IOCTL command is the key to set frequency
  37.         int ret = ioctl(fd, PWM_IOCTL_SET_FREQ, freq);  //设置蜂鸣器的pwm
  38.         if(ret < 0) {
  39.         perror("set the frequency of the buzzer");
  40.         exit(1);
  41.         }
  42. }
  43. static void stop_buzzer(void)
  44. {
  45.         int ret = ioctl(fd, PWM_IOCTL_STOP); //关闭蜂鸣器控制I/O
  46.         if(ret < 0) {
  47.         perror("stop the buzzer");
  48.         exit(1);
  49.         }
  50. }
  51. //主函数
  52. int main(int argc, char *argv[])
  53. {
  54.         int buttons_fd; //蜂鸣器设备文件标示符
  55.         int freq=1000;  //定蜂鸣器发声频率为1000
  56.         char buttons[6] = {'0', '0', '0', '0', '0', '0'}; //初始六个按键初值
  57.         buttons_fd = open("/dev/buttons", 0);  //打开按键设备
  58.         if (buttons_fd < 0) {
  59.         perror("open device buttons");
  60.         exit(1);
  61.         }
  62.         open_buzzer(); //打开蜂鸣器控制I/O
  63.          for (;;) {                         //函数启动后不断读取按键值,直到有按键按下并释放才会退出
  64.                 char current_buttons[6];
  65.                 int i;
  66.                 //读取按键设备,判断是否有按键按下
  67.                 if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof current_buttons) {
  68.                         perror("read buttons:");
  69.                         exit(1);
  70.                 }

  71.                 for (i = 0; i < sizeof buttons / sizeof buttons[0]; i++) {
  72.                         //如果按键按下,蜂鸣器发声
  73.                          if(buttons[i]!='0') {
  74.                                         set_buzzer_freq(freq);
  75.                                         printf("The key is down.t");
  76.                                         printf( "The buzzer is on.tFreq = %dn", freq );
  77.                                 }
  78.                  //按键释放,蜂鸣器停止,函数退出
  79.                                 else
  80.                                    {
  81.                                     stop_buzzer();
  82.                                     printf("The key is up.tThe buzzer is off.n");
  83.                                     exit(0);
  84.                          }

  85.                 }
  86.         }

  87.         close(buttons_fd);
  88.         return 0;
  89. }



更多回帖

发帖
×
20
完善资料,
赚取积分