自動(dòng)控制升降旗裝置_第1頁
自動(dòng)控制升降旗裝置_第2頁
自動(dòng)控制升降旗裝置_第3頁
自動(dòng)控制升降旗裝置_第4頁
自動(dòng)控制升降旗裝置_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、湖南人文科技學(xué)院課程設(shè)計(jì)報(bào)告課程名稱:單片機(jī)原理及應(yīng)用課程設(shè)計(jì)設(shè)計(jì)題目: 自動(dòng)控制升降旗裝置 系 別: 通信與控制工程系 專 業(yè): 通信工程 班 級(jí): 07通信一班 學(xué)生姓名: 鄧曉雄 王成 胡楚煊 學(xué) 號(hào): 07416132 07416134 07416135 起止日期: 2010年6月8日 2010年6月22日 指導(dǎo)教師: 方智文 劉偉元 教研室主任: 劉建閩 指導(dǎo)教師評(píng)語: 指導(dǎo)教師簽名: 年 月 日成績?cè)u(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總 成 績 教研室審核意見:教研室主任簽字: 年

2、 月 日教學(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è)

3、計(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附錄二:總原理圖27自動(dòng)控制升降旗裝置設(shè)計(jì)要求基本部分: 1).按下上升按鍵后,旗幟勻速上升,同時(shí)流暢地播放歌曲,上升到最高端時(shí)自動(dòng)

4、停止上升,歌曲停奏;按下下降按鍵后,旗幟勻速下降,降旗的時(shí)間不放歌曲,下降到最低端時(shí)自動(dòng)停止; 2).旗幟在最高端,上升按鍵不起作用;在最低端時(shí),下降按鍵不起作用; 3).升降旗的時(shí)間均為43秒,與國歌的演奏時(shí)間相等; 4).即時(shí)顯示旗幟所在的高度,以CM為單位,誤差不大于2CM。發(fā)揮部分: 1). 重新合上電源后,所顯示的旗幟高度數(shù)據(jù)不變; 2). 要求升降旗的速度可調(diào)整,調(diào)整范圍是30120秒鐘,步進(jìn)1秒(除43秒外,其他時(shí)間可與國歌不同步); 3). 在最高升降速度下(以自選的電機(jī)參數(shù)定),能在指定的位置上自動(dòng)停止,定位誤差±2CM。1 方案選擇與論證1.1電機(jī)的選擇與論證方案

5、一:采用普通的直流電機(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)的切換

6、速度實(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),

7、適應(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)榻俏灰?,即給一個(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)

8、格按照這一順序分別控制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ī)輸出100010x010x0e200110x030x0c300100x020x0d401100x060x09501000x040x0b611000x0c0x03710000

9、x080x07810010x090x06 如果按步序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的PA0PA5經(jīng)三極管擴(kuò)流后進(jìn)行控制,原理圖如圖4所示:圖 4 數(shù)碼管顯示電路原理圖 要在某位數(shù)碼管上顯示一個(gè)數(shù)字,首先把待顯示數(shù)字的顯示碼送給8255的PB口,接著選中要顯示的位。例如:要在開發(fā)板的最左邊的數(shù)碼上

10、顯示一個(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í)別辦法可以確定矩陣式鍵盤上何鍵被按下,采用的方法之

11、一為“行掃描法”。行掃描法又稱為逐行(或列)掃描查詢法,是一種最常見的按鈕識(shí)別方法,鍵盤如上所示。具體實(shí)現(xiàn)過程如下:判斷鍵盤中有無鍵按下。將全部行線置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵低于低電平線與4根行線交叉的4個(gè)按鈕之中。若所有列線均為高電平,則按鍵中無鍵按下。判斷閉合鍵所在的位置:在確認(rèn)有鍵按下的情況下,即可進(jìn)入確定具體鍵的過程。操作是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其他線為高電平。在確定某根行線為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該線與置為低電平的行線交叉處的按鈕就是閉合的按鈕。3.5 外部ROM存

12、儲(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ā)板

13、上均接地,第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í)也可以通過控制脈沖

14、頻率來控制電機(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ù)的功能為在指定

15、的數(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

16、控制音樂子程序流程圖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ì)因

17、為RAM存儲(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(uint ch,uchar address),功能為每一次寫一字節(jié)到指定的存儲(chǔ)器地址上,存儲(chǔ)器讀函數(shù)Read24c02(uchar address),功能為讀出指定地址上的一個(gè)字節(jié)。圖 13 外部ROM程序流程圖5 詳細(xì)儀器清單表格 1 儀器清單儀器名稱數(shù)量STC89C52芯片18255A芯片1UL

18、N2003L1步進(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ā)揮自己

19、的平臺(tái),讓我們把從課本學(xué)到的知識(shí)用到實(shí)際生活當(dāng)中,從中得到鍛煉。在系統(tǒng)設(shè)計(jì)過程中,劉老師、方老師、譚老師、周老師等提出了許多寶貴的意見,在此深表感謝!同時(shí)得到了在校老師和同學(xué)們的支持與幫助,在此表示感謝!參考文獻(xiàn)1 朱定華,戴汝平.單片微機(jī)原理與應(yīng)用(M).北京:清華大學(xué)出版社20032 張鑫單片機(jī)原理及應(yīng)用(M).電子工業(yè)出版社.20093 彭秀華單片機(jī)高級(jí)語言c51Windows環(huán)境編程與應(yīng)用(M).電子工業(yè)出版社 20014 全國大學(xué)生電子設(shè)計(jì)競賽組委會(huì)全國大學(xué)生電子設(shè)計(jì)競賽獲獎(jiǎng)作品選編(M).北京:理工大學(xué)出版社2003年5 彭為單片機(jī)典型系統(tǒng)設(shè)計(jì)實(shí)例精講(M).電子工業(yè)出版社2005

20、6 沈慶陽8051單片機(jī)實(shí)踐與應(yīng)用(M).清華大學(xué)出版社20027 張立科單片機(jī)典型模塊設(shè)計(jì)實(shí)例導(dǎo)航(M).北京:人民郵電出版社 20048 陳濤單片機(jī)應(yīng)用及c51程序設(shè)計(jì)(M).機(jī)械工業(yè)出版社2007附錄一:系統(tǒng)程序代碼#include <config.h> #include <reg52.h>#include <string.h>#define uchar unsigned char#define uint unsigned intuchar code FFW8=0x75,0x65,0x6d,0x4d,0x5d,0x1d,0x3d,0x35;/步進(jìn)電機(jī)正

21、轉(zhuǎn)數(shù)組uchar code REV8=0x35,0x3d,0x1d,0x5d,0x4d,0x6d,0x65,0x75;/步進(jìn)電機(jī)反轉(zhuǎn)數(shù)組/setflag用標(biāo)志定位是否有效test_x,test_y用于定義16個(gè)按鍵中的任一個(gè)uchar test_x=10,test_y=10,setflag=0;uchar setfalse=0;uint counter=0;/用于定義每隔多少個(gè)脈沖數(shù)碼管上數(shù)字自增/定義四個(gè)變量分別存儲(chǔ)四個(gè)要顯示的數(shù)位的值four顯最高位第四位的值,依此類推uint sum=0,four=0,three=0,two=0,one=0;uint four_max=0,three_m

22、ax=0,two_max=0,one_max=0;/定義四個(gè)變量,用來定位停止/音樂模塊用到的些定義常量,變量,數(shù)組unsigned char volatile FlagBeat;/基本節(jié)拍單位計(jì)數(shù)變量unsigned int volatile FreqTemp;unsigned char volatile music_temp; /暫時(shí)存放從MusicTable數(shù)組中讀出的變量unsigned char volatile beat;unsigned char volatile freq;/簡譜碼對(duì)應(yīng)T值數(shù)組的下標(biāo)unsigned char volatile *pmusic;sbit Pin_

23、Buzzer=P33; /串行外存定義的量#defineWriteDeviceAddress 0xa0/定義器件在IIC總線中的地址#defineReadDviceAddress 0xa1sbitSCL=P26;sbitSDA=P27;unsigned char x1,x2,x3;unsigned int code FreqTab= /簡譜對(duì)應(yīng)的簡譜碼、T值65535,63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030;unsigned char code MusicTable=

24、/音符節(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

25、,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,;unsigned char const dis_table16= 0xA0, /*0*/ 0xBB, /*

26、1*/ 0x62, /*2*/ 0x2A, /*3 */ 0x39, /*4*/ 0x2C, /*5 */ 0x24, /*6*/ 0xBA, /*7*/ 0x20, /*8*/ 0x28, /*9 */;void DelayMs(unsigned int number) unsigned char temp;for(;number!=0;number-) for(temp=112;temp!=0;temp-) ;/開始總線void Start() SDA=1;SCL=1;SDA=0;SCL=0;/結(jié)束總線void Stop() SCL=0;SDA=0;SCL=1;SDA=1;/發(fā)ACK0vo

27、id NoAck() SDA=1;SCL=1;SCL=0;/測試ACKbit TestAck() bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);/寫入8個(gè)bit到24c08Write8Bit(unsigned int input) unsigned char temp;for(temp=8;temp!=0;temp-) SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;/寫入一個(gè)字節(jié)到24c08中void Write24c02(uint ch,ucha

28、r address) Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);/從24c08中讀出8個(gè)bituchar Read8Bit() unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp-) SCL=1;rbyte=rbyte<<1;rbyte=rbyte|(unsigned char)(SDA);SCL=0;return(rbyte);/從24

29、c08中讀出1個(gè)字節(jié)uchar Read24c02(uchar address) uchar ch;Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Start();Write8Bit(ReadDviceAddress);TestAck();ch=Read8Bit();NoAck();Stop();return(ch);void delay()/延時(shí)主要用于控制display函數(shù)執(zhí)行速度,以及電機(jī)的轉(zhuǎn)帶 uint i = 0; for(i = 0; i<20;i+);void dela

30、ytest()/延時(shí)主要用作按鍵消抖作用。 uint i = 0; for(i = 0; i<25000;i+);/動(dòng)態(tài)掃描4X4鍵盤,不停的掃描則可以確實(shí)按下的為哪一個(gè)按鍵。void scanKeyboard() uint i,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=

31、1<<i; delay(); PC_data=a8255_PC; if(PC_data&(1<<j) = (1<<j) test_x = i; test_y = j; break;/定時(shí)器,音樂模塊的一些初始化void initial()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=

32、1;/數(shù)碼管顯示方法,在指定的place位置顯示num數(shù)字。void display(uchar place,uint num) uchar i = 0,display_num = 0; uint test = 0; a8255_CON=0x89; a8255_PB=0xff; a8255_PA=0xff; delay(); if(place = 1) test = (0x1<<0); else if(place = 2) test = (0x1<<1); else if(place = 3) test = (0x1<<2); else if(place =

33、 4) test = (0x1<<3); else if(place = 5) test = (0x1<<4); else if(place = 6) test = (0x1<<5); a8255_PA=test;if(num = 0) display_num = dis_table0; else if(num = 1) display_num = dis_table1; else if(num = 2) display_num = dis_table2; else if(num = 3) display_num = dis_table3; else if(

34、num = 4) display_num = dis_table4; else if(num= 5) display_num = dis_table5; else if(num = 6) display_num = dis_table6; else if(num = 7) display_num = dis_table7; else if(num = 8) display_num = dis_table8; else if(num = 9) display_num = dis_table9; a8255_PB=display_num; delay();/主函數(shù)入口,主要用來組合音樂,電機(jī),顯示

35、模塊以及通過按鍵實(shí)時(shí)的控制步進(jìn)機(jī),音樂播放void main(void)/用于掉電保存的數(shù)據(jù),每次開機(jī)時(shí),用于加載掉電前的數(shù)據(jù)uint stoNum=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&&tes

36、t_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();on

37、e_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

38、_x=1&&test_y=0) ) initial();while(1)uint i; scanKeyboard();for(i=0;i<8;i+)if(test_x=0&&test_y=0) P1 = FFWi;/正轉(zhuǎn)else if(test_x=1&&test_y=0)P1 = REVi; /反轉(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+;i

39、f(three= =10) three=0; four+;if(four= =10)four=0; counter=0;else if(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=9;if(four!=0)four-;if(four= =0)four=0;counter=0;/達(dá)到1500處,電機(jī)停止,聲音停止if(four= =1&&three= =5&&two= =0) uint stoNum=four*100+three*10+two;W

溫馨提示

  • 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論