- ベストアンサー
PIC16F84AのデバイスでC言語を用いて音を出したい
PIC16F84AデバイスでCCS社のCコンパイラーを用いて音を出したいのですが、C言語の記述が分かりません。 音は、圧電ブザーで、Bポートの1つを使います。 Aポートの1つにスイッチを取り付け、スイッチが入ったら、音を鳴らしたいのですが、C言語で音階が記述できるんでしょうか? 簡単で良いので、C言語で、音を鳴らす記述を教えていただけないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
圧電ブザーは他励式だと仮定して書かせてもらいます。 音は、圧電ブザーの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する方式に変更しないと実用性が低いかもしれません。
その他の回答 (1)
- zwi
- ベストアンサー率56% (730/1282)
実はPICはアセンブラ専門でC言語もフリーの物しか使ったことがありません。CCS社のCコンパイラが使ったことが無いので断言は出来ませんが一般のC言語としては問題ない書き方をしました。 不安があるとすれば、intの値の範囲で十分に音階を制御できるかどうかですね。intで足りなければlongにする必要があります。 それとmain関数や圧電ブサーのポートをON/OFFの部分は書いてありませんので付け加えをお願いします。
補足
対応ありがとうございます。 この記述は、CCS社のCコンパイラーに対応しているのでしょうか? PIC用に動かしたいのですが、上記の記述は音を鳴らすことが出来ますか?