基于51單片機(jī)的貪食蛇游戲機(jī)開(kāi)發(fā)_第1頁(yè)
基于51單片機(jī)的貪食蛇游戲機(jī)開(kāi)發(fā)_第2頁(yè)
基于51單片機(jī)的貪食蛇游戲機(jī)開(kāi)發(fā)_第3頁(yè)
基于51單片機(jī)的貪食蛇游戲機(jī)開(kāi)發(fā)_第4頁(yè)
基于51單片機(jī)的貪食蛇游戲機(jī)開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

PAGE31第ChpNum章基于51單片機(jī)的貪食蛇游戲機(jī)開(kāi)發(fā)1本設(shè)計(jì)的特點(diǎn)和目的本設(shè)計(jì)以51系列單片機(jī)STC89C52為控制核心,以點(diǎn)陣液晶顯示模塊、鍵盤(pán)為人機(jī)接口,實(shí)現(xiàn)了一個(gè)貪食蛇游戲機(jī)。通過(guò)本設(shè)計(jì),令讀者掌握利用單片機(jī)開(kāi)發(fā)簡(jiǎn)單電子產(chǎn)品的基本技能,熟悉原理圖繪制、仿真、軟件設(shè)計(jì)、優(yōu)化以及系統(tǒng)調(diào)試的基本方法,為進(jìn)一步設(shè)計(jì)開(kāi)發(fā)更為復(fù)雜的嵌入式模擬/數(shù)字混合系統(tǒng)打下一定的基礎(chǔ)。2產(chǎn)品簡(jiǎn)介“貪食蛇”又稱(chēng)為“貪吃蛇”,是一種益智小游戲。其游戲規(guī)則比較簡(jiǎn)單,就是一條小蛇,不停地在屏幕上游走去吃屏幕上出現(xiàn)的蛋,越吃越長(zhǎng),只要蛇頭碰到屏幕四周或者碰到自己的身子,小蛇就立即斃命并結(jié)束游戲。本作品有上下左右四個(gè)按鍵來(lái)控制蛇頭的移動(dòng)方向,另有一個(gè)復(fù)位按鍵控制程序的重啟,游戲界面采用分辨率為128×64的液晶顯示屏。3硬件設(shè)計(jì)3.1人機(jī)接口電路本游戲機(jī)游戲界面由液晶顯示模塊呈現(xiàn)。液晶顯示模塊中,最主要的就是LCD液晶屏。根據(jù)LCD液晶屏顯示內(nèi)容的不同,液晶顯示模塊可以分為數(shù)顯液晶模塊、點(diǎn)陣字符液晶模塊和點(diǎn)陣圖形液晶模塊3種。本設(shè)計(jì)使用點(diǎn)陣圖形液晶模塊OCM12864。OCM12864液晶顯示模塊是128×64點(diǎn)陣型液晶顯示模塊,可顯示各種字符及圖形,可與CPU直接連接,具有8位標(biāo)準(zhǔn)數(shù)據(jù)總線、6條控制線及電源線,各引腳的信號(hào)說(shuō)明參見(jiàn)表ChpNum-1。表ChpNum-1OCM12864引腳說(shuō)明管腳名稱(chēng)方向引腳說(shuō)明VSS-邏輯電源地。VDD-邏輯電源+5V。V0ILCD調(diào)整電壓,應(yīng)用時(shí)接10K電位器可調(diào)端RSI數(shù)據(jù)\指令選擇:高電平:數(shù)據(jù)D0-D7將送入顯示RAM;低電平:數(shù)據(jù)D0-D7將送入指令寄存器執(zhí)行。R/WI讀\寫(xiě)選擇:高電平:讀數(shù)據(jù);低電平:寫(xiě)數(shù)據(jù)。EI讀寫(xiě)使能,高電平有效,下降沿鎖定數(shù)據(jù)。DB0I/O數(shù)據(jù)輸入輸出引腳。DB1I/O數(shù)據(jù)輸入輸出引腳。DB2I/O數(shù)據(jù)輸入輸出引腳。DB3I/O數(shù)據(jù)輸入輸出引腳。DB4I/O數(shù)據(jù)輸入輸出引腳。DB5I/O數(shù)據(jù)輸入輸出引腳。DB6I/O數(shù)據(jù)輸入輸出引腳。DB7I/O數(shù)據(jù)輸入輸出引腳。CS1I片選擇信號(hào),高電平時(shí)選擇左半屏。CS2I片選擇信號(hào),高電平時(shí)選擇右半屏。/RETI復(fù)位信號(hào),低電平有效。VEEOLCD驅(qū)動(dòng),負(fù)電壓輸出,對(duì)地接10K電位器LEDA-背光電源,LED+(5V)。LEDK-背光電源,LED-(0V)。單片機(jī)與液晶顯示器的連接電路如圖ChpNum-1所示,片選信號(hào)CS1與CS2接P2.4和P2.3引腳,RS、R/W、E分別接引腳P2.2、P2.1、P2.0。VEE驅(qū)動(dòng)負(fù)電壓輸出,而V0接10K電位器,對(duì)LCD亮度進(jìn)行調(diào)節(jié)。51單片機(jī)的P0口為了實(shí)現(xiàn)準(zhǔn)3態(tài),采用了OC輸出,也就是集電極懸空輸出。這種電路結(jié)構(gòu),只有下拉能力,高電平輸出沒(méi)有電流。在高電平時(shí)表現(xiàn)為高阻態(tài),加上拉電阻,就會(huì)失去高阻態(tài),變成1、0兩態(tài)。因此在P0口與OCM12864的I/O口之間接上10K的排阻。用戶通過(guò)四個(gè)按鍵控制蛇頭的上下左右移動(dòng),接法如圖ChpNum-1所示。四個(gè)按鍵尾端均接地,任意按鍵的按下均會(huì)使與門(mén)輸出由高電平變成低電平,從而觸發(fā)中斷。此時(shí),中斷服務(wù)程序通過(guò)檢測(cè)P2.6口與P2.7口的電平可以識(shí)別是哪個(gè)按鍵被按下。若P2.6和P2.7同時(shí)為低電平,表明是UP鍵按下;若同時(shí)為高電平,表明DOWN鍵按下;若P2.6為高,P2.7為低則表明是LEFT鍵被按下;若P2.6為低,P2.7為高則表明RIGHT鍵被按下。游戲音效由蜂鳴器實(shí)現(xiàn),接法如圖ChpNum-1所示。由于單片機(jī)輸出腳的驅(qū)動(dòng)電流有限,我們用單片機(jī)P2.5腳輸出信號(hào)控制PNP三極管S8550的通斷,當(dāng)P2.5輸出高電平時(shí),三極管截止,當(dāng)P2.5輸出低電平時(shí),三極管導(dǎo)通。因此,通過(guò)在P2.5腳輸出不同頻率的方波信號(hào),可使得蜂鳴器發(fā)出不同頻率的聲音。圖ChpNum-1人機(jī)接口電路3.2單片機(jī)與PC機(jī)通信電路本設(shè)計(jì)采用的STC89C52單片機(jī)具備ISP下載功能,無(wú)需用到編程器,編譯好的單片機(jī)程序可以通過(guò)串口下載到單片機(jī)。單片機(jī)與PC機(jī)串行通信采用RS-232C標(biāo)準(zhǔn)。因?yàn)镽S-232C接口信號(hào)不是標(biāo)準(zhǔn)的TTL電平,單片機(jī)與PC機(jī)通過(guò)RS-232C串口進(jìn)行通信時(shí),必須進(jìn)行電平轉(zhuǎn)換。雖然可以用分立元件組成RS-232C與TTL電平之間的轉(zhuǎn)換電路,但是現(xiàn)在更多的是使用集成電路來(lái)完成,這里使用MAX232集成電路。如圖ChpNum-2所示,MAX232需要外接4只0.1uF電容,或者1uF的電解電容。之所以需要電容,是因?yàn)镽S-232電平是工作在大約-9V~+9V之間,需要電容將5V電壓轉(zhuǎn)換成RS-232電平需要的+10V和-10V。單片機(jī)側(cè)安裝了DB9物理連接器,可直接通過(guò)串口線連接到PC的串口。圖ChpNum-2RS-232信號(hào)適配電路3.3其他部分電路說(shuō)明電源電路、復(fù)位和時(shí)鐘電路比較簡(jiǎn)單,具體連接請(qǐng)參見(jiàn)電路原理總圖。供電部分采用7805將輸入9~12V電壓轉(zhuǎn)換為5V輸出,輸入輸出端接220uF電解電容,使整流后的脈動(dòng)直流電壓變成相對(duì)比較穩(wěn)定的直流電壓。由于大容量的電解電容一般具有一定的電感,對(duì)高頻及脈沖干擾信號(hào)不能有效地濾除,所以兩端并聯(lián)一只容量為0.1uF的電容,以濾除高頻及脈沖干擾。復(fù)位電路含有上電復(fù)位和按鍵復(fù)位功能,按鍵復(fù)位用于游戲結(jié)束后游戲的重新啟動(dòng)。系統(tǒng)插電瞬間電源通過(guò)10K電阻給10uF電容充電電平,充電電流在10K電阻上產(chǎn)生壓降,于是電阻上端產(chǎn)生一個(gè)維持幾百毫秒的高電平輸入到RESET對(duì)單片機(jī)進(jìn)行復(fù)位,電容充電滿后經(jīng)過(guò)電阻電流為0,復(fù)位失效。類(lèi)似地,當(dāng)開(kāi)關(guān)按下時(shí),強(qiáng)制產(chǎn)生一個(gè)高電平對(duì)單片機(jī)進(jìn)行復(fù)位。時(shí)鐘電路使用12MHz的晶振,晶振的兩引腳處接入兩個(gè)22pF的瓷片電容來(lái)削減諧波對(duì)電路穩(wěn)定性的影響。4軟件設(shè)計(jì)4.1系統(tǒng)程序流程如圖ChpNum-3所示,貪食蛇軟件主要分成三個(gè)部分:主程序、外部中斷服務(wù)程序、定時(shí)中斷服務(wù)程序。主程序的作用是一些初始化工作及蛇體動(dòng)作執(zhí)行、食物的隨機(jī)產(chǎn)生、得分累計(jì)、圖像顯示等。外部中斷服務(wù)程序的功能是識(shí)別按鍵。定時(shí)中斷服務(wù)程序的作用是定時(shí)產(chǎn)生步進(jìn)信號(hào)。外部中斷服務(wù)程序與主程序之間聯(lián)系的紐帶是全局變量MovDirection,鍵盤(pán)中斷服務(wù)程序每次執(zhí)行都要把按鍵對(duì)應(yīng)的方向更新到此變量,而主程序每次步進(jìn)方向都以此變量為依據(jù)。定時(shí)中斷服務(wù)程序通過(guò)全局變量IsToStep與主程序聯(lián)系起來(lái),主程序只有在IsToStep為1時(shí)才讓蛇體步進(jìn),且步進(jìn)后將該變量置0,定時(shí)中斷服務(wù)程序每隔一段時(shí)間為IsToStep置位,使主程序得到步進(jìn)信號(hào)。圖ChpNum-3程序流程主程序首先進(jìn)行LCD和定時(shí)器的初始化,繪制好游戲界面后打開(kāi)外部中斷并啟動(dòng)定時(shí)器,進(jìn)入主循環(huán)。主循環(huán)等待蛇體步進(jìn)信號(hào)IsToStep(由定時(shí)中斷服務(wù)程序設(shè)置),得到步進(jìn)信號(hào)后根據(jù)當(dāng)前方向MovDirection控制蛇體向前步進(jìn)。步進(jìn)后判斷當(dāng)前蛇頭是否碰到食物,若碰到,將食物與蛇體合并,并產(chǎn)生新的食物再進(jìn)入首身相碰判斷;若未碰到食物,直接進(jìn)入首身相碰判斷。若首身未相碰則將IsToStep清零、更新得分后回到主循環(huán);否則退出游戲。定時(shí)器中斷服務(wù)程序作用是定時(shí)產(chǎn)生步進(jìn)信號(hào),因硬件定時(shí)最大值不夠蛇體步進(jìn)最小間隔時(shí)間,我們用多次硬件定時(shí)來(lái)產(chǎn)生一個(gè)步進(jìn)信號(hào)。設(shè)計(jì)全局變量p,每硬件中斷觸發(fā)一次p減1。當(dāng)p減到0時(shí)置IsToStep為1并對(duì)p重新賦值。值得注意的是,p的重新賦值應(yīng)參考蛇體長(zhǎng)度,若蛇體長(zhǎng)度越長(zhǎng)p值應(yīng)越小,即步進(jìn)間隔越短,蛇體移動(dòng)速度越快,游戲難度越大。具體做法見(jiàn)參考代碼。外部中斷服務(wù)程序用于按鍵識(shí)別并更新前進(jìn)方向全局變量MovDirection。首先取出鍵盤(pán)檢測(cè)位的值再確定貪食蛇要改變的方向。當(dāng)貪食蛇正向上或向下移動(dòng)時(shí),按下上下方向鍵,鍵值都不進(jìn)行處理;而貪食蛇正向左或向右移動(dòng)時(shí),按下左右方向鍵,鍵值都不進(jìn)行處理。4.2軟件模塊設(shè)計(jì)4.2.1LCD初始化 在對(duì)LCD進(jìn)行初始化時(shí),先要檢查讀忙碌標(biāo)志位,當(dāng)BF為1表示內(nèi)部操作正在進(jìn)行,0表示允許指令操作。具體指令說(shuō)明如下:顯示開(kāi)/關(guān)設(shè)置引腳R/WRSDB7DB6DB5DB4DB3DB2DB1DB0電平LLLLHHHHHH/L功能:設(shè)置屏幕顯示開(kāi)/關(guān)。DB0=H,開(kāi)顯示;DB0=L,關(guān)顯示。不影響顯示RAM(DDRAM)中的內(nèi)容。設(shè)置顯示起始行引腳R/WRSDB7DB6DB5DB4DB3DB2DB1DB0電平LLHH行地址(0~63)功能:執(zhí)行該命令后,所設(shè)置的行將顯示在屏幕的第一行。顯示起始行是由Z地址計(jì)數(shù)器控制的,該命令自動(dòng)將A0-A5位地址送入Z地址計(jì)數(shù)器,起始地址可以是0-63范圍內(nèi)任意一行。Z地址計(jì)數(shù)器具有循環(huán)計(jì)數(shù)功能,用于顯示行掃描同步,當(dāng)掃描完一行后自動(dòng)加一。設(shè)置頁(yè)地址引腳R/WRSDB7DB6DB5DB4DB3DB2DB1DB0電平LLHLHHH頁(yè)地址(0~7)功能:執(zhí)行本指令后,下面的讀寫(xiě)操作將在指定頁(yè)內(nèi),直到重新設(shè)置。頁(yè)地址就是DDRAM的行地址,頁(yè)地址存儲(chǔ)在X地址計(jì)數(shù)器中,A2-A0可表示8頁(yè),讀寫(xiě)數(shù)據(jù)對(duì)頁(yè)地址沒(méi)有影響,除本指令可改變頁(yè)地址外,復(fù)位信號(hào)(RST)可把頁(yè)地址計(jì)數(shù)器內(nèi)容清零。設(shè)置列地址引腳R/WRSDB7DB6DB5DB4DB3DB2DB1DB0電平LLLH列地址(0~63)功能:DDRAM的列地址存儲(chǔ)在Y地址計(jì)數(shù)器中,讀寫(xiě)數(shù)據(jù)對(duì)列地址有影響,在對(duì)DDRAM進(jìn)行讀寫(xiě)操作后,Y地址自動(dòng)加1。狀態(tài)檢測(cè)引腳R/WRSDB7DB6DB5DB4DB3DB2DB1DB0電平HLBFLON/OFFRSTLLLL功能:讀忙信號(hào)標(biāo)志位(BF)、復(fù)位標(biāo)志位(RST)以及顯示狀態(tài)位(ON/OFF)。BF=H:內(nèi)部正在執(zhí)行操作;BF=L:空閑狀態(tài)。RST=H:正處于復(fù)位初始化狀態(tài);RST=L:正常狀態(tài)。ON/OFF=H:表示顯示關(guān)閉;ON/OFF=L:表示顯示開(kāi)。寫(xiě)顯示數(shù)據(jù)引腳R/WRSDB7DB6DB5DB4DB3DB2DB1DB0電平LHD7D6D5D4D3D2D1D0功能:寫(xiě)數(shù)據(jù)到DDRAM,DDRAM是存儲(chǔ)圖形顯示數(shù)據(jù)的,寫(xiě)指令執(zhí)行后Y地址計(jì)數(shù)器自動(dòng)加1。D7-D0位數(shù)據(jù)為1表示顯示,數(shù)據(jù)為0表示不顯示。寫(xiě)數(shù)據(jù)到DDRAM前,要先執(zhí)行“設(shè)置頁(yè)地址”及“設(shè)置列地址”命令。讀顯示數(shù)據(jù)引腳R/WRSDB7DB6DB5DB4DB3DB2DB1DB0電平HHD7D6D5D4D3D2D1D0功能:從DDRAM讀數(shù)據(jù),讀指令執(zhí)行后Y地址計(jì)數(shù)器自動(dòng)加1。從DDRAM讀數(shù)據(jù)前要先執(zhí)行“設(shè)置頁(yè)地址”及“設(shè)置列地址”命令.LCD初始化時(shí),根據(jù)指令格式,先進(jìn)行讀忙碌檢查。當(dāng)BF為低電平時(shí),設(shè)置顯示起始行為第一行,A0~A5位為0,然后設(shè)置屏幕顯示為開(kāi),具體做法見(jiàn)參考代碼。4.2.2鍵盤(pán)掃描程序鍵盤(pán)掃描通過(guò)外部中斷來(lái)檢測(cè),四個(gè)方向鍵經(jīng)與門(mén)與P3.2(中斷輸入)引腳相連。程序初始化時(shí)將IT0置0,表示外部中斷使用電平觸發(fā)方式,低電平可引起中斷。任何鍵的按下均會(huì)使P3.2電平為低,進(jìn)入中斷服務(wù)程序。中斷服務(wù)程序先將P2口數(shù)據(jù)取出,右移6位將鍵盤(pán)接入引腳(P2.7、P2.6)的值取出,得到鍵盤(pán)識(shí)別碼。鍵盤(pán)識(shí)別碼有四個(gè):1(左鍵)、2(右鍵)、0(上鍵)、3(下鍵)。得到按鍵識(shí)別碼后根據(jù)識(shí)別碼及當(dāng)前方向更新前進(jìn)方向。4.2.3顯示16*16點(diǎn)陣漢字液晶顯示器的數(shù)據(jù)線是8位的,顯示數(shù)據(jù)是逐字節(jié)輸入的。每字節(jié)輸入數(shù)據(jù)對(duì)應(yīng)到一列的8個(gè)像素點(diǎn)(8行)。自然地,64行像素點(diǎn)分成8頁(yè),每8行為一頁(yè)。向液晶顯示器寫(xiě)入顯示數(shù)據(jù)時(shí)均要先設(shè)置寫(xiě)入的頁(yè)號(hào)和列號(hào)(而不是具體某一個(gè)像素點(diǎn)的坐標(biāo)),然后寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù)。如表ChpNum-2所示,液晶顯示模塊中的DDRAM是存儲(chǔ)圖形顯示數(shù)據(jù)的,LCD顯示的數(shù)據(jù)與DDRAM中的數(shù)據(jù)一一對(duì)應(yīng)(一位DDRAM對(duì)應(yīng)一個(gè)像素,數(shù)據(jù)為1表顯示該點(diǎn),為0不顯示)。漢字在液晶中占用16*16像素點(diǎn),即兩頁(yè)16列。把漢字的點(diǎn)陣數(shù)據(jù)寫(xiě)到液晶的DDRAM中時(shí)。先載入第一頁(yè)的16列(字節(jié)),再載第2頁(yè)的16列。詳細(xì)過(guò)程見(jiàn)參考代碼。表ChpNum-2DDRAM地址映像Y地址012………616263X地址DB0∫

PAGE0DB7X=0DB0∫

PAGE1DB7X=1∷∷∷∷DB0∫

PAGE6DB7X=7DB0∫

PAGE7DB74.2.4食物的隨機(jī)出現(xiàn) 食物的出現(xiàn)是一種隨機(jī)行為,所以必須做一個(gè)隨機(jī)數(shù),而且食物出現(xiàn)的位置不能與蛇的位置相同,也不能超出墻外,否則就要重置食物。這里使用程序中的定時(shí)計(jì)數(shù)器的低八位TL0的數(shù)值,由于TL0不斷變化,不同的時(shí)間點(diǎn)數(shù)值不同,TL0%24及TL0%15分別為食物的列地址和行地址。4.3軟件編譯 程序調(diào)試使用uVision3,此在軟件中要求每個(gè)工程都要建立一個(gè)文件來(lái)存儲(chǔ)相關(guān)信息,因此不論是匯編的,還是C語(yǔ)言的,不論是只有一個(gè)文件的還是有多個(gè)文件的程序都需要一個(gè)工程文件。這里使用C語(yǔ)言編寫(xiě),具體步驟如下:(1)打開(kāi)uVision3后,打開(kāi)Project菜單,在彈出的下拉菜單中選擇NewProject命令,選擇保存路徑,輸入工程名“貪食蛇”,最后單擊“保存”按鈕。在保存新建工程后要求選擇所使用單片機(jī)的型號(hào),在此選擇Atmel的80C52單片機(jī)。(2)建立起一個(gè)新工程后,接下來(lái)是新建程序及各種文件,保存程序文件后需要將其添加文件到工程中。(3)至此就可以進(jìn)行源程序編寫(xiě),完成編寫(xiě)后就對(duì)程序進(jìn)行編譯及仿真。通過(guò)單擊工具欄圖標(biāo)BuildTarget,可以翻譯所有源文件并生成應(yīng)用。當(dāng)Build應(yīng)用存在語(yǔ)法錯(cuò)誤時(shí),uVision3將會(huì)在OutputWindow-Build頁(yè)顯示錯(cuò)誤和警示信息。雙擊信息行,uVision3在編輯器窗口打開(kāi)此信息對(duì)應(yīng)的源文件,并定位到相應(yīng)的位置。一旦成功地生成了應(yīng)用程序,就可以開(kāi)始調(diào)試了。在調(diào)試好應(yīng)用程序后,要求生成一個(gè)IntelHEX文件。這個(gè)文件可以下載到EPROM編程器中。5系統(tǒng)調(diào)試5.1PROTEUS仿真在用uVision3編寫(xiě)單片機(jī)程序時(shí),因uVision3往往只能修改語(yǔ)法上的錯(cuò)誤,對(duì)于算法上的問(wèn)題不好檢查,而直接下到單片機(jī)里又受電路板的限制而不方便調(diào)試,因此這里使用Proteus進(jìn)行電路仿真。該軟件具有模擬電路仿真、數(shù)字電路仿真、單片機(jī)及其外圍電路組成的系統(tǒng)仿真、RS232動(dòng)態(tài)仿真、I2C調(diào)試器、SPI調(diào)試器、鍵盤(pán)和LCD系統(tǒng)仿真的功能,同時(shí)有各種虛擬儀器,如示波器、邏輯分析儀、信號(hào)發(fā)生器等。 在Proteus軟件的ISIS中新建設(shè)計(jì)圖,畫(huà)出本設(shè)計(jì)的電路圖。電路設(shè)計(jì)完成后就可以進(jìn)行仿真。先雙擊單片機(jī),把用uVision3編譯生成的HEX文件指定為下載文件,點(diǎn)擊PLAY鍵即可進(jìn)行仿真。當(dāng)出現(xiàn)ANALYSERERRORS時(shí),表示電路有錯(cuò)誤,列表中說(shuō)明了具體的錯(cuò)誤,必須要先排錯(cuò)才可以進(jìn)行仿真。5.2硬件的安裝 軟件調(diào)試及Proteus仿真完成后就進(jìn)行硬件的安裝。讀者可以自己印制PCB進(jìn)行設(shè)計(jì),亦可在萬(wàn)能板上搭建。安裝時(shí)要考慮受熱、穩(wěn)固等多方面的影響。比如使用電烙鐵時(shí)要控制好焊接的時(shí)間,電烙鐵停留的時(shí)間太短,焊錫不易完全熔化,形成“虛焊”,而焊接時(shí)間太長(zhǎng)又容易損壞元器件,每一兩秒內(nèi)要焊好一個(gè)焊點(diǎn),若沒(méi)完成,寧愿等一會(huì)兒再焊一次。其次芯片的擺置要方便連線,焊接時(shí)要先把芯片從插座拔出,等線接好了再插上去。在焊接時(shí)要考慮電路的抗干擾能力,同時(shí)要充分考慮電源對(duì)單片機(jī)的影響。每焊接完一個(gè)模塊,要用萬(wàn)能表根據(jù)電路圖檢查有沒(méi)有接錯(cuò)、短路等現(xiàn)象,確認(rèn)正確后再繼續(xù)下一個(gè)模塊。5.3調(diào)試注意事項(xiàng)5.3.1硬件調(diào)試注意事項(xiàng)硬件全部焊接好以后,先初步檢查是否焊錯(cuò),有沒(méi)有漏焊、虛焊,元件有沒(méi)有接錯(cuò)或者接反。在上電之前可以用萬(wàn)用表檢測(cè)電源正負(fù)極有沒(méi)有短路,保證系統(tǒng)可靠地供電。對(duì)于復(fù)雜的接口,例如LCD接口,單純從硬件角度不易調(diào)試,應(yīng)結(jié)合軟件從不同的角度進(jìn)行測(cè)試,這樣能起到更好的效果。有條件的話可以合理地使用示波器,提高工作效率。同時(shí)系統(tǒng)時(shí)鐘受干擾或晶體振蕩不正??赡軐?dǎo)致系統(tǒng)工作故障,復(fù)位電路也要保證連接正確及工作正常。檢查故障時(shí)要細(xì)心嚴(yán)謹(jǐn),要學(xué)會(huì)正確迅速排除故障原因。如果調(diào)試各部分都正常,就可以把整個(gè)程序下載到單片機(jī)系統(tǒng)中,再進(jìn)行下一步的軟件調(diào)試了。5.3.2軟件調(diào)試注意事項(xiàng) 整個(gè)程序是用C語(yǔ)言進(jìn)行編寫(xiě)的,因?yàn)槌绦虿豢赡芤淮尉湍苷_無(wú)誤的完成,所以須要在調(diào)試中慢慢修改。程序完成后先是用Proteus軟件進(jìn)行仿真調(diào)試,之后再進(jìn)行硬件調(diào)試。這樣可以避免多次使用硬件下載調(diào)試造成不必要的麻煩與失誤。軟件仿真成功了,便可以通過(guò)串口下載到單片機(jī)上進(jìn)行調(diào)試了。但要注意一點(diǎn),并不是軟件上仿真成功了硬件就一定能成功,很多時(shí)候軟件上的仿真跟便件上仿真還是存在很大的差別的,軟件仿真成功只說(shuō)明電路連接正確,程序編寫(xiě)合理。而硬件的仿真還受到元件性能,周?chē)h(huán)境溫度和噪音干擾等多方面因素影響,必須要綜合的進(jìn)行考慮。6附錄6.1總原理圖圖ChpNum-4總原理圖6.2單片機(jī)程序參考代碼/*********************************************************************文件名:main.c說(shuō)明:程序文件,所有貪食蛇軟件的函數(shù)均在此文件內(nèi),包括main函數(shù),中斷處理處理函數(shù)和液晶驅(qū)動(dòng)的相關(guān)函數(shù)。其他:編譯器KeilC,單片機(jī)晶振12MHz.************************************************************************/#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintvoidDelayINms(uintk);//函數(shù)原型聲明voidchekbusy12864();voidchoose12864(ucharSlctScreen);voidcmd_w12864(ucharcmd);voiddat_w12864(uchardat);voidclear12864();voidinit_lcd();voidPlay8(ucharSlctScreen,ucharColumn,ucharPage,uchar*pAdr);voidPlay16(ucharSlctScreen,ucharColumn,ucharPage,uchar*pAdr);uchardat_r12864(ucharPage,ucharColumn);voidvertical(ucharRowStart,ucharRowStop,ucharColumn);voiddot(ucharx,uchary); voidcleardot(ucharx,uchary)voidDisplayBodyCell(uchar*x,uchar*y);voidClearBodyCell(uchar*x,uchar*y);//文字點(diǎn)陣數(shù)據(jù)ucharcodeshu0[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};/*"0"*/ucharcodeshu1[]={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};/*"1"*/ucharcodeshu2[]={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};/*"2"*/ucharcodeshu3[]={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};/*"3"*/ucharcodeshu4[]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};/*"4"*/ucharcodeshu5[]={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};/*"5"*/ucharcodeshu6[]={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};/*"6"*/ucharcodeshu7[]={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};/*"7"*/ucharcodeshu8[]={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};/*"8"*/ucharcodeshu9[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};/*"9"*/ucharcodeGameOverWord[]={0x00,0x20,0x44,0x08,0x20,0xE0,0x92,0x94,0x10,0x28,0xAE,0x68,0x24,0x04,0x00,0x00,0x00,0x0C,0x03,0x04,0x02,0x19,0x0C,0x03,0x02,0x12,0x22,0x1F,0x01,0x01,0x01,0x00,/*"游"*/0x00,0x20,0xA0,0x90,0x10,0xF0,0x00,0x40,0x7F,0xC0,0x20,0x24,0x88,0x00,0x00,0x00,0x10,0x08,0x04,0x02,0x01,0x02,0x14,0x10,0x08,0x05,0x06,0x09,0x10,0x20,0x38,0x00,/*"戲"*/0x00,0x60,0x50,0xCC,0x40,0x30,0x40,0x40,0x40,0xFE,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x12,0x13,0x0A,0x09,0x05,0x00,0x3A,0x2A,0x25,0x25,0x15,0x1D,0x00,0x00,0x00,/*"結(jié)"*/0x00,0x00,0x00,0x60,0xA8,0xA8,0xA8,0xFF,0x94,0x54,0x70,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x08,0x08,0x04,0x02,0x01,0x7F,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x00/*"束"*/};ucharcodefen[]={0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xc0,0x40,0x00,0x00,0x80,0x40,0x20,0x10,0x0f,0x00,0x00,0x20,0x40,0x3f,0x00,0x00,0x00,0x00,0x00/*"分"*/};ucharcodeshu[]={0x10,0x92,0x54,0x38,0xff,0x38,0x54,0x52,0x80,0xf0,0x1f,0x12,0x10,0xf0,0x10,0x00,0x42,0x42,0x2a,0x2e,0x13,0x1a,0x26,0x02,0x40,0x20,0x13,0x0c,0x33,0x60,0x20,0x00/*"數(shù)"*/};/*貪食蛇身體最小單位為4*4像素,活動(dòng)空間被劃分成多個(gè)4*4的小方塊,共有16行25列,用x表示列,y表示行的話我們可以(X,Y)來(lái)表示蛇身體的一個(gè)單元的位置,從蛇頭開(kāi)始,我們將蛇的身體所有單元置于一個(gè)數(shù)組內(nèi),該數(shù)組為SnakeBody,SnakeBody[0]存蛇尾。食物也是4*4的,處理方法類(lèi)似*/ucharSnakeBody[80]={0,8,1,8};sbitdeep=P2^5;bitIsMovInVetical=0;//IsMovInVetical為0表示當(dāng)前蛇頭移動(dòng)是水平向,1表垂直向 bitIsNotEatSelf;//為0表蛇頭碰到蛇身,為1表未碰到。bitIsToStep=0;//步進(jìn)標(biāo)志,主循環(huán)發(fā)現(xiàn)此位為1,讓蛇進(jìn)一步且將該位置0.bitIsT0GenNewFood;//是否需要重新產(chǎn)生食物(重置食物)ucharSnakeLength=2;//蛇體當(dāng)前長(zhǎng)度ucharp=20;//定時(shí)次數(shù)ucharButtonNum,MovDirection=1;//k是按鍵號(hào),MovDirection是移動(dòng)方向//液晶顯示器相關(guān)全局變量sbitE=P2^0;sbitRW=P2^1;sbitRS=P2^2;sbitCS2=P2^3;sbitCS1=P2^4;/*************************************************************************函數(shù)名:main說(shuō)明:液晶屏初始化,定時(shí)器初始化后進(jìn)入一個(gè)主循環(huán),在主循環(huán)內(nèi)等待到定時(shí)中斷服務(wù)程序?qū)⑷肿兞縄sToStep置1,控制蛇產(chǎn)生步進(jìn)。判斷是否碰到食物,若碰到食物則將蛇身與食物合并,并產(chǎn)生新的食物。每步進(jìn)一次,主循環(huán)內(nèi)還要判斷蛇是否吃到自己,若是,則退出主循環(huán)提示結(jié)束程序。***************************************************************************/voidmain(){ ucharfood[2]={12,8};//食物的位置(位于哪個(gè)4*4小格)uchari,x,y;choose12864(2);//選定左右屏幕init_lcd();//初始化clear12864(); //清屏vertical(1,61,30);//畫(huà)左垂直邊框線vertical(1,61,127);//畫(huà)右垂直邊框線for(i=0;i<98;i++)//畫(huà)上下水平邊框線{dot(30+i,1); dot(30+i,62);}Play16(0,0,1,fen);//在屏幕左側(cè)顯示"分?jǐn)?shù)"字樣Play16(0,0,2,shu);DisplayBodyCell(SnakeBody,(SnakeBody+1));//顯示貪食蛇DisplayBodyCell((SnakeBody+2),(SnakeBody+3));//顯示食物DisplayBodyCell(food,food+1);TMOD=0x01; //定時(shí)器工作方式IT0=1; //邊延有效EX0=1; //開(kāi)外部中斷TL0=0x00;TH0=0x00; //定時(shí)器初值TR0=1; //啟動(dòng)定時(shí)器ET0=1; //開(kāi)定時(shí)器中斷IP=0x01; //設(shè)置中斷優(yōu)先級(jí)EA=1; //開(kāi)CPU中斷do{ while(!IsToStep);//等待到定時(shí)中斷給步進(jìn)標(biāo)記置位后,控制蛇身向前一步x=*(SnakeBody);//暫存蛇尾位置y=*(SnakeBody+1);switch(MovDirection)//東 { case1: { //蛇步進(jìn),原次尾單元變成尾單元。SnakeBody向前挪兩個(gè)字節(jié)。for(i=0;i<SnakeLength-1;i++){ *(SnakeBody+(i<<1))=*(SnakeBody+(i<<1)+2); *(SnakeBody+(i<<1)+1)=*(SnakeBody+(i<<1)+3); } (*(SnakeBody+(SnakeLength<<1)-2))++;//設(shè)定新蛇頭的位置 IsMovInVetical=0; break; } case2: //南 {//蛇步進(jìn),原次尾單元變成尾單元。SnakeBody向前挪兩個(gè)字節(jié)。 for(i=0;i<SnakeLength-1;i++) { *(SnakeBody+(i<<1))=*(SnakeBody+(i<<1)+2); *(SnakeBody+(i<<1)+1)=*(SnakeBody+(i<<1)+3); } (*(SnakeBody+(SnakeLength<<1)-1))++; IsMovInVetical=1; break; } case3: //西 {//蛇步進(jìn),原次尾單元變成尾單元。SnakeBody向前挪兩個(gè)字節(jié)。 for(i=0;i<SnakeLength-1;i++) { *(SnakeBody+(i<<1))=*(SnakeBody+(i<<1)+2); *(SnakeBody+(i<<1)+1)=*(SnakeBody+(i<<1)+3); } (*(SnakeBody+(SnakeLength<<1)-2))--;//設(shè)定新蛇頭的位置 IsMovInVetical=0; break; } case4: { //北,蛇步進(jìn),原次尾單元變成尾單元。SnakeBody向前挪兩個(gè)字節(jié)。 for(i=0;i<SnakeLength-1;i++) { *(SnakeBody+(i<<1))=*(SnakeBody+(i<<1)+2); *(SnakeBody+(i<<1)+1)=*(SnakeBody+(i<<1)+3); } (*(SnakeBody+(SnakeLength<<1)-1))--;//設(shè)定新蛇頭的位置 IsMovInVetical=1; break; } } if(((*(SnakeBody+(SnakeLength<<1)-2))==food[0])&&((*(SnakeBody+(SnakeLength<<1)-1))==food[1])) {//若碰到食物,調(diào)整蛇體 for(i=SnakeLength;i>0;i--) { *(SnakeBody+(i<<1))=*(SnakeBody+(i<<1)-2); *(SnakeBody+(i<<1)+1)=*(SnakeBody+(i<<1)-1); } *SnakeBody=x; *(SnakeBody+1)=y; SnakeLength++;//蛇體長(zhǎng)度加 do//產(chǎn)生新的有效的食物 { IsT0GenNewFood=0; food[0]=TL0%24;//產(chǎn)生食物 food[1]=TL0%15;//檢查Food位置是否被蛇身覆蓋,若是需重置食 for(i=0;i<SnakeLength-1;i++)物。 {if((*(SnakeBody+(i<<1)))==food[0]&&((*(SnakeBody+(i<<1)+1))==food[1])) { IsT0GenNewFood=1; break; } } } while(IsT0GenNewFood); DisplayBodyCell(food,food+1);//顯示食物 } IsNotEatSelf=1; for(i=0;i<SnakeLength-1;i++){//判斷是否吃到自己,蛇頭坐標(biāo)與身體某單元相同 if(*(SnakeBody+(i<<1))==*(SnakeBody+(SnakeLength<<1)-2)&&(*(SnakeBody+(i<<1)+1)==*(SnakeBody+(SnakeLength<<1)-1))) { IsNotEatSelf=0;//吃到自己 break; } } IsNotEatSelf=IsNotEatSelf&&*(SnakeBody+(SnakeLength<<1)-2)>=0&&*(SnakeBody+(SnakeLength<<1)-2)<24;IsNotEatSelf=IsNotEatSelf&&*(SnakeBody+(SnakeLength<<1)-1)>=0&&*(SnakeBody+(SnakeLength<<1)-1)<15; if(IsNotEatSelf)//如果未吃到自己 { clear(&x,&y); for(i=0;i<SnakeLength;i++)//顯示蛇身 { DisplayBodyCell(SnakeBody+(i<<1),SnakeBody+(i<<1)+1); } IsToStep=0; Play8(0,0,3,shu0+((SnakeLength/10)<<4));//顯示得分 Play8(0,1,3,shu0+(((SnakeLength)%10)<<4)); }}while(IsNotEatSelf);//如果吃到自己,則上面大循環(huán)結(jié)束,游戲結(jié)束。TR0=0;DelayINms(450);DelayINms(450);choose12864(2);clear12864();Play16(0,4,1,GameOverWord);//顯示“游戲結(jié)束”字樣。Play16(0,6,1,GameOverWord+32);Play16(1,0,1,GameOverWord+64);Play16(1,2,1,GameOverWord+96);while(1);}/***********************************************************************函數(shù)名:DelayINms說(shuō)明:延時(shí)輸入?yún)?shù):uintk,要延時(shí)的ms數(shù)************************************************************************/voidDelayINms(uintk){k=k*125;while(k--);}/***********************************************************************函數(shù)名:chekbusy12864說(shuō)明:檢查液晶是否忙,若忙,等到其空閑再退出函數(shù)************************************************************************/voidchekbusy12864(){uchardat;EX0=0;RS=0;//指令模式RW=1;//讀數(shù)據(jù)do{P0=0x00;E=1;dat=P0&0x80;E=0;}while(dat!=0x00);EX0=1;}/***********************************************************************函數(shù)名:choose12864說(shuō)明:選擇要寫(xiě)的屏幕輸入?yún)?shù):ucharSlctScreeni是要寫(xiě)的屏.0是左屏,1是右屏,2是雙屏************************************************************************/voidchoose12864(ucharSlctScreen){switch(SlctScreen){case0:CS1=0;CS2=1;break;case1:CS1=1;CS2=0;break; case2:CS1=0;CS2=0;break; default:break;}}/***********************************************************************函數(shù)名:cmd_w12864說(shuō)明:液晶寫(xiě)命令輸入?yún)?shù):ucharcmd要寫(xiě)的命令字************************************************************************/voidcmd_w12864(ucharcmd){chekbusy12864();EX0=0;RS=0; //指令模式RW=0;//寫(xiě)模式E=1;P0=cmd;E=0;EX0=1;}/***********************************************************************函數(shù)名:dat_w12864說(shuō)明:寫(xiě)數(shù)據(jù)輸入?yún)?shù):uchardat要寫(xiě)的數(shù)據(jù)************************************************************************/voiddat_w12864(uchardata){chekbusy12864();EX0=0;RS=1;RW=0;E=1;P0=data;E=0;EX0=1;}/***********************************************************************函數(shù)名:clear12864說(shuō)明:清屏************************************************************************/voidclear12864(){ucharPage,Column;for(Page=0xb8;Page<0xc0;Page++){cmd_w12864(Page); cmd_w12864(0x40); for(Column=0;Column<64;Column++)dat_w12864(0x00);}}/***********************************************************************函數(shù)名:init_lcd說(shuō)明:初始化液晶************************************************************************/voidinit_lcd(){chekbusy12864();cmd_w12864(0xc0);cmd_w12864(0x3f);}/***********************************************************************函數(shù)名:Play8說(shuō)明:8X16字符的顯示輸入?yún)?shù):ucharSlctScreen,左右屏幕選擇ucharColumn,顯示位置的起始列號(hào)ucharPage,顯示位置的起始頁(yè)號(hào)uchar*pAdr,指向顯示的內(nèi)容************************************************************************/voidPlay8(ucharSlctScreen,ucharColumn,ucharPage,uchar*pAdr){uchari;choose12864(SlctScreen);Page=Page<<1;Column=Column<<3;cmd_w12864(Column+0x40);cmd_w12864(Page+0xb8);for(i=0;i<8;i++)dat_w12864(*(pAdr+i));cmd_w12864(Column+0x40);cmd_w12864(Page+0xb9);for(i=8;i<16;i++)dat_w12864(*(pAdr+i));}/***********************************************************************函數(shù)名:Play16說(shuō)明:該函數(shù)可用于在液晶屏指定位置輸出一個(gè)分辨率為16*16的漢字輸入?yún)?shù):ucharSlctScreen,左右屏幕選擇ucharColumn,顯示位置的起始列號(hào)ucharPage,顯示位置的起始頁(yè)號(hào)uchar*pAdr,指向顯示的內(nèi)容************************************************************************/voidPlay16(ucharSlctScreen,ucharColumn,ucharPage,uchar*pAdr){uchari;choose12864(SlctScreen);Page=Page<<1; Column=Column<<3;cmd_w12864(Column+0x40);cmd_w12864(Page+0xb8);for(i=0;i<16;i++)dat_w12864(*(pAdr+i));//寫(xiě)起始頁(yè)的16列cmd_w12864(Column+0x40);cmd_w12864(Page+0xb9);for(i=16;i<32;i++)dat_w12864(*(pAdr+i));//寫(xiě)下一頁(yè)的16列}/***********************************************************************函數(shù)名:dat_r12864說(shuō)明:讀12864數(shù)據(jù)輸入?yún)?shù):ucharPage,頁(yè)地址ucharColumn,列地址************************************************************************/uchardat_r12864(ucharPage,ucharColumn){uchardat;chekbusy12864();cmd_w12864(Page+0xb8);cmd_w12864(Column+0x40);EX0=0;P0=0xff;RW=1;RS=1;E=1;E=0;E=1;dat=P0;E=0;return(dat);EX0=1;}/***********************************************************************函數(shù)名:vertical說(shuō)明:該函數(shù)可用于在液晶屏指定位置輸出一個(gè)分辨率為16*16的漢字輸入?yún)?shù):ucharRowStart,豎線上端點(diǎn)所在行ucharRowStop,豎線下端點(diǎn)所在行ucharColumn,豎線所在列************************************************************************/voidvertical(ucharRowStart,ucharRowStop,ucharColumn){uchari,sum=0;if(Collumn>63)//若列號(hào)大于63選擇在右屏畫(huà)豎線{choose12864(1);Collumn=Collumn-64;}elsechoose12864(0);//若列號(hào)小于63選擇在左屏畫(huà)豎線if((RowStart/8)!=(RowStop/8))//如果上下端點(diǎn)在不同頁(yè){for(i=0;i<(8-RowStart%8);i++)sum=sum|((2<<((RowStart%8)+i)));cmd_w12864(Collumn+0x40);cmd_w12864(RowStart/8+0xb8);dat_w12864(sum);sum=0;for(i=0;i<(RowStop/8-RowStart/8-1);i++){cmd_w12864(Collumn+0x40); cmd_w12864((RowStart/8)+0xb9+i); dat_w12864(0xff);}for(i=0;i<=(RowStop%8);i++)sum=sum|(2<<i);cmd_w12864(Collumn+0x40);cmd_w12864(RowStop/8+0xb8);dat_w12864(sum|1);sum=0; }else//如果上下端點(diǎn)在同一頁(yè){for(i=0;i<=RowStop-RowStart;i++)sum=sum|(2<<(i+(RowStart%8))); cmd_w12864(0x40|Collumn); cmd_w12864(0xb8|(RowStart/8)); dat_w12864(sum);}}/***********************************************************************函數(shù)名:dot說(shuō)明:點(diǎn)的顯示輸入?yún)?shù):ucharx,X坐標(biāo);uchary,y坐標(biāo)************************************************************************/voiddot(ucharx,uchary){uchardat;if(x>63){choose12864(1); x=x-64;}elsechoose12864(0);dat=dat_r12864(y/8,x);cmd_w12864(0x40|x);cmd_w12864(0xb8|y/8);dat_w12864((1<<(y%8))|dat);}/***********************************************************************函數(shù)名:cleardot說(shuō)明:清除一個(gè)點(diǎn)輸入?yún)?shù):ucharx,X坐標(biāo);uchary,y坐標(biāo)**********************************

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論