版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
如何用單片機(jī)實(shí)現(xiàn)MIDI鍵盤(pán)功能51系列單片機(jī)實(shí)現(xiàn)MIDI3MIDI協(xié)議的串行通訊數(shù)據(jù),如何掃描鍵盤(pán)和實(shí)現(xiàn)力度響應(yīng),如何適當(dāng)?shù)倪M(jìn)展電器連接,本節(jié)將介紹前兩個(gè)問(wèn)題,最終一個(gè)問(wèn)題將放在下一節(jié)介紹。MIDI協(xié)議的串行信號(hào)絕大多數(shù)51系列單片機(jī)都有串行通訊掌握器〔UART〕,協(xié)作適宜的晶振,正確地設(shè)UART的工作參數(shù),就能夠自動(dòng)產(chǎn)生所需的串行數(shù)據(jù)。在51單片機(jī)做串行通訊時(shí),可以用定時(shí)/計(jì)數(shù)器1〔T/C1〕作為波特率發(fā)生器。將串行口設(shè)置為方式1工作狀態(tài)〔10位異步收發(fā),波特率由定時(shí)器掌握MHz振,T/C1設(shè)為自動(dòng)裝入8位計(jì)數(shù)器狀態(tài)〔TMOD置為2x,SMO=1,TH=FF31.25KMIDI協(xié)議。C語(yǔ)言例程,下同〕voidformat;{ TMOD=0x21; //T/C1工作于8位自動(dòng)裝入狀態(tài)//TL1=0xff;TH1=0xff; //T/C1常數(shù),確定波特率//SCON=0x50; //設(shè)串口工作于方式1,//PCON=0x80; //相當(dāng)于SMOD=1;//TR1=1; //T/C1開(kāi)頭計(jì)數(shù)//}51UART的工作方式可推知,當(dāng)外部晶振的頻率為6MHz的倍數(shù)時(shí),31.25K的波特率,見(jiàn)表5-3:表 5-3用不同的晶振頻率產(chǎn)生波特率31.25K的存放器值晶振頻率TMODSCONPCONTL1TH16MHz0x210x500x800xFF0xFF12MHz0x210x500x800xFE0xFE0x000xFF0xFF24MHz0x210x500x800xFD0xFD0x000xFE0xFE上一節(jié)已經(jīng)介紹了MIDI命令的格式,發(fā)送一個(gè)音符的開(kāi)關(guān)命令,可調(diào)用如下函數(shù):voidsend(ucharcc,kk,vv){TR1=1; //開(kāi)計(jì)數(shù)器//SBUF=cc; //發(fā)送cc//while(TI==0);//等待發(fā)送完畢//TI=0; //清發(fā)送標(biāo)志//SBUF=kk;while(TI==0);TI=0;SBUF=vv;while(TI==0);TI=0;TR1=0;}參數(shù)cc,kk,vv的含義已在MIDI協(xié)議中介紹,不再重復(fù)。12字節(jié)命令,只需將上述函數(shù)簡(jiǎn)化即可,由于在演奏中主要執(zhí)行的都是3字節(jié)命令,為提高運(yùn)行速度,不在發(fā)送函數(shù)中推斷命令長(zhǎng)度,由于那樣做的話固然可以削減一兩個(gè)函數(shù),但讓單片機(jī)過(guò)多執(zhí)行不必要的代碼,得不償失。鍵盤(pán)掃描電子樂(lè)器的鍵盤(pán),動(dòng)輒就是數(shù)十個(gè)琴鍵,而且常常消滅多個(gè)按鍵同時(shí)壓下的狀況,單片機(jī)系統(tǒng)必需能夠準(zhǔn)確推斷哪個(gè)鍵被壓下,哪個(gè)鍵保持,哪個(gè)鍵被釋放,考慮到經(jīng)濟(jì)性,矩陣式動(dòng)態(tài)掃描是樂(lè)器鍵盤(pán)最抱負(fù)的工作方式,圖5-364鍵無(wú)力度感應(yīng)的鍵盤(pán)原89c5164鍵的掃描工作。圖5-3中,88個(gè)鍵通過(guò)二極管共同接在一根段選線上,按鍵的另外一端,分別按挨次接在各自的讀入線〔51P2口〕上,段選線(P0)為單片機(jī)輸出,為低電平有效,工作時(shí),單片機(jī)向P0口某根線發(fā)出低電平,選中該段,然后讀P2口,當(dāng)有相應(yīng)的按鍵被壓下時(shí),該輸入線與段選線接通,通過(guò)二極管拉到低電平,單片機(jī)即可推斷是該段的哪一個(gè)按鍵被壓下。轉(zhuǎn)變段選線,則推斷另一段的88個(gè)鍵值,則可完成64如不加二極管,在有按鍵壓下時(shí),將發(fā)生有效的段選線〔低電平〕與無(wú)效的段選線〔其他線的高電平〕通過(guò)按鍵短路的狀況,將產(chǎn)生混亂。鍵盤(pán)在演奏時(shí),有三個(gè)動(dòng)作,被壓下、保持壓下?tīng)顟B(tài)、被釋放,在被壓下并保持時(shí),每次掃描都會(huì)推斷出該鍵的壓下?tīng)顟B(tài),但在實(shí)際工作中,并不需要每次掃描到這種狀態(tài)都MIDI命令,因此,要進(jìn)展按鍵狀態(tài)的存貯,每次掃描后,與存貯的狀態(tài)比較,覺(jué)察有轉(zhuǎn)變,再作相應(yīng)的處理,并將的狀態(tài)存入。圖5-3 8X8鍵無(wú)力度鍵盤(pán)電路圖8X8key_number[i]是全局?jǐn)?shù)組,用來(lái)存貯按鍵狀態(tài),addition是全局變量,是設(shè)定該鍵盤(pán)第一個(gè)按鍵對(duì)應(yīng)的MIDI音符的鍵值,全局?jǐn)?shù)組和全局send(cc,kk,vv)函數(shù),見(jiàn)前一節(jié)介紹,特此說(shuō)明。voidscan_key{uchari,j,k,r,mmm,xu;k=0xfe; //k0for(i=0;i<8;i++){ P2=0xff;P0=k; //輸出段選值k=(k<<1)+1; //段選標(biāo)志左移,末位補(bǔ)1,為下一循環(huán)預(yù)備mmm=0x01; //設(shè)按鍵查詢指針初值r=P2; //讀入鍵值P0=0xff;xu=r^key_number[i]; //查詢鍵值是否轉(zhuǎn)變,xu1的位為產(chǎn)生變化的按鍵key_number[i]=r; //的鍵值存入數(shù)組for(j=0;j<8;j++) //8次循環(huán),推斷具體產(chǎn)生變化的鍵{if((xu&mmm)!=0) //用指針選擇被測(cè)的鍵{ if((r&mmm)!=0) //推斷最終狀況,以確定是被壓下還是釋放{send(0x80+chnal,i*8+j+addition,40);} //關(guān)閉聲音else{send(0x90+chnal,i*8+j+addition,127);} //開(kāi)頭發(fā)聲}mmm=mmm<<1; //指針左移,推斷下個(gè)鍵}}}力度感應(yīng)的實(shí)現(xiàn)與力度曲線中高檔的電子琴,都帶有力度感應(yīng)功能,什么是力度感應(yīng)呢?就是音符發(fā)聲的音量,與擊鍵的力氣正相關(guān),力氣越大,音量也越大。實(shí)現(xiàn)力度感應(yīng)功能,首先要測(cè)量擊鍵的力度,而擊鍵力度與鍵盤(pán)的下沉速度正相關(guān),測(cè)量按鍵的下沉速度,就可以推出力度值。力度感應(yīng)鍵盤(pán)的按鍵構(gòu)造如圖5—4所示,每時(shí),前排觸點(diǎn)與后排觸點(diǎn)先后接通,感應(yīng)值。速度和存貯空間可以給我們供給幫圖5-4力度鍵示意圖 助,用一個(gè)計(jì)數(shù)器和多個(gè)存貯單元實(shí)現(xiàn)同樣的功能。為每一個(gè)琴鍵安排一個(gè)存貯單元,用單片機(jī)的定時(shí)/計(jì)數(shù)器做一個(gè)時(shí)鐘,當(dāng)按鍵壓下,使前排觸點(diǎn)接通時(shí),記錄下時(shí)鐘的值,在后排觸點(diǎn)接通時(shí)用當(dāng)時(shí)的時(shí)鐘值,減掉記錄的值,起,前排觸點(diǎn)與后排觸點(diǎn)共用P0口做輸入,P2口做前排觸點(diǎn)段選信號(hào),P1口做后排觸點(diǎn)的段選。每個(gè)按鍵需要一個(gè)字節(jié)的記錄空間,對(duì)于6464個(gè)字節(jié),再加128bitRAM89c51來(lái)說(shuō),就難以勝任了,故在力256bitRAM89c52。前文介紹過(guò),MIDI0-127反比的,這就有了一個(gè)函數(shù)關(guān)系:vv,所測(cè)定的時(shí)間差為T(mén)vv=A/TA是一個(gè)常量,用來(lái)把vv的值限制在0-127A的值,就可以做出各種不同的力度響應(yīng)曲線,用于不同的場(chǎng)合。在實(shí)際編程工作中,由于vv與T都是字符型量,而直接用字符型量作除法運(yùn)算,精度太差,用整形數(shù)或浮點(diǎn)數(shù)運(yùn)算沒(méi)有必要,用查表的方式是比較合理,速度又快的方法。力度鍵盤(pán)的掃描過(guò)程,與非力度鍵盤(pán)的過(guò)程類(lèi)似,區(qū)分在于在每個(gè)掃描周期中,分別send(cc,kk,vv)5.2節(jié)中有介紹,key_number[][]是用于記錄每個(gè)按鍵觸點(diǎn)通斷狀態(tài)的全局?jǐn)?shù)組,vol[][]是力度曲線存貯數(shù)組,count_begin[][]是各按鍵的計(jì)時(shí)存貯數(shù)組,ttt2毫秒為ttt1。voidscan_key{uchari,j,k,r,r1,mmm,xu,xd,ts,vv;k=0xfe; //段選指針初值for(i=0;i<8;i++){ P1=k; //輸出后排段選P0=0xff;r1=P0; //讀后排觸點(diǎn)P1=0xff; //關(guān)后排段選P2=k; //輸出前排段選ts=ttt; //讀入當(dāng)前時(shí)鐘,插在前后排語(yǔ)句之間是//為確保輸出電平穩(wěn)定后讀入的數(shù)據(jù)k=(k<<1)+1; //段選指針左移mmm=0x01; //位選指針初始化P0=0xff;r=P0; //讀前排鍵P2=0xff; //關(guān)段選xu=r^key_number[0][i]; //檢測(cè)前排鍵是否有變化xd=r1^key_number[1][i]; //檢測(cè)后排鍵是否有變化key_number[0][i]=r; //存貯按鍵狀態(tài)key_number[1][i]=r1;for(j=0;j<8;j++) //8次循環(huán)查詢各鍵狀況{ if((xu&mmm)!=0) //前排觸點(diǎn)是否有變化{ if((r&mmm)!=0){ key_number[2][i]&=(~mmm) ; //前排觸點(diǎn)關(guān),存入}else{ key_number[2][i]|=mmm ; //前排觸點(diǎn)閉合,存入count_begin[i][j]=ts; //紀(jì)錄閉合時(shí)間}}else{if((ts-count_begin[i][j])>250){key_number[2][i]&=(~mmm);}
//超時(shí)將認(rèn)為觸點(diǎn)關(guān)閉}if((xd&mmm)!=0) //檢測(cè)后排觸點(diǎn){if ((r1&mmm)!=0){if((ctk==0xf0)&((key_number[3][i]&mmm)!=0)){send(0x80+chnal,i*8+j+ada*12+addition,0x40); //后排鍵關(guān)閉則關(guān)音符key_number[3][i]&=(~mmm);}key_number[2][i]&=(~mmm);}else{if((key_number[2][i]&mmm)!=0) //后排觸點(diǎn)閉合{if(ts>=count_begin[i][j]) //計(jì)算時(shí)間值{vv=ts-count_begin[i][j];}else{vv=255-count_begin[i][j]+ts;//時(shí)間計(jì)數(shù)器溢出處理send(0x90+chnal,i*8+j+ada*12+addition,vol[pp][vv]);//音符發(fā)聲key_number[3][i]|=mmm;}}}}mmm=mmm<<1; //鍵檢測(cè)指針左移}}}//========2毫秒為ttt1,============================voidtimer0interrupt1using3/*interruptsuboftime
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能硬件合伙創(chuàng)業(yè)合同4篇
- 2025年外研版三年級(jí)起點(diǎn)第二冊(cè)地理下冊(cè)階段測(cè)試試卷
- 二零二五版智能門(mén)禁系統(tǒng)安全性能檢測(cè)合同4篇
- 2025年度智能車(chē)展位租賃合同模板4篇
- 6 地球的形狀(說(shuō)課稿)-2023-2024學(xué)年三年級(jí)科學(xué)下冊(cè) 教科版
- 2025年度裝配式建筑構(gòu)件生產(chǎn)與施工承包合同4篇
- 二零二五版企業(yè)并購(gòu)股權(quán)交易補(bǔ)充協(xié)議書(shū)3篇
- 2025年度廚房設(shè)備研發(fā)與制造合作協(xié)議范本4篇
- 2025年度新能源汽車(chē)零部件研發(fā)與制造廠房承包合同4篇
- 二零二五版美發(fā)店安全教育與應(yīng)急預(yù)案制定合同4篇
- 春節(jié)行車(chē)安全常識(shí)普及
- 電機(jī)維護(hù)保養(yǎng)專(zhuān)題培訓(xùn)課件
- 汽車(chē)租賃行業(yè)利潤(rùn)分析
- 春節(jié)拜年的由來(lái)習(xí)俗來(lái)歷故事
- 2021火災(zāi)高危單位消防安全評(píng)估導(dǎo)則
- 佛山市服務(wù)業(yè)發(fā)展五年規(guī)劃(2021-2025年)
- 房屋拆除工程監(jiān)理規(guī)劃
- 醫(yī)院保安服務(wù)方案(技術(shù)方案)
- 高效能人士的七個(gè)習(xí)慣:實(shí)踐應(yīng)用課程:高級(jí)版
- 小數(shù)加減法計(jì)算題100道
- 通信電子線路(哈爾濱工程大學(xué))智慧樹(shù)知到課后章節(jié)答案2023年下哈爾濱工程大學(xué)
評(píng)論
0/150
提交評(píng)論