久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 29437|回復(fù): 39
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)的電子琴設(shè)計(jì)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:93478 發(fā)表于 2015-10-31 21:49 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
功能如下:
1.通過按鍵能夠發(fā)出相應(yīng)的音符并播放產(chǎn)生樂音,實(shí)現(xiàn)演奏;
2.演奏的同時(shí)可數(shù)字顯示當(dāng)前的音調(diào),利于培養(yǎng)樂感
3.可以選定播放固定樂曲自動(dòng)演奏,演奏時(shí)LED進(jìn)行節(jié)拍指示;
4.在自動(dòng)演奏和奏樂的過程中按停止鍵則中斷演奏;
  5.可以選擇調(diào)節(jié)音或小。
采用stc89c52單片機(jī)作為核心器件,實(shí)現(xiàn)基本的音樂彈奏、音樂播放、音調(diào)顯示和音樂節(jié)拍指示的功能。
1.音樂彈奏:通過程序識(shí)別4x4矩陣鍵盤中按下的鍵的坐標(biāo)(x,y),
然后根據(jù)(x,y)從計(jì)數(shù)初值表中讀取對(duì)應(yīng)的計(jì)數(shù)初值,賦值給定時(shí)器0,定時(shí)器產(chǎn)生對(duì)應(yīng)頻率的方波,達(dá)到播放對(duì)應(yīng)音調(diào)的功能。
2.音樂播放:先建立一個(gè)包含一首音樂的音調(diào)與節(jié)拍的表。其中,音調(diào)就是0x01(低音、do)、0x12(中音、re)、0x23(高音、mi)之類的數(shù);節(jié)拍就是0x02(半拍),0x04(一拍)之類的數(shù)。然后,根據(jù)音調(diào)讀取計(jì)數(shù)初值,再將計(jì)數(shù)初值賦給定時(shí)器T0 -> 開啟定時(shí)器T0 -> 讀取節(jié)拍并延時(shí) -> 關(guān)閉定時(shí)器T0 。這樣就發(fā)出了一個(gè)音,然后再讀下一個(gè)音的初值與節(jié)拍,重復(fù)上一個(gè)操作即可。(具體實(shí)現(xiàn)方法見附錄總程序)
3.數(shù)碼管顯示音調(diào):
① 按鍵:讀出按鍵坐標(biāo)(x,y),用if語句來判斷(x,y)該給數(shù)碼管賦什么值,然后從uchar code num[] 表中讀取這個(gè)值賦給數(shù)碼管(例如P0)。
② 播放歌曲時(shí):讀入音調(diào),根據(jù)音調(diào)的值來判斷num這個(gè)表中的i,再把num賦給P0口。
4.led燈的節(jié)拍指示:采用定時(shí)器1來控制,作為節(jié)拍指示。
①按鍵時(shí):根據(jù)按下的時(shí)長(zhǎng)來控制led的點(diǎn)亮個(gè)數(shù),并且是按一定的時(shí)間間隔逐個(gè)點(diǎn)亮;釋放按鍵時(shí),led燈按一定的時(shí)間間隔逐個(gè)熄滅,從而達(dá)到一種比較簡(jiǎn)單的節(jié)拍指示效果。
②播放音樂時(shí):根據(jù)音符的節(jié)拍,控制點(diǎn)亮到哪一個(gè)燈,在點(diǎn)亮那個(gè)燈之前,前面的燈逐個(gè)等時(shí)距點(diǎn)亮。音符結(jié)束后,led燈全部一起熄滅。這樣,達(dá)到了一個(gè)精確顯示節(jié)拍的效果。
整體結(jié)構(gòu)一一的去攻破,節(jié)拍什么的東西都是在網(wǎng)上直接搜一下就可以找到所要曲子的節(jié)拍和拍子,分享給大家

EEJN`@2E2PDJH6D@$4B}6[R.png (283.98 KB, 下載次數(shù): 273)

EEJN`@2E2PDJH6D@$4B}6[R.png

{17]}C2(G9V}9[[FIZD@I9S.png (86.92 KB, 下載次數(shù): 264)

{17]}C2(G9V}9[[FIZD@I9S.png

68FO9IRVKH6HNTP@8TQI6PG.png (74.37 KB, 下載次數(shù): 455)

68FO9IRVKH6HNTP@8TQI6PG.png

電子琴程序.zip

6.08 KB, 下載次數(shù): 301, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 5黑幣 +70 收起 理由
cai764127922 + 5 共享資料的黑幣獎(jiǎng)勵(lì)!
西瓜味的美年達(dá) + 5 絕世好帖!
s979462478 + 5 贊一個(gè)!
唐宋元明清 + 5 絕世好帖!
admin + 50 共享資料的積分獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂8 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:95100 發(fā)表于 2015-12-5 14:48 來自手機(jī) | 只看該作者
大神,可以把這個(gè)電子琴的代碼給我一下嗎,我下了沒辦法看
回復(fù)

使用道具 舉報(bào)

板凳
ID:93478 發(fā)表于 2015-12-6 09:16 來自手機(jī) | 只看該作者
1246173372 發(fā)表于 2015-12-5 14:48
大神,可以把這個(gè)電子琴的代碼給我一下嗎,我下了沒辦法看


#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

#define allsong 4  //歌曲總數(shù) 按實(shí)際寫

sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;
sbit beep = P3^0;
sbit key_play = P3^1;

uchar x = 0; /*矩陣鍵盤橫坐標(biāo) 從1開始 0為未按下的標(biāo)志 */
uchar y = 0; /*矩陣鍵盤縱坐標(biāo) 從1開始 0為未按下的標(biāo)志 */
uchar flash = 0;//控制led燈顯示的變量 */
uchar f_l;   /*按鍵發(fā)出音調(diào)的初值(低位)*/
uchar f_h; //高位
uchar song_l;/*歌曲音調(diào)的初值(低位)*/
uchar song_h;//高位  

uchar out = 0;/*聲音輸出變量 1表示有輸出 0表示無輸出 */
uchar yindiao;/*音調(diào) 定義為全局變量 為了在播放時(shí)數(shù)碼管能顯示當(dāng)前音調(diào)*/
uchar yindiao_h;//音調(diào)的高四位
uchar yindiao_l;//音調(diào)的低四位
uchar jiepai;/*節(jié)拍(簡(jiǎn)而言之就是一個(gè)音調(diào)響的時(shí)間長(zhǎng)度)*/
uchar song_id = 1;//歌曲序號(hào)變量
uchar temp_id = 1;//歌曲臨時(shí)序號(hào)
uint which = 2;/*簡(jiǎn)譜表里的第幾個(gè)音 從第2個(gè)開始  第0個(gè)用來存曲速,第1個(gè)占位*/
uchar same = 0; /*在暫停時(shí)選了同一首歌曲,用于跳出暫停循環(huán)*/

uchar key_x();  //獲取鍵盤橫坐標(biāo) 函數(shù)
uchar key_y();//獲取鍵盤縱坐標(biāo) 函數(shù)
void play(); //播放歌曲 函數(shù)
void delayms(uint ms);//延時(shí)xx ms 函數(shù)
void delay(uint pai);//節(jié)拍延時(shí) 函數(shù)
void key_check(); //檢查按鍵狀態(tài) 函數(shù)
void display(); //數(shù)碼管顯示對(duì)應(yīng)音調(diào) 函數(shù)
void speak();/*按鍵后 給定時(shí)器0賦對(duì)應(yīng)音調(diào)的初值 從而發(fā)出聲音*/
uchar choose();/*播放狀態(tài)下 選歌函數(shù) 釋放按鍵后才跳出函數(shù),返回歌曲序號(hào)*/
uchar choose2();/*暫停狀態(tài)下 選歌函數(shù) 不用釋放按鍵即可跳出函數(shù),返回歌曲序號(hào) */
void play();//播放歌曲 函數(shù)

uchar code num[]={0x00,//數(shù)碼管段選碼
0x77,0x7c,0x39,0x5e,0x79,0x71,0x3d, //a - g
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //1 - 7
0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87 //1. - 7.
};

uchar code led_table[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};/*發(fā)光二極管閃爍表*/

uchar code chuzhi[]={  //音調(diào)對(duì)應(yīng)的計(jì)數(shù)初值
0xff,0xff,//占0位
0xf8,0x8c,//低1 (0x01)a -數(shù)碼管顯示方式
0xf9,0x5b,//  2 b
0xfa,0x15,//  3 c
0xfa,0x67,//  4 d
0xfb,0x04,//  5 e
0xfb,0x90,//  6 f
0xfc,0x0c,//低7(0x07)g
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*占位 0x08 - 0x0b  (8 - 11)*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,/*占位 0x0c - 0x10(12 - 16)*/
0xfc,0x44,//中1 (0x11)  (17)
0xfc,0xac,//  2
0xfd,0x09,//  3
0xfd,0x34,//  4
0xfd,0x82,//  5
0xfd,0xc8,//  6
0xfe,0x06,//中7 (0x17)  (23)
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*占位 0x18 - 0x1b   (24 - 27)*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*占位 0x1c - 0x20 (28 - 32)*/
0xfe,0x22,//高1 (0x21)1.   (33)
0xfe,0x56,//2 2.
0xfe,0x85,//3 3.
0xfe,0x9a,//4 4.
0xfe,0xc1,//5 5.
0xfe,0xe4,//6 6.
0xff,0x03 //高7 (0x27)7.   (39)
};

uchar code ymt[]={//玉滿堂
0x96,0x00, //曲速 0x96表示 150拍/分
0x00,0x0a,0x05,0x02,0x15,0x02,0x12,0x02,
0x13,0x04,0x13,0x02,0x15,0x02,0x12,0x04,0x12,0x02,0x13,0x02,
0x12,0x10,
0x13,0x04,0x13,0x02,0x12,0x02,0x13,0x04,0x15,0x02,0x16,0x02,
0x15,0x0c,0x13,0x02,0x15,0x02,
0x16,0x04,0x16,0x02,0x21,0x02,0x16,0x04,0x15,0x02,0x13,0x02,
0x15,0x0c,0x15,0x02,0x16,0x02,
0x21,0x04,0x21,0x02,0x22,0x02,0x23,0x04,0x22,0x02,0x21,0x02,
0x22,0x10,
0x23,0x08,0x15,0x02,0x16,0x02,0x21,0x02,0x22,0x02,
0x23,0x04,0x23,0x02,0x22,0x02,0x21,0x06,0x21,0x02,
0x16,0x04,0x16,0x02,0x21,0x02,0x16,0x04,0x13,0x04,
0x15,0x10,
0x16,0x04,0x16,0x02,0x21,0x02,0x16,0x04,0x21,0x02,0x22,0x02,
0x23,0x04,0x23,0x02,0x22,0x02,0x21,0x06,0x21,0x02,
0x16,0x02,0x21,0x02,0x16,0x02,0x21,0x02,0x22,0x02,0x23,0x02,0x25,0x02,0x23,0x02,
0x22,0x0c,0x21,0x02,0x22,0x02,
0x23,0x06,0x15,0x02,0x16,0x02,0x21,0x02,0x22,0x02,
0x23,0x04,0x23,0x02,0x22,0x02,0x21,0x06,0x21,0x02,
0x16,0x04,0x16,0x02,0x21,0x02,0x16,0x02,0x21,0x02,0x15,0x02,0x13,0x02,
0x15,0x0c,0x13,0x02,0x15,0x02,
0x16,0x04,0x16,0x02,0x21,0x02,0x16,0x04,0x16,0x02,0x21,0x02,
0x22,0x04,0x22,0x02,0x23,0x02,0x22,0x04,0x22,0x02,0x23,0x02,
0x25,0x02,0x26,0x02,0x23,0x02,0x25,0x02,0x22,0x02,0x23,0x02,0x21,0x02,0x16,0x02,
0x21,0x10,

0xff
};
uchar code dl[]={  //蝶戀  
0x8c,0x00, //曲速 0x8c表示 140拍/分
0x13,0x04,0x13,0x04,0x13,0x04,0x12,0x04,0x13,0x08,
0x12,0x04,0x13,0x04,0x12,0x04,0x12,0x04,0x06,0x08,
0x06,0x04,0x07,0x04,0x11,0x08,0x12,0x04,0x11,0x04,0x07,0x08,0x06,0x04,0x05,0x04,0x06,0x10,
0x13,0x04,0x13,0x04,0x13,0x04,0x12,0x04,0x13,0x0c,
0x16,0x04,0x15,0x04,0x16,0x04,0x15,0x04,0x15,0x04,0x12,0x04,
0x12,0x04,0x13,0x04,0x14,0x08,0x15,0x04,0x14,0x04,0x13,0x04,0x12,0x04,0x11,0x04,0x13,0x0f,0x13,0x0c,
0x13,0x04,0x16,0x08,0x17,0x04,0x16,0x04,0x15,0x0c,0x13,0x04,0x15,0x0f,
0x13,0x04,0x15,0x04,0x12,0x08,0x16,0x04,0x15,0x04,0x13,0x08,0x12,0x04,0x12,0x04,0x13,0x0c,
0x12,0x08,0x16,0x04,0x16,0x0c,
0x11,0x08,0x16,0x04,0x16,0x08,
0x16,0x04,0x17,0x04,0x21,0x08,0x17,0x04,0x16,0x04,0x17,0x08,0x16,0x04,0x17,0x04,0x13,0x08,0x13,0x0c,
0x13,0x04,0x16,0x08,0x17,0x08,0x16,0x04,0x15,0x0c,0x13,0x04,0x15,0x10,
0x14,0x04,0x15,0x04,0x16,0x08,0x17,0x04,0x16,0x04,0x17,0x08,
0x16,0x04,0x17,0x04,0x13,0x10,0x13,0x10,
0x12,0x08,0x16,0x04,0x16,0x02,0x16,0x10,
0x11,0x04,0x16,0x04,0x16,0x02,0x16,0x08,
0x16,0x04,0x17,0x04,0x21,0x08,0x17,0x04,0x16,0x04,0x17,0x08,0x15,0x08,0x16,0x10,
0x23,0x04,0x22,0x04,0x22,0x04,0x21,0x04,0x21,0x04,0x17,0x04,0x17,0x04,0x16,0x04,
0x21,0x04,0x17,0x04,0x17,0x04,0x16,0x04,0x16,0x04,0x15,0x04,0x15,0x04,0x14,0x04,
0x16,0x04,0x15,0x04,0x15,0x04,0x14,0x04,0x14,0x04,0x13,0x04,0x13,0x04,0x12,0x04,
0x13,0x10,0x13,0x10,
0xff
};

uchar code srkl[]={//生日快樂
0x78,0x00, //曲速 120
0x15,0x02,0x15,0x02,
0x16,0x04,0x15,0x04,0x21,0x04,
0x17,0x04,0x00,0x04,0x15,0x02,0x15,0x02,
0x16,0x04,0x15,0x04,0x22,0x04,
0x21,0x08,0x15,0x02,0x15,0x02,
0x25,0x04,0x23,0x04,0x21,0x04,
0x17,0x04,0x16,0x08,
0x16,0x04,0x00,0x04,0x24,0x02,0x24,0x02,
0x23,0x04,0x21,0x04,0x22,0x04,
0x21,0x08,
0x21,0x08,0x00,0x08,
0x15,0x02,0x15,0x02,//第二遍
0x16,0x04,0x15,0x04,0x21,0x04,
0x17,0x04,0x00,0x04,0x15,0x02,0x15,0x02,
0x16,0x04,0x15,0x04,0x22,0x04,
0x21,0x08,0x15,0x02,0x15,0x02,
0x25,0x04,0x23,0x04,0x21,0x04,
0x17,0x04,0x16,0x08,
0x16,0x04,0x00,0x04,0x24,0x02,0x24,0x02,
0x23,0x04,0x21,0x04,0x22,0x04,
0x21,0x08,
0x21,0x08,0x00,0x04,
0xff
};
uchar code test[]={//測(cè)試
0x78,0x00, //曲速 0x78表示 120拍/分
0x01,0x04,0x02,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x06,0x04,0x07,0x04,0x00,0x04,
0x11,0x08,0x12,0x07,0x13,0x06,0x14,0x05,0x15,0x04,0x16,0x03,0x17,0x02,0x00,0x01,
0x21,0x01,0x22,0x02,0x23,0x03,0x24,0x04,0x25,0x05,0x26,0x06,0x27,0x07,0x00,0x08,
0xff,
};


void delayms(uint ms)  /*ms 等于1時(shí),延時(shí)1ms 等于2時(shí),延時(shí)2ms,以此類推*/
{
uchar a,b,c;   //+3
while(ms--)
   {
for(c=1;c>0;c--)// 1+2 = 3
       for(b=142;b>0;b--)  //1*( 1+142*2)) = 285
           for(a=2;a>0;a--);// 142*(1+2*2) = 710
}
}

void delay(uint pai)/*pai 是節(jié)拍  pai若定義成uchar類型,當(dāng)節(jié)拍>0x0c時(shí),會(huì)造成數(shù)據(jù)溢出,產(chǎn)生失真。*/
{
uchar a,b,c;

while(pai--)//延遲pai 個(gè) 6.25ms
{
    for(c=1;c>0;c--)   //1+2=3
   for(b=28;b>0;b--)// 1*(1+28*2)  =57
       for(a=110;a>0;a--);//28*(1+110*2) = 6188
}

}

uchar key_x()   /*P1口高位接縱坐標(biāo)(P1.7 - P1.4) 低位接橫坐標(biāo)(P1.3 - P1.0)*/
{
uchar i;
P1 = 0x0f; /*有按鍵按下后 對(duì)應(yīng)按鍵的橫坐標(biāo)電位被拉低( 注意低電位引腳不能被高電位引腳抬高,只能是低電位拉低高電位)*/
if(P1_0 == 0)
{delayms(5); //延時(shí)5ms 去抖動(dòng)
if(P1_0 == 0)
i = 1;
}
else if(P1_1 == 0)
{delayms(5);
if(P1_1 == 0)
i = 2;
}
else if(P1_2 == 0)
{delayms(5);
if(P1_2 == 0)
i = 3;
}
else if(P1_3 == 0)
{delayms(5);
if(P1_3 == 0)
i = 4;
}
else
i = 0;
return (i);//0表示按鍵未按下
}

uchar key_y()
{
uchar j;
P1 = 0xf0;
if(P1_4 == 0)
{delayms(5);
if(P1_4 == 0)
j = 1;
}
else if(P1_5 == 0)
{delayms(5);
if(P1_5 == 0)
j = 2;
}
else if(P1_6 == 0)
{delayms(5);
if(P1_6 == 0)
j = 3;
}
else if(P1_7 == 0)
{delayms(5);
if(P1_7 == 0)
j = 4;
}
else
j = 0;
return (j);
}

void key_check() /*檢查矩陣按鍵坐標(biāo)、播放鍵的狀態(tài)及播放鍵狀態(tài)設(shè)置*/
{
x = key_x();
y = key_y();

if(key_play == 0)
key_play = 0; /*保持播放鍵引腳低電平,讓其作為歌曲正在播放的標(biāo)志*/
else
key_play = 1; /*保持播放鍵引腳高電平,讓其作為歌曲未播放的標(biāo)志*/
}

void display() /*數(shù)碼管顯示相應(yīng)的音調(diào)*/
{
if(key_play == 1)  //按鍵彈奏時(shí)
{if(x != 0 && y != 0 )
{
if(x == 1)
P0 = num[3 + y] ;  //低音4 - 7
else if(x == 2)
P0 = num[7 + y];  //中音1 - 4
else if(x == 3)
P0 = num[11 + y];  //中音5 - 7 和 高音 1
else if(x == 4)
P0 = num[15 + y];  //高音2 - 5
}
else
P0 = 0x00;
}
else  //播放音樂時(shí)
{if(yindiao_h == 0)  /* yindiao變量的高四位表示 低(0) 中(1) 高(2) 音*/
P0 = num[yindiao_l];/*yindiao變量的低四位表示“調(diào)”, 數(shù)碼管顯示當(dāng)前音調(diào)*/
else if(yindiao_h == 1) //中音
  P0 = num[yindiao_l + 7];
else if(yindiao_h == 2) //高音
P0 = num[yindiao_l + 14];
}

}

void speak()/* 按鍵 ,為定時(shí)器0 T0 賦計(jì)數(shù)初值,讓 T0函數(shù)驅(qū)動(dòng)蜂鳴器發(fā)出對(duì)應(yīng)的音調(diào) */
{
if(x == 1)
{
f_h = chuzhi[2*y + 6];  //低音4 - 7
f_l = chuzhi[2*y + 6 + 1];
}
else if(x == 2)
{
f_h = chuzhi[(16+y)*2]; //中音 1 -4
f_l = chuzhi[(16+y)*2 +1];
}
else if(x == 3)
{
if(y <= 3)
{
f_h = chuzhi[(20+y)*2]; //中音 5 - 7  
f_l = chuzhi[(20+y)*2 + 1];
}
else
{
f_h = chuzhi[66]; //高音1
f_l = chuzhi[67];
}
}
else if(x == 4)
{
f_h = chuzhi[(33+y)*2];  //高音2 -5
f_l = chuzhi[(33+y)*2 + 1];
}

}
void timer0() interrupt 1  //定時(shí)器0  
{
if(key_play == 0)
{
TL0 = song_l;
TH0 = song_h;

beep = ~beep;
}
else
if(x != 0 && y != 0 && key_play == 1)/*當(dāng)有矩陣按鍵按下,并且不播放歌曲時(shí) */
{
TL0 = f_l;//賦初值
TH0 = f_h;//
beep = ~beep; /*蜂鳴器引腳電平取反,定時(shí)器每溢出一次電平取反一次,不同的計(jì)數(shù)初值對(duì)應(yīng)不同的溢出時(shí)間,對(duì)應(yīng)不同的方波頻率 */
}
}

void timer1() interrupt 3 //定時(shí)器1 led燈起落
{
TL1 = 0x00;
TH1 = 0x54;/*定時(shí)器1 高8位初值。控制led燈的起落快慢(數(shù)值不嚴(yán)格)*/

if(key_play == 1) //不播放歌曲時(shí)
{
if(x != 0 && y != 0 && flash < 8 )//最大加到8
++flash;
else if(x == 0 && y == 0 && flash >0 )  //最小減到0
--flash;

P2 = led_table[flash];
}
else if(key_play == 0 )   //播放歌曲時(shí)
{
if(out == 1 && flash < 8 && flash < jiepai)/*out ==1 表示有歌曲發(fā)聲時(shí),(flash<jiepai)使 led燈剛好指示節(jié)拍*/
++flash;
else if(out == 0 && flash > 0)
--flash;

P2 = led_table[flash];

}
}

uchar choose()//播放狀態(tài)下 選歌
{
uchar i = 0;   //第i首歌 初值0表示未選歌
uchar j;

x = key_x();
y = key_y();

if(x == 1 && y == 1)
    i = 1;//選第一首
else if(x == 1 && y == 2)
   i = 2; //選第二首
else if(x == 1 && y == 3)
  i = 3;
else if(x == 1 && y == 4)
i = 4;
else if(x == 2 && y == 1)
i = 5;
else if(x == 4 && y == 1)// 上一首
i = 13;   
else if(x == 4 && y == 2)//用作暫停播放
i = 14;   
else if(x == 4 && y == 3)//下一首
i = 15;
else if(x == 4 && y == 4)
i = 16;//用作停止播放


if(i == song_id)
{
which = 2; //選同一首歌時(shí),重播這首歌
}
else if(i > allsong && i < 13)/*如果按鍵號(hào) 在 最大歌曲序號(hào) 和 功能鍵 之間,返回原歌曲序號(hào)*/
i = song_id;//
else if(i == 0) //i等于初值 說明未按鍵
i = song_id; //不按鍵選歌時(shí),返回原歌曲的序號(hào)

while(1)//釋放按鍵時(shí)才進(jìn)行下一步
{
x = key_x();
y = key_y();

if(x == 1)
j = y;
else if(x == 2)
j = 4 + y;
else if(x == 3)
j = 8 + y;
else if(x == 4)
j = 12 + y;

if(x == 0 || (j > allsong && j < 13))  /*釋放按鍵 或者按鍵號(hào) 在 最大歌曲序號(hào) 和 功能鍵 之間時(shí) 跳出循環(huán)*/
break;
}

return(i);
}

uchar choose2()/*選歌不用放開按鍵  在暫停的狀態(tài)下使用 */
{
uchar i = 0;

  x = key_x();
y = key_y();

if(x == 1 && y == 1)//選第一首
  i = 1;
else if(x == 1 && y == 2)//選第二首
   i = 2;
else if(x == 1 && y == 3)
  i = 3;
else if(x == 1 && y == 4)
i = 4;
else if(x == 2 && y == 1)
i = 5;
else if(x == 4 && y == 1)// 上一首
i = 13;   
else if(x == 4 && y == 2)//用作暫停播放
i = 14;   
else if(x == 4 && y == 3)//下一首
i = 15;
else if(x == 4 && y == 4)
i = 16;//用作停止播放

if(i == song_id)
{
same = 1;
which = 2; /*選了同一首歌時(shí),重播這首歌(0,1用來存曲速了 故從2開始)  */
}
else if(i > allsong && i < 13)/*如果按鍵號(hào) 在 最大歌曲序號(hào) 和 功能鍵 之間,返回原歌曲序號(hào)*/
i = song_id;
else if(i == 0)   //i等于初值 說明未按鍵
i = song_id; /*不按鍵選歌時(shí),返回原歌曲的序號(hào)*/

return(i);
}

void play()//播放歌曲
{  
  uint qusu;//歌曲播放速度 (拍/分)
  uint pai2; /*pai2 = (2400/qusu)*jiepai; 送到delay()函數(shù)*/

while(1)
{
while(1)
{
choose_id:
   temp_id = choose(); //選歌

/****************************↓↓↓↓↓暫停↓↓↓↓↓*****************************************/
  if(temp_id == 14) //如果按下暫停鍵
  {  
  delayms(500);//延時(shí)500ms
  while(1)
{
temp_id = choose2();/*choose2 按下就起作用 不必等到放開按鍵才起作用*/
if(temp_id == 14)  /*再次按下“暫停鍵” 表示繼續(xù)播放*/
{
break;
}
else if(temp_id == 16)/*按下停止鍵 ,功能表現(xiàn)為:暫停播放時(shí)也能停止播放,回到播放前狀態(tài)*/
{
song_id = 16;
break;
}
else if(temp_id == 13)//上一首
{
which = 2;
if(song_id == 1)
song_id = allsong ;//播放最后一首
else
--song_id;
break;
}
else if(temp_id == 15) //下一首
{
which = 2;
if(song_id == allsong)
song_id = 1;   //播放第一首
else
++song_id;
break;
}
else if(temp_id != song_id && temp_id <= allsong)/*選了另一首歌曲 屏蔽掉了未定義的按鍵*/
{
which = 2;   /*從歌曲的第一個(gè)音播放 (0,1用來存曲速了 故從2開始)*/
song_id = temp_id;
break;
}
else if(same == 1)
break;
}
same = 0; //跳出循環(huán)后 需重置為0
  }
/****************************↑↑↑↑↑暫停↑↑↑↑↑***************************************/
else if(temp_id == 13)//上一首
{
which = 2;
if(song_id == 1)
song_id = allsong ;//播放最后一首
else
--song_id;
}
else if(temp_id == 15) //下一首
{
which = 2;
if(song_id == allsong)
song_id = 1;   //播放第一首
else
++song_id;
}
else if(temp_id == 16)
{
song_id = 16;
}
else if(temp_id != song_id && temp_id <= allsong) //選了另一首歌曲
{
which = 2;   //從歌曲的第一個(gè)音播放
song_id = temp_id;
}
/**************************************************************************************/
nochoose://不用選歌 當(dāng)正常放完一首歌時(shí),跳到這里
if(song_id == 3)
{key_play = 0;
if(srkl[which] == 0xff) /* 遇到結(jié)束符  跳出循環(huán)(內(nèi)循環(huán)) 停止播放 */
break;
qusu = srkl[0];
yindiao = srkl[which]; //音調(diào)
jiepai = srkl[which+1]; //節(jié)拍
}
else
if(song_id == 1)
{key_play = 0;
if(ymt[which] == 0xff) /* 遇到結(jié)束符  跳出循環(huán)(內(nèi)循環(huán)) 停止播放 */
break;
qusu = ymt[0];
yindiao = ymt[which]; //音調(diào)
jiepai = ymt[which+1];  //節(jié)拍
}
else
if(song_id == 2)
{ key_play = 0;
if(dl[which] == 0xff) /* 遇到結(jié)束符 跳出循環(huán) 停止播放 */
break;
qusu = dl[0];
yindiao = dl[which]; //
jiepai = dl[which+1];   //
}
else if(song_id == 4)
  {
  key_play = 0;
if(test[which] == 0xff) /* 遇到結(jié)束符 跳出循環(huán) 停止播放*/
break;
qusu = test[0];
yindiao = test[which];
jiepai = test[which+1];  
  }
/******************************************************************************/
else if(song_id == 16 )
  {  
  which = 2;
  break;
  }
else
  {
  key_play = 1;
  goto choose_id;   /*如果既沒有選歌 又沒有停止 返回去做選擇*/
  }
/********************************************************************************************/
yindiao_l = yindiao % 16;// 低四位 調(diào)
yindiao_h = yindiao /16;/*高四位 。。是低音0 中音1 還是 高音2*/


if(yindiao != 0) /*音調(diào)不為0。(當(dāng)音調(diào)為0時(shí)表示這個(gè)音不響 但依舊要占這個(gè)音的播放時(shí)間)*/
{
song_h = chuzhi[yindiao*2];
song_l = chuzhi[yindiao*2+1];

TR0 = 1;   /*給初值賦值后,開啟定時(shí)器0 蜂鳴器開始發(fā)聲 */
TR1 = 1;/*開啟定時(shí)器1  ,led開始閃動(dòng)*/
display(); //數(shù)碼管顯示音調(diào)
out = 1;   /*正在發(fā)聲的標(biāo)志,定時(shí)器1得以控制led燈按一定的時(shí)間間隔 逐個(gè)點(diǎn)亮 */
}
else
{
TR0 = 0;
out = 0;
TR1 = 0;
P0 = 0x00;
flash = 0;
P2 = led_table[0];
}

pai2 = (2400/qusu)*jiepai;
delay(pai2); /*延時(shí) = 節(jié)拍數(shù) x 125ms  (決定著1個(gè)音的發(fā)聲時(shí)間) */
TR0 = 0;//蜂鳴器停止發(fā)聲
P0 = 0x00;
out = 0;

delayms(39); /*唱完一個(gè)音停xx ms(決定每個(gè)音調(diào)之間的時(shí)間間隔 根據(jù)個(gè)人喜好節(jié)奏來定 */

TR1 = 0;  //led停止閃動(dòng)
flash = 0;
P2 = led_table[0];
which = which + 2;//下一個(gè)音

}  /*已經(jīng)放完一首歌,或者停止播放,接下來判斷是停止播放還是播放下一首  */

TR0 = 0;
P0 = 0x00;
out = 0;
flash = 0;
P2 = led_table[0];

if(song_id == 16) /*坐標(biāo)(4,4)的鍵盤作為停止播放鍵*/
{
while(1)
{
x = key_x();
if(x == 0)
break;/*松開按鍵 才結(jié)束 避免觸發(fā)其他程序 比如電子琴發(fā)聲、led顯示等*/
}

key_play = 1; /*播放鍵引腳置高電平,播放結(jié)束的標(biāo)志*/
song_id = 1;  // 第一首歌開始
which = 2;  // 每首歌的最開始的一個(gè)音
break; /*跳出第二個(gè)循環(huán)(即結(jié)束play函數(shù))*/
}
else if(song_id == allsong)/*當(dāng)放到最后一首時(shí),從第一首開始   (當(dāng)前共3首)  */
{
song_id = 1;
which = 2;
delayms(1000); //一秒后從第一首開始播放
goto nochoose;
}
else  
{
++song_id; /*歌曲序號(hào)自動(dòng)+1 自動(dòng)播放下一首歌*/
which = 2;
delayms(1000);
goto nochoose;//不用選歌 播放下一首
}
}
}

void main()
{
P0 = 0x00;
P2 = 0xff;
TMOD = 0x11; /*定時(shí)器0 定時(shí)器1 都采用方式1(16位定時(shí)器方式) */
IE = 0x8a;
PT0 = 1; /*設(shè)置定時(shí)器0為高優(yōu)先級(jí),避免被定時(shí)器1干擾,造成聲音失真*/

while(1)
{

key_check();
if(key_play == 1 && x != 0 && y != 0)
{
TR1 = 1;
display();
speak();
TR0 = 1;
}
else  if(key_play == 0)
{
key_play = 0;
play(); /*play函數(shù)有循環(huán)語句,當(dāng)按下停止鍵(16鍵)時(shí)才能跳出 */
}
else
{
if(flash == 0)/*當(dāng)flash 減到0時(shí) 再關(guān)閉定時(shí)器1,即 讓led燈全部熄滅再關(guān)閉T1  */
TR1 = 0;

TR0 = 0;
P0 = 0x00;
}
}
}
回復(fù)

使用道具 舉報(bào)

地板
ID:64089 發(fā)表于 2015-12-28 10:23 | 只看該作者
Good ,我學(xué)習(xí)一下按鍵音調(diào)的編程思想,很好。
回復(fù)

使用道具 舉報(bào)

5#
ID:134300 發(fā)表于 2016-7-23 21:09 | 只看該作者
大神,如果要換歌代碼怎么換算,很多歌曲代碼換過來就不能用了
回復(fù)

使用道具 舉報(bào)

6#
ID:129008 發(fā)表于 2016-7-24 00:42 | 只看該作者
題主能提供清晰的原理圖嗎,你這個(gè)圖看不清元件參數(shù)
回復(fù)

使用道具 舉報(bào)

7#
ID:150634 發(fā)表于 2016-11-27 21:38 | 只看該作者
大神 能給個(gè)清晰的電路原理圖嗎,我想照做一個(gè),可是看不清楚原件參數(shù)
回復(fù)

使用道具 舉報(bào)

8#
ID:150634 發(fā)表于 2016-11-27 21:41 | 只看該作者
rosam_zhang 發(fā)表于 2016-7-24 00:42
題主能提供清晰的原理圖嗎,你這個(gè)圖看不清元件參數(shù)

你有上面那個(gè)電子琴的電路圖了不  能看清原件參數(shù)的
回復(fù)

使用道具 舉報(bào)

9#
ID:130231 發(fā)表于 2017-3-11 21:32 | 只看該作者
我下載來看看。
回復(fù)

使用道具 舉報(bào)

10#
ID:130231 發(fā)表于 2017-3-11 21:43 | 只看該作者
上面電路圖我看的不是清楚,有清楚點(diǎn)的嗎
回復(fù)

使用道具 舉報(bào)

11#
ID:183991 發(fā)表于 2017-3-27 23:16 | 只看該作者
求助清晰原理圖
回復(fù)

使用道具 舉報(bào)

12#
ID:166841 發(fā)表于 2017-3-28 09:38 | 只看該作者
有沒有清晰得原理圖
回復(fù)

使用道具 舉報(bào)

13#
ID:165068 發(fā)表于 2017-3-28 11:17 | 只看該作者
謝謝。最近正在做類似的東西,給了很多啟發(fā),謝謝、
回復(fù)

使用道具 舉報(bào)

14#
ID:200093 發(fā)表于 2017-5-12 20:43 | 只看該作者
謝謝大神
回復(fù)

使用道具 舉報(bào)

15#
ID:110278 發(fā)表于 2017-5-22 10:01 | 只看該作者
很實(shí)用。可以試看看。
回復(fù)

使用道具 舉報(bào)

16#
ID:213533 發(fā)表于 2017-6-21 22:20 | 只看該作者
有點(diǎn)6666
回復(fù)

使用道具 舉報(bào)

17#
ID:218611 發(fā)表于 2017-7-12 21:03 | 只看該作者
求清晰原理圖
回復(fù)

使用道具 舉報(bào)

18#
ID:218611 發(fā)表于 2017-7-12 21:12 | 只看該作者
大神不在線,好惆悵
回復(fù)

使用道具 舉報(bào)

19#
ID:218611 發(fā)表于 2017-7-12 21:52 | 只看該作者
學(xué)長(zhǎng),桂電的啊,你幾級(jí)的,我想用你的來做課設(shè),苦澀笑
回復(fù)

使用道具 舉報(bào)

20#
ID:219457 發(fā)表于 2017-7-13 17:48 來自手機(jī) | 只看該作者
好強(qiáng)大

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
還戀一個(gè)人 + 5 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

21#
ID:261683 發(fā)表于 2017-12-18 19:21 | 只看該作者
希望發(fā)一個(gè)清晰的原理圖
回復(fù)

使用道具 舉報(bào)

22#
ID:274077 發(fā)表于 2018-1-10 00:26 | 只看該作者
圍觀大佬
回復(fù)

使用道具 舉報(bào)

23#
ID:333064 發(fā)表于 2018-5-31 14:57 | 只看該作者
好貼,支持一下
回復(fù)

使用道具 舉報(bào)

24#
ID:345148 發(fā)表于 2018-6-5 08:16 | 只看該作者
好資料 感謝樓主分享
回復(fù)

使用道具 舉報(bào)

25#
ID:285652 發(fā)表于 2018-6-24 12:35 | 只看該作者
好貼支持一下
回復(fù)

使用道具 舉報(bào)

26#
ID:357774 發(fā)表于 2018-6-24 14:26 | 只看該作者
很不錯(cuò),支持一下,給力
回復(fù)

使用道具 舉報(bào)

27#
ID:387592 發(fā)表于 2018-8-31 16:05 | 只看該作者
大神可以發(fā)一下生成的hex文件給我嗎?QQ郵箱1638078283@qq.com
回復(fù)

使用道具 舉報(bào)

28#
ID:387592 發(fā)表于 2018-8-31 16:32 | 只看該作者
電壓大小??
回復(fù)

使用道具 舉報(bào)

29#
ID:493035 發(fā)表于 2019-3-18 10:50 | 只看該作者
謝謝大神!!!
回復(fù)

使用道具 舉報(bào)

30#
ID:482729 發(fā)表于 2019-3-19 09:14 | 只看該作者
絕世好帖!
回復(fù)

使用道具 舉報(bào)

31#
ID:399179 發(fā)表于 2019-3-20 20:36 | 只看該作者
真的好強(qiáng)大!
回復(fù)

使用道具 舉報(bào)

32#
ID:493822 發(fā)表于 2019-3-24 18:23 | 只看該作者
謝謝大佬
回復(fù)

使用道具 舉報(bào)

33#
ID:399179 發(fā)表于 2019-3-26 09:04 來自手機(jī) | 只看該作者
這個(gè)能不能發(fā)出鋼琴的音啊?
回復(fù)

使用道具 舉報(bào)

34#
ID:511461 發(fā)表于 2019-6-13 20:10 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

35#
ID:614806 發(fā)表于 2019-10-10 16:35 | 只看該作者
求清晰電路圖
回復(fù)

使用道具 舉報(bào)

36#
ID:588278 發(fā)表于 2019-12-6 15:37 | 只看該作者
有清楚點(diǎn)的原理圖嗎?
回復(fù)

使用道具 舉報(bào)

37#
ID:658466 發(fā)表于 2019-12-7 20:43 | 只看該作者
受教了
回復(fù)

使用道具 舉報(bào)

38#
ID:652972 發(fā)表于 2019-12-7 22:24 來自手機(jī) | 只看該作者
仿真圖不清楚啊
回復(fù)

使用道具 舉報(bào)

39#
ID:103311 發(fā)表于 2019-12-10 00:34 | 只看該作者
謝謝大佬
回復(fù)

使用道具 舉報(bào)

40#
ID:961300 發(fā)表于 2021-11-19 14:41 | 只看該作者
原理圖有清晰點(diǎn)的嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黄色电影在线免费观看 | 精品国产精品三级精品av网址 | 黑人巨大精品欧美黑白配亚洲 | 日本在线免费看最新的电影 | 中文字幕亚洲欧美日韩在线不卡 | 欧美小视频在线观看 | 精品不卡 | 免费观看一区二区三区毛片 | 在线免费黄色小视频 | 国产成人免费视频 | 欧美精品久久 | 国产一区二区在线视频 | 精品国产乱码久久久久久图片 | 日韩在线视频免费观看 | 国产精品美女www爽爽爽视频 | 欧美国产视频一区二区 | 精品一区二区久久久久久久网站 | 亚洲二区视频 | 久久综合影院 | 日本高清中文字幕 | 日日欧美| 一级黄色片在线看 | av永久免费 | 日日躁狠狠躁aaaaxxxx | 午夜无码国产理论在线 | 日本综合在线观看 | 自拍偷拍第一页 | 欧美日韩不卡合集视频 | 精品久久久久久久久久久久 | 色爱区综合 | 国产区在线 | 欧美高清免费 | 国产精品久久久久aaaa九色 | 色视频在线播放 | 91se在线| 日韩综合在线 | 成人免费三级电影 | 国内自拍偷拍一区 | 日韩在线视频网址 | 久色视频在线观看 | 91人人爽 |