天天看點

項目實戰:51單片機無線音樂門鈴設計資料 五首歌曲自由切換 (含實物 圖紙 程式 仿真)

無線門鈴又稱無線遙控門鈴或遙控門鈴。無線門鈴是利用超再生無線子產品來實作無線遙控的,無線門鈴不需要布線,安裝簡單靈活,但是傳輸距離受傳輸距離和現場環境影響較大。有線門鈴正好與之相反

包含,程式 實物 圖紙 程式 仿真

課題預期達到的效果:

1、有5首歌曲可以切換,每按一次演唱不同的歌曲。

2、無線傳輸距離10m以上,可以穿牆和門。

3、設計小巧,友善安裝和使用

4、穩定性高,無誤報。

實物圖:

項目實戰:51單片機無線音樂門鈴設計資料 五首歌曲自由切換 (含實物 圖紙 程式 仿真)

原理圖:

項目實戰:51單片機無線音樂門鈴設計資料 五首歌曲自由切換 (含實物 圖紙 程式 仿真)

仿真圖

項目實戰:51單片機無線音樂門鈴設計資料 五首歌曲自由切換 (含實物 圖紙 程式 仿真)

代碼截圖

項目實戰:51單片機無線音樂門鈴設計資料 五首歌曲自由切換 (含實物 圖紙 程式 仿真)

無線音樂門鈴元件清單

1.79萬用闆

2.8Ω0.25w小喇叭

3.DC電源插口

4.自鎖開關

5.12m晶振

6.10k電阻8

7.2.2k電阻

8.30pf電容2

9.10uf電容

10.40腳IC座

11.按鍵2

12.stc89c51

13.315M發射子產品

14.接收子產品

15.2272-M4晶片

16.2262晶片

17.12v電池

18.820k貼片電阻

19.4.7M貼片電阻

20.9012

21.9013

22.導線若幹

23.焊錫若幹

24.23cm長天線*2

25.usb電源線(電池盒+DC插頭)

C語言參考源代碼

//

//51單片機無線遙控門鈴程式

//

#include<REG51.H>

#define sound_amount 5 //歌曲的數量

sbit pause=P2^5; //播放\暫停

sbit speaker=P2^7; //無源蜂鳴器

//

unsigned char timer0h,timer0l,time;//timer0h,timer0l為定時器T0的高低位初值,time為對應的節拍時間

unsigned char music_num,num; //music_num為歌曲編号,music_num=0表示剛開機時的狀态,num是查找歌曲資料表的位址

signed char fre; //對應頻率資料表的位址

bit play_enable; //歌曲播放的使能标志位,用于播放\暫停

void delay(unsigned char t); //延時子函數,控制發音的時間長度

void delayms(unsigned int t); //普通延時子程式,可用于按鍵消抖

void song(void); //演奏一個音符

void music_play(void); //播放歌曲

//

//每三個數字,代表一個音符

//第一個數字是音符的數值1234567之一(第幾個音),代表哆來咪發…

//第二個數字是0123之一,代表低音\中音\高音\超高音(第幾個八度)

//第三個數字是時間長度,以半拍為機關,樂曲資料表的結尾是三個0

//

//《祝你生日快樂》

unsigned char code song1[]={

5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,

5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,

5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,

4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4, 0,0,0};

//《世上隻有媽媽好》

unsigned char code song2[]={

6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1,

//6,2,3代表6,中音,3個半拍;

//5,2,1代表5,中音,1個半拍;

//3,2,2代表3,中音,2個半拍;

//5,2,2代表5,中音,2個半拍;

//1,3,2代表1,高音,2個半拍;

//…

5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1,

3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1, 6,2,1, 3,2,2, 2,2,2,

1,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0};

//《當你孤單你會想起誰》

unsigned char code song3[]={

3,2,2, 3,2,1, 4,2,1, 3,2,2, 2,2,1, 1,2,1, 2,2,2, 5,2,2, 2,2,2, 2,2,3,

1,2,2, 1,2,1, 2,2,1, 1,2,2, 7,1,1, 6,1,1, 7,1,2, 3,2,2, 7,1,2, 7,1,3,

6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,2, 5,1,2, 2,2,1, 3,2,1, 2,2,1,

1,2,1, 6,1,2, 6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 7,1,1, 1,2,6, 0,0,0 };

//《鄉間小路》

unsigned char code song4[]={

3,1,2, 3,1,1, 3,1,1, 6,0,1, 6,0,1, 1,1,2,

6,0,1, 5,0,1, 6,0,4, 6,0,2, 6,0,1 ,6,0,1, 6,0,2, 6,0,1, 1,1,1,

2,1,2, 2,1,1, 3,1,1, 2,1,4, 3,1,1, 3,1,1, 3,1,1, 2,1,1, 4,1,2,

4,1,2, 3,1,2, 2,1,1, 1,1,1, 2,1,4, 7,0,1, 7,0,1, 7,0,1, 6,0,1,

5,0,1, 5,0,1, 6,0,1, 7,0,1, 7,0,1, 6,0,1, 5,0,1, 6,0,4, 6,1,2,

3,1,1, 6,1,1, 7,1,1, 6,1,1, 5,1,1, 5,1,2, 5,1,1, 2,1,1, 5,1,1,

6,1,1, 5,1,1, 4,1,1, 4,1,2, 4,1,1, 3,1,1, 2,1,2, 1,1,1, 2,1,1,

3,1,1, 2,1,1, 1,1,1, 2,1,1, 3,1,4, 6,1,2, 3,1,1, 6,1,1, 7,1,1,

6,1,1, 5,1,1, 5,1,2, 2,1,1, 5,1,1, 6,1,1, 5,1,1, 4,1,1, 0,0,0};

//《送别》

unsigned char code song5[]={

5,1,2, 3,1,3, 5,1,1, 1,2,3, 6,1,2, 1,2,2,

5,1,4, 5,1,2, 1,1,1, 2,1,1, 3,1,2, 2,1,1, 1,1,1, 2,1,4, 5,1,2,

3,1,1, 5,1,1, 1,2,2, 7,1,1, 6,1,2, 1,2,2, 5,1,4, 5,1,2, 2,1,1,

3,1,1, 4,1,2, 7,0,1, 1,1,4, 6,1,2, 1,2,2, 1,2,4, 7,1,2, 6,1,1,

7,1,1, 1,2,4, 6,1,1, 7,1,1, 1,2,1, 6,1,1, 6,1,1, 5,1,1, 3,1,1,

1,1,1, 2,1,8, 5,1,2, 3,1,1, 5,1,1, 1,2,2, 7,1,1, 6,1,2, 1,2,2,

5,1,4, 5,1,2, 2,1,1, 3,1,1, 4,1,2, 7,0,2, 1,1,4, 0,0,0};

// 頻率-半周期資料表 高八位 共儲存了四個八度的28個頻率資料

unsigned char code FREQH[]={

0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567

0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i

0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567

0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567

// 頻率-半周期資料表 低八位

unsigned char code FREQL[]={

0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567

0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i

0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567

0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567

void main(void)

{

TMOD=0x11; //T0 T1 均在工作方式1

ET0=1; //T0開中斷

EA=1; //CPU開中斷

while(1)

{

music_play(); //根據目前狀态播放相應歌曲的某個音符

if(!pause) //暫停鍵處理

{

delayms(5);

if(!pause)

{

if(music_num0) //music_num=0隻有在剛開機,且未按下暫停鍵時存在,表示剛開機時的狀态,按下後從第一首開始播放

{

music_num=1; //歌曲序号置1

num=0; //從頭播放

play_enable=1; //允許播放

}

else

{

play_enable=~play_enable;

speaker=1;

}

while(!pause) //若按着暫停鍵不放手時的處理

{

if(play_enable0){} //如果是暫停,則顯示時間不變//(暫停時play_enable==0)

}

}//暫停鍵處理結束

}//while結束

}

}

void delayms(unsigned int t) //MS延時子程式

{

unsigned int i,j;

for(i=0;i<t;i++)

{

for(j=0;j<123;j++)

;

}

}

void delay(unsigned char t) //延時子函數,控制發音的時間長度,每個節拍0.4S

{

unsigned char t1;

unsigned long t2;

for(t1=0;t1<t;t1++) //嵌套循環, 共延時t個半拍

{

for(t2=0;t2<8000;t2++) //延時期間, 可進入T0中斷去發音

{

;

}

}

TR0=0; //關閉T0, 停止發音

}

void timer0(void) interrupt 1 //T0中斷程式,控制發音的音調

{

speaker=!speaker;//輸出方波, 發音

TH0=timer0h; //下次的中斷時間,這個時間控制音調高低

TL0=timer0l;

}

void song(void) //演奏一個音符

{

TH0=timer0h; //控制音調

TL0=timer0l;

TR0=1; //啟動T0, 由T0輸出方波發音

delay(time); //每個音符的演奏時間

}

void music_play(void)//播放相應歌曲的某個音符

{

if((music_num1)&&(play_enable1))

{

fre=song1[num]+7song1[num+1]-1;//第i個是音符,第i+1個是第幾個八度

timer0h=FREQH[fre]; //從資料表中讀出頻率數值,實際上是定時的時間長度

timer0l=FREQL[fre];

time=song1[num+2]; //讀出時間長度數值

num+=3;

if(fre==-1) //判斷歌曲的結束位,結束後轉到下一首

{

num=0; //下一首從頭播放

music_num=2;

play_enable=0;

}

song(); //發出一個音符

}

if((music_num2)&&(play_enable1))

{

fre=song2[num]+7song2[num+1]-1;

timer0h=FREQH[fre];

timer0l=FREQL[fre];

time=song2[num+2];

num+=3;

if(fre==-1)

{

num=0;

music_num=3;

play_enable=0;

}

song();

}

if((music_num3)&&(play_enable1))

{

fre=song3[num]+7song3[num+1]-1;

timer0h=FREQH[fre];

timer0l=FREQL[fre];

time=song3[num+2];

num+=3;

if(fre==-1)

{

num=0;

music_num=4;

play_enable=0;

}

song();

}

if((music_num4)&&(play_enable1))

{

fre=song4[num]+7song4[num+1]-1;

timer0h=FREQH[fre];

timer0l=FREQL[fre];

time=song4[num+2];

num+=3;

if(fre==-1)

{

num=0;

music_num=5;

play_enable=0;

}

song();

}

if((music_num5)&&(play_enable1))

{

fre=song5[num]+7*song5[num+1]-1;

timer0h=FREQH[fre];

timer0l=FREQL[fre];

time=song5[num+2];

num+=3;

if(fre==-1)

{

num=0;

music_num=1;

play_enable=0;

}

song();

}

}

//程式結束

最後,如果有什麼意見或者建議歡迎您留言給我,讓我們共同學習一起進步,

如果需要 完整代碼或設計檔案,請在下方留言或者私信我,看到後會第一時間回複。

謝謝!

繼續閱讀