《單片機(jī)原理及應(yīng)用》課件-第9章_第1頁(yè)
《單片機(jī)原理及應(yīng)用》課件-第9章_第2頁(yè)
《單片機(jī)原理及應(yīng)用》課件-第9章_第3頁(yè)
《單片機(jī)原理及應(yīng)用》課件-第9章_第4頁(yè)
《單片機(jī)原理及應(yīng)用》課件-第9章_第5頁(yè)
已閱讀5頁(yè),還剩117頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第9章單片機(jī)開(kāi)發(fā)入門(mén)知識(shí)9.1單片機(jī)應(yīng)用系統(tǒng)開(kāi)發(fā)技術(shù)9.2Keil集成開(kāi)發(fā)平臺(tái)9.3實(shí)際應(yīng)用案例思考與練習(xí)

由于單片機(jī)應(yīng)用系統(tǒng)一般要進(jìn)行系統(tǒng)硬件的擴(kuò)展與配置,

同時(shí)還需要開(kāi)發(fā)相應(yīng)的軟件,因此,開(kāi)發(fā)者研制一個(gè)較完整的單片機(jī)產(chǎn)品時(shí),必須完成以下工作:

(1)硬件電路設(shè)計(jì)、制板、組裝。

(2)應(yīng)用軟件的編寫(xiě)、調(diào)試。

(3)應(yīng)用系統(tǒng)的程序固化、脫機(jī)(脫離開(kāi)發(fā)系統(tǒng))運(yùn)行。

9.1單片機(jī)應(yīng)用系統(tǒng)開(kāi)發(fā)技術(shù)

9.1.1單片機(jī)應(yīng)用系統(tǒng)的開(kāi)發(fā)過(guò)程

單片機(jī)應(yīng)用系統(tǒng)的開(kāi)發(fā)過(guò)程包括系統(tǒng)方案論證、系統(tǒng)硬件設(shè)計(jì)、系統(tǒng)軟件設(shè)計(jì)、系統(tǒng)仿真調(diào)試和脫機(jī)運(yùn)行調(diào)試。各部分的詳細(xì)內(nèi)容如圖9-1所示。圖9-1單片機(jī)應(yīng)用系統(tǒng)的開(kāi)發(fā)流程

1.系統(tǒng)方案論證和總體設(shè)計(jì)

方案討論包括查找資料,分析研究,并解決以下問(wèn)題:

(1)了解國(guó)內(nèi)類(lèi)似系統(tǒng)的開(kāi)發(fā)水平、供應(yīng)狀態(tài);如果是委托研制項(xiàng)目,還應(yīng)充分了解系統(tǒng)的技術(shù)要求、應(yīng)用環(huán)境,以確定項(xiàng)目的技術(shù)難度。

(2)了解可移植的軟件、硬件技術(shù)。能夠移植的盡量移植,防止大量的低水平重復(fù)勞動(dòng)。

(3)摸清軟、硬件技術(shù)的關(guān)鍵,明確技術(shù)主攻方向。

(4)綜合考慮軟、硬件分工與配合。單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)中,軟、硬件工作有密切的相關(guān)性。

(5)通過(guò)調(diào)查研究,確定應(yīng)用系統(tǒng)的功能和技術(shù)指標(biāo),軟、硬件技術(shù)方案及分工。

從總體上來(lái)看,設(shè)計(jì)任務(wù)可分為硬件設(shè)計(jì)和軟件設(shè)計(jì),這兩者互相結(jié)合,不可分離。從時(shí)間上來(lái)看,系統(tǒng)的硬件設(shè)計(jì)與軟件設(shè)計(jì)可同時(shí)進(jìn)行。硬件設(shè)計(jì)的絕大部分工作量是在最初階段,到后期往往還要做一些修改。只要技術(shù)準(zhǔn)備充分,硬件設(shè)計(jì)的大返工是較少的。軟件設(shè)計(jì)的任務(wù)貫徹始終,到中后期基本上都是軟件設(shè)計(jì)任務(wù)。

2.系統(tǒng)硬件設(shè)計(jì)

硬件設(shè)計(jì)就是在總體方案的指導(dǎo)下,對(duì)構(gòu)成單片機(jī)應(yīng)用系統(tǒng)的所有功能模塊進(jìn)行詳細(xì)、具體的電路設(shè)計(jì),包括:具體確定系統(tǒng)中所要使用的元器件,設(shè)計(jì)出系統(tǒng)的電路原理圖,必要時(shí)做一些部件實(shí)驗(yàn),以驗(yàn)證電路的正確性;進(jìn)行工藝結(jié)構(gòu)的設(shè)計(jì)加工、印制電路板的制作及樣機(jī)的組裝等。

單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)可劃分為兩部分:一部分是與單片機(jī)直接接口的數(shù)字電路芯片的選擇和設(shè)計(jì),如存儲(chǔ)器和并行接口的擴(kuò)展,定時(shí)系統(tǒng)、中斷系統(tǒng)的擴(kuò)展,一般外部設(shè)備的接口,與A/D、D/A芯片的接口;另一部分是與模擬電路相關(guān)的電路設(shè)計(jì),包括模擬信號(hào)的采集、整形、放大、變換、隔離和傳感器的選用,輸出通道的隔離和驅(qū)動(dòng)及執(zhí)行元件的

選用。

3.系統(tǒng)軟件設(shè)計(jì)

單片機(jī)應(yīng)用系統(tǒng)是一個(gè)整體,當(dāng)系統(tǒng)的硬件電路設(shè)計(jì)定型后,軟件的任務(wù)也就明確了。設(shè)計(jì)單片機(jī)系統(tǒng)應(yīng)用軟件時(shí),應(yīng)注意以下幾個(gè)方面:

(1)根據(jù)軟件功能要求,將軟件分成若干相對(duì)獨(dú)立的部分,設(shè)計(jì)出合理的軟件總體結(jié)構(gòu),使其清晰、簡(jiǎn)潔、流程合理。

(2)功能程序?qū)嵭心K化、子程序化,既便于調(diào)試、鏈接,又便于移植和修改。

(3)對(duì)于復(fù)雜的模塊和系統(tǒng),應(yīng)繪制出程序流程圖。多花一些時(shí)間來(lái)設(shè)計(jì)程序流程圖,可以大大減少源程序編寫(xiě)、調(diào)試的時(shí)間。

(4)在程序的相關(guān)位置處寫(xiě)上功能注釋,可提高程序的可讀性。

4.系統(tǒng)仿真調(diào)試

調(diào)試是一個(gè)非常復(fù)雜的過(guò)程,一般情況下需要借助開(kāi)發(fā)工具(開(kāi)發(fā)系統(tǒng)),通過(guò)運(yùn)行程序來(lái)觀察開(kāi)發(fā)的單片機(jī)應(yīng)用系統(tǒng)(目標(biāo)板)是否符合設(shè)計(jì)要求。在確保硬件電路設(shè)計(jì)正確、合理的前提下,調(diào)試過(guò)程實(shí)質(zhì)上是程序反復(fù)修改的過(guò)程。

5.脫機(jī)運(yùn)行調(diào)試

軟件和硬件聯(lián)機(jī)調(diào)試反復(fù)運(yùn)行正常后,借助開(kāi)發(fā)系統(tǒng)的編程器,將程序“寫(xiě)入”單片機(jī)應(yīng)用系統(tǒng)的程序存儲(chǔ)器EPROM或E2PROM中,這個(gè)過(guò)程稱(chēng)為固化。

固化完成后,單片機(jī)應(yīng)用系統(tǒng)即可脫離開(kāi)發(fā)系統(tǒng)獨(dú)立工作。這時(shí)還需將單片機(jī)應(yīng)用系統(tǒng)帶到現(xiàn)場(chǎng)投入實(shí)際工作,檢驗(yàn)其可靠性和抗干擾能力,直到完全滿(mǎn)足要求。

9.1.2單片機(jī)開(kāi)發(fā)調(diào)試工具

開(kāi)發(fā)工具應(yīng)具備以下主要作用:

(1)系統(tǒng)硬件電路的診斷。

(2)源程序的輸入與修改。

(3)除連續(xù)運(yùn)行程序外,具有單步運(yùn)行、設(shè)斷點(diǎn)運(yùn)行和狀態(tài)查詢(xún)等功能。

(4)能將程序固化到EPROM芯片上去。

1.仿真器

仿真器(Emulator)具有以某一系統(tǒng)復(fù)現(xiàn)另一系統(tǒng)的功能,它與計(jì)算機(jī)軟件模擬(詳見(jiàn)9.2.3小節(jié))的區(qū)別在于,仿真器用于模擬單片機(jī)系統(tǒng)的外在表現(xiàn)、行為,而不是模擬單片機(jī)

系統(tǒng)的抽象模型。某種型號(hào)的仿真器如圖9-2所示。圖9-2某種型號(hào)的仿真器

仿真器是用以實(shí)現(xiàn)硬件仿真的工具。仿真器可以替代單片機(jī)對(duì)程序的運(yùn)行進(jìn)行控制,如單步、全速、查看資源、設(shè)置斷點(diǎn)等。

仿真,就是用開(kāi)發(fā)系統(tǒng)的資源來(lái)仿真應(yīng)用系統(tǒng),此時(shí)開(kāi)發(fā)系統(tǒng)便是仿真器。一般多采用在線仿真,即仿真器控制的硬件環(huán)境與應(yīng)用系統(tǒng)完全一致,或就是實(shí)際的應(yīng)用系統(tǒng)。

仿真方法是:拔下應(yīng)用系統(tǒng)(用戶(hù)板)的CPU,改插開(kāi)發(fā)系統(tǒng)的仿真頭,兩個(gè)系統(tǒng)便共用一個(gè)CPU,而仿真器的存儲(chǔ)器中可以存放應(yīng)用系統(tǒng)的程序。仿真器運(yùn)行該程序,就可以測(cè)試應(yīng)用系統(tǒng)的硬件功能和軟件功能。這就是所謂“出借”CPU的方法。仿真器可以連續(xù)運(yùn)行程序、單步運(yùn)行程序或設(shè)斷點(diǎn)運(yùn)行,也可以進(jìn)行狀態(tài)查詢(xún)等。

仿真器除了具有如圖9-2所示的硬件部分以外,一般還配有在微機(jī)上運(yùn)行的專(zhuān)門(mén)軟件程序(一般由仿真器生產(chǎn)廠家提供),兩者共同組成仿真系統(tǒng)。所有的仿真操作命令都是

在軟件程序上操作的。大部分仿真器還可以和KeilμVision集成開(kāi)發(fā)環(huán)境一起使用。

圖9-3是仿真器和單片機(jī)應(yīng)用系統(tǒng)(用戶(hù)板)的連接關(guān)系圖。圖9-3仿真器和單片機(jī)應(yīng)用系統(tǒng)的連接關(guān)系

2.編程器

編程器(Programmer)也稱(chēng)燒錄器,是一個(gè)給可編程集成電路芯片寫(xiě)上數(shù)據(jù)(二進(jìn)制程序代碼)的工具,主要用于單片機(jī)(含嵌入式)/存儲(chǔ)器(含BIOS)之類(lèi)的芯片的編程(或稱(chēng)為刷寫(xiě)、固化)。當(dāng)程序調(diào)試完成后,需要將調(diào)試好的程序(匯編語(yǔ)言格式或C語(yǔ)言格式)通過(guò)匯編軟件工具或編譯軟件工具變成二進(jìn)制機(jī)器碼,寫(xiě)入到相應(yīng)的芯片中,使得開(kāi)發(fā)的單片機(jī)應(yīng)用系統(tǒng)可以脫離仿真器獨(dú)立運(yùn)行,變成“成品”。

編程器在功能上可分為通用編程器和專(zhuān)用編程器。某種型號(hào)的編程器如圖9-4所示。圖9-4某種型號(hào)的編程器

3.示波器

示波器(Oscilloscope)是一種用途十分廣泛的電子測(cè)量?jī)x器,如圖9-5所示。它能把肉眼看不見(jiàn)的電信號(hào)變換成看得見(jiàn)的圖像,便于人們研究各種電現(xiàn)象的變化過(guò)程。利用示

波器能觀察各種不同信號(hào)幅度隨時(shí)間變化的波形曲線,還可以用它測(cè)試各種不同的電量,如電壓、電流、頻率、相位差、調(diào)幅度等。圖9-5某種型號(hào)的示波器

4.邏輯分析儀

邏輯分析儀(LogicAnalyzer)是利用時(shí)鐘從測(cè)試設(shè)備上采集和顯示數(shù)字信號(hào)的儀器,最主要的作用在于時(shí)序判定。由于邏輯分析儀不像示波器那樣有許多電壓等級(jí),通常只顯示兩個(gè)電壓(邏輯1和0),因此設(shè)定了參考電壓后,邏輯分析儀根據(jù)被測(cè)信號(hào)通過(guò)比較器后的比較結(jié)果進(jìn)行判定,被測(cè)信號(hào)電壓高于參考電壓者為High,低于參考電壓者為L(zhǎng)ow,

在High與Low之間形成數(shù)字波形。

邏輯分析儀主要用于復(fù)雜數(shù)字電路(單片機(jī)應(yīng)用系統(tǒng))的調(diào)試,可以檢查多路時(shí)序之間的關(guān)系,這種定時(shí)分析可以對(duì)輸入數(shù)據(jù)進(jìn)行有效采樣,跟蹤采樣時(shí)產(chǎn)生的任何跳變,從而容易識(shí)別毛刺(毛刺是采樣時(shí)多次穿越邏輯閾值的跳變,難以查找)。

邏輯分析儀主要有兩種,一種是獨(dú)立的,另一種是將一塊板卡插入計(jì)算機(jī)插槽中和計(jì)算機(jī)配合使用,如圖9-6所示。圖9-6兩種類(lèi)型的邏輯分析儀

5.邏輯筆

邏輯筆(LogicTestPen)是采用不同顏色的指示燈來(lái)表示數(shù)字電平高低的儀器,如圖9-7所示。它是測(cè)量數(shù)字電路簡(jiǎn)便易用的工具。使用邏輯筆可快速測(cè)量出數(shù)字電路中有故

障的芯片。邏輯筆上一般有二三只信號(hào)指示燈,紅燈一般表示高電平,綠燈一般表示低電平,黃燈表示所測(cè)信號(hào)為脈沖信號(hào)。圖9-7邏輯筆

9.2Keil集成開(kāi)發(fā)平臺(tái)

Keil軟件是KeilSoftware公司出品的開(kāi)發(fā)MCS51系列單片機(jī)應(yīng)用系統(tǒng)的開(kāi)發(fā)平臺(tái)。Keil軟件是目前流行的開(kāi)發(fā)MCS51系列單片機(jī)的軟件,提供了包括源程序編輯器、C編譯器、匯編器、鏈接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的開(kāi)發(fā)工具,并通過(guò)一個(gè)集成開(kāi)發(fā)環(huán)境(KeilμVision)將這些部分組合在一起。

9.2.1應(yīng)用程序的創(chuàng)建

應(yīng)用程序的創(chuàng)建過(guò)程大致如下:

(1)新建一個(gè)工程項(xiàng)目文件。

(2)為工程選擇目標(biāo)器件(如AT89C51)。

(3)為工程項(xiàng)目設(shè)置軟硬件調(diào)試環(huán)境。

(4)創(chuàng)建源程序文件。

(5)保存創(chuàng)建的源程序文件。

(6)把源程序文件添加到項(xiàng)目中。

首先啟動(dòng)KeilμVision4。從計(jì)算機(jī)桌面上直接雙擊KeilμVision4圖標(biāo)即可啟動(dòng)該軟件。KeilμVision4提供一個(gè)菜單欄、一個(gè)工具欄,以便快速選擇命令按鈕。另外,

KeillμVision4還有文本編輯窗口、輸出信息窗口、工程窗口,如圖9-8所示。KeilμVision4允許同時(shí)打開(kāi)多個(gè)編輯窗口,瀏覽多個(gè)源文件。圖9-8KeilμVision4集成開(kāi)發(fā)環(huán)境

1.創(chuàng)建Keil工程文件

運(yùn)行KeilμVision4后,按照以下步驟建立一個(gè)工程項(xiàng)目。

(1)單擊Project(工程)菜單,在彈出的下拉菜單中選擇“NewμVisionProject”(新工程)命令,如圖9-9所示。

(2)在彈出的“CreatNewProject”對(duì)話(huà)框的文件名文本框中輸入一個(gè)C程序(或匯編程序)工程項(xiàng)目的名稱(chēng),不需要擴(kuò)展名,將其保存到指定位置。對(duì)于已有的工程文件,可以

用“OpenProject”加載。

(3)選擇所需的單片機(jī)器件,這里選擇較常用的Atmel公司的AT89C51,此時(shí)對(duì)話(huà)框如圖9-10所示,AT89C51的功能、特點(diǎn)顯示在右欄中。圖9-9Project菜單圖9-10單片機(jī)型號(hào)選取界面

2.在工程中添加源程序文件

可以通過(guò)菜單命令“File→Open”或快捷鍵“Ctrl+O”在工程中加入已有的源程序文件。如果沒(méi)有現(xiàn)成的源程序,就要新建一個(gè)源程序文件,以便于編寫(xiě)程序。以下介紹如何新建一個(gè)源程序文件。

(1)源程序文件的創(chuàng)建。單擊圖9-11中的“New”快捷按鈕(即新建文件),在右側(cè)會(huì)出現(xiàn)一個(gè)新的編輯窗口。這個(gè)操作也可以通過(guò)菜單命令“File→New”或快捷鍵“Ctrl+N”來(lái)實(shí)現(xiàn)。圖9-11工程中創(chuàng)建新的源程序文件

(2)源程序文件的保存。新建完編輯窗口后,單擊“Save”按鈕,或通過(guò)菜單命令“File→Save”或快捷鍵“Ctrl+S”進(jìn)行保存。在出現(xiàn)的如圖9-12所示的窗口中命名一個(gè)文件名,然后保存。匯匯編語(yǔ)言源程序文件命名的后綴為.aassm。圖9-12保存一個(gè)匯編語(yǔ)言源程序

(3)源程序文件的添加。在創(chuàng)建源程序文件后,需要將這個(gè)文件添加到工程項(xiàng)目中。在Project窗口的Project頁(yè)中選中文件組,單擊右鍵打開(kāi)快捷菜單,如圖9-13所示,單擊選項(xiàng)“AddFilestoGroup‘SourceGroup1’”,在出現(xiàn)的對(duì)話(huà)框中選中剛剛創(chuàng)建的test.asm(也可以是已有源程序文件),這時(shí)在SourceGroup1文件夾圖標(biāo)左側(cè)出現(xiàn)了“+”號(hào),表明文件組中添加了文件,單擊便可以展開(kāi)查看。

(4)源程序文件的查看。在源程序編輯窗口查看剛才加入的文件,如圖9-19所示。圖9-13添加文件到源代碼組1的界面

3.工程的詳細(xì)設(shè)置

工程項(xiàng)目建立好以后,還要對(duì)工程進(jìn)行進(jìn)一步的設(shè)置,以滿(mǎn)足要求。

首先單擊Project窗口的Target1,然后使用菜單“Project→OptionsforTarget‘Target1’”,即出現(xiàn)對(duì)工程設(shè)置的對(duì)話(huà)框,這個(gè)對(duì)話(huà)框共有11個(gè)頁(yè)面,在此只介紹其主要功能。

(1)Target標(biāo)簽頁(yè):用于存儲(chǔ)器設(shè)置,如圖9-14所示?!癕emoryModel”用于設(shè)置RAM空間的使用,主要用于C51語(yǔ)言,有三個(gè)選擇項(xiàng):Small是所有變量都在單片機(jī)的內(nèi)

部RAM中;Compact可以使用一頁(yè)外部擴(kuò)展RAM;Large可以使用全部外部擴(kuò)展RAM。“CodeRomSize”用于設(shè)置ROM空間,同樣也有三個(gè)選擇項(xiàng):Small模式,只使用低于

2KB的程序空間;Compact模式,單個(gè)函數(shù)的代碼量不能超過(guò)2KB,整個(gè)程序可以使用64KB的程序空間;Large模式,可使用全部64KB的程序空間?!癠seOn-chipROM”用于確認(rèn)是否僅使用片內(nèi)ROM(注意:選中該項(xiàng)并不會(huì)影響最終生成的目標(biāo)代碼量)。圖9-14Target標(biāo)簽頁(yè)

(2)Output標(biāo)簽頁(yè):用于輸出選項(xiàng)設(shè)置,如圖9-15所示。“CreatHexFile”用于生成可執(zhí)行代碼文件(可以用編程器寫(xiě)入單片機(jī)芯片的Hex格式文件,文件的擴(kuò)展名為.hex),

默認(rèn)情況下該項(xiàng)未被選中,如果要寫(xiě)芯片做硬件實(shí)驗(yàn),就必須選中該項(xiàng),這一點(diǎn)是初學(xué)者易疏忽的,在此特別提醒注意?!癉ebugInformation”用于產(chǎn)生調(diào)試信息,如果需要對(duì)程序

進(jìn)行調(diào)試,應(yīng)當(dāng)選中該項(xiàng)?!癇rowseInformation”用于產(chǎn)生瀏覽信息,該信息可以用菜單“View→Browse”來(lái)查看,這里取默認(rèn)值。圖9-15Output標(biāo)簽頁(yè)

(3)Listing標(biāo)簽頁(yè):用于調(diào)整生成的列表文件,如圖9-16所示。在匯編或編譯完成后將產(chǎn)生(*.lst)的列表文件,在連接完成后也將產(chǎn)生(*.m51)的列表文件,該頁(yè)用于對(duì)列表文件的內(nèi)容和形式進(jìn)行細(xì)致的調(diào)節(jié),其中比較常用的選項(xiàng)是“

CCompilerListing”下的“AssemblyCode”項(xiàng),選中該項(xiàng)可以在列表文件中生成C語(yǔ)言源程序所對(duì)應(yīng)的匯編代碼。圖9-16Listing標(biāo)簽頁(yè)

(4)C51標(biāo)簽頁(yè):用于對(duì)Keil中C51編譯器的編譯過(guò)程進(jìn)行控制,如圖9-17所示。其中比較常用的是“

CodeOptimization”組,該組中Level是優(yōu)化等級(jí),C51在對(duì)源程序進(jìn)行編譯時(shí),可以對(duì)代碼進(jìn)行多至9級(jí)的優(yōu)化,默認(rèn)使用第8級(jí),一般不必修改,如果在編譯中出現(xiàn)一些問(wèn)題,可以降低優(yōu)化級(jí)別。Emphasis是選擇編譯優(yōu)先方式的,第一項(xiàng)是代碼量?jī)?yōu)先(最終生成的代碼其代碼量小),第二項(xiàng)是速度優(yōu)先(最終生成的代碼其代碼速度快),第三項(xiàng)是缺省,默認(rèn)速度優(yōu)先,可根據(jù)需要更改圖9-17C51標(biāo)簽頁(yè)

(5)Debug標(biāo)簽頁(yè):用于設(shè)置仿真模式及調(diào)試設(shè)置選項(xiàng),如圖9-18所示。KeilμVision4的兩種仿真模式分別是軟件模擬和硬件仿真。軟件模擬選項(xiàng)是將KeilμVision4

調(diào)試器設(shè)置成軟件模擬模式,在此模式下不需要實(shí)際的目標(biāo)硬件就可以模擬MCS51單片機(jī)的很多功能(例如第4章的程序),在制作硬件電路之前就可以測(cè)試應(yīng)用程序,非常有用。硬硬件仿真則需要和仿真器聯(lián)合使用用(詳見(jiàn)9.

2.3小節(jié))。圖9-18Debug標(biāo)簽頁(yè)

9.2.2應(yīng)用程序的編輯、編譯和鏈接

1.源程序的編輯和修改

除了通過(guò)添加源程序建立編輯環(huán)境外,還可以采用其他方法編寫(xiě)程序。例如,把第4章例4-1的參考程序通過(guò)一個(gè)獨(dú)立編輯器(可以是寫(xiě)字板或記事本)錄入,并存為test.asm

(匯編程序擴(kuò)展名必須是asm),通過(guò)“AddFilestoGroup‘SourceGroup1’”選項(xiàng)加載,加載后的界面如圖9-19所示。如果是一個(gè)新程序,我們也可以在編輯窗口中直接編寫(xiě)程序。對(duì)于加載完的源程序,可以在編輯窗口直接修改。圖9-19源程序編輯窗口

2.編譯和鏈接

在設(shè)置好工程文件并編寫(xiě)好源程序后,即可進(jìn)行編譯、鏈接。選擇菜單“Project→Buildtarget”,對(duì)當(dāng)前工程進(jìn)行鏈接。如果當(dāng)前文件已修改,軟件會(huì)先對(duì)該文件進(jìn)行編譯,

然后再鏈接以產(chǎn)生目標(biāo)代碼;如果選擇Rebuildalltargetfiles”,將會(huì)對(duì)當(dāng)前工程中的所有文件重新進(jìn)行編譯然后再鏈接,以確保最終生產(chǎn)的目標(biāo)代碼是最新的;而“TranslateFiles”項(xiàng)則僅對(duì)該文件進(jìn)行編譯,不進(jìn)行鏈接。

以上操作可以通過(guò)工具欄中的按鈕直接進(jìn)行。如圖9-20所示,矩形框中最左邊三個(gè)圖標(biāo)都是編譯按鈕,不同的是:

按鈕用于編譯單個(gè)文件;按鈕用于編譯鏈接當(dāng)前項(xiàng)目,如果先前編譯過(guò)一次的文件沒(méi)有做過(guò)編輯改動(dòng),再次單擊按鈕不會(huì)再次編譯;按鈕,每單擊一次均會(huì)再次編譯鏈接一次,不論程序是否有改動(dòng)。編譯和鏈接完成后,在下方的“

BuildOutput”窗口中可以看到編譯結(jié)果的輸出信息和使用的系統(tǒng)資源情況等,如果沒(méi)有語(yǔ)法錯(cuò)誤(如圖9-21所示),表示程序可以運(yùn)行。圖9-20編譯按鈕

如果源程序中有語(yǔ)法錯(cuò)誤,在“BuildOutput”窗口中會(huì)有錯(cuò)誤報(bào)告出現(xiàn),如圖9-22所示(表示源程序第5行有語(yǔ)法錯(cuò)誤),這時(shí)沒(méi)有生成目標(biāo)代碼,源源程序中存在語(yǔ)法錯(cuò)誤誤,程序不能運(yùn)行行,必必須改正錯(cuò)誤誤。雙擊錯(cuò)誤示意行,可以在編輯器窗口中定位到源程序相應(yīng)的位置。對(duì)源程序反復(fù)修改之后,最終會(huì)得到如圖9-21所示的正確結(jié)果,提示獲得了名為test.hex的文件(可以被編程器讀入并燒錄到ROM芯片中),同時(shí)還產(chǎn)生了一些其他相關(guān)的文件,可用于仿真與調(diào)試,這時(shí)可以進(jìn)入下一步調(diào)試的工作。圖9-21編譯正確的輸出窗口圖9-22編譯錯(cuò)誤的輸出窗口

9.2.3應(yīng)用程序的仿真和調(diào)試

通過(guò)編譯(匯編)和鏈接,可以獲得目標(biāo)代碼,但是做到這一步僅僅代表源程序沒(méi)有語(yǔ)法錯(cuò)誤。源源程序中是否存在邏輯錯(cuò)誤,必須通過(guò)調(diào)試才能發(fā)現(xiàn)并解決。事實(shí)上,除了極簡(jiǎn)單的程序以外,絕大部分的程序都要通過(guò)反復(fù)調(diào)試才能得到正確的結(jié)果,因此,調(diào)試是軟件開(kāi)發(fā)中一個(gè)重要環(huán)節(jié)。下面通過(guò)實(shí)例介紹常用的調(diào)試命令和調(diào)試方法。

1.仿真器的連接

(1)選擇硬件仿真器類(lèi)型。打開(kāi)Debug標(biāo)簽頁(yè)設(shè)置窗口,選中右側(cè)一欄Use,并在下拉菜單中選擇第一個(gè)硬件仿真器KeilMonitor-51Driver,如圖9-23所示。圖9-23使用硬件仿真器的Debug標(biāo)簽頁(yè)設(shè)置窗口

(2)查找串口號(hào)。連接仿真器時(shí)需注意和計(jì)算機(jī)串口匹配的問(wèn)題,因而需要確定計(jì)算機(jī)的串口號(hào)。打開(kāi)計(jì)算機(jī)的設(shè)備管理器即可查詢(xún)計(jì)算機(jī)的串口號(hào),如圖9-24所示。圖9-24計(jì)算機(jī)設(shè)備管理器窗口

(3)設(shè)置串口波特率。在確定了計(jì)算機(jī)所使用的串口號(hào)之后,就可以繼續(xù)對(duì)硬件仿真器進(jìn)行設(shè)置。單擊Debug標(biāo)簽頁(yè)設(shè)置窗口右欄中的Settings,對(duì)計(jì)算機(jī)所使用的串口號(hào)和

波特率進(jìn)行設(shè)置,串口號(hào)與設(shè)備管理器上所顯示的一致,波特率可以選擇最大值115200b/s,如圖9-25所示。

(4)仿真器的連接。拔下單片機(jī)應(yīng)用系統(tǒng)(用戶(hù)板)的CPU,改插仿真器的仿真頭,將仿真器通過(guò)串行接口(或USB口)連接到計(jì)算機(jī)上。圖9-25串口號(hào)和波特率設(shè)置窗口

2.仿真的啟動(dòng)和停止

1)使用軟件模擬器

使用軟件模擬器進(jìn)行仿真時(shí),需要先進(jìn)入工程設(shè)置的Debug標(biāo)簽頁(yè),將仿真方式設(shè)置成軟件模擬器仿真,然后進(jìn)入調(diào)試過(guò)程,如圖9-26所示。圖9-26軟件模擬器調(diào)試操作步驟

2)使用硬件仿真器(真實(shí)仿真器)

使用硬件仿真器進(jìn)行仿真時(shí),需要先進(jìn)入工程設(shè)置的Debug標(biāo)簽頁(yè),將仿真方式設(shè)置成硬件仿真器仿真,并進(jìn)行串口和波特率的設(shè)置,連接好仿真器,然后進(jìn)入調(diào)試過(guò)程,如圖9-27所示。圖9-27硬件仿真器調(diào)試操作步驟

3.常用調(diào)試命令

進(jìn)入調(diào)試狀態(tài)后,界面與編緝狀態(tài)相比有明顯的變化,Debug菜單項(xiàng)中原來(lái)不能用的命令現(xiàn)在已可以使用了,工具欄會(huì)多出一個(gè)用于運(yùn)行和調(diào)試的工具條。如圖9-28所示,

Debug菜單上的大部分命令可以在此找到對(duì)應(yīng)的快捷按鈕,從左到右依次是復(fù)位、全速運(yùn)行、暫停、單步(進(jìn)入到函數(shù)或子程序內(nèi)部)、過(guò)程單步(不進(jìn)入到函數(shù)或子程序內(nèi)部)、跳

出函數(shù)或子程序(只有軟件仿真時(shí)有效)、運(yùn)行到當(dāng)前行(光標(biāo)位置處)、顯示光標(biāo)位置、記錄運(yùn)行軌跡、觀察運(yùn)行軌跡、反匯編窗口、變量觀察窗口、代碼作用范圍分析、內(nèi)存窗口、

性能分析(只有軟件仿真支持)、工具按鈕等命令。圖9-28調(diào)試工具條

1)全速運(yùn)行

全速運(yùn)行是指一行程序執(zhí)行完以后緊接著執(zhí)行下一行程序,中間不停止,這樣程序執(zhí)行的速度很快,只能看到該段程序執(zhí)行的總體效果,即最終結(jié)果正確還是錯(cuò)誤,但如果程序有錯(cuò),則難以確認(rèn)錯(cuò)誤出現(xiàn)在哪些程序行。圖9-28的第2個(gè)選項(xiàng)即是全速運(yùn)行。也可以通過(guò)Debug菜單項(xiàng)中的Run實(shí)現(xiàn)全速運(yùn)行。

2)單步運(yùn)行

單步運(yùn)行是每次執(zhí)行一行程序,執(zhí)行完該行程序以后即停止,等待命令執(zhí)行下一行程序,此時(shí)可以觀察該行程序執(zhí)行完以后得到的結(jié)果是否與我們編寫(xiě)該行程序前的預(yù)期結(jié)果

相同,借此可以找到程序中的問(wèn)題所在。

按下F11(或F10)鍵,可以看到源程序窗口的左邊出現(xiàn)了一個(gè)黃色調(diào)試箭頭,指向源程序的第一行,如圖9-29所示。每按一次F11(或F10),即執(zhí)行該箭頭所指程序行,然后

箭頭指向下一行,不斷按F11(或F10)鍵,即可逐步執(zhí)行程序。

圖9-29源程序窗口調(diào)試狀態(tài)

3)斷點(diǎn)運(yùn)行

程序調(diào)試時(shí),已經(jīng)確定正確的程序段不必每次都單步運(yùn)行,或者一些程序行必須滿(mǎn)足一定的條件才能被執(zhí)行到(如程序中某變量達(dá)到一定的值、按鍵被按下、串口接收到數(shù)據(jù)、

有中斷產(chǎn)生等),這些條件往往是異步發(fā)生或難以預(yù)先設(shè)定的,這類(lèi)問(wèn)題使用單步運(yùn)行的方法是很難調(diào)試的,這時(shí)就要使用到程序調(diào)試中的另一種非常重要的方法———斷點(diǎn)運(yùn)行。

斷點(diǎn)設(shè)置的方法有多種,常用的是在某一程序行設(shè)置斷點(diǎn)。在程序行設(shè)置/移除斷點(diǎn)的方法是:將光標(biāo)定位于需要設(shè)置斷點(diǎn)的程序行,使用菜單“Debug→Insert/Remove

BreakPoint”設(shè)置或移除斷點(diǎn)(也可以用鼠標(biāo)在該行雙擊實(shí)現(xiàn)同樣的功能),如圖9-30所示。圖9-30斷點(diǎn)的設(shè)置和移除

9.2.4應(yīng)用程序調(diào)試的常用窗口

KeilμVision4在調(diào)試程序時(shí)提供了多個(gè)窗口,主要包括輸出窗口(OutputWindows)、觀察窗口(WatchWindows)、存儲(chǔ)器窗口(MemoryWindows)和工程窗口寄存器頁(yè)等。進(jìn)

入調(diào)試模式后,可以通過(guò)菜單View下的相應(yīng)選項(xiàng)打開(kāi)或關(guān)閉這些窗口。在程序調(diào)試過(guò)程中,可以充分利用KeilμVision4提供的各種窗口,來(lái)提高程序調(diào)試的效率。

1.輸出窗口

圖9-31所示為輸出窗口。進(jìn)入調(diào)試程序后,輸出窗口自動(dòng)切換到Command頁(yè),該頁(yè)用于輸入調(diào)試命令和輸出調(diào)試信息。圖9-31輸出窗口

2.存儲(chǔ)器窗口

用圖9-32所示方法打開(kāi)存儲(chǔ)器窗口,窗口中可以顯示單片機(jī)中RAM和ROM的值。通過(guò)在Address編輯框內(nèi)輸入“字母:數(shù)字”即可顯示從這個(gè)數(shù)字開(kāi)始的若干存儲(chǔ)單元的值,字母可選擇C、D、I、X,其中:

·C:代表ROM空間;

·D:代表直接尋址的片內(nèi)RAM空間;

·I:代表間接尋址的片內(nèi)RAM空間;

·X:代表擴(kuò)展的外部RAM空間;

·數(shù)字:代表想要查看的地址(習(xí)慣上采用十六進(jìn)制,在數(shù)字后面要加上H)。圖9-32通過(guò)菜單項(xiàng)打開(kāi)存儲(chǔ)器窗口

例如:輸入“D:30H”即可觀察到地址30H開(kāi)始的片內(nèi)RAM單元中的值;輸入“C:0000H”即可顯示從0000H開(kāi)始的ROM單元中的值,即查看程序的二進(jìn)制代碼。RAM或ROM單元中的值可以在窗口中以各種形式顯示,如十進(jìn)制、十六進(jìn)制、字符型等。改變顯示方式的方法是單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇,默認(rèn)的是十六進(jìn)制顯示方式。

3.工程窗口寄存器頁(yè)

圖9-33所示為工程窗口寄存器頁(yè)的內(nèi)容。寄存器頁(yè)包括了當(dāng)前的工作寄存器組和系統(tǒng)寄存器組。系統(tǒng)寄存器組有一些是實(shí)際存在的寄存器(如A、B、DPTR、SP、PSW等),有一些是實(shí)際中并不存在或雖然存在卻不能對(duì)其操作的(如PC、States等)。每當(dāng)程序中執(zhí)行到對(duì)某寄存器的操作時(shí),該寄存器會(huì)以反色(藍(lán)底白字)顯示,鼠標(biāo)單擊后按下F2鍵,

即可修改該值。存儲(chǔ)器窗口和工程窗口寄存器頁(yè)是匯編程序調(diào)試過(guò)程中常用的窗口。圖9-33工程窗口寄存器頁(yè)

4.觀察窗口

圖9-34所示為觀察窗口。由于工程窗口中僅可以觀察到工作寄存器和有限的寄存器(如A、B、DPTR等),如果需要觀察其他的寄存器的值或在高級(jí)語(yǔ)言編程時(shí)需要直接觀察變量,就要借助于觀察窗口。一般情況下,僅在單步運(yùn)行時(shí)才對(duì)變量的值的變化感興趣。全速運(yùn)行時(shí),變量的值是不變的,只有在程序停下來(lái)之后,才會(huì)將這些值的最新變化反映

出來(lái)。

但是,在一些特殊場(chǎng)合下也可能需要在全速運(yùn)行時(shí)觀察變量的變化,此時(shí)可以單擊“View→PeriodicWindowUpdate”(周期更新窗口),確認(rèn)該項(xiàng)處于被選中狀態(tài)后,即可在全速運(yùn)行時(shí)動(dòng)態(tài)觀察有關(guān)值的變化。但是,選中該項(xiàng),將會(huì)使程序模擬執(zhí)行的速度變慢。觀察窗口是C程序調(diào)試過(guò)程中常用的窗口之一。

圖9-34觀察窗口

9.2.5調(diào)試實(shí)例

下面以第4章的例4-1為例,全面講述程序調(diào)試方法。

三字節(jié)無(wú)符號(hào)數(shù)相加,其中被加數(shù)在內(nèi)部RAM的50H、51H和52H單元中(低位在后),加數(shù)在內(nèi)部RAM的53H、54H和55H單元中(低位在后),要求把相加之和存放在

50H、51H和52H單元中(低位在后),進(jìn)位存放在位尋址區(qū)的00H位中。

(1)編譯程序。如上述參考程序所示,為了演示“程序的調(diào)試”,我們首先給源程序制造一個(gè)錯(cuò)誤,將第6行中的帶進(jìn)位的加指令的ADDC改為ADD,然后進(jìn)行編譯,如圖

9-35所示。由于程序中并無(wú)語(yǔ)法錯(cuò)誤,所以編譯時(shí)不會(huì)有任何出錯(cuò)提示。但由于中間字節(jié)相加結(jié)果沒(méi)有考慮進(jìn)位位,所以可能會(huì)導(dǎo)致運(yùn)算結(jié)果出錯(cuò)。圖9-35有邏輯錯(cuò)誤的調(diào)試窗口

(2)演算或預(yù)判給出正確結(jié)果。我們?cè)O(shè)定24位的被加數(shù)和加數(shù)均為101010101010101010101010,則相加的結(jié)果如下:

用十六進(jìn)制表示為55H55H54H。

進(jìn)入運(yùn)行狀態(tài)后,首先需要在存儲(chǔ)器窗口中將內(nèi)部地址單元50H到55H的值修改為AAH(即輸入加數(shù)和被加數(shù)),其方法是:用鼠標(biāo)雙擊對(duì)應(yīng)存儲(chǔ)器窗口中的存儲(chǔ)單元,單元

中數(shù)據(jù)被選中后便可修改數(shù)據(jù),如圖9-36所示。圖9-36存儲(chǔ)器值修改

(3)運(yùn)運(yùn)行程序并查看程序運(yùn)行結(jié)果果。先全速運(yùn)行,在存儲(chǔ)器窗口中輸入“D:0050h”,查看結(jié)果為55H54H54H,如圖9-37所示。這與我們上面計(jì)算的結(jié)果不同,說(shuō)明出現(xiàn)了錯(cuò)誤。為此需要單步運(yùn)行,通過(guò)中間結(jié)果找到錯(cuò)誤。

需要注意的是:有些情況下字節(jié)之間相加沒(méi)有進(jìn)位,比如:兩個(gè)010101010101010101010101相加,上面錯(cuò)誤則無(wú)法發(fā)現(xiàn),這就需要我我們?cè)谡{(diào)試時(shí)考慮到所有的情況況。圖9-37全速運(yùn)行得到的錯(cuò)誤結(jié)果

(4)單單步運(yùn)行調(diào)試試,觀觀察中間值值。進(jìn)入單步運(yùn)行狀態(tài)后,按F10以過(guò)程單步執(zhí)行程序,觀察寄存器窗口的各寄存器的運(yùn)算結(jié)果。按照預(yù)置的數(shù)據(jù)其輸出結(jié)果在存儲(chǔ)器地址單元50H到52H的結(jié)果應(yīng)該為“55H、55H、54H”,而實(shí)際調(diào)試中當(dāng)程序執(zhí)行完第7行時(shí),發(fā)現(xiàn)存儲(chǔ)器地址51H中的結(jié)果為“54H”,與預(yù)期結(jié)果不符(如圖9-38所示),并且觀察到單元52H和55H加法完成后寄存器窗口中狀態(tài)字PSW的進(jìn)位位Cy為1(如圖9-39所示),而在單元51H和54H相加時(shí)卻沒(méi)有加上此進(jìn)位位,最終找到邏輯錯(cuò)誤。圖9-38調(diào)試過(guò)程的中間結(jié)果圖9-39寄存器中狀態(tài)字顯示

(5)改改正錯(cuò)誤并驗(yàn)證結(jié)果果。檢查源程序發(fā)現(xiàn)第6行中加法為ADD,不含進(jìn)位加法指令,當(dāng)改成ADDC后發(fā)現(xiàn)結(jié)果與預(yù)期一致,如圖9-40所示。圖9-40正確顯示結(jié)果

9.3實(shí)際應(yīng)用案例

9.3.1汽車(chē)駕駛操縱信號(hào)燈控制系統(tǒng)在駕駛汽車(chē)時(shí),有左轉(zhuǎn)彎、右轉(zhuǎn)彎、剎車(chē)、緊急開(kāi)關(guān)、??康炔僮?。在左轉(zhuǎn)彎或右轉(zhuǎn)彎時(shí),通過(guò)轉(zhuǎn)彎操作桿應(yīng)使左轉(zhuǎn)開(kāi)關(guān)或右轉(zhuǎn)開(kāi)關(guān)合上,從而使左頭燈、儀表板左轉(zhuǎn)彎燈、左尾燈或右頭燈、儀表板右轉(zhuǎn)彎燈、右尾燈閃爍;合緊急開(kāi)關(guān)時(shí)要求前面述及的6個(gè)信號(hào)燈全都閃爍;剎車(chē)時(shí),2個(gè)尾燈點(diǎn)亮;若正當(dāng)轉(zhuǎn)彎時(shí)剎車(chē),則轉(zhuǎn)彎時(shí)原應(yīng)閃爍的信號(hào)燈仍應(yīng)閃爍。以上閃爍都是頻率為1Hz的低頻閃爍,在汽車(chē)??慷?块_(kāi)關(guān)合上時(shí),左頭燈、右頭燈、左尾燈、右尾燈按頻率為30Hz的高頻閃爍。信號(hào)燈應(yīng)輸出的信號(hào)如表9-1所示。

1.設(shè)計(jì)思路

將P1口作為輸出口,利用單片機(jī)內(nèi)部計(jì)數(shù)器/定時(shí)器產(chǎn)生所需的低頻(1Hz)與高頻(30Hz)閃爍信號(hào)。設(shè)計(jì)時(shí)應(yīng)考慮故障監(jiān)控性能,以提高系統(tǒng)的可靠性。

計(jì)數(shù)器/定時(shí)器的工作方式采用中斷方式。

2.硬件設(shè)計(jì)

圖9-41所示是汽車(chē)駕駛操縱信號(hào)燈單片機(jī)控制系統(tǒng)的硬件原理圖。

由圖9-41可見(jiàn),各種駕駛操作的信號(hào)自P0口送入單片機(jī),而使信號(hào)燈點(diǎn)亮的輸出信號(hào)則自P1口輸出。圖中的晶體管是輸出驅(qū)動(dòng)級(jí),圖的下部是故障監(jiān)控電路。在P1.0~P1.5共6路輸出中,如輪流使其中1路的晶體管斷開(kāi)(P1口相應(yīng)引腳輸出低電平),這1路的信號(hào)燈將熄滅,而其他5路的晶體管接通(P1口引腳送來(lái)高電平),相應(yīng)的信號(hào)燈點(diǎn)亮,則在正常情況下,信號(hào)燈熄滅的那路將使P1.7呈現(xiàn)低電平;

如果P1.7出現(xiàn)高電平,則說(shuō)明當(dāng)前這1路出現(xiàn)故障。另外,如使6路的晶體管全部接通(P1口引腳送來(lái)高電平),在正常情況下,P1.7應(yīng)呈高電平;如果P1.7出現(xiàn)低電平,也說(shuō)明信號(hào)線路存在故障。有故障時(shí),通過(guò)軟件應(yīng)使P1.6輸出高電平,以點(diǎn)亮故障信號(hào)燈報(bào)警。

圖9-41汽車(chē)駕駛操縱信號(hào)燈單片機(jī)控制系統(tǒng)原理

3.軟件設(shè)計(jì)

參考程序:

4.程序說(shuō)明

本程序的主程序部分只有8條指令,其中7條用于初始化,分別為:對(duì)T0置初值、設(shè)定T0的工作方式、設(shè)定片內(nèi)RAM20H單元的初值、開(kāi)T0中斷、啟動(dòng)T0、中斷等待。

(1)T0的中斷服務(wù)子程序:為T(mén)0重裝初值和保護(hù)現(xiàn)場(chǎng)后又轉(zhuǎn)去INTUSB。自INTUB起,包含2個(gè)主要程序段:信號(hào)燈指示程序段和故障監(jiān)控程序段。如1s時(shí)間未到,則只執(zhí)行信號(hào)燈指示程序段,根據(jù)駕駛操作動(dòng)作,如轉(zhuǎn)彎、??康惹樾?信號(hào)燈將閃爍或點(diǎn)亮(見(jiàn)表9-1)。每逢1s時(shí)間到,則先執(zhí)行故障監(jiān)控程序段,檢查一遍信號(hào)指示電路(見(jiàn)圖9-41),看看是否有硬件故障,然后再執(zhí)行信號(hào)燈指示程序段。

(2)1Hz閃爍信號(hào)的產(chǎn)生與占空比:本例令T0工作于方式1,且將初始值預(yù)置為F000H,在12MHz晶振的情形下,每隔4096ms將溢出一次,另以片內(nèi)RA

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論