原創(chuàng)作品,禁止轉(zhuǎn)載售賣,僅供學習參考!!!
仿真目的和要求: (1) 進一步熟悉定時/計數(shù)器的應用 (2) 讓單片機放個音樂聽聽 項目內(nèi)容: (1) 選定一首歌,下載歌譜,按照音調(diào)和節(jié)拍生成數(shù)據(jù)格式,用蜂鳴器播放。 (2) 按鍵定義鋼琴的鍵盤,按下按鍵可以發(fā)出不同的聲音,可以彈奏簡單的曲調(diào)。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
屏幕截圖 2023-12-25 200602.png (310.13 KB, 下載次數(shù): 22)
下載附件
Proteus
2023-12-25 20:07 上傳
屏幕截圖 2023-12-25 200648.png (291.46 KB, 下載次數(shù): 15)
下載附件
部分代碼截圖
2023-12-25 20:07 上傳
單片機源程序如下:- #include <REGX52.H>
- sbit beep = 0xA6;
- unsigned int num = 0;
- unsigned char number = 1;//歌曲序號
- unsigned char time = 0;//節(jié)拍時間,第三個數(shù)
- unsigned char fre_num ;
- unsigned char sign = 0;
- unsigned char flag = 1;
- //簡單愛
- unsigned char code music[]={
- 5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1,
- 4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1,
- 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1,
- 3,2,1, 3,2,1, 1,2,1, 5,2,1, 1,2,1, 5,2,1, 1,2,1, 7,1,1, 1,2,1, 1,2,1, 6,1,1,
- 2,2,1, 2,2,1, 3,2,1, 3,2,1, 5,2,1, 5,2,1,
- 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2,
- 5,1,1, 1,2,1, 2,1,2, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1,
- 4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1,
- 5,2,1, 5,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1,
- 3,2,1, 3,2,1, 1,2,2, 5,2,1, 1,2,1, 5,2,1, 5,2,1, 7,1,1, 1,2,1, 0,0,0 };
- // 頻率-半周期數(shù)據(jù)表 高八位 共保存了四個八度的28個頻率數(shù)據(jù)
- unsigned char code NOTEH[]={
- 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
- // 頻率-半周期數(shù)據(jù)表 低八位
- unsigned char code NOTEL[]={
- 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 Delay(unsigned char t) //延時子函數(shù),控制發(fā)音的時間長度,每個節(jié)拍0.4S
- {
- unsigned char t1;
- unsigned long t2;
- for (t1 = 0; t1 < t; t1++) //嵌套循環(huán), 共延時t個半拍
- {
- for (t2 = 0; t2 < 8000; t2++) //延時期間, 可進入T0中斷去發(fā)音
- {
- ;
- }
- }
- TR0 = 0; //關(guān)閉T0, 停止發(fā)音
- }
- void Delay20ms() //@11.0592MHz
- {
- unsigned char i, j, k;
-
- i = 1;
- j = 216;
- k = 35;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
-
- void ONE() //演奏一個音符
- {
- beep = !beep;
- TH0 = NOTEH[fre_num];
- TL0 = NOTEL[fre_num];
- TR0 = 1;
- Delay(time);
- }
- void PlayMusic() //播放相應歌曲的某個音符
- {
- if(sign == 1)
- {
- if ((number == 1) && (flag == 1))
- {
- fre_num = music[num] + 7 * music[num + 1] - 1; //第i個是音符,第i+1個是第幾個八度
- time = music[num + 2]; //讀出時間長度數(shù)值
- num += 3;
- if (fre_num < 0)
- {
- num = 0;
- number = 1;
- }
- ONE(); //發(fā)出一個音符
-
- }
-
-
- }
- sign = 0;
- beep = 1;
-
-
- }
- unsigned char key_scan()
- {
- unsigned char KeyNumber = 0;
-
- P1 = 0xff;
- P1_0 = 0;
- if(P1_4 == 0){Delay20ms();while(P1_4 == 0);KeyNumber = 1;}
- if(P1_5 == 0){Delay20ms();while(P1_5 == 0);KeyNumber = 2;}
- if(P1_6 == 0){Delay20ms();while(P1_6 == 0);KeyNumber = 3;}
- if(P1_7 == 0){Delay20ms();while(P1_7 == 0);KeyNumber = 4;}
-
- P1 = 0xff;
- P1_1 = 0;
- if(P1_4 == 0){Delay20ms();while(P1_4 == 0);KeyNumber = 5;}
- if(P1_5 == 0){Delay20ms();while(P1_5 == 0);KeyNumber = 6;}
- if(P1_6 == 0){Delay20ms();while(P1_6 == 0);KeyNumber = 7;}
- if(P1_7 == 0){Delay20ms();while(P1_7 == 0);KeyNumber = 8;}
-
- P1 = 0xff;
-
- return KeyNumber;
- }
- unsigned char ss ;
- void Key()
- {
-
- ss = key_scan();
- if(ss == 1)
- {
- beep = !beep;
- TH1 = NOTEH[8];
- TL1 = NOTEL[8];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 2)
- {
- beep = !beep;
- TH1 = NOTEH[9];
- TL1 = NOTEL[9];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 3)
- {
- beep = !beep;
- TH1 = NOTEH[10];
- TL1 = NOTEL[10];
- TR1 = 1;
- Delay(1);
- beep = 0;
-
- }
- if(ss == 4)
- {
- beep = !beep;
- TH1 = NOTEH[11];
- TL1 = NOTEL[11];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 5)
- {
- beep = !beep;
- TH1 = NOTEH[12];
- TL1 = NOTEL[12];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 6)
- {
- beep = !beep;
- TH1 = NOTEH[13];
- TL1 = NOTEL[13];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 7)
- {
- beep = !beep;
- TH1 = NOTEH[14];
- TL1 = NOTEL[14];
- TR1 = 1;
- Delay(1);
- beep = 0;
-
- }
-
-
- }
- void time0() interrupt 1
- {
- if(sign == 1)
- {
- beep = !beep;
- TH0 = NOTEH[fre_num];
- TL0 = NOTEL[fre_num];
- TR0 = 1;
-
-
- }
- }
- void main()
- {
- TMOD = 0x11;
- ET0 = 1;
- EA = 1;
- beep = 1;
-
- while(1)
- {
- PlayMusic();
- if(ss == 8)
- {
- sign = 1;
- }
- else
- Key();
- }
- }
復制代碼 程序有問題 求幫助:
音樂播放器.7z
(142.61 KB, 下載次數(shù): 35)
2023-12-26 02:08 上傳
點擊文件名下載附件
|