版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計 報 告</p><p> 課程名稱 嵌入式系統(tǒng)原理與設計 </p><p> 課題名稱 電子琴 </p><p> 專 業(yè) 通信工程 </p><p> 班 級
2、 </p><p> 學 號 </p><p> 姓 名 </p><p> 指導教師 </p><p> 2013年 1月 6日</p><p>
3、 課 程 設 計 任 務 書</p><p> 課程名稱 嵌入式系統(tǒng)原理與設計 </p><p> 課 題 電子琴 </p><p> 專業(yè)班級 通信工程1001 </p><p> 學生姓名 </p>&
4、lt;p> 學 號 </p><p> 指導老師 </p><p> 審 批 </p><p> 任務書下達日期 2012 年 12月18 日</p><p> 任務完成日期
5、 2013 年 1月 4 日</p><p><b> 設計課題一:電子琴</b></p><p><b> 問題描述:</b></p><p> 制作一個由紅外遙控器控制發(fā)音的電子琴。</p><p><b> 二、功能要求:</b></p><
6、p> 1、設計制作或購買能驅動小型揚聲器的發(fā)音電路,讓單片機送出不同頻率的方波,驅動此電路發(fā)出對應聲調的聲音。</p><p> 2、將兩首簡單歌曲的音調和節(jié)拍存儲在E2PROM芯片里</p><p> 3、通過紅外遙控器控制歌曲的選曲,按1鍵唱第一首歌,按2鍵唱第二首歌。</p><p><b> 三、主要器件準備:</b>&l
7、t;/p><p><b> 第一種方案</b></p><p> 51單片機最小系統(tǒng)、紅外遙控器和紅外接收HS38B5、揚聲器推薦8歐姆0.5W、</p><p> 驅動電路參考驅動電路</p><p> E2PROM 可以使用24C16 </p><p><b> 第二種方案&l
8、t;/b></p><p> 購買WT588D-U語音模塊、1單片機最小系統(tǒng)、紅外遙控器和紅外接收HS38B5、揚聲器推薦8歐姆0.5W。</p><p><b> 目 錄</b></p><p><b> 1 整體方案1</b></p><p><b> 2 硬件結
9、構1</b></p><p> 2.1 單片機主控板1</p><p> 2.2 存儲器3</p><p> 2.3 紅外遙控3</p><p> 2.4 功放驅動4</p><p> 2.5 串行接口電路4</p><p><b> 3
10、 軟件結構5</b></p><p> 3.1 功能模塊的劃分5</p><p> 3.2 各模塊的功能設計6</p><p> 4 調試分析11</p><p> 4.1 中斷處理方式有誤11</p><p> 4.2 音階和音符錄入時出錯11</p><
11、;p> 4.3 音樂播放時不對11</p><p> 5 心得體會12</p><p><b> 6 附件13</b></p><p> 6.1 各部分實物圖13</p><p> 6.2 源代碼15</p><p><b> 7 評分表25&l
12、t;/b></p><p><b> 1 整體方案</b></p><p> 這個系統(tǒng)主要是通過紅外遙控的方式來控制小型揚聲器的發(fā)音電路,使單片機發(fā)出不同頻率的方波,來驅動發(fā)音電路發(fā)出對應聲調的聲音。此系統(tǒng)由五個部分組成:單片機最小系統(tǒng)、紅外遙控與接收、LM386功放驅動電路、E2PROM存儲、串行接口電路等五個部分。單片機最小系統(tǒng)主要用來產(chǎn)生定時脈沖信號
13、,發(fā)出不同頻率的方波,以使驅動電路發(fā)出對應聲調的聲音。紅外遙控部分包括紅外遙控器和紅外接收器。通過按紅外遙控器上的1鍵和2鍵來控制音樂的切換播放。E2PROM存儲部分主要存儲音樂的音調和節(jié)拍,為驅動電路提供輸出數(shù)據(jù),且保證掉電后不丟失數(shù)據(jù)。串行接口為RS-232C接口,主要是通過該接口將程序從PC機上下載到單片機主控板中。</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 硬件結構</b></p><p> 2.1 單片機主控板</p><p> 這個單片機最小系統(tǒng)中包含了復位電路、晶振電路和AT89S51芯片。AT89S51芯片是一個低功耗,高性能CMOS 8位單片機,片內(nèi)含4k Bytes ISP(In-system programmable)的可反復擦寫1000次的Fla
16、sh只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統(tǒng)及80C51引腳結構,芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,AT89S51在眾多嵌入式控制應用系統(tǒng)中得到廣泛應用。</p><p><b> 主要性能特點有:</b></p><p> (1) 4k Bytes Flash片內(nèi)程序存儲器;&
17、lt;/p><p> (2) 128 bytes的隨機存取數(shù)據(jù)存儲器(RAM);</p><p> (3) 32個外部雙向輸入/輸出(I/O)口;</p><p> (4) 2個中斷優(yōu)先級、2層中斷嵌套中斷;</p><p> (5) 6個中斷源;</p><p> (6) 2個16位可編程定時器/計數(shù)
18、器;</p><p> (7) 2個全雙工串行通信口;</p><p> (8) 看門狗(WDT)電路;</p><p> (9) 片內(nèi)振蕩器和時鐘電路;</p><p> (10) 與MCS-51兼容;</p><p> (11) 全靜態(tài)工作:0Hz-33MHz;</p><p
19、> (12) 三級程序存儲器保密鎖定;</p><p> (13) 可編程串行通道;</p><p> (14) 低功耗的閑置和掉電模式。</p><p> AT89S51引腳分配圖如下所示:</p><p> 圖2 AT89S51引腳分配圖</p><p> 晶振是給單片機提供工作信號脈沖的
20、,這個脈沖就是單片機的工作速率在電氣上它可以等效成一個電容和一個電阻并聯(lián)再串聯(lián)一個電容的二端網(wǎng)絡,電工學上這個網(wǎng)絡有兩個諧振點,以頻率的高低分其中較低的頻率是串聯(lián)諧振,較高的頻率是并聯(lián)諧振。這個并聯(lián)諧振電路加到一個負反饋電路中就可以構成正弦波振蕩電路,也就是晶振電路。由于晶振等效為電感的頻率范圍很窄,所以即使其他元件的參數(shù)變化很大,這個振蕩器也不會有很大的變化。原理圖如圖3所示:</p><p> 圖3 晶振
21、電路原理圖</p><p> 復位電路是提供給單片機一個復位信號。在這次實驗中,XTAL1(19腳)和XTAL2(18腳)接晶振電路,RST(9腳)接口跟復位電路相接。原理圖如圖4所示:</p><p> 圖4 復位電路原理圖</p><p><b> 2.2 存儲器</b></p><p> 這里采用的存儲
22、器芯片是24C16。這是一個16K位串行CMOS E2PROM,內(nèi)部含有2048個8位字節(jié),有一個16字節(jié)頁寫緩沖。該器件通過I2C總線接口進行操作,有一個專門的寫保護功能。采用8引腳DIP,其引腳如下圖所示。其中,Vcc、GND為電源引腳,SCL、SDA為I2C總線引腳,SCL由單片機P3.5引腳控制,SDA由單片機P3.6引腳控制。A0~A2為地址引腳,TEST為測試端,系統(tǒng)中可接地處理。</p><p>
23、 其引腳配置圖如圖5所示:</p><p> 圖5 24C16引腳分配圖</p><p><b> 2.3 紅外遙控</b></p><p> 紅外遙控部分包括紅外遙控器和紅外接收器。在此系統(tǒng)中通過按紅外遙控器上的按鍵來控制音樂的切換播放。紅外接收器接在單片機主控板的P3.3引腳上,將接收到的紅外信號傳送給單片機主控板,主控板根據(jù)接收
24、到的紅外信號做出相應的選擇,控制功放驅動電路播放相應的音樂。</p><p> 工作原理圖如圖6所示:</p><p><b> S</b></p><p> IR </p><p> 圖6 紅外接收原理圖</p><p>
25、;<b> 2.4 功放驅動</b></p><p> 功放驅動部分主要是根據(jù)單片機主控板所發(fā)出的不同脈沖信號,將其進行放大并使蜂鳴器播放出相應聲調的聲音,對音樂進行播放。由單片機P1.6引腳控制。</p><p> 這里采用LM386驅動電路。LM386是一種音頻集成功放,具有自身功耗低、更新內(nèi)鏈增益可調整、電源電壓范圍大、外接元件少和總諧波失真小等優(yōu)點的功
26、率放大器。輸入音頻信號通過音量電位器由同相輸入端3腳輸入,阻容網(wǎng)絡C5和RP也通過3腳接入,調節(jié)RP可以改變電路增益。反相輸入端接地;6腳接電源,C9為電源濾波電容;1、8腳外接變?nèi)菥W(wǎng)絡C7;輸出端5腳通過C6接揚聲器負載,電路為OTL形式;R10、C8并聯(lián)在負載兩端,主要用于改善輸出頻率響應。</p><p> 其原理圖如圖7所示:</p><p> 圖7 功放電路原理圖</
27、p><p> 2.5 串行接口電路</p><p> 這里的串行接口采用的是RS-232C接口。RS-232C接口是美國電子工業(yè)協(xié)會與貝爾實驗室等機構于1969年公布的串行通信接口標準,適用于帶調制解調器的通信場合,當RS-232C的電氣特性是屬于非平衡傳輸方式,抗干擾能力較弱,故傳輸距離較短。RS-232C采用負邏輯,將-5 ~ -15V規(guī)定為邏輯“1”,+5 ~ +15V規(guī)定為邏輯“
28、0”,</p><p> 最高傳輸率為19.2kbit/s,傳輸距離一般不超過15m。RS-232C采用標準的DB-25連接器,也可采用DB-9連接器。這里采用的就是DB-9的RS-232C接口。</p><p> 其接口電路圖如圖8所示:</p><p> 圖8 串行接口電路圖</p><p><b> 3 軟件結構&
29、lt;/b></p><p> 3.1 功能模塊的劃分</p><p> 該程序通過單片機的定時器T0中斷產(chǎn)生不同的頻率節(jié)拍,組合成音樂的不同音調。由外部中斷1來處理接收到的紅外信號,采用對高電平持續(xù)時間計時的方式來判斷出‘0’‘1’脈沖電平。在主函數(shù)中將給出的音樂音符寫進存儲器中,并通過判斷紅外接收器接收到的來自紅外遙控器產(chǎn)生的不同信號和單片機產(chǎn)生的不同的頻率節(jié)拍信號,根據(jù)這
30、些信號從存儲器中讀取出相應的音符,將其傳送到功放驅動電路,對其進行放大并驅動蜂鳴器放出聲音。</p><p> 程序的整個流程圖如圖9所示:</p><p><b> N</b></p><p><b> Y </b></p><p><b> 圖9 程序流程圖</b>
31、;</p><p> 3.2 各模塊的功能設計</p><p> 3.2.1 定時器中斷0和外部中斷1模塊</p><p> 在函數(shù)聲明(紅外音樂.c)部分中先對定時器T0和外部中斷1進行初始化。定時器采用的工作方式為方式2,TH0、TL0的初始值都設置為0。程序如下:</p><p> void TIM0init() //定時
32、器0初始化函數(shù)</p><p> { TMOD=0x21; //定時器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)部分對定時器T0和外部中斷1進行中斷處理。將頻率數(shù)值賦給TH0、TL0時引發(fā)定時器中斷T0工作,產(chǎn)生相應的頻率脈沖信號。對定時器T0產(chǎn)生的脈沖信號的高電平脈沖持續(xù)的時間進行計數(shù),以判別出“1” 碼和“0”碼。當持續(xù)時間小于0.84ms時判為“0”碼,當持續(xù)時間大于0.84ms時判為“1”碼。根據(jù)接收到的不同“1”“0”碼信號
35、判斷出不同的按鍵選擇,將按鍵信號通過紅外傳輸送給紅外接收器。紅外接收器再將按鍵信號通過單片機主控板傳送給功放驅動電路,驅動蜂鳴器放出不同音調的音符。程序如下:</p><p> void tim0_isr () interrupt 1 //定時器中斷0處理程序</p><p> { TR0=0; //暫時關閉中斷</p><p&g
36、t; s=!s; //定時為半個周期,再取反合成一個周期</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; //暫時關閉外中斷1中斷請求</p><p> delay(20);//延時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的低電平引導碼</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的高電平引導碼信號。</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) //對IRIN高電平時間進行計數(shù)</p><p> { delay(1);//延時0.14ms</p><p> count++; //對0.14ms延時時間進行計數(shù)</p><p> if (count>=30)</p><p>
42、{ EX1=1;//開外中斷1</p><p> return;//0.14ms計數(shù)過長則返回</p><p> } </p><p><b> } </b></p><p> IRcord[j]=IRcord[j] >> 1;//若計數(shù)小于6,數(shù)據(jù)最
43、高位補"0",說明收到的是"0"</p><p> if (count>=6) {IRcord[j] = IRcord[j] | 0x80;} //若計數(shù)大于等于6,數(shù)據(jù)最高位補"1",說明收到的是"1"</p><p> count=0;//計數(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ù)錯誤,放棄</p><p> { EX1=1;</p><p><b> re
45、turn;</b></p><p><b> }</b></p><p><b> }</b></p><p> 3.2.2 存儲器模塊</p><p> 存儲器模塊主要是將數(shù)據(jù)寫入到E2PROM中進行保存。需要的時候再從E2PROM中讀取出來。E2PROM通過串行數(shù)據(jù)線SDA
46、和串行時鐘線與單片機進行連接。E2PROM進行數(shù)據(jù)傳送時,每一位數(shù)據(jù)都與時鐘脈沖相對應。在時鐘線SCL為高電平期間,數(shù)據(jù)線SDA上必須保持穩(wěn)定的邏輯電平;只有在SCL為低電平時,才允許SDA上的電平發(fā)生變化。其單個字節(jié)的讀寫程序如下所示:</p><p> uchar iic_write_byte(uchar wdata)//將單個字節(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下降沿到來時,將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中讀取單個字節(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++) //每個字節(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> 音階由十六位組成,分為高八位和第八位,可由定時器根據(jù)音節(jié)列表產(chǎn)生。每個音符由三位組成,第一位表示為第幾個音;第二位表示第幾個八度,即高中低音,3表示高音,2表示中音,1表示低音;最后一位表示每個音的時長,這里以半拍為延時單位。
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> //一個音符有三個數(shù)字。前為第幾個音、中為第幾個八度、后為時長(以半拍為單位)。</p><p> //6, 3, 3 分別代表:6, 高音, 3個半拍;</p><p> //5, 2, 1 分別代表:5, 中音, 1個半拍;</p&
64、gt;<p> //3, 1, 2 分別代表:3, 低音, 2個半拍;</p><p><b> 4 調試分析</b></p><p> 4.1 中斷處理方式有誤</p><p> 本程序中使用到了定時器中斷和外部中斷。剛開始時在定時器的初始化中忘記了給TH0、TL0賦初始值,且在初始化時忘記了開總中斷EA,導致定時器
65、不能正常工作。而在外部中斷的使用時,選擇的是外部中斷0,致使在中斷處理的過程當中出現(xiàn)了錯誤的結果。</p><p> 后經(jīng)小組成員的探討,將程序從頭開始仔細檢查才得以發(fā)現(xiàn)問題并改正。改正后的程序才得以正常處理中斷事件。</p><p> 4.2 音階和音符錄入時出錯</p><p> 一開始由于我們沒有明確老師“音調頻率和節(jié)拍要由定時器自動產(chǎn)生”的要求。也沒
66、搞清楚音調還有高、中、低之分以及音符的表達方式,在表示時就直接使用了“1、2、3、4、5、6、7、8”來表示,導致播放不出聲音。</p><p> 后來請教了老師和同學,明確了課題要求。并上網(wǎng)翻書查找了相關的資料,才弄清楚了音階和音符的表達方式。改正之后才得以使用。</p><p> 4.3 音樂播放時不對</p><p> 在經(jīng)過多次的調整修改后,我們的電
67、子琴終于可以放出音樂了。但是也是在這時我們又發(fā)現(xiàn)了新的問題。在我們的設計中,本來要求是可以根據(jù)不同的按鍵選擇來切換播放音樂的,也就是按1鍵可以放第一首歌,按2鍵的時候就可以切換到放第二首歌。且不停的按鍵時,音樂可以循環(huán)的切換播放。而我們的設計按遙控器1鍵,揚聲器放第一首歌,但在放第一首歌的過程中再按遙控器2鍵,揚聲器卻沒有切換到第二首歌,而且,等兩首歌全放完后,無論是按1鍵還是2鍵,揚聲器都不再播放。</p><p&
68、gt; 后來請教同學和仔細檢查了程序,終于發(fā)現(xiàn)了錯誤之處:在處理音樂播放的函數(shù)中沒有先將外部中斷1關閉再開啟,導致程序無法再引發(fā)下次中斷,不能再次播放音樂。于是改寫了程序,才得以達到要求。</p><p><b> 5 心得體會</b></p><p> 電子琴的設計,老實說,不是所有組中最難的題目。但那并不能成為我們敷衍的理由。況且,任何一件事,想要做好它,
69、并不是想象中的那么簡單。而且,這次課程設計和以往的不一樣,它需要幾個人共同來完成。它能否圓滿地完成,不僅僅取決于該組中各成員的實踐能力,更取決于該組中各組員之間的默契和契合度,以及組員之間的相互理解和信任。比如說,在課程設計的開始,進行組員任務分工時,每個組員都會分到不同于另一組員的工作,如規(guī)劃整個設計流程、查找資料、寫程序、買實驗用具和做課程設計報告等等。因為工作性質的不同,難免會出現(xiàn)工作難易程度不同,這時,組員之間就需要理解和對各成
70、員所負責工作能力的高度信任。同時,各個成員在執(zhí)行任務的過程中,應互幫互助,齊頭并進。像前面所說的,要做好一件事并不簡單。本組課程設計一個難點就在于如何將我們學過的知識應用到電子琴設計這一實踐上來,也就是我們必須弄清楚實現(xiàn)此次課程設計的原理。這原理是,我們首先需要將某首歌的音調轉換成相應的頻率,而不同的頻率對應不同的周期,了解到這一問題后,我們可以通過單片機向揚聲器輸送不同周期的脈沖方波電平信號,從而使揚聲器發(fā)出接收到的不同周期所對應的不
71、同頻率的音調。</p><p> 從任務下達到課程設計的結束,差不多經(jīng)過了一個月的時間。但是之前由于大家都在忙著復習考試,所以根本也就沒開始著手去做。課程設計雖然辛苦一點,但是真正辛苦了也就只有這一個星期,真正可以學到東西的也只有這一個星期。在這一個星期里,它考察了我們應用理論知識解決實際問題的能力,更考驗了幾個組員作為一個團體的團結合作能力。這是一段這樣的日子,它告訴我們,真正努力過的結果從來都不會令人失望,
72、更教會我們,組員間的相互理解、信任、支持對于一個團體來說有多么的重要。我們在實際操作過程中犯的一些錯誤也會提高自己解決問題的能力和對于有關知識點的理解。在具體操作中使得這學期所學的理論知識得到了鞏固,同時也增進了同學們之間的交流與了解。 </p><p><b> 6 附件</b></p><p> 6.1 各部分實物圖</p><p>
73、; 6.1.1 整體實物圖</p><p> 圖10 紅外遙控電子琴整體實物圖</p><p> 6.1.2 單片機主控板</p><p> 圖11 單片機主控板實物圖</p><p> 6.1.3 紅外遙控</p><p> 圖12 紅外遙控器實物圖</p><p>
74、 6.1.4 驅動電路</p><p> 圖13 驅動電路實物圖</p><p> 6.1.5 存儲器</p><p> 圖14 EEPROM芯片實物圖</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; //驅動電路接口</p><p> sbit SCL=P3^5; //存儲器接口</p><p> sbit SDA=P3^6; </p><p> sbit IR=P3^
79、3; //紅外接口標志</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、個字節(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下降沿到來時,將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中讀取單個字節(jié)</p><p> { uchar bit_cnt,rdata;</p><p><b> SDA=1;</b></p><p> for(bit_cnt=0;bit_cnt<8;bit_cnt++) //每個字節(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()//定時器0初始化</p><p> {
99、 TMOD=0x21;//定時器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> //一個音符有三個數(shù)字。前為第幾個音、中為第幾個八度、后為時長(以半拍為單位)。</p><p> //6, 3, 3 分別代表:6, 高音, 3個半拍;</p><p> //5, 2, 1 分別代表:5, 中音, 1個半拍;</p><p> /
112、/3, 1, 2 分別代表:3, 低音, 2個半拍;</p><p> void delay(uchar x) //延時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 //定時器中斷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; //暫時關閉外中斷1中斷請求</p><p> delay(20);//延時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的低電平引導碼</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的高電平引導碼信號。</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) //對IRIN高電平時間進行計數(shù)</p><p> { delay(1)
121、;//延時0.14ms</p><p> count++; //對0.14ms延時時間進行計數(shù)</p><p> if (count>=30)</p><p> { EX1=1;//開外中斷1</p><p> return;//0.14ms計數(shù)過長則返回</p><p>
122、; } </p><p><b> } </b></p><p> IRcord[j]=IRcord[j] >> 1; //若計數(shù)小于6,數(shù)據(jù)最高位補"0",說明收到的是"0"</p><p> if (count>=6)
123、 {IRcord[j] = IRcord[j] | 0x80;} //若計數(shù)大于等于6,數(shù)據(jù)最高位補"1",說明收到的是"1"</p><p> count=0;//計數(shù)器清0</p><p><b> }</b></p><p><b> }</b></p
124、><p> if (IRcord[2]!=~IRcord[3])//將鍵數(shù)據(jù)反碼取反后與鍵數(shù)據(jù)碼碼比較,若不等,表示接收數(shù)據(jù)錯誤,放棄</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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計---電子琴
- 單片機課程設計(電子琴)
- 單片機課程設計-電子琴
- 單片機課程設計——電子琴
- 單片機原理課程設計報告--電子琴
- 電子琴課程設計--基于單片機的電子琴設計
- 單片機課程設計---電子琴設計
- 電子琴課程設計-- 基于單片機的電子琴設計
- 電子琴課程設計--基于單片機的電子琴設計
- 單片機課程設計---電子琴設計
- 單片機簡易電子琴單片機課程設計
- 單片機課程設計報告---簡單電子琴設計
- 簡易電子琴單片機課程設計
- 簡易電子琴單片機課程設計
- 電子琴單片機課程設計--電子琴模擬實驗
- 簡易電子琴單片機課程設計
- 單片機課程設計簡易電子琴
- 單片機課程設計——簡易電子琴
- 單片機課程設計---簡易電子琴
- 單片機課程設計簡易電子琴
評論
0/150
提交評論