

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 題目: 《可編程頻率計》設(shè)計 </p><p> 學(xué)號: </p><p> 姓名: LXZ-2008 </p><p> 專業(yè)班級: </p><p> 指導(dǎo)老師:
2、 </p><p> 實踐日期: 2010年8月31號—10月12號</p><p><b> 目錄</b></p><p><b> 1引言3</b></p><p><b> 1.1編寫目的3</b></p
3、><p><b> 1.2背景3</b></p><p><b> 1.3定義3</b></p><p><b> 1.4參考資料4</b></p><p><b> 2實際開發(fā)結(jié)果4</b></p><p><b
4、> 2.1產(chǎn)品4</b></p><p> 2.2主要功能和性能4</p><p><b> 2.3基本流程5</b></p><p><b> 2.4進度7</b></p><p><b> 2.5費用8</b></p>&
5、lt;p><b> 3開發(fā)工作評價9</b></p><p> 3.1對產(chǎn)品質(zhì)量的評價9</p><p> 3.3對技術(shù)方法的評價9</p><p> 3.4出錯原因的分析9</p><p><b> 4經(jīng)驗與教訓(xùn)10</b></p><p> 5
6、附錄—程序清單及結(jié)構(gòu)圖14</p><p> 5.1邏輯結(jié)構(gòu)圖及流程圖14</p><p> 5.2程序清單16</p><p><b> 項目設(shè)計總結(jié)報告</b></p><p> --可編程頻率計的設(shè)計</p><p><b> 1引言</b></p
7、><p><b> 1.1編寫目的</b></p><p> 經(jīng)過一段時間的努力,我們終于完成了對可編程頻率計的設(shè)計。為了讓讀者更加了解我們設(shè)計的這個可編程頻率計的原理、工作方式、運行環(huán)境、功能和我們設(shè)計的流程等等,我們寫了這個項目設(shè)計的總結(jié)報告。對于學(xué)生的我們,這份報告的主要目的是提高我們規(guī)范化的工程實驗方法,進行系統(tǒng)的、高效地開發(fā)項目,同時也作為指導(dǎo)。在編寫報告與
8、實驗同步能提高我們做項目和實戰(zhàn)的能力。</p><p><b> 1.2背景</b></p><p> 硬件課程設(shè)計的課題是:可編程頻率計的設(shè)計。</p><p> 這次可編程頻率計的設(shè)計是由劉曉澤提出來的,由劉曉澤和劉春一起討論、共同編程、實踐,最后成功完成的。</p><p> 該可編程頻率計能夠快速準(zhǔn)確的捕
9、捉到被測信號頻率的變化,所以該頻率計適用于需要精確測量信號頻率變化的設(shè)備。</p><p> 本頻率計是方波頻率計,由于實驗箱資源的有限性,我們只能設(shè)計這個方波頻率計。</p><p> 該設(shè)計的頻率計需要在16/32位微機接口技術(shù)實驗系統(tǒng)的實驗箱上完成,連接電腦,用到了8279芯片和鍵盤,8253計數(shù)器和I/O輸入輸出設(shè)備,用匯編語言完成編程驅(qū)動可編程頻率計的實現(xiàn)。</p>
10、;<p><b> 1.3定義</b></p><p><b> 中文名稱:頻率計</b></p><p> 英文名稱:frequency meter </p><p> 定義:測量周期量頻率值的儀表。</p><p> I/O:輸出/輸入(Input/Output)<
11、/p><p> 匯編語言:(Assembly Language)是面向機器的程序設(shè)計語言。用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標(biāo)號(Label)代替地址碼。</p><p><b> 中文名稱:計數(shù)器 </b></p><p> 英文名稱:counter </p><p> 定義:通過傳動
12、機構(gòu)驅(qū)動計數(shù)元件,指示被測量累計值的器件。計時器即計數(shù)器。</p><p><b> 中文名稱:脈沖 </b></p><p> 英文名稱:pulse </p><p> 定義:一個物理量在短持續(xù)時間內(nèi)突變后迅速回到其初始狀態(tài)的過程。</p><p> LED:(Light Emitting Diode),發(fā)光二
13、極管,是一種固態(tài)的半導(dǎo)體器件,它可以直接把電轉(zhuǎn)化為光。</p><p><b> 中文名稱:流程圖 </b></p><p> 英文名稱:flow diagram </p><p> 定義:表示生產(chǎn)過程中事物各個環(huán)節(jié)進行順序的簡圖。</p><p><b> 1.4參考資料</b></
14、p><p> 《微型計算機原理與接口技術(shù)》第四版 周荷琴 吳秀清/著 中國科學(xué)技術(shù)出版社</p><p><b> HK88TE說明書</b></p><p> 8279芯片使用說明文檔</p><p><b> 2實際開發(fā)結(jié)果</b></p><p><b>
15、 2.1產(chǎn)品</b></p><p> 程序: Is_Start ;檢測是否按下開始脈沖鍵</p><p> 程序: InitClock2 ;初始化計數(shù)器2,并產(chǎn)生可編程的方波頻率</p><p> 程序: InitClock0 ;初始化計數(shù)器0</p><p> 程序: InitClo
16、ck1 ;初始化計數(shù)器1</p><p> 程序: CheckClock0Over ;檢測計數(shù)器0是否工作結(jié)束,并將讀取的結(jié)果存入變量a中</p><p> 程序:Display ;顯示變量a的值到LED上</p><p> 主程序:Main ;整個程序的主程序運行部分</p><p> 本項
17、目的程序結(jié)構(gòu)是扁平式的,即在一個主程序的作用下,分別調(diào)用各個小的程序來完成整個項目的功能。而各個小程序又是不可劃分的最小程序模塊。</p><p> 本項目總共200行代碼。數(shù)據(jù)段與代碼段共用,均用CS作為段寄存器。數(shù)據(jù)部分21行,其中19行是宏定義,在編譯時用,在生成2進制可執(zhí)行文件時不用。只有2行是真正的數(shù)據(jù),占用程序空間。主程序20行代碼。Display程序70行代碼,InitClock0、InitClo
18、ck1、InitClock2程序均為10行代碼,CheckClock0Over程序20行代碼。</p><p> 本項目有兩個版本。但實質(zhì)為一個版本。由于一開始沒有頻率發(fā)生設(shè)備,我們利用8253產(chǎn)生頻率,其中用到8個開關(guān)作為產(chǎn)生頻率的種類。但由于我們的模塊是高內(nèi)聚、低耦合的。獨立性比較強。這個產(chǎn)生頻率的模塊可以隨時替換。后來老師找來了頻率發(fā)生器做檢驗,檢驗通過。而之前的代碼并未用到。因此實質(zhì)為一個版本。<
19、/p><p> 2.2主要功能和性能</p><p> 在這次可編程頻率計的設(shè)計中,我們的項目的計劃的主要功能是:完成方波頻率的測試。主要原理:對一個脈沖進行頻率計數(shù),通過測量它在單位時間內(nèi)的脈沖數(shù),然后用 ,其中 為測出的方波頻率,N為單位時間內(nèi)的頻率數(shù),T為單位時間(這里為0.5S)。</p><p> 首先對8253賦初始值,讓0通道在外界輸入1/8MHZ的
20、情況下,通過賦值62500計數(shù),在方式0下產(chǎn)生0.5秒的定時。而計時器0的輸出接輸入芯片,通過一個循環(huán)不斷檢測計時器0是否定時完畢。而計時器1的CLK1端口接帶檢測的方波頻率,這個計時器是在方式2下工作的,每次頻率計工作都賦初始值0給它,讓它在單位時間內(nèi)對產(chǎn)生的脈沖計數(shù)。通過 ,其中N為最終的計數(shù)值, 為計數(shù)的最大值,這里是65536,即 , 是計時器1上讀出的計數(shù)值,N為測出的頻率數(shù)。然后將N轉(zhuǎn)換成8279能顯示的數(shù)碼,最后用8279
21、顯示出來。在這當(dāng)中用一個開關(guān)負(fù)責(zé)開啟檢測和重置。即第一次使用撥動開關(guān),不到1秒及出來結(jié)果,以后每撥動2次,即可看到結(jié)果。</p><p><b> 性能:</b></p><p> 本產(chǎn)品為方波頻率發(fā)生器,只能檢測方波,我們用標(biāo)準(zhǔn)的實驗頻率發(fā)生器產(chǎn)生方波進行檢測。由于我們的8279附近的數(shù)碼管只有6個,而8253上的寄存器是16位的,我們就設(shè)計出一個0到65535
22、HZ范圍的可編程方波頻率計,即用到5個數(shù)碼管來顯示。如果數(shù)碼管增加,本產(chǎn)品的程序只需改動少量代碼變可迅速做到擴展。</p><p> 通過標(biāo)準(zhǔn)的實驗頻率發(fā)生器檢測,本產(chǎn)品的精確度為千分之一。這部分誤差是由于在定時結(jié)束后,在讀取計數(shù)值的這部分時間內(nèi),CPU執(zhí)行時間占用所導(dǎo)致的誤差。還有另一個原因就是芯片的硬件誤差引起的。前者通過縮短代碼,基本達到極限。因此若想再提高誤差,只有用更好的運算芯片或硬件中斷來處理。&l
23、t;/p><p><b> 2.3基本流程</b></p><p> 用圖給出本程序系統(tǒng)的實際的基本的處理流程。</p><p> ?。?)頻率計程序流程圖 (2)可編程頻率計使用流程圖</p><p><b> ?。?)硬件框架圖</b></p><p
24、><b> 2.4進度</b></p><p><b> 原定進度:</b></p><p> 8個學(xué)時的時間選定硬件課程設(shè)計的課題,提出本項目的任務(wù);</p><p> 16個學(xué)時的時間進行課程設(shè)計的分析、編程、硬件連接,最后實現(xiàn)頻率計的功能。</p><p> 8個學(xué)時的時間編寫
25、硬件課程設(shè)計報告。</p><p><b> 實際進度:</b></p><p> 我們課上用了4個學(xué)時的時間就選擇好了我們的硬件設(shè)計課題—可編程頻率計的設(shè)計。課下花了大量的時間編程。</p><p> 然后是設(shè)計階段,我們開始對可編程頻率計的設(shè)計進行分析,討論該如何設(shè)計、編程。我們從網(wǎng)上找了一些有用的資料,編程過程中,連接硬件運行過程中
26、也都遇到過一些問題,不過我們還是通過查找資料,相互討論,與老師交流等方式成功地解決了。設(shè)計階段課上我們花了12個學(xué)時調(diào)試完成了。</p><p> 寫設(shè)計報告我們用了大概8個學(xué)時的時間。</p><p><b> 分析:</b></p><p> 通過原定計劃的進度和實際使用的進度我們可以很容易的看出,我們設(shè)計的實際進度提前了。</
27、p><p> 主要原因是:我們迅速地選定課題,之后我們就盡快地投入到了設(shè)計當(dāng)中去。在課題選擇這個階段我們就節(jié)約了很大一部分時間。在實際設(shè)計階段,我們不僅僅在實驗室里積極認(rèn)真的調(diào)試硬件,改進方式。同時我們在其它時間還查閱了很多關(guān)于我們這個課題的相關(guān)資料,包括頻率計的原理,實現(xiàn)方式,相關(guān)的8253和8279的使用等等。這些充分的課余準(zhǔn)備使我們在實驗室里比較容易地就設(shè)計出了我們滿意的結(jié)果,并且也用了更少的時間。而且有部分
28、實驗箱的問題得到了老師的指點。最重要的是我們對實驗原理的深刻理解,然后設(shè)計好方案思路之后在課下花大量時間編程,而在實驗室里主要是調(diào)試。</p><p><b> 2.5費用</b></p><p><b> 費用預(yù)算:</b></p><p> 在設(shè)計之前,我們預(yù)算實際設(shè)計操作并完成可編程頻率計需要16個學(xué)時,合計為
29、800分鐘,大概13.3個小時的時間。</p><p> 預(yù)計我們用到的物料主要是實驗室里的電腦和實驗箱里的儀器,不會有出差的情況,所以也沒有出差費的預(yù)算。</p><p><b> 實際支出:</b></p><p> 我們的設(shè)計的時間是我們使用了12個學(xué)時的,合計為600分鐘,10個小時的時間。這段時間我們都在實驗室里,在電腦上連通實
30、驗儀器試驗,改進。</p><p> 在可編程頻率計的設(shè)計中,我們主要用到的是實驗室里的電腦和實驗箱里的儀器,并沒有什么物料消耗,也沒有出差,所以也沒有費等支出。</p><p><b> 分析:</b></p><p> 按照以上預(yù)算與實際支出情況,我們的設(shè)計經(jīng)費是有節(jié)余的。</p><p> 實際物料消耗與費
31、用支出與預(yù)算基本上一致,而主要有節(jié)余的地方是我們比預(yù)計花費了更少的時間,預(yù)計要16個學(xué)時的設(shè)計而我們只用了12個學(xué)時的時間就完成了。</p><p><b> 3開發(fā)工作評價</b></p><p> 3.1對產(chǎn)品質(zhì)量的評價</p><p> 頻率計在質(zhì)量上滿足我們預(yù)先的需求。而且穩(wěn)定性好,精確度達到千分之一,多次檢測一直達到這個精確值,
32、沒出現(xiàn)什么誤差。所不足的是僅能檢測方波。而且在無法連續(xù)檢測不斷變化的頻率,只能檢測出穩(wěn)定的方波,當(dāng)要檢測另一頻率時必須撥動開關(guān)重新檢測。而且檢測速度不是很快,大概0.5S。但是,總體上滿足產(chǎn)品預(yù)先的要求。</p><p> 3.3對技術(shù)方法的評價</p><p> 本項目用的是HK88TE實驗箱里的8088CPU、8253芯片、IO輸入芯片、8279芯片、LED數(shù)碼管、8個開關(guān)、連線若
33、干、HK88TE實驗平臺。</p><p> 檢測工具是:頻率發(fā)生器</p><p> 編程工具及語言:用匯編語言,編程平臺是HK88TE實驗箱配備的軟件。</p><p> 在開發(fā)中用到了模塊化的思想,將一個一個的實現(xiàn)功能代碼做成高內(nèi)聚低耦合的獨立性強的模塊,模塊可以單獨處理,加快了編程效率,增強了擴展功能。由于硬件平臺缺少硬件中斷功能的缺陷,我們采用軟件中
34、斷來實現(xiàn)開關(guān)、定時的檢測。通過循環(huán)條件的設(shè)定來跳出循環(huán)。</p><p> 3.4出錯原因的分析</p><p><b> 出錯情況:</b></p><p> 無法取出數(shù)據(jù)段的數(shù)據(jù)。</p><p> 編譯通過,運行無法通過。</p><p> 單步調(diào)試通過,全速運行無法進行。<
35、/p><p><b> 無法顯示頻率。</b></p><p><b> 啟動開關(guān)無法檢測。</b></p><p> 出錯原因分析及解決方法:</p><p> 我一開始定義一個數(shù)據(jù)段即data segment….data ends,然后取里面的數(shù)據(jù),無論如何都不行,我看了一下實驗箱手冊里的例
36、子,他們?nèi)珱]用到data段,而是數(shù)據(jù)段和代碼段共用,用ds :code 及push cs,pop ds來解決。因此我分析的結(jié)果是實驗箱不支持的問題,我在PC機上用匯編均支持。</p><p> 經(jīng)老師指點,是因為代碼長了,實驗箱的監(jiān)控程序不支持,通過滑動下載軟件上的延遲到高的部分解決了。</p><p> 我是用一個循環(huán)來檢測計時器0的輸出情況,由于我在循環(huán)里忘了加一條IN指令,而陷入
37、死循環(huán),加了后解決了。</p><p> 主要是不了解8279的原理及使用方法,還有數(shù)碼管的編碼方式,通過查看文檔資料及摸索解決了。</p><p> 這個問題跟第3點類似,也是在循環(huán)里忘了先用IN指令讀取數(shù)據(jù),再用AND截取數(shù)據(jù)檢測。發(fā)現(xiàn)后加了IN指令解決了。</p><p><b> 4經(jīng)驗與教訓(xùn)</b></p><
38、;p><b> 小組成員:劉曉澤</b></p><p><b> 體會:</b></p><p> 這是一個小的項目開發(fā),我試著用規(guī)范的方法去做,我在項目開始時先想著確定一個題目,老師推薦了幾個題目,又要求一個小組只能有一個且不能重復(fù)。因此我們選了頻率計作為我們的項目。一開始時我并不知道什么是頻率計,然后詢問了老師。大概明白了,后來
39、在課上我在百度里打頻率計,然后在百度百科里看了一下什么叫頻率計以及頻率計的主要原理是什么,這個比較重要。我覺得做一個陌生的項目,首先搞明白這個項目的概念及原理,這樣才能下手。我看了一下我們那個HK88TE這個實驗箱,以及實驗箱可用的部分,感覺只能完成方波的測試,因此進行了方波的頻率計設(shè)計。我進行了需求分析,搞明白了我們到底要干什么,以及是否在規(guī)定的時間內(nèi)可行,以及取得所做項目所需的技術(shù)知識及資料,這些統(tǒng)統(tǒng)在第一次課后進行了準(zhǔn)備。我把老師
40、給的資料全打印下來了。</p><p> 由于我們做的是頻率計,那么必然有顯示的輸出部分,以及頻率的輸入部分,還有處理轉(zhuǎn)換這樣3個主要模塊。這三個模塊中所需的知識只有顯示部分之前沒遇到過。剩下的在上學(xué)期的微機原理用過,而且第一次課的時間又熟悉了一下,還是比較熟悉的,忘了的命令字翻翻書也就能解決了,欠缺的是8279這個芯片的使用方法和原理。第一次課后,我便把8279的資料全看了,由于我只用到顯示部分,因此主要看顯
41、示部分的原理和操作。</p><p> 第一次課時我并不清楚6個數(shù)碼管的顯示方法,后來仔細(xì)看了實驗臺上的數(shù)碼管,通過看例子以及自己的推測,發(fā)現(xiàn)一個數(shù)碼管是用1個字節(jié)里的數(shù)據(jù)來顯示的,按照數(shù)碼管上的標(biāo)號,從a到h,按照順時針方式旋轉(zhuǎn),0表示滅,1表示亮,這樣的信息用8位數(shù)據(jù)里的低字節(jié)到高字節(jié)表示。</p><p> 我是這樣認(rèn)為的,實驗課的時間是十分寶貴的,主要是用來搞硬件的,即主要是用
42、來驗證自己對硬件的理解以及調(diào)試自己的電路和代碼的,不是主要用來編程和看資料的。而實驗箱比較貴,聽說幾千塊,而且實驗結(jié)束或者十分了解實驗箱后,實驗箱對自己的作用也不大,實驗箱主要是教學(xué)用,不必一人買一個。不像學(xué)習(xí)單片機,買個51芯片,自己焊電路那樣,可以長期持有,使用。而且用51單片機芯片自己搞一個電子產(chǎn)品,價格也很低,很實用。因此,我在課下盡量地花時間編程和看資料,在課上盡可能地調(diào)試程序,以及檢驗自己的電路。</p>&l
43、t;p> 我在假期時,有自己買過一些單片機芯片自己玩。但是,我跟別人學(xué)單片機不太一樣。由于自己是計科的,專業(yè)方向不同,很難花大量的時間在電子方面。但由于有些興趣,也自己在假期有空時學(xué)學(xué)。發(fā)現(xiàn)單片機的核心還是編程,當(dāng)把電路搭好后,原理也明白后,剩下的大量時間是在編程。因此,總的來說對自己的專業(yè)方向偏差不大。</p><p> 我是在網(wǎng)上聽說有人用面包板來學(xué)習(xí)單片機的。就是買上一塊面包板和線,由于面包板上有
44、一個個小孔,用線插拔十分方便,不用焊東西,對自己的學(xué)習(xí)十分有利。然后我就照著別人的推薦買了51單片機,不過這個是國產(chǎn)的STC系列的芯片,因為它是國產(chǎn),自然網(wǎng)上的官方文檔是中文版的,對于英語不好的我來說比較方便。買了一些晶振什么的就在面包板上接起來,然后照著例子看著原理圖學(xué)習(xí)。用的是C語言編程。</p><p> 后來在實驗課上想用C語言,發(fā)現(xiàn)實驗平臺的軟件不支持,而我用的芯片是8088CPU。所以最終就用匯編來
45、編程了,盡管過程中有一段痛苦的過程,但是隨著我把自己的實驗完成,又自己玩了一下其它人做的什么時鐘、計算器、電子琴和交通燈,這樣我間接在硬件課程的這段時期編了幾千行的匯編代碼。盡管我自己的實驗是只有200行代碼,但是我在這幾千行的代碼編程中中對匯編比較自信,也不再恐懼它了。</p><p> 我在使用匯編中沒用到多少種指令,也就是常用的那20幾種。什么MOV、JMP、LEA、RET、CALL、ADD、SUB、MU
46、L、ADD、DIV、IN、OUT、JL、JZ、JA、JNZ、LOOP、INC、DEC、AND、NOT、SLL、SLR、PUSH、POP。</p><p> 我也就熟悉這么些指令。</p><p> 我在網(wǎng)上看到的頻率計的原理是:通過在單位時間內(nèi)檢測出的頻率數(shù),用 ,其中 為測出的方波頻率,N為單位時間內(nèi)的頻率數(shù),T為單位時間(項目里為0.5S)。這樣求出的 即為頻率,單位是HZ。<
47、;/p><p> 我就用這條幾句話的原理進行方波頻率計的設(shè)計。開始時想自己買芯片來焊(盡管我不是很自信,但是知道一點原理,我覺得可行),但是我們大三上學(xué)期的課程太多了,一天8節(jié)課,不光有硬件的課程設(shè)計,還有軟件工程的課程設(shè)計,覺得在時間上可能安排不過來。而且這學(xué)期的專業(yè)課程比較重要,很多都是原理,而且有些課程的老師不錯,不花時間的話,可能過了這村就沒這店了。我認(rèn)為本科生與??粕牟顒e在于理論原理的研究。本科生普遍比
48、職業(yè)學(xué)校的學(xué)生缺少動手時間和經(jīng)歷,而職業(yè)學(xué)校的學(xué)生由于一開始的生源不同,他們在理論學(xué)習(xí)上的時間要少,學(xué)習(xí)能力稍差。而缺乏理論原理的學(xué)習(xí),在技術(shù)上很快會到達瓶頸。而他們再學(xué)習(xí)能力有限,再自我學(xué)習(xí)理論原理時就會遇到困難,自學(xué)能力也有限。因此,就必須找到一個平衡點。因此,我在不落下平常的課程的學(xué)習(xí)下,盡可能多地動手做實驗,編程。</p><p> 我把我們的項目分析了一下,發(fā)現(xiàn)必須用中斷。而實驗箱有缺陷,上學(xué)期馬海波
49、老師教我們微機原理,當(dāng)時他說我們實驗箱缺少中斷的連接口,所以我們上學(xué)期的實驗也就沒有中斷的實驗。中斷有兩種方法實現(xiàn),即軟中斷和硬中斷。而硬件中斷方式,實驗箱無法實現(xiàn),那么只能采取軟件中斷。軟中斷就是用循環(huán)來實現(xiàn),盡管很浪費CPU資源,但是也算是一種響應(yīng)不錯的方法。軟中斷也是比較不好把握的,因為必須把全局所需要處理的內(nèi)容的順序安排好。把需要不斷檢測及更新的部分全部安排在一起,一次一次地掃描。而其余的安排在這個代碼段的外面。</p&g
50、t;<p> 開這門課之前,我在課余時間看了幾頁反匯編的書,就是看原先C語言編的代碼在轉(zhuǎn)成匯編時如何實現(xiàn)的。里面的函數(shù)在轉(zhuǎn)成匯編代碼時,是在調(diào)用前把所謂的參數(shù)入棧,然后用CALL命令將程序段調(diào)入(在C里叫函數(shù)),在程序段的末尾用RET指令返回調(diào)用處。我大概看了一些CALL指令,這個指令可以用JMP和PUSH指令代替,其本質(zhì)是把當(dāng)前的CPU狀態(tài)入棧,把IP寄存器內(nèi)容入棧,然后用JMP跳到相應(yīng)的標(biāo)號,即代碼段上偏移的地址處執(zhí)
51、行指令。而RET就是把之前入棧的內(nèi)容按順序出棧。由于用這兩條指令省事,而且讓人更了解代碼的內(nèi)容和思想,我在以后的編碼中經(jīng)常用。</p><p> 編匯編是十分頭疼的事情,至少在開這門課之前。編300行的匯編和編300行的C絕對不是一個數(shù)量級的,如果不處理好匯編代碼的結(jié)構(gòu),那么將比較痛苦。</p><p> 借鑒了這些思想,我采用模塊化的思想將這個程序劃分成一個個功能獨立的代碼,用一些P
52、USH、POP語句充當(dāng)像C語言中的形參。我盡量將這些功能代碼做成像軟件工程這門課說的高內(nèi)聚低藕合的模塊。當(dāng)一個模塊有小問題時,影響不大,只修改這個模塊即可,而模塊又可以迅速地組合,擴展。我用這個方法,在完成自己小組的實驗下,自己又做了一些別人的項目內(nèi)容。而我在這有限的幾周內(nèi)完成了幾個項目,當(dāng)然,交報告肯定只是自己該交的部分,其它的就當(dāng)自己練練手。學(xué)習(xí)學(xué)到手,畢竟是最重要的,不閉拘于形式。</p><p> 我平
53、?;ū容^多的時間在編程,一些開發(fā)輔助工具沒怎么關(guān)注。因此當(dāng)畫我們這個項目的流程圖以及原理的邏輯結(jié)構(gòu)圖時是用WINDOWS里的畫圖工具和WORD配合完成的,盡管就三幅圖,花了一個下午,可能有4個小時,比較艱難和辛苦。</p><p> 項目程序分為主程序和功能小程序。通過在主程序中依次調(diào)用功能小程序來完成全部功能,旁邊也附加大量的注釋,方便小組成員的交流,以及代碼的修改。</p><p>
54、 這個程序的主體思想是這樣的:</p><p> 首先用一段循環(huán)檢測程序段檢測是否有開關(guān)按鍵按下,沒有就一直循環(huán)檢測,檢測到便對8253賦初始值,讓0通道在外界輸入1/8MHZ的情況下,通過賦值62500計數(shù),在方式0下產(chǎn)生0.5秒的定時。而計時器0的輸出接輸入芯片,通過一個循環(huán)不斷檢測計時器0是否定時完畢。而計時器1的CLK1端口接帶檢測的方波頻率,這個計時器是在方式2下工作的,每次頻率計工作都賦初始值0給
55、它,讓它在單位時間內(nèi)對產(chǎn)生的脈沖計數(shù)。通過 ,其中N為最終的計數(shù)值, 為計數(shù)的最大值,這里是65535,即 , 是計時器1上讀出的計數(shù)值,N為測出的頻率數(shù)。然后將N轉(zhuǎn)換成8279能顯示的數(shù)碼,最后用8279顯示出來。接著繼續(xù)用一段代碼檢測在這當(dāng)中用一個開關(guān)負(fù)責(zé)開啟檢測和重置。有的話,代碼又跳轉(zhuǎn)到最開始執(zhí)行。即第一次使用撥動開關(guān),不到1秒即出來結(jié)果,以后每撥動2次,即可看到結(jié)果。</p><p> 在編程的過程中
56、也遇到不少的問題,例如:</p><p><b> 出錯情況:</b></p><p> 無法取出數(shù)據(jù)段的數(shù)據(jù)。</p><p> 編譯通過,運行無法通過。</p><p> 單步調(diào)試通過,全速運行無法進行。</p><p><b> 無法顯示頻率。</b><
57、/p><p><b> 啟動開關(guān)無法檢測。</b></p><p> 出錯原因分析及解決方法:</p><p> 我一開始定義一個數(shù)據(jù)段即data segment….data ends,然后取里面的數(shù)據(jù),無論如何都不行,我看了一下實驗箱手冊里的例子,他們?nèi)珱]用到data段,而是數(shù)據(jù)段和代碼段共用,用ds :code 及push cs,pop
58、ds來解決。因此我分析的結(jié)果是實驗箱不支持的問題,我在PC機上用匯編均支持。</p><p> 經(jīng)老師指點,是因為代碼長了,實驗箱的監(jiān)控程序不支持,通過滑動下載軟件上的延遲到高的部分解決了。</p><p> 我是用一個循環(huán)來檢測計時器0的輸出情況,由于我在循環(huán)里忘了加一條IN指令,而陷入死循環(huán),加了后解決了。</p><p> 主要是不了解8279的原理及使
59、用方法,還有數(shù)碼管的編碼方式,通過查看文檔資料及自己摸索解決了。</p><p> 這個問題跟第3點類似,也是在循環(huán)里忘了先用IN指令讀取數(shù)據(jù),再用AND截取數(shù)據(jù)檢測。發(fā)現(xiàn)后加了IN指令解決了。</p><p> 經(jīng)過這些過程我們小組便在第三周的開始接受老師的檢驗并通過了。老師拿來一個頻率發(fā)生器,開到方波進行檢驗,在我們的頻率計可顯示的范圍內(nèi)通過了。</p><p&
60、gt; 后來我們便是作報告,以及自己做自己想做的其它實驗。</p><p> 在本次課程中我學(xué)到了和熟悉了不少匯編指令,而且匯編的編程積累量也有兩、三千行,提高了不少的動手能力以及獨立思考、解決問題的能力。感覺收獲挺大的。</p><p><b> 建議:</b></p><p> 建議以后實驗箱的功能更多點,像8279中斷這種功能缺陷
61、,我們也就缺少了一次用中斷的機會。</p><p> 建議實驗箱能允許的代碼多些,這樣我們可以發(fā)揮自己的想象和能力編出更加多彩的程序。</p><p> 建議學(xué)校安排更多的實驗課,來彌補我們在理論學(xué)習(xí)下缺少實踐的情況。少開一些與專業(yè)課相差比較大的學(xué)科。</p><p> 建議課程安排合理一些,將每天的課安排平均一些,像我們上半學(xué)期課很多,下半學(xué)期課很少,這樣我
62、們充分消化和學(xué)習(xí)的時間有沖突。</p><p> 建議多些擴展的實驗?zāi)K,例如像數(shù)碼管這樣的模塊比較少,學(xué)校是否可以多采購一些這樣的模塊再課程設(shè)計時讓學(xué)生盡可能地發(fā)揮想象力和創(chuàng)造力。我覺得創(chuàng)造力的基礎(chǔ)是環(huán)境和有一定學(xué)習(xí)知識基礎(chǔ)。否則寫寫報告只是空談。</p><p> 建議擴展一些更有趣的模塊,如LCD屏(黑白或彩色的),無線網(wǎng)絡(luò)模塊。</p><p> 建議
63、盡可能多地提供技術(shù)文檔,例如盡可能多地提供實驗室里的所有實驗箱的文檔,讓學(xué)生能盡可能地自學(xué)里面的東西。</p><p> 這就是我個人的經(jīng)驗、體會、教訓(xùn)和建議。</p><p><b> 小組成員:劉春</b></p><p><b> 體會:</b></p><p> 在做“可編程頻率計的
64、設(shè)計”這個課題時,我學(xué)到了很多。很多知識確實只有從實踐中獲得,想要只從書本上學(xué)到,那是沒辦法的。雖然以前我們在微機原理與接口技術(shù)可課上也學(xué)習(xí)了很多硬件知識,包括 8086、8253等等,還到實驗室里做過很多實驗,但是我們這個課題也用到了我們沒有學(xué)過,沒有用過的硬件—8279鍵盤顯示器。</p><p> 對硬件知識我最多的收獲就是8279了。一開始我還是不懂8279的,在老師給的資料里有這方面的用法。這次我對硬
65、件知識收獲最多的就是明白了很多8279的功能,主要是顯示功能。在顯示數(shù)字時,數(shù)字被分成了7個部分,外加一個小數(shù)點,由八位代表這八個部分,0表示不亮,1表示亮,比如:00000000B表示全部熄滅,00000110B表示1,01011011B表示2等等。在顯示數(shù)字時,我遇到了一個問題,就是當(dāng)我輸出后2位之后要輸出3,4位數(shù)字是,8279輸不出來。當(dāng)時我覺得很奇怪,后來我知道8279顯示第3,4位是不顯示出來的。而鍵盤上的3,4位數(shù)字在實際
66、的編程中卻是第5,6位。這一點在當(dāng)時我困惑了好久,后來我問了一下同學(xué),然后又上網(wǎng)查了一下才明白過來。在8279初始化的時候,輸入控制端的掃描頻率38H我就不懂了,因為編程的時候直接用就可以了,所以我也沒有仔細(xì)研究,我想大概是顯示數(shù)字的速度吧。</p><p> 在可編程頻率計的設(shè)計中,還用到了8253和I/O輸入接口。在上學(xué)期的微機原理與接口技術(shù)課,我們也做了很多硬件設(shè)計實驗,對匯編語言和實驗儀器也有一定的了解
67、,知道一些8253和I/O接口的原理與使用?,F(xiàn)在通過這個課題的設(shè)計使我對匯編語言編程和硬件的原理與使用有了更深的認(rèn)識。</p><p> 在剛開始上這門課的時候,當(dāng)時我考慮到我的專業(yè)是計算機科學(xué)與技術(shù),選的又是軟件工程方向,所以對這門課沒有引起足夠的重視。以前我的家里人在電話里也叫我也軟件、硬件一起學(xué),后來大家都很認(rèn)真地在查找資料,設(shè)計匯編程序,一起討論,我也下定決心認(rèn)真學(xué),即使不能做到對各個語句、各個硬件了如
68、指掌的地步,但是也要知道他們的基本原理和使用方法吧。剛開始還有些吃力,畢竟學(xué)習(xí)微機原理與接口技術(shù)這門課已經(jīng)過去了一個暑假,很多知識忘記了,比如8253初始化的各種命令字等等。后來看微機原理與接口技術(shù)的書,對匯編語言更加熟悉后,對匯編語句編寫程序,硬件連接就很輕松了。</p><p> 在以前學(xué)習(xí)微機原理與接口技術(shù)的時候,學(xué)了很多匯編語言,雖然也有實驗課,但是還有很多語句不熟,甚至有些語句根本就不知道什么意思,不
69、會用。在這次設(shè)計中也用到了不少匯編語句,有知道的,不熟的,也有一些我根本不知道什么意思。通過學(xué)習(xí)與討論,我熟悉了很多匯編語句,也學(xué)習(xí)了很多語句,在匯編程序知識上拓展了很多,學(xué)習(xí)了很多。對于8253的初始化,我在學(xué)習(xí)微機原理與接口技術(shù)的時候就很清楚了,現(xiàn)在就又學(xué)習(xí)了一遍,加深印象。有些細(xì)小的知識,應(yīng)用,比如分離一個數(shù)的各個位就需要用到除法div,然后將各個位一個一個的顯示出來。除法div根據(jù)除數(shù)、被除數(shù)的位不同而使用方法也有所不同,如果被
70、除數(shù)是16位,商或余數(shù)都是八位,那么就可以將被除數(shù)放在ax中,指令:div 源(除數(shù)),計算結(jié)果是商放在al中,余數(shù)放在ah中。如果商或余數(shù)超過8位,那么被除數(shù)的低16位就必須放在ax中,高16位必須放在dx中,如果被除數(shù)低于16位,那么高位dx就得賦值00H,指令:div 源(除數(shù)),計算結(jié)果是商放在ax中,余數(shù)放在dx中。如果還用前面那種除法,就會出現(xiàn)計算結(jié)果溢出,程序會卡在這一語句上。當(dāng)時我用除法顯示一個5位數(shù),8279顯<
71、/p><p> 我在這次硬件課程設(shè)計中,收獲最多的還是動手能力,在學(xué)校里除了實驗課,動手的機會還真不多。有些書本知識學(xué)習(xí)的很好的同學(xué),一看到那些復(fù)雜的電路,接口,連接線路就不知所措,畢竟書本知識和實際實驗器件還是有差別的,有些差別還挺大的。通過這次實際動手,我的動手能力也提升了不少啊。</p><p> 對今后的項目開發(fā)工作的建議:</p><p> 我覺得硬件設(shè)
72、計最看重的是親自動手能力,不管你對課題了解得怎么樣,一定要親自動手寫匯編程序,親自連接硬件,親自調(diào)試。</p><p> 鑒于親自動手對項目開發(fā)工作的重要性,我覺得我們應(yīng)多上實驗課,多對實際硬件操作,書本上的知識很重要,但實際操作也同樣重要。并且參加工作,公司看重的也主要是你的實際動手能力。</p><p> 5附錄—程序清單及結(jié)構(gòu)圖</p><p> 5.1
73、邏輯結(jié)構(gòu)圖及流程圖</p><p> ?。?)頻率計程序流程圖 (2)可編程頻率計使用流程圖</p><p><b> ?。?)硬件框架圖</b></p><p><b> 5.2程序清單 </b></p><p> Z8279 equ 20ah
74、;命令字地址</p><p> D8279 equ 208h ;數(shù)據(jù)地址</p><p> LEDMOD equ 00h ;左邊輸入,八位顯示,外部譯碼八位顯示</p><p> LEDFEQ equ 38h ;掃描頻率</p><p> Clock0 equ 210h ;定時器0
75、的地址</p><p> Clock1 equ 211h ;定時器1的地址</p><p> Clock2 equ 212h ;定時器2的地址</p><p> clockc equ 213h ;計數(shù)器控制端口地址</p><p> Clock0Mode equ 00110000b
76、 ;通道0,先讀寫低位再讀寫高位,方式0,2進制</p><p> Clock1Mode equ 01110100b ;通道1,先讀寫低位再讀寫高位,方式2,2進制</p><p> Clock2Mode equ 10110100b ;通道2,先讀寫低位再讀寫高位,方式2,2進制</p><p> Clock1Read equ 0100010
77、0b ;通道1計數(shù)器鎖存,供CPU讀</p><p> Clock0Count equ 0f424h ;計數(shù)器0計數(shù)值62500,在1M/8Hz下0.5秒所需計數(shù)值)</p><p> Clock1Count equ 0 ;計數(shù)器1計數(shù)值</p><p> Clock2Count equ 16 ;計數(shù)器2計數(shù)值&
78、lt;/p><p> InputAdr equ 218h ;IO輸入端口地址</p><p> StartWork equ 01h ;開始工作的檢測狀態(tài)(通過與運算截獲第一位)</p><p> Clock0End equ 02h ;檢測計數(shù)器0是否工作結(jié)束(通過與運算截獲第二位)</p>
79、<p> Data_K equ 10 ;變量K,初始值10</p><p> CODE SEGMENT</p><p><b> ;主函數(shù)</b></p><p> MAIN PROC FAR</p><p> ASSUME CS:CODE DS:CODE</p>
80、;<p><b> START:</b></p><p><b> push cs</b></p><p><b> pop ds</b></p><p> call Is_Start ;檢測是否按下開始脈沖鍵</p><p> call
81、 InitClock2 ;初始化計數(shù)器2,并產(chǎn)生可編程的方波頻率 </p><p> call InitClock0 ;初始化計數(shù)器0 </p><p> call InitClock1 ;初始化計數(shù)器1 </p><p> call CheckClock0Over ;檢測計數(shù)器0是否工作結(jié)束,并將讀取的結(jié)果存入變量a中<
82、;/p><p> call Display ;顯示變量a的值到LED上</p><p><b> EndTime:</b></p><p> mov dx,InputAdr ;IO輸入端口地址</p><p><b> in al,dx</b></p>&
83、lt;p> and al,StartWork ;開始工作的檢測狀態(tài)(通過與運算截獲第一位)</p><p> cmp al,01h ;判斷是否為高電平 </p><p><b> jz START</b></p><p> jmp EndTime</p><p><b>
84、; MAIN ENDP</b></p><p> ;這個函數(shù)負(fù)責(zé)將提取出的變量a的值輸出到LED上,最大16位</p><p> Display proc near </p><p><b> ;初始化8279</b></p><p> mov di,ax ;保存頻率至B
85、X</p><p> mov al,LEDMOD ;左邊輸入,八位顯示,外部譯碼八位顯示</p><p> mov dx,Z8279</p><p><b> out dx,al</b></p><p> mov al,LEDFEQ ;掃描頻率</p><p
86、><b> out dx,al</b></p><p> ;向LED輸出數(shù)據(jù),顯示結(jié)果</p><p><b> mov cx,5</b></p><p><b> First1:</b></p><p> mov ax,di ;保存頻
87、率至AX</p><p> mov dx,00h</p><p> mov si,Data_K</p><p><b> div si</b></p><p> mov di,ax ;將商保存至BX</p><p> mov ax,dx
88、 ;將余數(shù)保存至AX</p><p> lea bx,LED</p><p><b> add ax,bx</b></p><p><b> mov bx,ax</b></p><p> mov ax,[bx]</p><p> OutPut1: </p&
89、gt;<p> mov dx,D8279 ;8279數(shù)據(jù)端口</p><p><b> out dx,al</b></p><p><b> dec cx</b></p><p><b> cmp cx,3</b></p><p>
90、ja Continu1</p><p> lea bx,Signed</p><p> mov ax,[bx]</p><p><b> cmp ax,0</b></p><p><b> ja Next1</b></p><p><b> jmp Ne
91、xt2</b></p><p><b> Continu1:</b></p><p> jmp First1</p><p><b> Next1:</b></p><p> mov dx,D8279</p><p> mov al,00h</p&
92、gt;<p> out dx,al ;空操作</p><p> out dx,al ;空操作</p><p> lea bx,Signed</p><p> mov ax,00h</p><p> mov [bx],ax</p><p><
93、;b> Next2:</b></p><p><b> cmp cx,0</b></p><p> ja Continu1</p><p><b> jmp Next3</b></p><p><b> Next3:</b></p>
94、<p> mov dx,D8279</p><p> mov al,00h</p><p> out dx,al ;空操作</p><p> lea bx,Signed</p><p> mov ax,[bx]</p><p><b> inc ax</b
95、></p><p> mov [bx],ax</p><p><b> ret </b></p><p> Display endp</p><p> ;檢查是否按下開始按鈕,判斷脈沖信號</p><p> Is_Start proc near</p><p&g
96、t;<b> Again: </b></p><p> mov dx,InputAdr ;IO輸入端口地址</p><p><b> in al,dx</b></p><p> and al,StartWork ;開始工作的檢測狀態(tài)(通過與運算截獲第一位)</p><p>
97、; cmp al,00h ;判斷是否為低電平 </p><p> jz EndCheck </p><p> jmp Again </p><p> EndCheck: ;判斷結(jié)束,可以工作了</p><p><b> ret</b></p>
98、;<p> Is_Start endp</p><p> ;設(shè)置計數(shù)器0的工作方式及計數(shù)值</p><p> InitClock0 proc near</p><p> mov dx,clockc ;計數(shù)器控制端地址</p><p> mov al,Clock0Mode ;通道0,先讀寫低位再讀寫高位,
99、方式0,2進制,只定時1次</p><p><b> out dx,al</b></p><p> mov dx,Clock0 ;定時器0的地址</p><p> mov ax,Clock0Count ;計數(shù)器0計數(shù)值62500,在1M/8Hz下0.5秒所需計數(shù)值)</p><p><b>
100、 out dx,al</b></p><p><b> mov al,ah</b></p><p><b> out dx,al</b></p><p><b> ret</b></p><p> InitClock0 endp</p>&l
101、t;p> ;設(shè)置計數(shù)器1的工作方式及計數(shù)值</p><p> InitClock1 proc near</p><p> mov dx,clockc ;計數(shù)器控制端地址</p><p> mov al,Clock1Mode ;通道1,先讀寫低位再讀寫高位,方式2,2進制</p><p><b> ou
102、t dx,al</b></p><p> mov dx,Clock1 ;定時器1的地址</p><p> mov ax,Clock1Count ;計數(shù)器1計數(shù)值0</p><p><b> out dx,al</b></p><p><b> mov al,ah</b&g
103、t;</p><p><b> out dx,al</b></p><p><b> ret</b></p><p> InitClock1 endp</p><p> ;設(shè)置計數(shù)器2的工作方式及計數(shù)值,工作頻率1MHZ</p><p> InitClock2 pr
104、oc near</p><p> mov dx,InputAdr ;IO輸入端口地址</p><p><b> in al,dx</b></p><p><b> mov cl,2</b></p><p><b> not al</b></p>
105、<p> and al,11111100b</p><p> shr al,cl ;右移兩位</p><p> mov ah,00h</p><p> mov cx,ax ;保存頻率倍數(shù)</p><p> mov dx,clockc ;計數(shù)器控制端地址</p>
106、<p> mov al,Clock2Mode ;通道2,先讀寫低位再讀寫高位,方式2,2進制</p><p><b> out dx,al</b></p><p><b> cmp cx,0</b></p><p><b> je CX_1</b></p>&
107、lt;p><b> jmp Next</b></p><p><b> CX_1:</b></p><p> mov cx,1 ;1倍頻</p><p><b> Next: </b></p><p> mov ax,Clock2Coun
108、t ;計數(shù)器2計數(shù)值16</p><p> mov dx,00h</p><p><b> mul cx</b></p><p> mov dx,Clock2 ;定時器2的地址</p><p><b> out dx,al</b></p><p><
109、;b> mov al,ah</b></p><p><b> out dx,al</b></p><p><b> ret</b></p><p> InitClock2 endp</p><p> ;檢測定時器0是否定時0.5秒結(jié)束</p><p&g
110、t; CheckClock0Over proc near</p><p> mov dx,InputAdr ;IO輸入端口地址</p><p> Compare: </p><p><b> in al,dx</b></p><p> and al,Clock0End ;檢測計數(shù)器0是否工作結(jié)束
111、(通過與運算截獲第二位)</p><p> cmp al,00h ;比較該位是否為低電平</p><p> je Compare</p><p> mov dx,clockc ;計數(shù)器控制端地址</p><p> mov al,Clock1Read ;設(shè)置計數(shù)器1鎖存,供CPU讀</p>
112、<p><b> out dx,al</b></p><p> mov dx,clock1 ;定時器1的地址</p><p> in al,dx ;讀低位</p><p> xchg ah,al ;交換AL與AH的值</p><p> in a
113、l,dx ;讀高位</p><p> xchg ah,al ;交換AL與AH的值</p><p> mov cx,ax ;用CX臨時儲存AX</p><p> mov ax,0ffffh ;將最大值65535賦值給AX</p><p> sub ax,cx
114、 ;得出計數(shù)的最終頻率的一半</p><p> mov cx,2 ;乘數(shù)2</p><p> mov dx,00h</p><p> mul cx ;ax * 2</p><p><b> ret</b></p><p> Che
115、ckClock0Over endp</p><p> LED db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,67h ;0~9 LED數(shù)碼管顯示 </p><p> Signed db 01h ;使用標(biāo)志</p><p><b> CODE E
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 頻率計課程設(shè)計
- 頻率計課程設(shè)計
- eda課程設(shè)計--頻率計
- 簡易頻率計課程設(shè)計
- 頻率計課程設(shè)計 (2)
- 智能儀器課程設(shè)計——頻率計設(shè)計
- 智能儀器頻率計課程設(shè)計
- eda課程設(shè)計--簡易頻率計設(shè)計
- 可編程彩燈課程設(shè)計報告
- eda頻率計課程設(shè)計報告
- 微機原理課程設(shè)計--頻率計
- 簡單頻率計課程設(shè)計報告
- eda課程設(shè)計報告---頻率計
- 基于arm頻率計課程設(shè)計
- 可編程字符顯示課程設(shè)計
- 智能儀器課程設(shè)計——智能頻率計設(shè)計
- 單片機頻率計課程設(shè)計
- 課程設(shè)計——數(shù)字頻率計
- 數(shù)字頻率計課程設(shè)計
- 簡易頻率計畢業(yè)課程設(shè)計報告
評論
0/150
提交評論