版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p> 課程名稱 嵌入式系統(tǒng)原理與設(shè)計(jì) </p><p> 課題名稱 電子琴 </p><p> 專 業(yè) 通信工程 </p><p> 班 級(jí)
2、 </p><p> 學(xué) 號(hào) </p><p> 姓 名 </p><p> 指導(dǎo)教師 </p><p> 2013年 1月 6日</p><p>
3、 課 程 設(shè) 計(jì) 任 務(wù) 書</p><p> 課程名稱 嵌入式系統(tǒng)原理與設(shè)計(jì) </p><p> 課 題 電子琴 </p><p> 專業(yè)班級(jí) 通信工程1001 </p><p> 學(xué)生姓名 </p>&
4、lt;p> 學(xué) 號(hào) </p><p> 指導(dǎo)老師 </p><p> 審 批 </p><p> 任務(wù)書下達(dá)日期 2012 年 12月18 日</p><p> 任務(wù)完成日期
5、 2013 年 1月 4 日</p><p><b> 設(shè)計(jì)課題一:電子琴</b></p><p><b> 問題描述:</b></p><p> 制作一個(gè)由紅外遙控器控制發(fā)音的電子琴。</p><p><b> 二、功能要求:</b></p><
6、p> 1、設(shè)計(jì)制作或購買能驅(qū)動(dòng)小型揚(yáng)聲器的發(fā)音電路,讓單片機(jī)送出不同頻率的方波,驅(qū)動(dòng)此電路發(fā)出對(duì)應(yīng)聲調(diào)的聲音。</p><p> 2、將兩首簡(jiǎn)單歌曲的音調(diào)和節(jié)拍存儲(chǔ)在E2PROM芯片里</p><p> 3、通過紅外遙控器控制歌曲的選曲,按1鍵唱第一首歌,按2鍵唱第二首歌。</p><p><b> 三、主要器件準(zhǔn)備:</b>&l
7、t;/p><p><b> 第一種方案</b></p><p> 51單片機(jī)最小系統(tǒng)、紅外遙控器和紅外接收HS38B5、揚(yáng)聲器推薦8歐姆0.5W、</p><p> 驅(qū)動(dòng)電路參考驅(qū)動(dòng)電路</p><p> E2PROM 可以使用24C16 </p><p><b> 第二種方案&l
8、t;/b></p><p> 購買WT588D-U語音模塊、1單片機(jī)最小系統(tǒng)、紅外遙控器和紅外接收HS38B5、揚(yáng)聲器推薦8歐姆0.5W。</p><p><b> 目 錄</b></p><p><b> 1 整體方案1</b></p><p><b> 2 硬件結(jié)
9、構(gòu)1</b></p><p> 2.1 單片機(jī)主控板1</p><p> 2.2 存儲(chǔ)器3</p><p> 2.3 紅外遙控3</p><p> 2.4 功放驅(qū)動(dòng)4</p><p> 2.5 串行接口電路4</p><p><b> 3
10、 軟件結(jié)構(gòu)5</b></p><p> 3.1 功能模塊的劃分5</p><p> 3.2 各模塊的功能設(shè)計(jì)6</p><p> 4 調(diào)試分析11</p><p> 4.1 中斷處理方式有誤11</p><p> 4.2 音階和音符錄入時(shí)出錯(cuò)11</p><
11、;p> 4.3 音樂播放時(shí)不對(duì)11</p><p> 5 心得體會(huì)12</p><p><b> 6 附件13</b></p><p> 6.1 各部分實(shí)物圖13</p><p> 6.2 源代碼15</p><p><b> 7 評(píng)分表25&l
12、t;/b></p><p><b> 1 整體方案</b></p><p> 這個(gè)系統(tǒng)主要是通過紅外遙控的方式來控制小型揚(yáng)聲器的發(fā)音電路,使單片機(jī)發(fā)出不同頻率的方波,來驅(qū)動(dòng)發(fā)音電路發(fā)出對(duì)應(yīng)聲調(diào)的聲音。此系統(tǒng)由五個(gè)部分組成:?jiǎn)纹瑱C(jī)最小系統(tǒng)、紅外遙控與接收、LM386功放驅(qū)動(dòng)電路、E2PROM存儲(chǔ)、串行接口電路等五個(gè)部分。單片機(jī)最小系統(tǒng)主要用來產(chǎn)生定時(shí)脈沖信號(hào)
13、,發(fā)出不同頻率的方波,以使驅(qū)動(dòng)電路發(fā)出對(duì)應(yīng)聲調(diào)的聲音。紅外遙控部分包括紅外遙控器和紅外接收器。通過按紅外遙控器上的1鍵和2鍵來控制音樂的切換播放。E2PROM存儲(chǔ)部分主要存儲(chǔ)音樂的音調(diào)和節(jié)拍,為驅(qū)動(dòng)電路提供輸出數(shù)據(jù),且保證掉電后不丟失數(shù)據(jù)。串行接口為RS-232C接口,主要是通過該接口將程序從PC機(jī)上下載到單片機(jī)主控板中。</p><p> 其原理框圖如圖1所示:</p><p><
14、;b> S</b></p><p> IR SCL </p><p> IR SCL </p><p><b> SDA</b></p><p> 圖1 紅外遙控電子琴系統(tǒng)框圖</p&g
15、t;<p><b> 2 硬件結(jié)構(gòu)</b></p><p> 2.1 單片機(jī)主控板</p><p> 這個(gè)單片機(jī)最小系統(tǒng)中包含了復(fù)位電路、晶振電路和AT89S51芯片。AT89S51芯片是一個(gè)低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含4k Bytes ISP(In-system programmable)的可反復(fù)擦寫1000次的Fla
16、sh只讀程序存儲(chǔ)器,器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)制造,兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲(chǔ)單元,AT89S51在眾多嵌入式控制應(yīng)用系統(tǒng)中得到廣泛應(yīng)用。</p><p><b> 主要性能特點(diǎn)有:</b></p><p> (1) 4k Bytes Flash片內(nèi)程序存儲(chǔ)器;&
17、lt;/p><p> (2) 128 bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM);</p><p> (3) 32個(gè)外部雙向輸入/輸出(I/O)口;</p><p> (4) 2個(gè)中斷優(yōu)先級(jí)、2層中斷嵌套中斷;</p><p> (5) 6個(gè)中斷源;</p><p> (6) 2個(gè)16位可編程定時(shí)器/計(jì)數(shù)
18、器;</p><p> (7) 2個(gè)全雙工串行通信口;</p><p> (8) 看門狗(WDT)電路;</p><p> (9) 片內(nèi)振蕩器和時(shí)鐘電路;</p><p> (10) 與MCS-51兼容;</p><p> (11) 全靜態(tài)工作:0Hz-33MHz;</p><p
19、> (12) 三級(jí)程序存儲(chǔ)器保密鎖定;</p><p> (13) 可編程串行通道;</p><p> (14) 低功耗的閑置和掉電模式。</p><p> AT89S51引腳分配圖如下所示:</p><p> 圖2 AT89S51引腳分配圖</p><p> 晶振是給單片機(jī)提供工作信號(hào)脈沖的
20、,這個(gè)脈沖就是單片機(jī)的工作速率在電氣上它可以等效成一個(gè)電容和一個(gè)電阻并聯(lián)再串聯(lián)一個(gè)電容的二端網(wǎng)絡(luò),電工學(xué)上這個(gè)網(wǎng)絡(luò)有兩個(gè)諧振點(diǎn),以頻率的高低分其中較低的頻率是串聯(lián)諧振,較高的頻率是并聯(lián)諧振。這個(gè)并聯(lián)諧振電路加到一個(gè)負(fù)反饋電路中就可以構(gòu)成正弦波振蕩電路,也就是晶振電路。由于晶振等效為電感的頻率范圍很窄,所以即使其他元件的參數(shù)變化很大,這個(gè)振蕩器也不會(huì)有很大的變化。原理圖如圖3所示:</p><p> 圖3 晶振
21、電路原理圖</p><p> 復(fù)位電路是提供給單片機(jī)一個(gè)復(fù)位信號(hào)。在這次實(shí)驗(yàn)中,XTAL1(19腳)和XTAL2(18腳)接晶振電路,RST(9腳)接口跟復(fù)位電路相接。原理圖如圖4所示:</p><p> 圖4 復(fù)位電路原理圖</p><p><b> 2.2 存儲(chǔ)器</b></p><p> 這里采用的存儲(chǔ)
22、器芯片是24C16。這是一個(gè)16K位串行CMOS E2PROM,內(nèi)部含有2048個(gè)8位字節(jié),有一個(gè)16字節(jié)頁寫緩沖。該器件通過I2C總線接口進(jìn)行操作,有一個(gè)專門的寫保護(hù)功能。采用8引腳DIP,其引腳如下圖所示。其中,Vcc、GND為電源引腳,SCL、SDA為I2C總線引腳,SCL由單片機(jī)P3.5引腳控制,SDA由單片機(jī)P3.6引腳控制。A0~A2為地址引腳,TEST為測(cè)試端,系統(tǒng)中可接地處理。</p><p>
23、 其引腳配置圖如圖5所示:</p><p> 圖5 24C16引腳分配圖</p><p><b> 2.3 紅外遙控</b></p><p> 紅外遙控部分包括紅外遙控器和紅外接收器。在此系統(tǒng)中通過按紅外遙控器上的按鍵來控制音樂的切換播放。紅外接收器接在單片機(jī)主控板的P3.3引腳上,將接收到的紅外信號(hào)傳送給單片機(jī)主控板,主控板根據(jù)接收
24、到的紅外信號(hào)做出相應(yīng)的選擇,控制功放驅(qū)動(dòng)電路播放相應(yīng)的音樂。</p><p> 工作原理圖如圖6所示:</p><p><b> S</b></p><p> IR </p><p> 圖6 紅外接收原理圖</p><p>
25、;<b> 2.4 功放驅(qū)動(dòng)</b></p><p> 功放驅(qū)動(dòng)部分主要是根據(jù)單片機(jī)主控板所發(fā)出的不同脈沖信號(hào),將其進(jìn)行放大并使蜂鳴器播放出相應(yīng)聲調(diào)的聲音,對(duì)音樂進(jìn)行播放。由單片機(jī)P1.6引腳控制。</p><p> 這里采用LM386驅(qū)動(dòng)電路。LM386是一種音頻集成功放,具有自身功耗低、更新內(nèi)鏈增益可調(diào)整、電源電壓范圍大、外接元件少和總諧波失真小等優(yōu)點(diǎn)的功
26、率放大器。輸入音頻信號(hào)通過音量電位器由同相輸入端3腳輸入,阻容網(wǎng)絡(luò)C5和RP也通過3腳接入,調(diào)節(jié)RP可以改變電路增益。反相輸入端接地;6腳接電源,C9為電源濾波電容;1、8腳外接變?nèi)菥W(wǎng)絡(luò)C7;輸出端5腳通過C6接揚(yáng)聲器負(fù)載,電路為OTL形式;R10、C8并聯(lián)在負(fù)載兩端,主要用于改善輸出頻率響應(yīng)。</p><p> 其原理圖如圖7所示:</p><p> 圖7 功放電路原理圖</
27、p><p> 2.5 串行接口電路</p><p> 這里的串行接口采用的是RS-232C接口。RS-232C接口是美國電子工業(yè)協(xié)會(huì)與貝爾實(shí)驗(yàn)室等機(jī)構(gòu)于1969年公布的串行通信接口標(biāo)準(zhǔn),適用于帶調(diào)制解調(diào)器的通信場(chǎng)合,當(dāng)RS-232C的電氣特性是屬于非平衡傳輸方式,抗干擾能力較弱,故傳輸距離較短。RS-232C采用負(fù)邏輯,將-5 ~ -15V規(guī)定為邏輯“1”,+5 ~ +15V規(guī)定為邏輯“
28、0”,</p><p> 最高傳輸率為19.2kbit/s,傳輸距離一般不超過15m。RS-232C采用標(biāo)準(zhǔn)的DB-25連接器,也可采用DB-9連接器。這里采用的就是DB-9的RS-232C接口。</p><p> 其接口電路圖如圖8所示:</p><p> 圖8 串行接口電路圖</p><p><b> 3 軟件結(jié)構(gòu)&
29、lt;/b></p><p> 3.1 功能模塊的劃分</p><p> 該程序通過單片機(jī)的定時(shí)器T0中斷產(chǎn)生不同的頻率節(jié)拍,組合成音樂的不同音調(diào)。由外部中斷1來處理接收到的紅外信號(hào),采用對(duì)高電平持續(xù)時(shí)間計(jì)時(shí)的方式來判斷出‘0’‘1’脈沖電平。在主函數(shù)中將給出的音樂音符寫進(jìn)存儲(chǔ)器中,并通過判斷紅外接收器接收到的來自紅外遙控器產(chǎn)生的不同信號(hào)和單片機(jī)產(chǎn)生的不同的頻率節(jié)拍信號(hào),根據(jù)這
30、些信號(hào)從存儲(chǔ)器中讀取出相應(yīng)的音符,將其傳送到功放驅(qū)動(dòng)電路,對(duì)其進(jìn)行放大并驅(qū)動(dòng)蜂鳴器放出聲音。</p><p> 程序的整個(gè)流程圖如圖9所示:</p><p><b> N</b></p><p><b> Y </b></p><p><b> 圖9 程序流程圖</b>
31、;</p><p> 3.2 各模塊的功能設(shè)計(jì)</p><p> 3.2.1 定時(shí)器中斷0和外部中斷1模塊</p><p> 在函數(shù)聲明(紅外音樂.c)部分中先對(duì)定時(shí)器T0和外部中斷1進(jìn)行初始化。定時(shí)器采用的工作方式為方式2,TH0、TL0的初始值都設(shè)置為0。程序如下:</p><p> void TIM0init() //定時(shí)
32、器0初始化函數(shù)</p><p> { TMOD=0x21; //定時(shí)器0工作方式2, </p><p> ET0=1; //開中斷</p><p> TH0=0X00;TL0=0X00; // TH0、TL0賦初值為0</p><p> TR0=1; </p><p><b&g
33、t; }</b></p><p> void EX0init() //外部中斷1初始化函數(shù)</p><p> { IT1 = 1; //指定外部中斷1為下降沿觸發(fā)</p><p> EX1 = 1; //開外部中斷</p><p> EA = 1; //開總中斷</p><p>
34、<b> }</b></p><p> 在主函數(shù)(main.c)部分對(duì)定時(shí)器T0和外部中斷1進(jìn)行中斷處理。將頻率數(shù)值賦給TH0、TL0時(shí)引發(fā)定時(shí)器中斷T0工作,產(chǎn)生相應(yīng)的頻率脈沖信號(hào)。對(duì)定時(shí)器T0產(chǎn)生的脈沖信號(hào)的高電平脈沖持續(xù)的時(shí)間進(jìn)行計(jì)數(shù),以判別出“1” 碼和“0”碼。當(dāng)持續(xù)時(shí)間小于0.84ms時(shí)判為“0”碼,當(dāng)持續(xù)時(shí)間大于0.84ms時(shí)判為“1”碼。根據(jù)接收到的不同“1”“0”碼信號(hào)
35、判斷出不同的按鍵選擇,將按鍵信號(hào)通過紅外傳輸送給紅外接收器。紅外接收器再將按鍵信號(hào)通過單片機(jī)主控板傳送給功放驅(qū)動(dòng)電路,驅(qū)動(dòng)蜂鳴器放出不同音調(diào)的音符。程序如下:</p><p> void tim0_isr () interrupt 1 //定時(shí)器中斷0處理程序</p><p> { TR0=0; //暫時(shí)關(guān)閉中斷</p><p&g
36、t; s=!s; //定時(shí)為半個(gè)周期,再取反合成一個(gè)周期</p><p> TH0=timer0h;TL0=timer0l; //將頻率數(shù)值賦給TH0、TL0</p><p> TR0=1; //開中斷</p><p><b> }</b></p><p>
37、; void IR_decode() interrupt 2 //外部中斷</p><p> { uchar j,k,count=0;</p><p> EX1 = 0; //暫時(shí)關(guān)閉外中斷1中斷請(qǐng)求</p><p> delay(20);//延時(shí)20*0.14=2.8ms</p><p> if (IR=
38、=1) //等待 IRIN低電平出現(xiàn)</p><p> { EX1 =1;//開外中斷1</p><p> return;//中斷返回</p><p> } </p><p> while (!IR) delay(1); //等待IRIN變?yōu)楦唠娖?,跳過9m
39、s的低電平引導(dǎo)碼</p><p> for (j=0;j<4;j++) //收集四組數(shù)據(jù),即用戶碼低位、用戶碼高位、鍵值數(shù)據(jù)碼和鍵值數(shù)碼反碼</p><p><b> { </b></p><p> for (k=0;k<8;k++) //每組數(shù)據(jù)有8位</p><p>
40、{ while (IR) //等待IRIN變?yōu)榈碗娖剑^4.5ms的高電平引導(dǎo)碼信號(hào)。</p><p><b> delay(1);</b></p><p> while (!IR) //等待IRIN變?yōu)楦唠娖?lt;/p><p><b> delay(1);</b></p>
41、<p> while (IR) //對(duì)IRIN高電平時(shí)間進(jìn)行計(jì)數(shù)</p><p> { delay(1);//延時(shí)0.14ms</p><p> count++; //對(duì)0.14ms延時(shí)時(shí)間進(jìn)行計(jì)數(shù)</p><p> if (count>=30)</p><p>
42、{ EX1=1;//開外中斷1</p><p> return;//0.14ms計(jì)數(shù)過長(zhǎng)則返回</p><p> } </p><p><b> } </b></p><p> IRcord[j]=IRcord[j] >> 1;//若計(jì)數(shù)小于6,數(shù)據(jù)最
43、高位補(bǔ)"0",說明收到的是"0"</p><p> if (count>=6) {IRcord[j] = IRcord[j] | 0x80;} //若計(jì)數(shù)大于等于6,數(shù)據(jù)最高位補(bǔ)"1",說明收到的是"1"</p><p> count=0;//計(jì)數(shù)器清0</p><p&g
44、t;<b> }</b></p><p><b> }</b></p><p> if (IRcord[2]!=~IRcord[3])//將鍵數(shù)據(jù)反碼取反后與鍵數(shù)據(jù)碼碼比較,若不等,表示接收數(shù)據(jù)錯(cuò)誤,放棄</p><p> { EX1=1;</p><p><b> re
45、turn;</b></p><p><b> }</b></p><p><b> }</b></p><p> 3.2.2 存儲(chǔ)器模塊</p><p> 存儲(chǔ)器模塊主要是將數(shù)據(jù)寫入到E2PROM中進(jìn)行保存。需要的時(shí)候再從E2PROM中讀取出來。E2PROM通過串行數(shù)據(jù)線SDA
46、和串行時(shí)鐘線與單片機(jī)進(jìn)行連接。E2PROM進(jìn)行數(shù)據(jù)傳送時(shí),每一位數(shù)據(jù)都與時(shí)鐘脈沖相對(duì)應(yīng)。在時(shí)鐘線SCL為高電平期間,數(shù)據(jù)線SDA上必須保持穩(wěn)定的邏輯電平;只有在SCL為低電平時(shí),才允許SDA上的電平發(fā)生變化。其單個(gè)字節(jié)的讀寫程序如下所示:</p><p> uchar iic_write_byte(uchar wdata)//將單個(gè)字節(jié)寫入E2PROM中</p><p> {
47、uchar bit_cnt;</p><p> for(bit_cnt=0;bit_cnt<8;bit_cnt++)</p><p> { if(wdata & 0x80) SDA=1;</p><p> else SDA=0;</p><p> wdata<<=1; //在SDA上寫數(shù)據(jù)<
48、;/p><p> delay_10us();</p><p> SCL=1; </p><p> delay_10us();</p><p><b> SCL=0;</b></p><p><b> }</b></p><p> de
49、lay_10us();</p><p><b> SDA=1;</b></p><p> SCL=1; //SCL下降沿到來時(shí),將SDA上的數(shù)據(jù)寫入E2PROM中</p><p> delay_10us();</p><p> if(SDA==1) bit_cnt=0;</p><p&
50、gt; else bit_cnt=1;</p><p><b> SCL=0;</b></p><p> return bit_cnt;</p><p><b> }</b></p><p> uchar iic_read_byte() //從E2PROM中讀取單個(gè)字節(jié)</
51、p><p><b> {</b></p><p> uchar bit_cnt,rdata;</p><p><b> SDA=1;</b></p><p> for(bit_cnt=0;bit_cnt<8;bit_cnt++) //每個(gè)字節(jié)有8位</p><p&g
52、t;<b> {</b></p><p> SCL=0;</p><p> delay_10us();</p><p> SCL=1; //SCL為上升沿</p><p> delay_10us();</p><p> rdata<<=1;
53、 //從SDA上讀取數(shù)據(jù)</p><p> if(SDA==1) rdata|=0x01;</p><p> delay_10us();</p><p><b> }</b></p><p><b> SCL=0;</b></p><p> return rdata
54、;</p><p><b> }</b></p><p> 3.2.3 音階和音符的定義模塊</p><p> 音階由十六位組成,分為高八位和第八位,可由定時(shí)器根據(jù)音節(jié)列表產(chǎn)生。每個(gè)音符由三位組成,第一位表示為第幾個(gè)音;第二位表示第幾個(gè)八度,即高中低音,3表示高音,2表示中音,1表示低音;最后一位表示每個(gè)音的時(shí)長(zhǎng),這里以半拍為延時(shí)單位。
55、其代碼如下所示:</p><p> uchar code a[]= // 音階頻率表 高八位</p><p> {0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, </p><p> 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i</p>
56、<p> 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,</p><p> 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,</p><p><b> };</b></p><p> uchar code b[]=// 音階頻率表 低八位</p><p>
57、{ 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,</p><p> 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i</p><p> 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, </p><p> 0x47,0x77,0xA2,0xB6
58、,0xDA,0xFA,0x16,</p><p><b> };</b></p><p> uchar code music1[]=</p><p> { 1,3,2, 7,2,1, 7,2,1, 6,2,1, 6,2,1, 3,2,2, 3,2,2,</p><p> 6,2,1, 6,2,1, 6,2,
59、2, 6,2,1, 1,3,1, 5,2,1, 3,2,3,</p><p> 1,3,2, 7,2,1, 7,2,1, 3,2,1, 3,2,1, 5,2,1, 7,2,1,</p><p> 6,2,4, 6,2,1, 6,2,1, 2,2,1, 2,2,1, 2,2,1, 2,2,1,</p><p> 2,2,2, 1,2,1, 6,1,1, 2,2,
60、1, 3,2,3, 3,2,2, 1,3,2,</p><p><b> };</b></p><p> uchar code music2[]=</p><p><b> {</b></p><p> 5,3,2, 3,3,1, 4,3,1, 5,3,2, 3,3,1, 4,3,1, 5,
61、3,1, 5,2,1,</p><p> 6,2,1, 7,2,1, 1,3,1, 2,3,1, 3,3,1, 4,3,1, 3,3,2, 1,3,1,</p><p> 2,3,1, 3,3,2, 3,2,1, 4,2,1, 5,2,1, 6,2,1, 5,2,1, 4,2,1,</p><p> 5,2,1, 3,2,1, 4,2,1, 5,2,1, 4,
62、2,2, 6,2,1, 5,2,1, 4,2,2,</p><p> 3,2,1, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 2,2,1, 3,2,1, 4,2,1,</p><p> 5,2,1, 6,2,1, 4,2,2, 6,2,1, 5,2,1, 6,2,1, 7,2,1, 1,3,1,</p><p> 5,2,1, 6,2,1, 7,
63、2,1,</p><p><b> }; </b></p><p> //一個(gè)音符有三個(gè)數(shù)字。前為第幾個(gè)音、中為第幾個(gè)八度、后為時(shí)長(zhǎng)(以半拍為單位)。</p><p> //6, 3, 3 分別代表:6, 高音, 3個(gè)半拍;</p><p> //5, 2, 1 分別代表:5, 中音, 1個(gè)半拍;</p&
64、gt;<p> //3, 1, 2 分別代表:3, 低音, 2個(gè)半拍;</p><p><b> 4 調(diào)試分析</b></p><p> 4.1 中斷處理方式有誤</p><p> 本程序中使用到了定時(shí)器中斷和外部中斷。剛開始時(shí)在定時(shí)器的初始化中忘記了給TH0、TL0賦初始值,且在初始化時(shí)忘記了開總中斷EA,導(dǎo)致定時(shí)器
65、不能正常工作。而在外部中斷的使用時(shí),選擇的是外部中斷0,致使在中斷處理的過程當(dāng)中出現(xiàn)了錯(cuò)誤的結(jié)果。</p><p> 后經(jīng)小組成員的探討,將程序從頭開始仔細(xì)檢查才得以發(fā)現(xiàn)問題并改正。改正后的程序才得以正常處理中斷事件。</p><p> 4.2 音階和音符錄入時(shí)出錯(cuò)</p><p> 一開始由于我們沒有明確老師“音調(diào)頻率和節(jié)拍要由定時(shí)器自動(dòng)產(chǎn)生”的要求。也沒
66、搞清楚音調(diào)還有高、中、低之分以及音符的表達(dá)方式,在表示時(shí)就直接使用了“1、2、3、4、5、6、7、8”來表示,導(dǎo)致播放不出聲音。</p><p> 后來請(qǐng)教了老師和同學(xué),明確了課題要求。并上網(wǎng)翻書查找了相關(guān)的資料,才弄清楚了音階和音符的表達(dá)方式。改正之后才得以使用。</p><p> 4.3 音樂播放時(shí)不對(duì)</p><p> 在經(jīng)過多次的調(diào)整修改后,我們的電
67、子琴終于可以放出音樂了。但是也是在這時(shí)我們又發(fā)現(xiàn)了新的問題。在我們的設(shè)計(jì)中,本來要求是可以根據(jù)不同的按鍵選擇來切換播放音樂的,也就是按1鍵可以放第一首歌,按2鍵的時(shí)候就可以切換到放第二首歌。且不停的按鍵時(shí),音樂可以循環(huán)的切換播放。而我們的設(shè)計(jì)按遙控器1鍵,揚(yáng)聲器放第一首歌,但在放第一首歌的過程中再按遙控器2鍵,揚(yáng)聲器卻沒有切換到第二首歌,而且,等兩首歌全放完后,無論是按1鍵還是2鍵,揚(yáng)聲器都不再播放。</p><p&
68、gt; 后來請(qǐng)教同學(xué)和仔細(xì)檢查了程序,終于發(fā)現(xiàn)了錯(cuò)誤之處:在處理音樂播放的函數(shù)中沒有先將外部中斷1關(guān)閉再開啟,導(dǎo)致程序無法再引發(fā)下次中斷,不能再次播放音樂。于是改寫了程序,才得以達(dá)到要求。</p><p><b> 5 心得體會(huì)</b></p><p> 電子琴的設(shè)計(jì),老實(shí)說,不是所有組中最難的題目。但那并不能成為我們敷衍的理由。況且,任何一件事,想要做好它,
69、并不是想象中的那么簡(jiǎn)單。而且,這次課程設(shè)計(jì)和以往的不一樣,它需要幾個(gè)人共同來完成。它能否圓滿地完成,不僅僅取決于該組中各成員的實(shí)踐能力,更取決于該組中各組員之間的默契和契合度,以及組員之間的相互理解和信任。比如說,在課程設(shè)計(jì)的開始,進(jìn)行組員任務(wù)分工時(shí),每個(gè)組員都會(huì)分到不同于另一組員的工作,如規(guī)劃整個(gè)設(shè)計(jì)流程、查找資料、寫程序、買實(shí)驗(yàn)用具和做課程設(shè)計(jì)報(bào)告等等。因?yàn)楣ぷ餍再|(zhì)的不同,難免會(huì)出現(xiàn)工作難易程度不同,這時(shí),組員之間就需要理解和對(duì)各成
70、員所負(fù)責(zé)工作能力的高度信任。同時(shí),各個(gè)成員在執(zhí)行任務(wù)的過程中,應(yīng)互幫互助,齊頭并進(jìn)。像前面所說的,要做好一件事并不簡(jiǎn)單。本組課程設(shè)計(jì)一個(gè)難點(diǎn)就在于如何將我們學(xué)過的知識(shí)應(yīng)用到電子琴設(shè)計(jì)這一實(shí)踐上來,也就是我們必須弄清楚實(shí)現(xiàn)此次課程設(shè)計(jì)的原理。這原理是,我們首先需要將某首歌的音調(diào)轉(zhuǎn)換成相應(yīng)的頻率,而不同的頻率對(duì)應(yīng)不同的周期,了解到這一問題后,我們可以通過單片機(jī)向揚(yáng)聲器輸送不同周期的脈沖方波電平信號(hào),從而使揚(yáng)聲器發(fā)出接收到的不同周期所對(duì)應(yīng)的不
71、同頻率的音調(diào)。</p><p> 從任務(wù)下達(dá)到課程設(shè)計(jì)的結(jié)束,差不多經(jīng)過了一個(gè)月的時(shí)間。但是之前由于大家都在忙著復(fù)習(xí)考試,所以根本也就沒開始著手去做。課程設(shè)計(jì)雖然辛苦一點(diǎn),但是真正辛苦了也就只有這一個(gè)星期,真正可以學(xué)到東西的也只有這一個(gè)星期。在這一個(gè)星期里,它考察了我們應(yīng)用理論知識(shí)解決實(shí)際問題的能力,更考驗(yàn)了幾個(gè)組員作為一個(gè)團(tuán)體的團(tuán)結(jié)合作能力。這是一段這樣的日子,它告訴我們,真正努力過的結(jié)果從來都不會(huì)令人失望,
72、更教會(huì)我們,組員間的相互理解、信任、支持對(duì)于一個(gè)團(tuán)體來說有多么的重要。我們?cè)趯?shí)際操作過程中犯的一些錯(cuò)誤也會(huì)提高自己解決問題的能力和對(duì)于有關(guān)知識(shí)點(diǎn)的理解。在具體操作中使得這學(xué)期所學(xué)的理論知識(shí)得到了鞏固,同時(shí)也增進(jìn)了同學(xué)們之間的交流與了解。 </p><p><b> 6 附件</b></p><p> 6.1 各部分實(shí)物圖</p><p>
73、; 6.1.1 整體實(shí)物圖</p><p> 圖10 紅外遙控電子琴整體實(shí)物圖</p><p> 6.1.2 單片機(jī)主控板</p><p> 圖11 單片機(jī)主控板實(shí)物圖</p><p> 6.1.3 紅外遙控</p><p> 圖12 紅外遙控器實(shí)物圖</p><p>
74、 6.1.4 驅(qū)動(dòng)電路</p><p> 圖13 驅(qū)動(dòng)電路實(shí)物圖</p><p> 6.1.5 存儲(chǔ)器</p><p> 圖14 EEPROM芯片實(shí)物圖</p><p><b> 6.2 源代碼</b></p><p> /*-------------------------
75、-----------------------</p><p><b> 函數(shù)聲明部分頭文件</b></p><p> ------------------------------------------------*/</p><p> #define uchar unsigned char</p><p>
76、 #define uint unsigned int </p><p> #define delay_10us() _nop_();_nop_();_nop_();_nop_();_nop_();\</p><p> _nop_();_nop_();_nop_();_nop_();_nop_()</p><p> #define iic_start() S
77、DA=1;SCL=1;delay_10us();SDA=0;delay_10us();SCL=0</p><p> #define iic_stop() SDA=0;SCL=1;delay_10us();SDA=1;delay_10us()</p><p> #define iic_ack(X) SDA=(X)&0x01;delay_10us();SCL=1;delay_1
78、0us();SCL=0 </p><p> #define AT24C16 0xa0 </p><p> sbit s=P1^6; //驅(qū)動(dòng)電路接口</p><p> sbit SCL=P3^5; //存儲(chǔ)器接口</p><p> sbit SDA=P3^6; </p><p> sbit IR=P3^
79、3; //紅外接口標(biāo)志</p><p> void delay_ms(uint z);</p><p> void delay1(uchar t);</p><p> void song();</p><p> void EX0init();</p><p> void TIM0init();</p&
80、gt;<p> uchar iic_read_str(uchar sla,uchar suba,uchar *s,uchar len);</p><p> uchar iic_write_str(uchar sla,uchar suba,uchar *s,uchar len);</p><p> uchar iic_read_byte();</p><
81、;p> uchar iic_write_byte(uchar wdata);</p><p> /*------------------------------------------------</p><p><b> 函數(shù)聲明</b></p><p> ------------------------------------
82、------------*/</p><p> #include<reg52.h></p><p> #include<intrins.h></p><p> #include "紅外音樂.h"</p><p> uchar iic_write_byte(uchar wdata)//將單
83、個(gè)字節(jié)寫入E2PROM中</p><p> { uchar bit_cnt;</p><p> for(bit_cnt=0;bit_cnt<8;bit_cnt++)</p><p> { if(wdata & 0x80) SDA=1;</p><p> else SDA=0;</p><p>
84、; wdata<<=1; //在SDA上寫數(shù)據(jù)</p><p> delay_10us();</p><p> SCL=1; </p><p> delay_10us();</p><p><b> SCL=0;</b></p><p><b>
85、 }</b></p><p> delay_10us();</p><p><b> SDA=1;</b></p><p> SCL=1; //SCL下降沿到來時(shí),將SDA上的數(shù)據(jù)寫入E2PROM中</p><p> delay_10us();</p><p> if(
86、SDA==1) bit_cnt=0;</p><p> else bit_cnt=1;</p><p><b> SCL=0;</b></p><p> return bit_cnt;</p><p><b> }</b></p><p> uchar iic
87、_read_byte() //從E2PROM中讀取單個(gè)字節(jié)</p><p> { uchar bit_cnt,rdata;</p><p><b> SDA=1;</b></p><p> for(bit_cnt=0;bit_cnt<8;bit_cnt++) //每個(gè)字節(jié)有8位</p><p>
88、 { SCL=0;</p><p> delay_10us();</p><p> SCL=1; //SCL為上升沿</p><p> delay_10us();</p><p> rdata<<=1; //從SDA上讀取數(shù)據(jù)</p><p> if(SDA=
89、=1) rdata|=0x01;</p><p> delay_10us();</p><p><b> }</b></p><p><b> SCL=0;</b></p><p> return rdata;</p><p><b> }</b&g
90、t;</p><p> uchar iic_write_str(uchar sla,uchar suba,uchar *s,uchar len)</p><p> { uchar i;</p><p> iic_start();</p><p> if(iic_write_byte(sla)==0) return 0;</p
91、><p> if(iic_write_byte(suba)==0) return 0;</p><p> for(i=0;i<len;i++)</p><p><b> {</b></p><p> if(iic_write_byte(*s++)==0) return 0; </p><
92、p><b> }</b></p><p> iic_stop();</p><p><b> return 1;</b></p><p><b> }</b></p><p> uchar iic_read_str(uchar sla,uchar suba,uc
93、har *s,uchar len)</p><p> { uchar i;</p><p> iic_start();</p><p> if(iic_write_byte(sla)==0) return 0;</p><p> if(iic_write_byte(suba)==0) return 0; </p>
94、<p> iic_start(); </p><p> if(iic_write_byte(sla|0x01)==0) return 0;</p><p> for(i=0;i<len-1;i++)</p><p> { *s++=iic_read_byte();</p><p> iic_ack(0);<
95、/p><p><b> }</b></p><p> *s=iic_read_byte();</p><p> iic_ack(1);</p><p> iic_stop();</p><p><b> return 1;</b></p><p>
96、;<b> }</b></p><p> void delay_ms(uint z)</p><p> { uint x,y;</p><p> for(x=z;x>0;x--)</p><p> for(y=110;y>0;y--);</p><p><b>
97、 }</b></p><p> void delay1(uchar t)</p><p> { unsigned char t1;</p><p> unsigned long t2;</p><p> for(t1=0;t1<t;t1++)</p><p> for(t2=0;t2&l
98、t;7500;t2++)</p><p><b> {;}</b></p><p><b> TR0=0;</b></p><p><b> }</b></p><p> void TIM0init()//定時(shí)器0初始化</p><p> {
99、 TMOD=0x21;//定時(shí)器0工作方式2,TH0是重裝值,TL0是初值</p><p> ET0=1; //開中斷</p><p> TH0=0X00;TL0=0X00; //給TH0、TL0賦初始值為0</p><p> TR0=1; </p><p><b> }</b></p>
100、<p> void EX0init()</p><p> { IT1 = 1; //指定外部中斷1下降沿觸發(fā),INT0 (P3.2)</p><p> EX1 = 1; //開外部中斷</p><p> EA = 1; //開總中斷</p><p><b> }</b><
101、/p><p> /*------------------------------------------------</p><p><b> 主函數(shù)部分</b></p><p> ------------------------------------------------*/</p><p> #include
102、<reg52.h></p><p> #include<intrins.h></p><p> #include "紅外音樂.h"</p><p> uchar IRcord[4];</p><p> uchar timer0h,timer0l,time;</p><p&
103、gt; uchar code a[]= // 音階頻率表 高八位</p><p><b> { </b></p><p> 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, </p><p> 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,
104、4,5,6,7,8,i</p><p> 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,</p><p> 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,</p><p><b> };</b></p><p> uchar code b[]=// 音階頻率表 低八位
105、</p><p> { 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,</p><p> 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i</p><p> 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, </p><p>
106、; 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,</p><p><b> };</b></p><p> uchar code music1[]=</p><p> { 1,3,2, 7,2,1, 7,2,1, 6,2,1, 6,2,1, 3,2,2, 3,2,2,</p><p&g
107、t; 6,2,1, 6,2,1, 6,2,2, 6,2,1, 1,3,1, 5,2,1, 3,2,3,</p><p> 1,3,2, 7,2,1, 7,2,1, 3,2,1, 3,2,1, 5,2,1, 7,2,1,</p><p> 6,2,4, 6,2,1, 6,2,1, 2,2,1, 2,2,1, 2,2,1, 2,2,1,</p><p> 2,2
108、,2, 1,2,1, 6,1,1, 2,2,1, 3,2,3, 3,2,2, 1,3,2,</p><p><b> };</b></p><p> uchar code music2[]=</p><p> { 5,3,2, 3,3,1, 4,3,1, 5,3,2, 3,3,1, 4,3,1, 5,3,1, 5,2,1,</p
109、><p> 6,2,1, 7,2,1, 1,3,1, 2,3,1, 3,3,1, 4,3,1, 3,3,2, 1,3,1,</p><p> 2,3,1, 3,3,2, 3,2,1, 4,2,1, 5,2,1, 6,2,1, 5,2,1, 4,2,1,</p><p> 5,2,1, 3,2,1, 4,2,1, 5,2,1, 4,2,2, 6,2,1, 5,2,1
110、, 4,2,2,</p><p> 3,2,1, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 2,2,1, 3,2,1, 4,2,1,</p><p> 5,2,1, 6,2,1, 4,2,2, 6,2,1, 5,2,1, 6,2,1, 7,2,1, 1,3,1,</p><p> 5,2,1, 6,2,1, 7,2,1,</p>&
111、lt;p><b> }; </b></p><p> //一個(gè)音符有三個(gè)數(shù)字。前為第幾個(gè)音、中為第幾個(gè)八度、后為時(shí)長(zhǎng)(以半拍為單位)。</p><p> //6, 3, 3 分別代表:6, 高音, 3個(gè)半拍;</p><p> //5, 2, 1 分別代表:5, 中音, 1個(gè)半拍;</p><p> /
112、/3, 1, 2 分別代表:3, 低音, 2個(gè)半拍;</p><p> void delay(uchar x) //延時(shí)x*0.14ms</p><p> { uchar i;</p><p> while(x--)</p><p> for (i = 0; i<13; i++);</p><p&g
113、t;<b> }</b></p><p> void song()</p><p> { TH0=timer0h;</p><p> TL0=timer0l;</p><p><b> TR0=1;</b></p><p> delay1(time);
114、 </p><p><b> } </b></p><p> void tim0_isr () interrupt 1 //定時(shí)器中斷0</p><p> { TR0=0;</p><p><b> s=!s;</b></p><p
115、> TH0=timer0h;</p><p> TL0=timer0l; </p><p><b> TR0=1;</b></p><p><b> }</b></p><p> /*------------------------------------------------&l
116、t;/p><p><b> 外部中斷1中斷處理</b></p><p> ------------------------------------------------*/</p><p> void IR_decode() interrupt 2</p><p> { uchar j,k,count=0;&l
117、t;/p><p> EX1 = 0; //暫時(shí)關(guān)閉外中斷1中斷請(qǐng)求</p><p> delay(20);//延時(shí)20*0.14=2.8ms</p><p> if (IR==1) //等待 IRIN低電平出現(xiàn)</p><p> { EX1 =1;//開外中斷1</p><p> re
118、turn;//中斷返回</p><p> } </p><p> while (!IR) delay(1); //等待IRIN變?yōu)楦唠娖?,跳過9ms的低電平引導(dǎo)碼</p><p> for (j=0;j<4;j++) //收集四組數(shù)據(jù),即用戶碼低位、用戶碼高位、鍵值數(shù)據(jù)
119、碼和鍵值數(shù)碼反碼</p><p><b> { </b></p><p> for (k=0;k<8;k++) //每組數(shù)據(jù)有8位</p><p> { while (IR) //等待IRIN變?yōu)榈碗娖剑^4.5ms的高電平引導(dǎo)碼信號(hào)。</p><p><b> de
120、lay(1);</b></p><p> while (!IR) //等待IRIN變?yōu)楦唠娖?lt;/p><p><b> delay(1);</b></p><p> while (IR) //對(duì)IRIN高電平時(shí)間進(jìn)行計(jì)數(shù)</p><p> { delay(1)
121、;//延時(shí)0.14ms</p><p> count++; //對(duì)0.14ms延時(shí)時(shí)間進(jìn)行計(jì)數(shù)</p><p> if (count>=30)</p><p> { EX1=1;//開外中斷1</p><p> return;//0.14ms計(jì)數(shù)過長(zhǎng)則返回</p><p>
122、; } </p><p><b> } </b></p><p> IRcord[j]=IRcord[j] >> 1; //若計(jì)數(shù)小于6,數(shù)據(jù)最高位補(bǔ)"0",說明收到的是"0"</p><p> if (count>=6)
123、 {IRcord[j] = IRcord[j] | 0x80;} //若計(jì)數(shù)大于等于6,數(shù)據(jù)最高位補(bǔ)"1",說明收到的是"1"</p><p> count=0;//計(jì)數(shù)器清0</p><p><b> }</b></p><p><b> }</b></p
124、><p> if (IRcord[2]!=~IRcord[3])//將鍵數(shù)據(jù)反碼取反后與鍵數(shù)據(jù)碼碼比較,若不等,表示接收數(shù)據(jù)錯(cuò)誤,放棄</p><p><b> { </b></p><p><b> EX1=1;</b></p><p><b> return;</b>
125、;</p><p><b> }</b></p><p><b> }</b></p><p> void main()</p><p><b> { </b></p><p> uchar i,k,j;</p><p&
126、gt; iic_write_str(AT24C16,0,music1,75); //將數(shù)據(jù)寫入E2PROM中</p><p> delay_ms(10);</p><p> iic_write_str(AT24C16,76,music2,99);</p><p> delay_ms(10); </p><p> iic_read_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)---電子琴
- 單片機(jī)課程設(shè)計(jì)(電子琴)
- 單片機(jī)課程設(shè)計(jì)-電子琴
- 單片機(jī)課程設(shè)計(jì)——電子琴
- 單片機(jī)原理課程設(shè)計(jì)報(bào)告--電子琴
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子琴設(shè)計(jì)
- 單片機(jī)簡(jiǎn)易電子琴單片機(jī)課程設(shè)計(jì)
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---簡(jiǎn)單電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)-- 基于單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)簡(jiǎn)易電子琴
- 簡(jiǎn)易電子琴單片機(jī)課程設(shè)計(jì)
- 簡(jiǎn)易電子琴單片機(jī)課程設(shè)計(jì)
- 簡(jiǎn)易電子琴單片機(jī)課程設(shè)計(jì)
- 電子琴單片機(jī)課程設(shè)計(jì)--電子琴模擬實(shí)驗(yàn)
- 單片機(jī)課程設(shè)計(jì)簡(jiǎn)易電子琴
- 單片機(jī)課程設(shè)計(jì)——簡(jiǎn)易電子琴
- 單片機(jī)課程設(shè)計(jì)---簡(jiǎn)易電子琴
評(píng)論
0/150
提交評(píng)論