
No.1ベストアンサー
- 回答日時:
圧電ブザーは他励式だと仮定して書かせてもらいます。
音は、圧電ブザーのON/OFFで出すことが可能ですが、周波数(音階)は1秒間に何回ON/OFFを繰り返せるかで周波数が決まります。例えば、周波数800Hzは、1秒にONとOFFを1組として800組繰り返します。
ようは、ONとOFFの時間が可変長な関数を作ってやれば色々な周波数を出すことができます。
[参考関数]
void sound( int time, int count )
{
int loop;
// 残り時間だけループを繰り返す。
for( ; time>0 ; time-=(count*2) ) {
// 圧電ブザーをONにする。ON時間はcountで決まる。
for( loop=0 ; loop<count ; loop++ ) {
圧電ブサーのポートをONに。
}
// 圧電ブザーをOFFにする。OFF時間はcountで決まる。
for( loop=0 ; loop<count ; loop++ ) {
圧電ブサーのポートをOFFに。
}
}
}
[説明]
timeでなり続ける時間を指定します。
countでON/OFFの周期を指定します。大きな数字ほど周波数が低くなります。0は音が鳴りません。
C言語だとアセンブラほど高速にON/OFFを繰り返せないので、アセンブラに比べると出せる周波数は低めになるかと思います。いろんな値を入れて実際にどんな音するか試してみてください。
それとこのプログラムはCPUを占有しますので、音を鳴らしながら平行して処理をしたい場合は、タイマー割り込みでブザーをON/OFFする方式に変更しないと実用性が低いかもしれません。
この回答への補足
対応ありがとうございます。
この記述は、CCS社のCコンパイラーに対応しているのでしょうか?
PIC用に動かしたいのですが、上記の記述は音を鳴らすことが出来ますか?
No.2
- 回答日時:
実はPICはアセンブラ専門でC言語もフリーの物しか使ったことがありません。
CCS社のCコンパイラが使ったことが無いので断言は出来ませんが一般のC言語としては問題ない書き方をしました。不安があるとすれば、intの値の範囲で十分に音階を制御できるかどうかですね。intで足りなければlongにする必要があります。
それとmain関数や圧電ブサーのポートをON/OFFの部分は書いてありませんので付け加えをお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラム言語
-
ライン数とステップ数の違いは?
-
PIC16F84AのデバイスでC言語を...
-
【H8マイコン】HEWで埋め込みア...
-
PICはアセンブラとC言語のどち...
-
素数を求めるプログラム(アセン...
-
データコピー
-
アセンブラからC言語に変換する...
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
一般のソフトで画像を扱う場合...
-
PIC16F1シリーズマイコンのNCO...
-
C言語で128bitの2進数のビット...
-
非常に限定された条件での8バイ...
-
CPUは何故、16bit→32bit→64bit...
-
トリムレジスタ
-
PICでUSARTのフレーミングエラ...
-
SRAMとレジスタの違いは何でし...
-
文字参照は10進数と16進数では...
-
信号のビット数制限、って出来...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラム言語
-
ライン数とステップ数の違いは?
-
アセンブラからC言語に変換する...
-
アセンブラ言語がわかりません。
-
実行ファイルからソースはみれる?
-
このアセンブラの意味を教えて...
-
アセンブラのコマンドについて
-
PICに書き込むプログラムや変数...
-
アセンブラのLA
-
アセンブラwordという単位
-
アセンブラの実行速度
-
Windowsはオープンソースですか?
-
バイナリの実行ファイルをgccを...
-
void __cdeclなど_
-
MPLAB IDE v8.92アセンブラにつ...
-
ArduinoIDEのコンパイル結果の表示
-
GASの入門書
-
アセンブラ言語で
-
アセンブラで割り算
-
アセンブラのリンカのダウンロ...
おすすめ情報