程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> Micro2440/Mini2440 linux下蜂鳴(Beep)c程序

Micro2440/Mini2440 linux下蜂鳴(Beep)c程序

編輯:關於C

關鍵字: Micro2440, Mini2440, Beep, 蜂鳴

Micro2440/Mini2440 linux缺省內核中已加入了蜂鳴器支持(見<<micro2440用戶手冊 -2010-6-9.pdf>>P346),因此可以直接通過文件ioctl的方式操作蜂鳴器。

(ls /dev/pwm 存在,則表明你的Micro2440/Mini2440已經有蜂鳴器功能。)

下面的代碼參考了<<micro2440用戶手冊 -2010-6-9.pdf>>

#include <stdio.h> 
#include <termios.h> 
#include <unistd.h> 
#include <stdlib.h> 
 
#define PWM_IOCTL_SET_FREQ 1 
#define PWM_IOCTL_STOP 0          // 注意:<<micro2440用戶手冊 -2010-6-9.pdf>>中, 
                                  //       PWM_IOCTL_STOP定義為2,有誤; 
                                  //       應該與蜂鳴器的內核代碼一致,為0 
 
static int fd = -1; /**< 保存蜂鳴器文件句柄 */ 
 
/** 關閉蜂鳴器 */ 
static void close_buzzer(void) 

    if (fd >= 0)  
    { 
        ioctl(fd, PWM_IOCTL_STOP); 
        close(fd); 
        fd = -1; 
    } 

 
/** 打開蜂鳴器 */ 
static void open_buzzer(void) 

    fd = open("/dev/pwm", 0); 
    if (fd < 0)  
    { 
        perror("open pwm_buzzer device"); 
        exit(1); 
    } 
 
    // any function exit call will stop the buzzer 
    atexit(close_buzzer); 

 
/** 以freq蜂鳴 */ 
static void set_buzzer_freq(int freq) 

    // this IOCTL command is the key to set frequency 
    int ret = ioctl(fd, PWM_IOCTL_SET_FREQ, freq); 
    if(ret < 0) 
    { 
        perror("set the frequency of the buzzer"); 
        exit(1); 
    } 

 
/** 停止蜂鳴 */ 
static void stop_buzzer(void) 

    int ret = ioctl(fd, PWM_IOCTL_STOP); 
    if(ret < 0) 
    { 
        perror("stop the buzzer error.\n"); 
        exit(-1); 
    } 

 
/** 
 * 蜂鳴函數。
 * \param freq 蜂鳴的頻率
 * \param t1 每次蜂鳴持續的時間長度。單位毫秒
 * \param t2 蜂鳴的次數
 * \remark 經測試,./testBeep 3000 2000 3 作為正常情況的蜂鳴效果較好(3k頻率蜂鳴3次,每次2秒)
 *                ./testBeep 3000 500 20 作為失敗告警的蜂鳴效果較好(3k頻率蜂鳴20次,每次0.5秒)
 */ 
static void Beep(int freq, int t1, int t2) 

    printf("freq=%d,each_ms=%d,ntimes=%d\n", freq, t1, t2); 
    open_buzzer(); 
    int i=0; 
    for(i=0; i<t2;++i) 
    { 
        set_buzzer_freq(freq); 
        usleep(t1*100);    //  *100 是經驗值,沒有為啥~ 
        stop_buzzer(); 
        usleep(t1*100);    //  *100 是經驗值,沒有為啥~ 
    } 
    close_buzzer(); 

 
/** 測試程序main */ 
int main(int argc, char **argv) 

    int freq; 
    if(argc >=2) 
    { 
        freq = atoi(argv[1]); 
        if ( freq < 1000 || freq > 20000 ) 
        { 
            freq = 10000; 
        } 
    } 
 
    int each_ms = 500; 
    if(argc >=3) 
    { 
        each_ms = atoi(argv[2]); 
        if ( each_ms < 100 || each_ms > 5000 ) 
        { 
            each_ms = 500; 
        } 
    } 
 
    int times = 0; 
    if(argc >=4) 
    { 
        times = atoi(argv[3]); 
        if ( times < 1 || times > 30 ) 
        { 
            times = 5; 
        } 
    } 
 
    Beep(freq, each_ms, times); 
 
    return 0; 

 
// EasyVCR@csdn, 2012.01.04 

編譯:arm-linux-gcc testBeep.c -o testBeep

摘自 EasyVCR的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved