版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計任務(wù)書</b></p><p> 課 程 名 稱 單片機(jī)原理及應(yīng)用A </p><p> 設(shè) 計 課 題 電子琴設(shè)計 </p><p> 院(系、部、中心) 自動化學(xué)院 </p><p> 專 業(yè)
2、 自動化(數(shù)控技術(shù)) </p><p> 班 級 數(shù)控094 </p><p><b> 目 錄</b></p><p><b> 設(shè)計目的及任務(wù)</b></p><p><b> 設(shè)計目的</b></p>&
3、lt;p><b> 設(shè)計任務(wù)題目及要求</b></p><p><b> 總體方案設(shè)計</b></p><p><b> 設(shè)計任務(wù)分析</b></p><p><b> 設(shè)計方案</b></p><p><b> 設(shè)計原理<
4、/b></p><p><b> 程序流程圖</b></p><p><b> 硬件原理圖</b></p><p><b> 模塊設(shè)計</b></p><p><b> 鍵盤掃描模塊</b></p><p><b
5、> 定時器模塊</b></p><p><b> 調(diào)試過程</b></p><p><b> 問題發(fā)現(xiàn)與解決</b></p><p><b> 設(shè)計總結(jié)</b></p><p><b> 七、參考文獻(xiàn)</b></p>
6、<p><b> 八.程序清單</b></p><p><b> 一、設(shè)計目的及任務(wù)</b></p><p> 1.課程設(shè)計應(yīng)達(dá)到的目的</p><p> ?。?)運用<<單片機(jī)原理及應(yīng)用A>>課程等知識,根據(jù)題目要求進(jìn)行軟硬件系統(tǒng)的設(shè)計和調(diào)試,從而加深對本課程知識點的理解,使學(xué)
7、生綜合應(yīng)用知識能力、設(shè)計能力、調(diào)試能力及報告撰寫能力等顯著提高。</p><p> (2)了解計算機(jī)發(fā)聲原理, 進(jìn)一步熟悉定時器編程方法及鍵盤掃描電路工作原理及編程方法。</p><p> 2.課程設(shè)計題目及要求</p><p><b> ?。?)、題目</b></p><p><b> 電子琴設(shè)計<
8、;/b></p><p><b> (2)、設(shè)計要求:</b></p><p> 利用實驗儀上提供的鍵盤,使數(shù)字鍵1、2、3、4、5、6、7、8、9作為電子琴按鍵,其中1~7號鍵按下后即發(fā)出相應(yīng)的音調(diào)。8號鍵按下后依次發(fā)出“1、2、3、4、5、6、7” 音調(diào),9號鍵按下后依次發(fā)出“7、6、5、4、3、2、1” 音調(diào),用8255的PA.0 口發(fā)出音頻脈沖,驅(qū)動
9、喇叭。</p><p> 利用定時器,可以發(fā)出不同頻率的脈沖,不同頻率的脈沖經(jīng)喇叭驅(qū)動電路放大濾波后,就會發(fā)出不同的音調(diào).定時器按設(shè)置的定時參數(shù)產(chǎn)生中斷,這一次中斷發(fā)出脈沖低電平,下一次反轉(zhuǎn)發(fā)出脈沖高電平.由于定時參數(shù)不同,就發(fā)出了不同頻率的脈沖. 本實驗中按鍵一次,會發(fā)50個脈沖.發(fā)完后繼續(xù)檢測鍵盤,如果鍵還按下,繼續(xù)發(fā)音。</p><p><b> 二、總體方案設(shè)計<
10、;/b></p><p><b> 1、設(shè)計任務(wù)分析</b></p><p> 本任務(wù)的要求是根據(jù)不同的數(shù)字鍵被按下后,發(fā)出相對應(yīng)的音調(diào),或者順序、逆序連續(xù)的發(fā)出七中音調(diào),不同音調(diào)的產(chǎn)生對喇叭發(fā)出不同頻率的脈沖,而脈沖則是根據(jù)定時器中斷產(chǎn)生正負(fù)脈沖的跳變,這樣就形成了脈沖。與此同時,定時時間的長短,及頻率的高低,是由定時間的初值決定的。</p>
11、<p> 通過以上的析,可以明確,本課題需要涉及到的就是鍵盤掃描,和定時器。圍繞這兩個模塊,就可以制定出總體的設(shè)計方案。</p><p><b> 2、設(shè)計方案</b></p><p> 通過以上的分析,可以制定出以下的設(shè)計方案:</p><p> (1)、 因為要用到9個按鍵,可以用4*4的矩陣鍵盤,,對其中的9個按鍵進(jìn)行
12、標(biāo)號,再根據(jù)鍵盤掃描的原理,就可以找出是哪個鍵被按下。</p><p> ?。?)、不同頻率的脈沖均通過定時器來產(chǎn)生,定時器的初值不同,計滿溢出的頻率</p><p> 也是不同的,從而正負(fù)電平的跳變的頻率也不同,就產(chǎn)生了不停頻率的脈沖,所以只需對定時器設(shè)置不同德計數(shù)初值,便可實現(xiàn)不同頻率脈沖的產(chǎn)生。</p><p> ?。?)、喇叭發(fā)聲原理則是:對喇叭驅(qū)動電路交
13、替的施加施加低電平,喇叭發(fā)聲;否則就不發(fā)聲。把這一原理和定時器中斷產(chǎn)生的電平跳變相結(jié)合,就可以聽到不同頻率的音調(diào)。</p><p><b> 三、設(shè)計原理</b></p><p><b> 1、程序流程圖</b></p><p> 根據(jù)上述的設(shè)計方案,可以用流程圖畫出本次課程設(shè)計的整體思路,在以下的流程圖中,包括主程
14、序和各個相關(guān)的子程序。</p><p> 在程序中,首先是進(jìn)行掃描,找出是哪個鍵被按下,然后根據(jù)相應(yīng)的鍵號,采取不同的操作,以此構(gòu)成循環(huán)</p><p> 本程序中涉及到的子程序模塊包括:鍵盤掃描子程序;定時器中斷子程序;順序連續(xù)發(fā)出1234567七個音調(diào);連續(xù)發(fā)出7654321七個音調(diào)。</p><p> 以下分別主程序各個相關(guān)的子程序:</p>
15、<p><b> 2、硬件原理圖</b></p><p> 以下是電子琴電路的實際硬件原理圖,主要是一個單片機(jī),和一個8255以及一個喇叭組成。是通過8255的PA.0口發(fā)出脈沖,來產(chǎn)生不同頻率的音調(diào)。單片機(jī)則是用到一個定時器,來產(chǎn)生定時中斷。</p><p> 值得注意的是,由于電路圖中是直接用P1口來進(jìn)行鍵盤掃描的,則在實驗箱上進(jìn)行實物連接時,
16、一定要把跳線器短接,否則將使鍵盤掃描不能正常工作。</p><p> 在連線時,不能使用已損壞的導(dǎo)線,并且把多余的導(dǎo)線放到一邊,一面影響正常的工作。</p><p><b> 四.模塊設(shè)計</b></p><p><b> 1.鍵盤掃描模塊</b></p><p> 通過鍵盤掃描的流程圖可以
17、清晰的知道其工作原理,可將其歸納為:</p><p> 先將P1的高四位置1,低四位置0,在讀P1口的值,若讀到的值得高四位不是全1,則代表有鍵按下或者是鍵盤抖動。</p><p> 為消除鍵盤抖動的影響,先采用延時,延時后重復(fù)上述操作,若讀到的值得高四位不是全1,則代表確實有鍵按下。</p><p> 在有鍵按下的情況下,則可以找出是哪個鍵被按下,方法是:在
18、值為0的那一行,繼續(xù)賦零,其余行和所有列均給1,在此情況下,讀出列的值,在列中,哪一列為0,則代表該列的鍵被按下。</p><p> 用上述的方法就可以找出被按下的鍵,然后將對應(yīng)的鍵號取出,就可以在主程序中使用。</p><p><b> 2、定時器模塊</b></p><p> 定時器模塊則是簡單的運用定時器的中斷,對于定時器而言,其初
19、值不同,計數(shù)的溢出率就不同,又因為,每次定時器產(chǎn)生的中斷將電平信號取反,就可以產(chǎn)生不同頻率的脈沖,有了脈沖就可以驅(qū)動喇叭產(chǎn)生不同頻率的音調(diào)。</p><p> 以上就是該任務(wù)的兩個模塊,這都是簡單的運用單片機(jī)鍵盤掃描知識和定時器的運用,其原理都是很基本的。</p><p><b> 五、調(diào)試過程</b></p><p><b>
20、 1、問題發(fā)現(xiàn)與解決</b></p><p> 在進(jìn)行調(diào)試是,還是發(fā)現(xiàn)了一些問題。但最終都得到解決。問題之一就是,在等待50脈沖時,由于while語句位置的使用不當(dāng),導(dǎo)致程序不能正常運行。其次,就是1234567七個音調(diào)的不準(zhǔn)確,需要正確計算出定時器初值,而后在進(jìn)行調(diào)試,就可以聽到效果較好的其中音調(diào)。</p><p><b> 設(shè)計總結(jié)</b><
21、/p><p> 在此次課程設(shè)計中,我通過實踐操作,更好的正握了書本知識,尤其是鍵盤掃描模塊,其次就是定時的使用,當(dāng)然,對喇叭的發(fā)生原理也能掌握。</p><p> 另外,我還學(xué)到了如何正確,有效的調(diào)試程序。這說明,只有掌握正確的方法,才能提高效率。</p><p> 最重要的是,我的動手實踐能力,得到了較大的提高。所以,此次的課程使勁兒還是受益頗多的。 <
22、/p><p><b> 參考文獻(xiàn)</b></p><p> 《單片機(jī)原理及應(yīng)用實驗指導(dǎo)書》,屈波等編,2007年</p><p> 《單片機(jī)原理及應(yīng)用》,趙德安等編,機(jī)械工業(yè)出版社,2011</p><p> 《單片機(jī)基礎(chǔ)》,李廣弟等,北京航空航天大學(xué)出版社,2004年</p><p><
23、;b> 程序清單</b></p><p> 以下是電子琴設(shè)計的程序:</p><p> #include<reg52.h> //頭文件的說明</p><p> #include<absacc.h> //用于8255的使用</p><p> #define uint unsi
24、gned int</p><p> #define uchar unsigned char</p><p> #define COM8255 XBYTE [0X8003] //8255的控制字地址</p><p> #define PA XBYTE [0X8000] //8255端口A的地址</p><p&g
25、t; uchar flag; //在鍵盤掃描時使用</p><p> uchar key; //用于存放按鍵的對應(yīng)標(biāo)號</p><p> uchar num; //用于對50次脈沖的電平跳變進(jìn)行計數(shù),跳變100次后就達(dá)到50次脈沖</p><p> uint code table[]={ 64100,64224,64333,
26、64484,64577,64660,64734}; </p><p> //以上數(shù)組中的數(shù)分別是發(fā)出1234567七個音調(diào)的定時器的初值</p><p><b> //子程序的說明</b></p><p> void keyscan(); //鍵盤掃描</p><p> void delay(
27、); //簡單的延時程序,用于鍵盤掃描時的消抖</p><p> void shun(); //順序播放1234567</p><p> void ni(); //逆序播放7654321</p><p> //簡單的延時子程序,用于鍵盤掃描時消抖</p><p> void delay()<
28、/p><p><b> {</b></p><p><b> uchar a;</b></p><p><b> a=250;</b></p><p> while(a--);</p><p><b> }</b></p
29、><p><b> //鍵盤掃描</b></p><p> /*鍵盤掃描的原理是:用P1口的高四位分別連接4*4鍵盤的行,P1口的低四位分別連接列,在進(jìn)行鍵盤掃描時先判斷是否有鍵按下,若消抖后仍有鍵按下,則找出是哪個鍵被按下*/</p><p> void keyscan()</p><p><b> {
30、</b></p><p> flag=0; //變量賦初值</p><p><b> do{</b></p><p> P1=0xf0; //檢查是否有鍵按下</p><p><b> flag=P1;</b></p><p>
31、 flag=flag&0xf0;</p><p> if(flag!=0xf0) //等待有鍵按下,若有鍵按下則向下執(zhí)行</p><p><b> {</b></p><p> delay(); //延時消抖</p><p> P1=0xf0; //重新檢測是否有鍵按下</
32、p><p><b> flag=P1;</b></p><p> flag=flag&0xf0;</p><p><b> }</b></p><p> } while(flag==0xf0); //確認(rèn)有鍵按下后,找出是1至9個鍵中哪個鍵按下</p><
33、;p> if(flag==0xb0) //檢查第三行</p><p><b> {</b></p><p> P1=0xbf; /*給第三行賦零值,檢查該行哪個鍵被按下,哪一列電平被拉低,則該列的鍵被按下*/</p><p><b> flag=P1;</b></p>
34、<p> flag=flag&0x0f;</p><p> switch(flag)</p><p><b> {</b></p><p> case 0x07:key=9;break; /*第三行中除了9號鍵外,其余鍵按下不采取操作*/</p><p> case 0x0b:k
35、ey=0;break;</p><p> case 0x0d:key=0;break;</p><p> case 0x0e:key=0;break;</p><p><b> }</b></p><p><b> }</b></p><p> if(flag==0
36、xd0) //檢查第二行</p><p><b> {</b></p><p> P1=0xdf; /*給第二行賦零值,檢查該行哪個鍵被按下,哪一列電平被拉低,則該列的鍵被按下*/</p><p><b> flag=P1;</b></p><p> flag=fl
37、ag&0x0f;</p><p> switch(flag)</p><p><b> {</b></p><p> case 0x0e:key=8;break; //根據(jù)對應(yīng)的鍵,對key賦值</p><p> case 0x0d:key=7;break;</p><
38、;p> case 0x0b:key=6;break;</p><p> case 0x07:key=5;break;</p><p><b> }</b></p><p><b> }</b></p><p> if(flag==0xe0) //檢查第一行</p&g
39、t;<p><b> {</b></p><p> P1=0xef; /*給第一行賦零值,檢查該行哪個鍵被按下,哪一列電平被拉低,則該列的鍵被按下*/</p><p><b> flag=P1;</b></p><p> flag=flag&0x0f;</p><p
40、> switch(flag)</p><p><b> {</b></p><p> case 0x0e:key=4;break; //根據(jù)對應(yīng)的鍵,對key賦值</p><p> case 0x0d:key=3;break;</p><p> case 0x0b:key=2;break;
41、</p><p> case 0x07:key=1;break;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //順序播放1234567七個音調(diào)</p
42、><p> void shun() //順序播放</p><p><b> {</b></p><p> uchar i; //用于取數(shù)組中的對應(yīng)的數(shù)</p><p> for(i=0;i<7;i++)</p><p><b> {</b>
43、;</p><p> TH0=table[i]/256; //定時器賦初值</p><p> TL0=table[i]%256;</p><p> TR0=1; // 開始計時</p><p> while(num<100); //等待發(fā)出50個脈沖</p><p>
44、<b> }</b></p><p> TR0=0; //若已到50次脈沖,則關(guān)定時器</p><p> PA=0x01; //喇叭停止發(fā)聲</p><p> num=0; //num清零,準(zhǔn)備下次計數(shù)</p><p><b> }</b></
45、p><p> //逆序播放7654321七個音調(diào)</p><p> void ni() //逆序播放</p><p><b> {</b></p><p> uchar i; //用于取數(shù)組中的對應(yīng)的數(shù)</p><p> for(i=0;i<7;i++)<
46、/p><p><b> {</b></p><p> i=6-i; //逆序取數(shù)組中的數(shù)</p><p> TH0=table[i]/256; //定時器賦初值</p><p> TL0=table[i]%256;</p><p> TR0=1; // 開
47、始計時</p><p> while(num<100); //等待發(fā)出50個脈沖</p><p><b> }</b></p><p> TR0=0; //若已到50次脈沖,則關(guān)定時器</p><p> PA=0x01; //喇叭停止發(fā)聲</p><p>
48、; num=0; //num清零,準(zhǔn)備下次計數(shù)</p><p><b> }</b></p><p> //利用定時器的中斷來產(chǎn)生脈沖</p><p> void time() interrupt 1 //定時中斷</p><p><b> {</
49、b></p><p> TH0=table[key]/256; //每次定時產(chǎn)生中斷,重新賦初值,可以產(chǎn)生連續(xù)的脈沖</p><p> TL0=table[key]%256;</p><p> PA=~PA;//對喇叭端口電平取反,形成脈沖</p><p> num++; //對正
50、負(fù)電平數(shù)計數(shù),其值時脈沖數(shù)的兩倍</p><p><b> }</b></p><p><b> //主程序</b></p><p> //主程序中根據(jù)鍵盤掃描得到是哪個鍵按下,來給定時器賦相應(yīng)的初值,產(chǎn)生不同頻率的脈沖</p><p> void main()</p><
51、;p><b> {</b></p><p> key=0; //key值清零,用于鍵盤掃描</p><p> num=0; //清零,用于脈沖計數(shù)</p><p> PA=1; //初始化,使喇叭不發(fā)聲</p><p> TMOD=0x01; //用T0工作于方式
52、1,用于定時</p><p> EA=1; //開總中斷</p><p> ET0=1; //開T0中斷</p><p> COM8255 = 0X80; //8255初始化,僅使用PA口,用于輸出方式</p><p><b> while(1)</b></p>&
53、lt;p><b> {</b></p><p><b> do{</b></p><p> keyscan(); /*進(jìn)行鍵盤掃描,若有鍵按下,則KEY的值會改變,跳出循環(huán)*/</p><p> }while(key==0); //等待鍵按下</p><p><b>
54、; if(key<8)</b></p><p><b> {</b></p><p> key--; //key值減1后就可在數(shù)組中取到對應(yīng)的取值</p><p> TH0=table[key]/256; //定時器賦初值</p><p> TL0=table[key]%256;
55、</p><p> TR0=1;//開定時器</p><p> while(num<100); //等待產(chǎn)生50個脈沖</p><p> TR0=0; //50次脈沖后關(guān)定時器</p><p> PA=0x01; //停止喇叭發(fā)聲</p><p> num=0; //n
56、um清零,為下次計數(shù)做好準(zhǔn)備</p><p><b> }</b></p><p> if(key==8)</p><p><b> {</b></p><p> shun(); //8鍵按下,進(jìn)行順序播放</p><p><b> }</
57、b></p><p> if(key==9)</p><p><b> {</b></p><p> ni(); //9鍵按下,進(jìn)行逆序播放</p><p><b> }</b></p><p> key=0; //key重新賦零,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(電子琴)
- 單片機(jī)課程設(shè)計---電子琴設(shè)計
- 單片機(jī)課程設(shè)計-電子琴
- 單片機(jī)課程設(shè)計——電子琴
- 單片機(jī)課程設(shè)計---電子琴設(shè)計
- 電子琴課程設(shè)計--基于單片機(jī)的電子琴設(shè)計
- 電子琴課程設(shè)計--基于單片機(jī)的電子琴設(shè)計
- 電子琴課程設(shè)計-- 基于單片機(jī)的電子琴設(shè)計
- 單片機(jī)簡易電子琴單片機(jī)課程設(shè)計
- 單片機(jī)課程設(shè)計簡易電子琴
- 簡易電子琴單片機(jī)課程設(shè)計
- 簡易電子琴單片機(jī)課程設(shè)計
- 簡易電子琴單片機(jī)課程設(shè)計
- 單片機(jī)課程設(shè)計報告--電子琴
- 單片機(jī)課程設(shè)計簡易電子琴
- 單片機(jī)課程設(shè)計——簡易電子琴
- 單片機(jī)課程設(shè)計---簡易電子琴
- 單片機(jī)課程設(shè)計--簡易電子琴設(shè)計
- 電子琴單片機(jī)課程設(shè)計--電子琴模擬實驗
- 單片機(jī)課程設(shè)計---基于單片機(jī)的電子琴設(shè)計
評論
0/150
提交評論