畢業(yè)論文自動(dòng)控制升降旗裝置論文課程設(shè)計(jì)報(bào)告_第1頁
畢業(yè)論文自動(dòng)控制升降旗裝置論文課程設(shè)計(jì)報(bào)告_第2頁
畢業(yè)論文自動(dòng)控制升降旗裝置論文課程設(shè)計(jì)報(bào)告_第3頁
畢業(yè)論文自動(dòng)控制升降旗裝置論文課程設(shè)計(jì)報(bào)告_第4頁
畢業(yè)論文自動(dòng)控制升降旗裝置論文課程設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PAGE湖南人文科技學(xué)院課程設(shè)計(jì)報(bào)告課程名稱:單片機(jī)原理及應(yīng)用課程設(shè)計(jì)設(shè)計(jì)題目:自動(dòng)控制升降旗裝置系別:通信與控制工程系專業(yè):通信工程

指導(dǎo)教師評(píng)語:指導(dǎo)教師簽名:年月日成績評(píng)定項(xiàng)目權(quán)重成績鄧曉雄王成胡楚煊1、設(shè)計(jì)過程中出勤、學(xué)習(xí)態(tài)度等方面0.22、課程設(shè)計(jì)質(zhì)量與答辯0.53、設(shè)計(jì)報(bào)告書寫及圖紙規(guī)范程度0.3總成績教研室審核意見:教研室主任簽字:年月日教學(xué)系審核意見:主任簽字:年月日

摘要本系統(tǒng)采用單片機(jī)STC89C52作為自動(dòng)控制升降旗系統(tǒng)的檢測和控制核心,采用由單片機(jī)控制的步進(jìn)電機(jī)帶動(dòng)國旗升降,實(shí)現(xiàn)對(duì)國旗升降的自動(dòng)控制。該電路主要由電機(jī)驅(qū)動(dòng)控制模塊、鍵盤與顯示模塊及語音模塊幾個(gè)部分組成。電機(jī)驅(qū)動(dòng)控制模塊采用集成驅(qū)動(dòng)芯片ULN2003L,采用鍵盤作為輸入控制和數(shù)碼管作為輸出顯示,語音模塊采用報(bào)警蜂鳴器(LS)電路。關(guān)鍵字:步進(jìn)電機(jī);自動(dòng)控制;語音;數(shù)碼管顯示;按鍵目錄設(shè)計(jì)要求 11方案選擇與論證 11.1電機(jī)的選擇與論證 11.2電機(jī)驅(qū)動(dòng)方案的選擇與論證 22自動(dòng)控制升降旗整體電路設(shè)計(jì) 22.1整體電路原理 23單元電路設(shè)計(jì) 33.1步進(jìn)電機(jī)電路的設(shè)計(jì) 33.2數(shù)碼管顯示電路的設(shè)計(jì) 43.3音樂發(fā)聲電路的設(shè)計(jì) 53.4矩陣4X4鍵盤電路的設(shè)計(jì) 63.5外部ROM存儲(chǔ)器電路設(shè)計(jì) 74自動(dòng)控制升旗裝置軟件設(shè)計(jì) 84.1系統(tǒng)總程序流程圖 84.2步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的軟件設(shè)計(jì) 94.3數(shù)碼管實(shí)時(shí)顯示的軟件設(shè)計(jì) 104.4國歌音樂的軟件設(shè)計(jì) 104.5矩陣鍵盤實(shí)時(shí)控制軟件設(shè)計(jì) 114.6外部ROM實(shí)時(shí)訪問的軟件設(shè)計(jì) 125詳細(xì)儀器清單 136總結(jié)與思考及致謝 14參考文獻(xiàn) 15附錄一:系統(tǒng)程序代碼 16附錄二:總原理圖 27PAGE4自動(dòng)控制升降旗裝置設(shè)計(jì)要求基本部分:1).按下上升按鍵后,旗幟勻速上升,同時(shí)流暢地播放歌曲,上升到最高端時(shí)自動(dòng)停止上升,歌曲停奏;按下下降按鍵后,旗幟勻速下降,降旗的時(shí)間不放歌曲,下降到最低端時(shí)自動(dòng)停止;2).旗幟在最高端,上升按鍵不起作用;在最低端時(shí),下降按鍵不起作用;3).升降旗的時(shí)間均為43秒,與國歌的演奏時(shí)間相等;4).即時(shí)顯示旗幟所在的高度,以CM為單位,誤差不大于2CM。發(fā)揮部分:1).重新合上電源后,所顯示的旗幟高度數(shù)據(jù)不變;2).要求升降旗的速度可調(diào)整,調(diào)整范圍是30—120秒鐘,步進(jìn)1秒(除43秒外,其他時(shí)間可與國歌不同步);3).在最高升降速度下(以自選的電機(jī)參數(shù)定),能在指定的位置上自動(dòng)停止,定位誤差≤±2CM。1方案選擇與論證1.1電機(jī)的選擇與論證方案一:采用普通的直流電機(jī)。普通直流電動(dòng)機(jī)具有優(yōu)良的調(diào)速特性,調(diào)速平滑、方便,調(diào)整范圍廣,過載能力強(qiáng),能承受頻繁的沖擊負(fù)載,可實(shí)現(xiàn)頻繁的無級(jí)快速啟動(dòng)、制動(dòng)和反轉(zhuǎn)。方案二:采用步進(jìn)電機(jī)。步進(jìn)電機(jī)是純粹的數(shù)字控制電動(dòng)機(jī),它將電脈沖轉(zhuǎn)化為角位移,即一脈沖,電機(jī)就轉(zhuǎn)動(dòng)一角度,因此很適合單片機(jī)控制。步進(jìn)電機(jī)的一個(gè)顯著特點(diǎn)是具有快速的啟停能力,如果負(fù)荷不超過步進(jìn)電機(jī)所能提供的動(dòng)態(tài)轉(zhuǎn)矩值,就能夠立即使步進(jìn)電機(jī)啟動(dòng)或反轉(zhuǎn)。另一個(gè)顯著特點(diǎn)是轉(zhuǎn)換精度高,可以通過步數(shù)實(shí)現(xiàn)精確定位,可正轉(zhuǎn)反轉(zhuǎn)控制靈活。綜上所述,我們選用方案二。1.2電機(jī)驅(qū)動(dòng)方案的選擇與論證方案一:采用繼電器對(duì)電動(dòng)機(jī)的開或關(guān)進(jìn)行控制,通過控制開關(guān)的切換速度實(shí)現(xiàn)對(duì)電機(jī)的運(yùn)行速度進(jìn)行調(diào)整。這個(gè)電路的優(yōu)點(diǎn)是電路結(jié)構(gòu)簡單,其缺點(diǎn)是繼電器的響應(yīng)時(shí)間長,易損環(huán),壽命短,耗電流,不能很好的驅(qū)動(dòng)步進(jìn)電機(jī),可靠性不是很高。方案二:采用由達(dá)林頓管組成的H橋型PWM電路。用單片機(jī)控制達(dá)林頓管使之工作在占空比可調(diào)的開關(guān)狀態(tài),可精確調(diào)整電動(dòng)機(jī)的運(yùn)動(dòng)狀態(tài)(前進(jìn),后退,左轉(zhuǎn),右轉(zhuǎn))。這種電路由于工作在管子的飽和截至模式下,效率很高。H橋電路保證了可以簡單的實(shí)現(xiàn)轉(zhuǎn)速和方向的控制,但不能很精確的控制步距和速度。方案三:采用ULN2003驅(qū)動(dòng)。ULN2003是高耐壓、大電流達(dá)林頓陳列,由七個(gè)硅NPN達(dá)林頓管組成,具有電流增益高、工作電壓高、溫度范圍寬、帶負(fù)載能力強(qiáng)等特點(diǎn),適應(yīng)于各類要求高速大功率驅(qū)動(dòng)的系統(tǒng)。所以綜上所述我們采用方案三。2自動(dòng)控制升降旗整體電路設(shè)計(jì)2.1整體電路原理系統(tǒng)整體電路原理框圖如圖1所示:圖1總體電路框圖3單元電路設(shè)計(jì)3.1步進(jìn)電機(jī)電路的設(shè)計(jì)根據(jù)設(shè)計(jì)要求,我們采用了步進(jìn)電機(jī)的準(zhǔn)確步進(jìn)來控制旗桿的升降,電路圖如圖3所示:圖3步進(jìn)電機(jī)原理圖步進(jìn)電機(jī)是數(shù)字控制電機(jī),不同于直流電機(jī)。它將脈沖信號(hào)轉(zhuǎn)變?yōu)榻俏灰疲唇o一個(gè)脈沖信號(hào),步進(jìn)電機(jī)就轉(zhuǎn)動(dòng)一個(gè)角度,非常適合單片機(jī)控制。工作原理如下:(1)控制換相順序通電換相這一過程稱為脈沖分配。例如:三相步進(jìn)電機(jī)的六拍工作方式,其各相通電順序?yàn)锳-AB-B-BC-C-CA-A,通電控制脈沖必須嚴(yán)格按照這一順序分別控制A,B,C各相得通斷。(2)控制步進(jìn)電機(jī)的轉(zhuǎn)向如果給定工作方式正序換相通電,電機(jī)正轉(zhuǎn),如果按反序通電換相,電機(jī)就反轉(zhuǎn)。(3)控制步進(jìn)電機(jī)的速度如果給步進(jìn)電機(jī)發(fā)一個(gè)控制脈沖,它就轉(zhuǎn)一步,再發(fā)一個(gè)脈沖,它就會(huì)再轉(zhuǎn)一步。兩步脈沖的時(shí)間間隔越短,步進(jìn)電機(jī)就轉(zhuǎn)的越快。調(diào)整單片機(jī)發(fā)出的脈沖頻率,就可以對(duì)步進(jìn)電機(jī)進(jìn)行調(diào)速。步進(jìn)電機(jī)步序表如表1所示:表1步進(jìn)電機(jī)步序表步序C4C3C2C1ULN2003輸出單片機(jī)輸出100010x010x0e200110x030x0c300100x020x0d401100x060x09501000x040x0b611000x0c0x03710000x080x07810010x090x06 如果按步序1-->步序8輸出數(shù)據(jù),步進(jìn)電機(jī)正轉(zhuǎn),按步序8—>步序一輸出數(shù)據(jù),步進(jìn)電機(jī)反轉(zhuǎn)。3.2數(shù)碼管顯示電路的設(shè)計(jì)由于要求升降過程中即時(shí)顯示所在高度,故采用四位數(shù)碼管即可顯示出來。本試驗(yàn)所采用的開發(fā)板上有一排六位的數(shù)碼管,每個(gè)數(shù)碼管的8段是由芯片8255得PB口控制亮滅,即可得到所要顯示的數(shù)字,每個(gè)數(shù)碼管的公共腳分別由8255的PA0—PA5經(jīng)三極管擴(kuò)流后進(jìn)行控制,原理圖如圖4所示:圖4數(shù)碼管顯示電路原理圖 要在某位數(shù)碼管上顯示一個(gè)數(shù)字,首先把待顯示數(shù)字的顯示碼送給8255的PB口,接著選中要顯示的位。例如:要在開發(fā)板的最左邊的數(shù)碼上顯示一個(gè)‘0’,則需要先把‘0’得顯示碼0xc0送8255得PB口,接著PA0賦‘0’(低電平),隨后讓單片機(jī)保持這個(gè)值不變。3.3音樂發(fā)聲電路的設(shè)計(jì)為了在升旗得過程中同步放出國歌的音樂,本實(shí)驗(yàn)采取蜂鳴器來奏響國歌。單片機(jī)的P33引腳用來控制蜂鳴器的工作,當(dāng)P33輸出高電平時(shí),蜂鳴器不工作。當(dāng)P33引腳輸出低電平時(shí),三極管導(dǎo)通,蜂鳴器工作,同時(shí)二極管發(fā)光。蜂鳴器音樂電路如圖5示:圖5音樂發(fā)聲電路3.4矩陣4X4鍵盤電路的設(shè)計(jì)本實(shí)驗(yàn)中用來控制的功能比較多,故采取按鍵控制的方法來實(shí)現(xiàn)控制功能。電路如圖6示:圖6矩陣4X4鍵盤電路 矩陣式鍵盤的按鈕識(shí)別辦法可以確定矩陣式鍵盤上何鍵被按下,采用的方法之一為“行掃描法”。行掃描法又稱為逐行(或列)掃描查詢法,是一種最常見的按鈕識(shí)別方法,鍵盤如上所示。具體實(shí)現(xiàn)過程如下:判斷鍵盤中有無鍵按下。將全部行線置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵低于低電平線與4根行線交叉的4個(gè)按鈕之中。若所有列線均為高電平,則按鍵中無鍵按下。 判斷閉合鍵所在的位置:在確認(rèn)有鍵按下的情況下,即可進(jìn)入確定具體鍵的過程。操作是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其他線為高電平。在確定某根行線為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該線與置為低電平的行線交叉處的按鈕就是閉合的按鈕。3.5外部ROM存儲(chǔ)器電路設(shè)計(jì) 由于設(shè)計(jì)要求要掉電后將數(shù)據(jù)保存,即重開電源后單片機(jī)要從上次掉電前得狀態(tài)繼續(xù)執(zhí)行,故采取I2C總線形式掛載外部程序存儲(chǔ)器來存儲(chǔ)掉電前得數(shù)據(jù)。原理圖如圖7所示:圖7外部ROM存儲(chǔ)器電路 I2C總線是一種用于IC器件之間連接的二進(jìn)制總線。它通過SDA(串行數(shù)據(jù)線)及SCL(串行時(shí)鐘線)兩根線在連到總線上的器件之間傳送信息,并根據(jù)地址識(shí)別每個(gè)器件:不管是單片機(jī)、存儲(chǔ)器、LCD驅(qū)動(dòng)器還是鍵盤接口。 AT24C08是低功耗的CMOS串行EEPROM,內(nèi)含256*8位存儲(chǔ)空間,工作電壓寬,擦寫次數(shù)多,寫入速度快等特點(diǎn)。本設(shè)計(jì)中24C08的1、2、3腳是三條地址線,用于確定芯片的硬件地址。在開發(fā)板上均接地,第8腳和第4腳分別接正、負(fù)電源。第5腳SDA為串行數(shù)據(jù)輸入輸出,數(shù)據(jù)通過這條I2C總線串行傳送,與單片機(jī)的P27連接。第6腳SCL為串行時(shí)鐘輸入線與單片機(jī)的P26連接。SDA與SCL都需要和正電源間各接一個(gè)2K的上拉電阻。第7腳需接地。4自動(dòng)控制升旗裝置軟件設(shè)計(jì)4.1系統(tǒng)總程序流程圖系統(tǒng)工作總程序流程圖如圖8所示:圖8整體程序流程圖4.2步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的軟件設(shè)計(jì)步進(jìn)電機(jī)是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行機(jī)構(gòu)。當(dāng)步進(jìn)驅(qū)動(dòng)器接收到一個(gè)脈沖信號(hào),它就驅(qū)動(dòng)步進(jìn)電機(jī)按設(shè)定的方向轉(zhuǎn)動(dòng)一個(gè)固定的角度(及步進(jìn)角)??梢酝ㄟ^控制脈沖個(gè)數(shù)來控制角位移量,從而達(dá)到準(zhǔn)確定位的目的;同時(shí)也可以通過控制脈沖頻率來控制電機(jī)轉(zhuǎn)動(dòng)的速度和加速度,從而達(dá)到調(diào)速的目的。其工作流程圖如圖9所示:圖9步進(jìn)電機(jī)程序流程圖此次設(shè)計(jì)中,采用的為四相八拍的步進(jìn)電機(jī)控制方式。代碼中,先定義了要用到的步進(jìn)電機(jī)正轉(zhuǎn)和反轉(zhuǎn)的時(shí)序數(shù)組,以使后面的程序能夠隨時(shí)更改電機(jī)接收到的脈沖時(shí)序,以達(dá)到實(shí)時(shí)地控制電機(jī)的正轉(zhuǎn)和反轉(zhuǎn),從而實(shí)現(xiàn)旗幟的上升與下降。更改脈沖時(shí)序的條件由所按下的鍵盤按鍵決定,所以可以實(shí)時(shí)地更改脈沖的時(shí)序,達(dá)到實(shí)時(shí)地控制電機(jī)轉(zhuǎn)動(dòng)方式。4.3數(shù)碼管實(shí)時(shí)顯示的軟件設(shè)計(jì) 數(shù)碼管顯示的部分硬件上是通過8255擴(kuò)展I/O芯片實(shí)現(xiàn)控制,且采用的為動(dòng)態(tài)數(shù)碼管顯示的方法,也就是六要數(shù)碼管共用的為一個(gè)八位數(shù)據(jù)線。上面函數(shù)的功能為在指定的數(shù)碼管上顯示指定的數(shù)字。實(shí)際中要顯示的數(shù)字不只有一位,所以必須在人的視覺停留的時(shí)間內(nèi),即1/12秒的時(shí)間內(nèi),把所有要顯示的數(shù)碼管全部點(diǎn)亮,才能給人感覺像是所有數(shù)碼管同一時(shí)刻全部點(diǎn)亮了。數(shù)碼管工作流程圖如圖10所示:

圖10數(shù)碼管子程序流程圖4.4國歌音樂的軟件設(shè)計(jì)音樂功能主要在兩個(gè)中斷中完成;定時(shí)器0中斷主要輸出一定頻率的方波,定時(shí)器1中斷完成音長的控制,在完成特定音符的音長后讀取下一個(gè)音符,并且更新定時(shí)器0的初始設(shè)置值。演奏時(shí),要根據(jù)音符的不同把對(duì)應(yīng)半周期的定時(shí)時(shí)間初始值送入定時(shí)器T0,再由定時(shí)器T1按時(shí)輸出高低電平,定時(shí)器控制音樂程序流程圖如圖11所示:圖11定時(shí)器T0、T1控制音樂子程序流程圖4.5矩陣鍵盤實(shí)時(shí)控制軟件設(shè)計(jì)本次設(shè)計(jì)采用的為4X4矩陣鍵盤,這種鍵盤是由16個(gè)按鍵組成的開關(guān)矩陣。其程序流程圖如圖12所示,程序中用來識(shí)別用戶按下的按鍵采用的方式為動(dòng)態(tài)掃描的方式,即分別對(duì)矩陣進(jìn)行行掃描,再進(jìn)行列掃描即可得到識(shí)別按鍵所需的兩個(gè)坐標(biāo)值,在程序中定義全局變量test_x,test_y用來存儲(chǔ)鍵盤掃描得到的值。個(gè)體的程序設(shè)計(jì)中,因?yàn)閷?shí)時(shí)控制電機(jī)的轉(zhuǎn)動(dòng),音樂的開關(guān)均以用戶按下的按鍵為基準(zhǔn),故程序中多次要用到鍵盤掃描,所以將鍵盤掃描程序抽象出來形成一個(gè)單獨(dú)的函數(shù)scanKeyboard(),提高編碼效率。圖12鍵盤程序流程圖4.6外部ROM實(shí)時(shí)訪問的軟件設(shè)計(jì)因?yàn)镽AM存儲(chǔ)器的掉電易失性,而要達(dá)到掉電保存數(shù)據(jù)的效果,就必須將要保存的數(shù)據(jù)寫到ROM中。本次設(shè)計(jì)中,采用外部程序存儲(chǔ)器24C08,采用的通訊協(xié)議為I2C串行總線方式,外部ROM程序流程圖如圖13所示。具體的程序設(shè)計(jì)中,將主要對(duì)存儲(chǔ)器的操作抽象為兩個(gè)函數(shù)以供調(diào)用,即存儲(chǔ)器寫函數(shù)Write24c02(uintch,ucharaddress),功能為每一次寫一字節(jié)到指定的存儲(chǔ)器地址上,存儲(chǔ)器讀函數(shù)Read24c02(ucharaddress),功能為讀出指定地址上的一個(gè)字節(jié)。

圖13外部ROM程序流程圖5詳細(xì)儀器清單表格SEQ表格\*ARABIC1儀器清單儀器名稱數(shù)量STC89C52芯片18255A芯片1ULN2003L1步進(jìn)電機(jī)1七段LED數(shù)碼顯示器6按鍵166總結(jié)與思考及致謝本系統(tǒng)采用單片機(jī)STC89C52作為自動(dòng)控制升降旗系統(tǒng)的檢測和控制核心,采用由單片機(jī)控制的步進(jìn)電機(jī)帶動(dòng)國旗升降,通過用按生鍵來實(shí)現(xiàn)對(duì)國旗升降的自動(dòng)控制,最終與實(shí)踐相結(jié)合的升降旗系統(tǒng),實(shí)現(xiàn)單片機(jī)與人們活的密切應(yīng)用。做本設(shè)計(jì),深刻的體會(huì)到,要把各功能模塊搞懂才能達(dá)到各硬件的融合,達(dá)到硬件和軟件的結(jié)合。軟件設(shè)計(jì)中,由于匯編的繁瑣性,本系統(tǒng)采用C來編寫程序,其實(shí)C是每一條語句可轉(zhuǎn)化為匯編,匯編是更接近硬件的語言,寫匯編可以對(duì)單片機(jī)的實(shí)際操作有更好的理解,故有時(shí)間可以嘗試寫“雙語”。 感謝學(xué)校能給我們這次機(jī)會(huì),讓我們有一個(gè)發(fā)揮自己的平臺(tái),讓我們把從課本學(xué)到的知識(shí)用到實(shí)際生活當(dāng)中,從中得到鍛煉。在系統(tǒng)設(shè)計(jì)過程中,劉老師、方老師、譚老師、周老師等提出了許多寶貴的意見,在此深表感謝!同時(shí)得到了在校老師和同學(xué)們的支持與幫助,在此表示感謝!

參考文獻(xiàn)[1]朱定華,戴汝平.單片微機(jī)原理與應(yīng)用(M).北京:清華大學(xué)出版社.2003[2]張鑫.單片機(jī)原理及應(yīng)用(M).電子工業(yè)出版社.2009[3]彭秀華.單片機(jī)高級(jí)語言c51Windows環(huán)境編程與應(yīng)用(M).電子工業(yè)出版社2001[4]全國大學(xué)生電子設(shè)計(jì)競賽組委會(huì).全國大學(xué)生電子設(shè)計(jì)競賽獲獎(jiǎng)作品選編(M).北京:理工大學(xué)出版社.2003年[5]彭為.單片機(jī)典型系統(tǒng)設(shè)計(jì)實(shí)例精講(M).電子工業(yè)出版社.2005[6]沈慶陽.8051單片機(jī)實(shí)踐與應(yīng)用(M).清華大學(xué)出版社.2002[7]張立科.單片機(jī)典型模塊設(shè)計(jì)實(shí)例導(dǎo)航(M).北京:人民郵電出版社.2004[8]陳濤.單片機(jī)應(yīng)用及c51程序設(shè)計(jì)(M).機(jī)械工業(yè)出版社.2007附錄一:系統(tǒng)程序代碼#include<config.h>#include<reg52.h>#include<string.h>#defineucharunsignedchar#defineuintunsignedintucharcodeFFW[8]={0x75,0x65,0x6d,0x4d,0x5d,0x1d,0x3d,0x35};//步進(jìn)電機(jī)正轉(zhuǎn)數(shù)組ucharcodeREV[8]={0x35,0x3d,0x1d,0x5d,0x4d,0x6d,0x65,0x75};//步進(jìn)電機(jī)反轉(zhuǎn)數(shù)組//setflag用標(biāo)志定位是否有效test_x,test_y用于定義16個(gè)按鍵中的任一個(gè)uchartest_x=10,test_y=10,setflag=0;ucharsetfalse=0;uintcounter=0;//用于定義每隔多少個(gè)脈沖數(shù)碼管上數(shù)字自增//定義四個(gè)變量分別存儲(chǔ)四個(gè)要顯示的數(shù)位的值four顯最高位第四位的值,依此類推uintsum=0,four=0,three=0,two=0,one=0;uintfour_max=0,three_max=0,two_max=0,one_max=0;//定義四個(gè)變量,用來定位停止//音樂模塊用到的些定義常量,變量,數(shù)組unsignedcharvolatileFlagBeat;//基本節(jié)拍單位計(jì)數(shù)變量unsignedintvolatileFreqTemp;unsignedcharvolatilemusic_temp;//暫時(shí)存放從MusicTable數(shù)組中讀出的變量unsignedcharvolatilebeat;unsignedcharvolatilefreq;//簡譜碼對(duì)應(yīng)T值數(shù)組的下標(biāo)unsignedcharvolatile*pmusic;sbitPin_Buzzer=P3^3;//串行外存定義的量#define WriteDeviceAddress0xa0//定義器件在IIC總線中的地址#define ReadDviceAddress0xa1sbit SCL=P2^6;sbit SDA=P2^7;unsignedcharx1,x2,x3;unsignedintcodeFreqTab[]={//簡譜對(duì)應(yīng)的簡譜碼、T值65535,63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030};unsignedcharcodeMusicTable[]={//音符節(jié)拍碼0x52,0x84,0x02,0x82,0x82,0x01,0x81,0x52,0x61,0x71,0x84,0x84,0xa2,0x82,0x91,0xa1,0xc2,0x01,0xc1,0xc4,0xa2,0x01,0xa1,0x82,0x01,0xa1,0xc2,0x01,0xa1,0x94,0x94,0x04,0xd4,0xc4,0x94,0xa4,0xc2,0xa4,0xc2,0xa2,0x91,0xa1,0x82,0x01,0x91,0xa4,0xc2,0x01,0x61,0x82,0xa2,0x01,0xa1,0xc2,0x01,0xc1,0x92,0x92,0x92,0x62,0x01,0x61,0x94,0x02,0x52,0x84,0x02,0x82,0xa4,0x02,0xa2,0xc4,0x04,0xc4,0x04,0x82,0x01,0xa1,0xc2,0x01,0xc1,0xd4,0xc4,0xa2,0x01,0x81,0xc2,0xc2,0xc2,0xa2,0x82,0x54,0x84,0x32,0x01,0x81,0xc2,0xc2,0xc2,0xa2,0x82,0x54,0x84,0x54,0x84,0x54,0x84,0x84,};unsignedcharconstdis_table[16]={0xA0,/*0*/0xBB,/*1*/0x62,/*2*/0x2A,/*3*/0x39,/*4*/0x2C,/*5*/0x24,/*6*/0xBA,/*7*/0x20,/*8*/0x28,/*9*/};voidDelayMs(unsignedintnumber){unsignedchartemp;for(;number!=0;number--){for(temp=112;temp!=0;temp--);}}//開始總線voidStart(){SDA=1;SCL=1;SDA=0;SCL=0;}//結(jié)束總線voidStop(){SCL=0;SDA=0;SCL=1;SDA=1;}//發(fā)ACK0voidNoAck(){SDA=1;SCL=1;SCL=0;}//測試ACKbitTestAck(){bitErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}//寫入8個(gè)bit到24c08Write8Bit(unsignedintinput){ unsignedchartemp; for(temp=8;temp!=0;temp--){ SDA=(bit)(input&0x80); SCL=1; SCL=0; input=input<<1;}}//寫入一個(gè)字節(jié)到24c08中voidWrite24c02(uintch,ucharaddress){ Start(); Write8Bit(WriteDeviceAddress); TestAck(); Write8Bit(address); TestAck(); Write8Bit(ch); TestAck(); Stop(); DelayMs(10);}//從24c08中讀出8個(gè)bitucharRead8Bit(){ unsignedchartemp,rbyte=0; for(temp=8;temp!=0;temp--){ SCL=1; rbyte=rbyte<<1; rbyte=rbyte|((unsignedchar)(SDA)); SCL=0;} return(rbyte);}//從24c08中讀出1個(gè)字節(jié)ucharRead24c02(ucharaddress){ ucharch; Start(); Write8Bit(WriteDeviceAddress); TestAck(); Write8Bit(address); TestAck(); Start(); Write8Bit(ReadDviceAddress); TestAck(); ch=Read8Bit(); NoAck(); Stop(); return(ch);}voiddelay(){//延時(shí)主要用于控制display函數(shù)執(zhí)行速度,以及電機(jī)的轉(zhuǎn)帶 uinti=0; for(i=0;i<20;i++);}voiddelaytest(){//延時(shí)主要用作按鍵消抖作用。。 uinti=0; for(i=0;i<25000;i++);}//動(dòng)態(tài)掃描4X4鍵盤,不停的掃描則可以確實(shí)按下的為哪一個(gè)按鍵。。voidscanKeyboard(){ uinti,j,PC_data=0; a8255_CON=0x89;a8255_PB=0xff; a8255_PA=0xff;delay(); PC_data=a8255_PC; for(j=0;j<4;j++){ if((PC_data&(1<<j))==(1<<j)){ for(i=0;i<4;i++){ a8255_PA=1<<i; delay(); PC_data=a8255_PC; if((PC_data&(1<<j))==(1<<j)){ test_x=i; test_y=j; break;}}}}}//定時(shí)器,音樂模塊的一些初始化voidinitial(){pmusic=MusicTable; beat=1; FlagBeat=0; TMOD=0x11;//定時(shí)器0,1都工作16位計(jì)數(shù)方式 ET0=1;//允許定時(shí)器0溢出中斷; ET1=1;//允許定時(shí)器1溢出中斷 EA=1; TL1=0xF0; TH1=0xFF; TR1=1; IT0=1;//外中斷跳變產(chǎn)生中斷 EX0=1;}//數(shù)碼管顯示方法 ,在指定的place位置顯示num數(shù)字。。 voiddisplay(ucharplace,uintnum){uchari=0,display_num=0; uinttest=0; a8255_CON=0x89; a8255_PB=0xff; a8255_PA=0xff;delay(); if(place==1) test=~(0x1<<0); elseif(place==2)test=~(0x1<<1); elseif(place==3)test=~(0x1<<2); elseif(place==4)test=~(0x1<<3); elseif(place==5)test=~(0x1<<4); elseif(place==6)test=~(0x1<<5);a8255_PA=test;if(num==0) display_num=dis_table[0]; elseif(num==1)display_num=dis_table[1]; elseif(num==2)display_num=dis_table[2]; elseif(num==3)display_num=dis_table[3]; elseif(num==4)display_num=dis_table[4]; elseif(num==5)display_num=dis_table[5]; elseif(num==6)display_num=dis_table[6]; elseif(num==7)display_num=dis_table[7]; elseif(num==8)display_num=dis_table[8]; elseif(num==9)display_num=dis_table[9]; a8255_PB=display_num; delay();}//主函數(shù)入口,主要用來組合音樂,電機(jī),顯示模塊以及通過按鍵實(shí)時(shí)的控制步進(jìn)機(jī),音樂播放voidmain(void){//用于掉電保存的數(shù)據(jù),每次開機(jī)時(shí),用于加載掉電前的數(shù)據(jù) uintstoNum=Read24c02(0x04);four_max=stoNum/100; three_max=stoNum/10%10; two_max=stoNum%10; four=four_max; three=three_max; two=two_max; one=one_max; while(1){ //設(shè)定初始位置值,電機(jī)轉(zhuǎn)到指定的位置停止 while(1){scanKeyboard();//每次調(diào)用延時(shí),以消除鍵盤抖動(dòng)。。 if(test_x==0&&test_y==3){delaytest();test_x=0,test_y=1;four_max=++four_max%2;setfalse=1;}if(test_x==1&&test_y==3){delaytest();three_max=++three_max%6;test_x=0,test_y=1;setfalse=1;}if(test_x==2&&test_y==3){delaytest();two_max=++two_max%10;test_x=0,test_y=1;setfalse=1;}if(test_x==3&&test_y==3){delaytest();one_max=++one_max%10;test_x=0,test_y=1;setfalse=1;} display(1,four_max);display(2,three_max);display(3,two_max);display(4,one_max); if(test_x==0&&test_y==0){break;}if(test_x==1&&test_y==0){break;}}if(four_max!=0||three_max!=0||two_max!=0||one_max!=0)setflag=1;if((test_x==0&&test_y==0)||(test_x==1&&test_y==0)){initial();while(1){uinti;scanKeyboard(); for(i=0;i<8;i++){if(test_x==0&&test_y==0)P1=FFW[i];//正轉(zhuǎn)elseif(test_x==1&&test_y==0)P1=REV[i];//反轉(zhuǎn)if(test_x==0&&test_y==0){//如果為上升則,顯示管四個(gè)數(shù)位依次累加if(counter==15){one++;if(one==10){two++;one=0;if(two==10){two=0;three++;if(three==10){three=0;four++;if(four==10)four=0;}}}counter=0;}}elseif(test_x==1&&test_y==0){//如果為下降,則數(shù)碼管四個(gè)數(shù)位依次遞減EA=0;if(counter==15){if(one!=0)one--;if(one==0&&(two!=0||three!=0||four!=0)){one=9;if(two!=0)two--;}if(two==0&&(three!=0||four!=0)){two=9;if(three!=0)three--;}if(three==0&&four!=0){three=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論