查看完整版本: 89S51 音樂盒
頁: [1]

a3812006 發表於 2016-6-15 02:41 PM

89S51 音樂盒

本帖最後由 snowflying 於 2016-6-17 01:43 PM 編輯

大家好,本人因為學校期末要做成品小專題,所以參考網上別人的作品,是一個音樂盒,可以播雨夜花的旋律,但程式碼有錯不知道怎麼辦,所以想請別人幫忙,有人可以幫我看看嗎,謝謝


這是程式碼:
#include <reg51.h>
sbit buzzer = P3^7; // 宣告輸出端
unsigned char i=0; // 宣告變數
unsigned char tone_H, tone_L; // 宣告計時量變數
void beat_125(unsigned char); // 宣告節拍函數
unsigned char code song4[]={2,2,3,5, 6,5,6,7,9,7,7,6,5, 6,
7,9,9,7,9, 5,6,6, 2,7,6,5, 5,
6,6,7,6,5, 3,2,3,5, 3,5,6,7, 9,
9,9,10,9,7, 7,6,5,3, 2,7,7,6,5, 5, 15};
unsigned char code beat4[]={12,4,8,8, 8,4,4,16, 12,4,4,8, 32,
12,4,8,4,4, 12,4,16, 12,4,8,4,4, 32,
12,4,8,4,4, 8,4,4,16, 12,8,8,8, 32,
12,4,8,4,4, 8,4,4,16, 12,4,8,4,4, 32,};
// ========主程式 ===============
main()
{ buzzer=1; // 蜂鳴器初始值
IE=0x82; // 啟用Timer 0
TMOD=0x01; // 設定MODE1
while(song4!=15) // while迴圈開始
{ TH0=tone_H=(65536-tone_H])/256; //填入音階計數量之高八位元
TL0= tone_L=(65536-tone_L]) % 256;//填入音階計數量之低八位元
TR0=1; // 啟動Timer 0
beat_125(beat4); // 指定節拍
i++; // 下一個音
TR0=0; // 關閉T0停止播放
buzzer=1; // 蜂鳴器不動作
} // 結束播放
} // 主程式結束
//====Timer 0中斷副程式==================
void tone_timer(void) interrupt 1 // Timer 0中斷副程式開始
{ TH0=tone_H; // 填入計時量之高八位元
TL0=tone_L; // 填入計時量之低八位元
buzzer=~buzzer; // 蜂鳴器反相輸出
} // 結束中斷副程式
//====節拍函數==================
void beat_125(unsigned char x) // 節拍函數開始
{ unsigned char i,j,k; // 宣告變數
for (i=0;i<x;i++) // i迴圈
for (j=0;j<125;j++) // j迴圈
for (k=0;k<120;k++); // k迴圈
} // 結束節拍函數

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

johnwanz 發表於 2016-6-16 09:21 AM

第四行:  unsigned char tone_H, tone_L; // 宣告計時量變數
第20行: TH0=tone_H=(65536-tone_H)/256;

tone_H有Array?

a3812006 發表於 2016-6-16 02:36 PM

第20,21行應該都是tone

a3812006 發表於 2016-6-16 02:38 PM

johnwanz 發表於 2016-6-16 09:21 AM static/image/common/back.gif
第四行:  unsigned char tone_H, tone_L; // 宣告計時量變數
第20行: TH0=tone_H=(65536-tone_H)/25 ...

第20,21行應該都是tone

a3812006 發表於 2016-6-16 02:46 PM

johnwanz 發表於 2016-6-16 09:21 AM static/image/common/back.gif
第四行:  unsigned char tone_H, tone_L; // 宣告計時量變數
第20行: TH0=tone_H=(65536-tone_H)/25 ...

我程式碼有改過了 可以執行 但不知道對不對 可以幫我看看嗎
#include <reg51.h>
sbit buzzer = P3^7; // 宣告輸出端
unsigned char i=0; // 宣告變數
unsigned char tone_H, tone_L; // 宣告計時量變數
void beat_125(unsigned char); // 宣告節拍函數
const unsigned char tone[];
unsigned char code song4[]={2,2,3,5, 6,5,6,7,9,7,7,6,5, 6,
7,9,9,7,9, 5,6,6, 2,7,6,5, 5,
6,6,7,6,5, 3,2,3,5, 3,5,6,7, 9,
9,9,10,9,7, 7,6,5,3, 2,7,7,6,5, 5, 15};
unsigned char code beat4[]={12,4,8,8, 8,4,4,16, 12,4,4,8, 32,
12,4,8,4,4, 12,4,16, 12,4,8,4,4, 32,
12,4,8,4,4, 8,4,4,16, 12,8,8,8, 32,
12,4,8,4,4, 8,4,4,16, 12,4,8,4,4, 32,};
// ========主程式 ===============
main()
{ buzzer=1; // 蜂鳴器初始值
IE=0x82; // 啟用Timer 0
TMOD=0x01; // 設定MODE1
while(song4!=15) // while迴圈開始
{ TH0=tone_H=(65536-tone])/256; //填入音階計數量之高八位元
TL0= tone_L=(65536-tone]) % 256;//填入音階計數量之低八位元
TR0=1; // 啟動Timer 0
beat_125(beat4); // 指定節拍
i++; // 下一個音
TR0=0; // 關閉T0停止播放
buzzer=1; // 蜂鳴器不動作
} // 結束播放
return 0 ;
} // 主程式結束
//====Timer 0中斷副程式==================
void tone_timer(void) interrupt 1 // Timer 0中斷副程式開始
{ TH0=tone_H; // 填入計時量之高八位元
TL0=tone_L; // 填入計時量之低八位元
buzzer=~buzzer; // 蜂鳴器反相輸出
} // 結束中斷副程式
//====節拍函數==================
void beat_125(unsigned char x) // 節拍函數開始
{ unsigned char i,j,k; // 宣告變數
for (i=0;i<x;i++) // i迴圈
for (j=0;j<125;j++) // j迴圈
for (k=0;k<120;k++); // k迴圈
} // 結束節拍函數...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

a3812006 發表於 2016-6-16 03:46 PM

請問為什麼我的揚聲器沒有聲音?是程式問題嗎?

a3812006 發表於 2016-6-16 09:04 PM

我一直再改程式,為什麼揚聲器都沒有聲音?程式哪裡有問題嗎?有人可以幫我看看嗎?
#include <reg51.h>
sbit buzzer = P3^7; // 宣告輸出端
unsigned char i=0; // 宣告變數
unsigned char tone_H, tone_L; // 宣告計時量變數
void beat_125(unsigned char); // 宣告節拍函數
unsigned int code tone[]={ 1012, 956, 852, 759, 716, 638,
568, 506, 478, 426, 379, 1136, 1276, 10 };//音階定義
unsigned char code song4[]={2,2,3,5, 6,5,6,7,9,7,7,6,5, 6,
7,9,9,7,9, 5,6,6, 2,7,6,5, 5,
6,6,7,6,5, 3,2,3,5, 3,5,6,7, 9,
9,9,10,9,7, 7,6,5,3, 2,7,7,6,5, 5, 15};
unsigned char code beat4[]={12,4,8,8, 8,4,4,16, 12,4,4,8, 32,
12,4,8,4,4, 12,4,16, 12,4,8,4,4, 32,
12,4,8,4,4, 8,4,4,16, 12,8,8,8, 32,
12,4,8,4,4, 8,4,4,16, 12,4,8,4,4, 32};

// ========主程式 ===============
void main()
{ buzzer=1; // 蜂鳴器初始值
IE=0x82; // 啟用Timer 0
TMOD=0x01; // 設定MODE1
while(song4!=15) // while迴圈開始
{ TH0=tone_H=(65536-tone])/256; //填入音階計數量之高八位元
TL0= tone_L=(65536-tone])%256;//填入音階計數量之低八位元
TR0=1; // 啟動Timer 0
beat_125(beat4); // 指定節拍
i++; // 下一個音
TR0=0; // 關閉T0停止播放
}
buzzer=1; // 蜂鳴器不動作
// 結束播放
} // 主程式結束
//====Timer 0中斷副程式==================
void tone_timer(void) interrupt 1 // Timer 0中斷副程式開始
{ TH0=tone_H; // 填入計時量之高八位元
TL0=tone_L; // 填入計時量之低八位元
buzzer=~buzzer; // 蜂鳴器反相輸出
} // 結束中斷副程式
//====節拍函數==================
void beat_125(unsigned char x) // 節拍函數開始
{ unsigned char i,j,k; // 宣告變數
for (i=0;i<x;i++) // i迴圈
for (j=0;j<125;j++) // j迴圈
for (k=0;k<120;k++); // k迴圈
} // 結束節拍函數...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

西岸的来打酱油 發表於 2016-6-18 06:40 AM

a3812006 發表於 2016-6-16 03:46 PM static/image/common/back.gif
請問為什麼我的揚聲器沒有聲音?是程式問題嗎?

揚聲器有沒有通過三極管驅動?
還是MCU引腳直接驅動?
MCU本身的驅動能力是不足的。

a3812006 發表於 2016-6-18 10:49 PM

西岸的來打醬油 發表於 2016-6-18 06:40 AM static/image/common/back.gif
揚聲器有沒有通過三極管驅動?
還是MCU引腳直接驅動?
MCU本身的驅動能力是不足的。 ...

揚聲器接了一個PNP三極管 可是聲音很小
但接了第二個之後揚聲器沒聲了

a3812006 發表於 2016-6-18 10:50 PM

西岸的來打醬油 發表於 2016-6-18 06:40 AM static/image/common/back.gif
揚聲器有沒有通過三極管驅動?
還是MCU引腳直接驅動?
MCU本身的驅動能力是不足的。 ...

我參考網上的PNP多級電路接法,可是沒聲<br><br><br><br><br><div></div>

西岸的来打酱油 發表於 2016-6-19 02:50 AM

a3812006 發表於 2016-6-18 10:50 PM static/image/common/back.gif
我參考網上的PNP多級電路接法,可是沒聲

聽起來似乎是電路問題
試試這樣

先不用你的程式,寫一段小程式利用定時器中斷令P3^7輸出2kHz的脈衝,正常的話蜂鳴器會響。
如果不響,可檢查:
1、三極管引腳有沒有接錯
2、用電壓表測蜂鳴器兩端有無電壓
請問樓主有沒有示波器?
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

a3812006 發表於 2016-6-21 09:06 PM

西岸的來打醬油 發表於 2016-6-19 02:50 AM static/image/common/back.gif
聽起來似乎是電路問題
試試這樣



謝謝 有聲音了 好像是電路問題
頁: [1]