伊莉討論區

標題: 89S51 音樂盒 [打印本頁]

作者: a3812006    時間: 2016-6-15 02:41 PM     標題: 89S51 音樂盒

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

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

這是程式碼:
#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[song4])/256; //填入音階計數量之高八位元
TL0= tone_L=(65536-tone_L[song4]) % 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迴圈
} // 結束節拍函數


作者: johnwanz    時間: 2016-6-16 09:21 AM

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

tone_H有Array?
作者: a3812006    時間: 2016-6-16 02:36 PM

第20,21行應該都是tone[song4]
作者: a3812006    時間: 2016-6-16 02:38 PM

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

第20,21行應該都是tone[song4]
作者: a3812006    時間: 2016-6-16 02:46 PM

johnwanz 發表於 2016-6-16 09:21 AM
第四行:  unsigned char tone_H, tone_L; // 宣告計時量變數
第20行: TH0=tone_H=(65536-tone_H[song4])/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[song4])/256; //填入音階計數量之高八位元
TL0= tone_L=(65536-tone[song4]) % 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迴圈
} // 結束節拍函數
作者: 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[i]!=15) // while迴圈開始
{ TH0=tone_H=(65536-tone[song4[i]])/256; //填入音階計數量之高八位元
TL0= tone_L=(65536-tone[song4[i]])%256;//填入音階計數量之低八位元
TR0=1; // 啟動Timer 0
beat_125(beat4[i]); // 指定節拍
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迴圈
} // 結束節拍函數
作者: 西岸的来打酱油    時間: 2016-6-18 06:40 AM

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

揚聲器有沒有通過三極管驅動?
還是MCU引腳直接驅動?
MCU本身的驅動能力是不足的。
作者: a3812006    時間: 2016-6-18 10:49 PM

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

揚聲器接了一個PNP三極管 可是聲音很小
但接了第二個之後揚聲器沒聲了
作者: a3812006    時間: 2016-6-18 10:50 PM

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

我參考網上的PNP多級電路接法,可是沒聲
作者: 西岸的来打酱油    時間: 2016-6-19 02:50 AM

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

聽起來似乎是電路問題
試試這樣
[attach]114736874[/attach]
先不用你的程式,寫一段小程式利用定時器中斷令P3^7輸出2kHz的脈衝,正常的話蜂鳴器會響。
如果不響,可檢查:
1、三極管引腳有沒有接錯
2、用電壓表測蜂鳴器兩端有無電壓
請問樓主有沒有示波器?

作者: a3812006    時間: 2016-6-21 09:06 PM

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

謝謝 有聲音了 好像是電路問題




歡迎光臨 伊莉討論區 (http://1.eyny.com/) Powered by Discuz!