微型計算機控制技術(shù)課程設(shè)計報告(二階電壓跟蹤_單片機)_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  二階環(huán)節(jié)電壓跟蹤控制系統(tǒng)的設(shè)計</p><p> ?。ú捎脝纹瑱C教學實驗裝置)</p><p><b>  目錄</b></p><p><b>  一、序言1</b></p><p><b>  二、設(shè)計步驟2</b></p><

2、p>  2.1 確定基本設(shè)計目標2</p><p>  2.2 確定基本實現(xiàn)方案2</p><p>  2.2.1 搭建二階環(huán)節(jié)2</p><p>  2.2.2 電路輸出跟蹤階躍信號2</p><p>  2.2.3 設(shè)計人機交互接口(鍵盤)2</p><p>  2.2.4 精度要求2</p

3、><p>  2.3 硬件設(shè)計2</p><p>  2.4 軟件設(shè)計3</p><p>  2.5 調(diào)試完善程序4</p><p><b>  三、 心得體會5</b></p><p><b>  四、參考文獻9</b></p><p><

4、;b>  五、附錄10</b></p><p>  5.1系統(tǒng)框圖10</p><p>  5.2電原理圖11</p><p>  5.3程序流程圖12</p><p>  5.4程序清單17</p><p><b>  一、序言</b></p><

5、p>  自動控制在日常生活中的應(yīng)用非常廣泛,大到航天航空,小到家用電器都會涉及到自動控制。自動控制系統(tǒng)的任務(wù)是使被控對象的被控量跟隨給定值的變化而變化。閉環(huán)控制系統(tǒng)是一種最基本的自動控制系統(tǒng),圖1是單回路閉環(huán)控制系統(tǒng)的框圖。變送器(含測量元件)對被控量C進行測量,并將其變換為電信號,經(jīng)A/D轉(zhuǎn)換為數(shù)字信號后反饋給控制器??刂破鲗⒎答佇盘柵c給定值R進行比較,并根據(jù)指定的控制規(guī)律產(chǎn)生相應(yīng)的控制信號,經(jīng)D/A轉(zhuǎn)換后作用于被控對象,使被控

6、量與給定值保持一致。</p><p>  圖1.1 單回路閉環(huán)控制系統(tǒng)框圖</p><p><b>  二、設(shè)計步驟</b></p><p>  2.1 確定基本設(shè)計目標</p><p>  仔細研讀了設(shè)計任務(wù)書后,我們確認了本次課程設(shè)計需要實現(xiàn)的基本任務(wù)目標有:</p><p> ?。?)搭建一

7、個二階環(huán)節(jié);</p><p> ?。?)示波器能夠顯示輸出曲線;</p><p>  (3)要求設(shè)計人機交互接口,參數(shù)可隨時設(shè)置;</p><p><b>  (4)精度要求。</b></p><p>  2.2 確定基本實現(xiàn)方案</p><p>  對比任務(wù)書的要求,我們討論得出了要完成各個基本

8、設(shè)計任務(wù)的初步實現(xiàn)方案:</p><p>  2.2.1 搭建二階環(huán)節(jié)</p><p>  本次課程設(shè)計中,由實驗室提供二階環(huán)節(jié)系統(tǒng)裝置,故不需要我們自己搭建。</p><p>  2.2.2 電路輸出跟蹤階躍信號</p><p>  我們采用實驗箱上的4×4鍵盤作為系統(tǒng)輸入,實驗箱讀取按鍵后,得到一個給定值,系統(tǒng)通過A/D讀取二階

9、環(huán)節(jié)的電壓并與給定值比較,采取控制并將輸出值通過D/A送給二階環(huán)節(jié)。整個過程中需要用的讀鍵程序、D/A、A/D轉(zhuǎn)換程序、LED顯示程序、濾波程序、控制計算程序……</p><p>  2.2.3 設(shè)計人機交互接口(鍵盤)</p><p>  由于任務(wù)要求信號參數(shù)可通過人機交互接口設(shè)置,我們討論后設(shè)計在LED上顯示輸入的信息。通過4×4鍵盤輸入控制信號。按鍵設(shè)置為‘0’到‘9’十個

10、按鍵加上負號、小數(shù)點和確認這三個按鍵。</p><p>  2.2.4 精度要求</p><p>  對于精度≤±5%,調(diào)節(jié)時間≤25秒的設(shè)計要求,我們決定在軟件調(diào)試時通過修改各參數(shù)來完成。</p><p><b>  2.3 硬件設(shè)計</b></p><p>  本次課程設(shè)計中最為重要的硬件設(shè)計任務(wù)是信號數(shù)據(jù)

11、采集系統(tǒng)的搭建。數(shù)據(jù)采集系統(tǒng)是由單片機和硬件接口電路組成,硬件接口電路主要由采樣保持器、A/D轉(zhuǎn)換電路、輸入接口電路、D/A轉(zhuǎn)換電路、控制邏輯電路輸出接口電路等組成。其工作過程是:由機接收電路模擬信號,將模擬信號送到采樣保持電路進行采樣;當單片機啟動A/D轉(zhuǎn)換電路轉(zhuǎn)換時,采樣保持電路處于保持狀態(tài),并把信號送給A/D轉(zhuǎn)換電路實現(xiàn)模擬量到數(shù)字量的轉(zhuǎn)換;A/D轉(zhuǎn)換結(jié)束后,將送出一結(jié)束信號,該信號可產(chǎn)生已中斷請求或供單片機查詢,同時采樣/保持電

12、路進入采樣狀態(tài),單片機由輸入接口電路讀取模擬信號并進行一次轉(zhuǎn)換數(shù)據(jù)。當單片機向D/A轉(zhuǎn)換電路輸出數(shù)據(jù)時,D/A轉(zhuǎn)換電路輸出一個與輸出數(shù)據(jù)對應(yīng)的模擬電壓。硬件電路就是選取合適的電子器件和芯片,設(shè)計成滿足系統(tǒng)速度、精度和可靠性等技術(shù)要求的電路接口,使單片計算機能按要求完成上述工作過程。</p><p>  其次,按鍵鍵盤功能設(shè)計也是重要的,不同的鍵盤設(shè)計帶給編程的難度是不同的,具體功能的體現(xiàn)也是有差別的。</p

13、><p>  本次課程設(shè)計需要用到的硬件系統(tǒng)還有閉環(huán)控制系統(tǒng)。其實閉環(huán)控制系統(tǒng)硬件組成與數(shù)據(jù)采集系統(tǒng)基本相同,主要由模擬輸入通道、模擬輸出通道和被控對象等組成。圖2.3.1就是此次設(shè)計過程中一個很重要的硬件模塊,即二階環(huán)節(jié)系統(tǒng):</p><p>  圖2.3.1 二階環(huán)節(jié)</p><p><b>  2.4 軟件設(shè)計</b></p>

14、<p>  相同于硬件設(shè)計,軟件設(shè)計也大體分為兩個部分,及采集系統(tǒng)和閉環(huán)控制系統(tǒng)。因為此次課程設(shè)計的主要任務(wù)是完成閉環(huán)控制系統(tǒng)的軟件設(shè)計,而且采集系統(tǒng)的軟件設(shè)計可以包括在閉環(huán)控制系統(tǒng)的步驟里。</p><p>  除了必須達到采集系統(tǒng)的要求外,閉環(huán)控制系統(tǒng)的軟件設(shè)計還必須有控制算法程序和更強的數(shù)據(jù)處理能力。其實一個控制系統(tǒng)的控制過程可歸納為以下3個步驟:</p><p>  1.

15、 實時數(shù)據(jù)采集:即對被控參數(shù)的瞬時值進行測量。</p><p>  2. 實時決策:對表征被控對象狀態(tài)的測量值進行分析,并按已定的控制規(guī)律進 行控制。</p><p>  3. 實時控制:根據(jù)決策,實施對控制機構(gòu)發(fā)出控制信號。</p><p>  控制程序的運行必須滿足以上控制過程,同時控制算法是使被控參數(shù)盡快達到給定值,并能將被控參數(shù)隨時

16、間的變化情況在屏幕上顯示出來。</p><p>  參考程序流程圖如圖3 所示。該程序由初始化和數(shù)據(jù)采集,數(shù)據(jù)濾波,標度變換,LED顯示,D/A輸出,控制程序和等子程序構(gòu)成。</p><p><b>  各子程序功能為:</b></p><p>  (1)數(shù)據(jù)采集:連續(xù)采集12個數(shù)據(jù),每采集一個數(shù)據(jù),去掉最前面一個數(shù)據(jù)。</p>

17、<p>  (2)數(shù)字濾波:具體方法是對12個數(shù)據(jù)取平均值</p><p>  (3)標度變換:函數(shù) void symbol()將數(shù)字濾波后的采樣值按比列換成與實際輸入對應(yīng)的模擬電壓毫伏值,然后存放在數(shù)據(jù)緩沖區(qū)。</p><p>  (4)LED顯示:函數(shù)void display()顯示給定值和跟蹤電壓值。</p><p>  (5)控制決策:函數(shù)void

18、 pid()對給定值與真實值的誤差進行比例、積分和微分運算,得到本次控制值,存放在輸出緩沖區(qū)。</p><p>  (6)D/A輸出:D/A輸出程序是將當前輸出緩沖區(qū)數(shù)據(jù)輸出到D/A轉(zhuǎn)換器端口。</p><p>  (7)檢查按鍵:函數(shù)void keyscan()檢查是否有鍵按下,以確定給定值為多少。如有鍵按下,讀取鍵值,是確定鍵鍵就表示輸入完畢。</p><p>

19、  2.5 調(diào)試完善程序</p><p>  相關(guān)硬件及軟件設(shè)計完成后,最后的主要工作就是調(diào)試運行程序,并達到設(shè)計任務(wù)要求的精度。整個過程就是不斷地修改相關(guān)參數(shù)并調(diào)試運行,已達到理想效果。調(diào)試完善程序之后,我們便開始著手撰寫課程設(shè)計報告。</p><p><b>  心得體會</b></p><p>  計算機控制原理的課程設(shè)計剛剛結(jié)束,微型計

20、算機控制的課程設(shè)計接踵而至。這次我們面對的實際控制對象更接近于我們的生活了,我突然感覺到了我積累了的知識終于有了用武之地了。我很興奮,但興奮的同時我也感覺得到此次課程設(shè)計的重要性,眼前的難題是我們分到了單片機類型的控制。雖然平時比較擅長軟件設(shè)計的我此時也感到一絲絲壓力,因為我們小組決定要用已經(jīng)一年多沒有用過的C語言編寫程序,雖然當時我學習C語言的時候很認真。而且我自認為當時學得很不錯的,但畢竟有一年多沒有用了,不經(jīng)有點生疏了。</

21、p><p>  周一,我們滿懷激情的來到了單片機實驗室。我們沒有著急馬上動手做實驗,而是檢查起了我們的實驗設(shè)備是否能正常工作。我們把給的實例程序?qū)懙搅藛纹瑱C里,導線也連接了,當我們運行時,發(fā)現(xiàn)實驗設(shè)備無法正常工作,起初我們還懷疑過是不是實例程序出了問題。同時我們也在認真的檢查我們的線路連接,當然,我們并沒有發(fā)現(xiàn)問題。就這樣,迷迷糊糊的周一就這樣過去了,一點收獲也沒有。</p><p>  周二

22、,我們又調(diào)試了其他實例程序,發(fā)現(xiàn)用lcd顯示的時候,是能夠正常顯示的。但我們問了一下和我們做同一個項目的組員,他們也沒有多大的進展。這下我心里稍微舒緩了一下,然后聽他們說著實驗設(shè)備有些老化,不能得到正確的結(jié)果就可能是這個原因了,我現(xiàn)在也只能這樣想了,我決定先用proteus仿真一下。下午一回到宿舍就開始搭建實驗電路了,但當我用搭建好的實驗電路仿真時,發(fā)現(xiàn)也不能正常的運行。這下我一下子就懵了,我不知道到底是我搭建的電路有問題,還是程序出現(xiàn)

23、了問題。我努力的在網(wǎng)上查找資料,關(guān)于仿真軟件的運用,還有就是查找軟件的錯誤,但到了晚上十點多了,還是沒有找到結(jié)果。</p><p>  周三,沒有任何進展,還是在查找proteus仿真的錯誤,還是沒有任何的進展。很快,到了晚上,有些小組已經(jīng)換到了計算機硬件機房,用另外一套設(shè)備了。到了我們小組抉擇的時候了,我們到底是繼續(xù)選擇留在單片機機房,還是換機房用新的設(shè)備。最后通過小組決定,我們還是決定留下了,我們不能退縮,面

24、對這點困難。但說實話,目前為止我們還是沒有任何進展,此時,不經(jīng)心里有點著急了,一周的課程設(shè)計我們已經(jīng)花了大半的時間了。剩下的兩天時間,我們能做出結(jié)果嗎?我真的無從知曉。</p><p>  周四,我們又來到了單片機機房,今天老師考慮到了導線老化的原因,終于為我們換了一批導線。用新的導線接上,實例程序能正常工作了。我一下子來了精神,當天上午我完成了我的指定任務(wù),調(diào)試也完全沒有問題。我也分配給了小組成員不同的子程序,

25、這樣希望能盡快完成我們的任務(wù),畢竟我們的時間已經(jīng)不多了。下午我們進行了A/D轉(zhuǎn)換模塊的調(diào)試,這模塊的調(diào)試遇到了一些麻煩。到了晚上,A/D模塊仍然沒有任何進展。</p><p>  周五,很早就來到了實驗室,這是我們最后一天了,我們要抓緊時間了,其他小組已經(jīng)陸續(xù)答辯了,這無形給了我們很大的壓力,但是壓力就是動力。到了中午的時候,終于調(diào)試出了A/D模塊功能?,F(xiàn)在主要是PID算法和D/A模塊了,下午我們早早就完成了D/

26、A模塊的調(diào)試,我們不敢休停半刻,我們著手PID的調(diào)試?,F(xiàn)在回想起來,這個模塊是最傷腦筋的模塊了,我們一直調(diào)試到晚上十點了,此時就剩下四組了。最讓我感到溫暖的是,老師也在同我們并肩作戰(zhàn),雖然到最后還是沒有調(diào)試出來,但老師看到我們那依依不舍的樣子,決定星期六再給我們半天的時間。這消息對我們無疑是雪中送炭。</p><p>  周六,花了兩個小時,終于把結(jié)果弄出來了,我們一周的課程設(shè)計也算告一段落了。</p>

27、;<p>  現(xiàn)在總結(jié)一下,我覺得主要是我們定義的數(shù)據(jù)類型出了問題。一開始我們考慮到要用到小數(shù)點,所以定義浮點類型數(shù)據(jù),編譯時發(fā)現(xiàn)地址溢出。我們只能將有些數(shù)據(jù)改為其他類型,但運算時出現(xiàn)了問題。還有就是c語言用負數(shù)計算時,有可能會出錯,最好用正數(shù)進行運算。當然計算時也要考慮數(shù)據(jù)溢出的問題??傊?,通過這次課程設(shè)計,我懂得了如何用軟件實現(xiàn)pid控制,同時對pid的原理也有了更清晰的認識。</p><p>

28、  本次微型計算機控制我們的課程設(shè)計題目是二階環(huán)節(jié)電壓跟蹤控制系統(tǒng)的設(shè)計(采用單片機教學實驗系統(tǒng)的)。由于本次的時間比較緊只有一周的時間,再加上要使用單片機無疑增加了難度。為了能很好的完成任務(wù)小組成員都花了不少時間復習單片機和計算機控制的知識,并自行研究課題設(shè)計如何做。</p><p>  在對題目有一定的了解基礎(chǔ)后我們小組開始展開討論,確定和設(shè)計系統(tǒng)框圖并分配好任務(wù),通力完成。題目要求我們設(shè)計一個控制器輸出作用

29、于電路輸入IN使得電路輸出能夠跟蹤-5~5V范圍內(nèi)的任意階躍信號,這就需要我們的程序設(shè)計中要包含有A/D轉(zhuǎn)換、標度變換、D/A轉(zhuǎn)換、PID控制算法以及顯示與鍵盤等模塊。在明確好各個模塊后我分配到的是標度轉(zhuǎn)換模塊然后協(xié)助其他組員完成其他模塊。</p><p>  微型計算機控制系統(tǒng)在讀入被測模擬信號后需要轉(zhuǎn)換成數(shù)字量,變成操作人員所熟悉的數(shù)值并顯示出來,這就是標度變換模塊所要氣的作用。本次課題我們要A/D轉(zhuǎn)換讀入電

30、壓值并轉(zhuǎn)成0~255中的數(shù)字量。-5~5V的電壓轉(zhuǎn)成0~255相應(yīng)的數(shù)字量我們采用的是線性標度轉(zhuǎn)換,把它帶入相應(yīng)的標度變換公式,再用程序語言表示出來即可,再接下來就是把相應(yīng)的數(shù)字量一位一位分離出來再在LED顯示管上顯示出來。在復習過單片機和計算機控制后很快就完成了這模塊的編程。</p><p>  在經(jīng)過漫長的編程后,終于把每個模塊都初步完成,再接下來我們就一起進行聯(lián)調(diào)。一開始,小錯誤不斷,在我們仔細排錯下對多處

31、地方進行了調(diào)整修改后鍵盤、顯示、A/D轉(zhuǎn)換、D/A轉(zhuǎn)換都能夠順利的工作,但在整塊一起調(diào)試以后我們的結(jié)果卻出不來,我們的PID控制一直沒起到控制的效果,輸出電壓總是維持在5V處,沒有跟隨輸入變化。我們經(jīng)過多次排查甚至多次改控制算法都沒能解決問題的算在。最后我們實在沒辦法,只能請老師來協(xié)助我們。在老師的協(xié)助下我們調(diào)出各個模塊單步調(diào)試,觀察變量變化看是否按照程序在準確執(zhí)行,最終老師幫我們找到了原因:我們都數(shù)據(jù)類型定得太亂了,一會整型一會浮點數(shù)

32、的,計算出來的數(shù)值一直有錯。在老師的建議下我們改動程序,統(tǒng)一把數(shù)值定為整型,解決了我們的困擾。最后我們一起對控制算法進行調(diào)整,先是值進行比例控制確定了一個比較合適的參數(shù),再加入微分環(huán)節(jié)加快了調(diào)節(jié)時間,接著引入積分環(huán)節(jié)消除靜差。</p><p>  在經(jīng)過一周的努力我們成功的完成了課題,并且有不錯的控制效果,輸出在經(jīng)過很多的調(diào)節(jié)時間后進入穩(wěn)定,并且已輸入的誤差只有0.03V左右。在這次課程設(shè)計中我們小組遇到了很多困

33、難,在我們相互幫助團結(jié)協(xié)作下才得以完成。這短短的幾天時間了讓我感受到了團結(jié)合作的重要性,以及遇到困難要敢于沖擊敢于挑戰(zhàn),只有這樣你才能走得跟遠,取得成功。相信在今后的學習生活中這次課程設(shè)計的經(jīng)歷將對我有很大的幫助。</p><p>  在這次短暫的一個星期的學習和設(shè)計中,我和我的隊友們一起合作完成了二階環(huán)節(jié)電壓跟蹤控制系統(tǒng)的設(shè)計任務(wù)。二階環(huán)節(jié)電壓跟蹤控制系統(tǒng)可以用C語言編寫,因此程序簡潔,易于閱讀。在這次課程設(shè)計

34、中,我負責的主要是A/D轉(zhuǎn)換功能的實現(xiàn)和編寫報告。</p><p>  設(shè)計完了程序則該輪到調(diào)試了,各個模塊進行獨立的調(diào)試。調(diào)試是一件很需要耐心的工作,同時也需要相當?shù)淖屑殹R苍S只是稍微寫漏了一句語句也會耽擱相當大的時間。尤其是當設(shè)計者被調(diào)試擾亂了思維的時候更應(yīng)該靜下心來仔細閱讀程序,檢驗自己的邏輯是否有誤。這些都是需要慢慢學習的。</p><p>  這次程序的設(shè)計構(gòu)思沒有多大問題,但是

35、當調(diào)試的時候,總是出現(xiàn)運算的錯誤,經(jīng)老師的指導,才發(fā)現(xiàn)原來不同類型的數(shù)據(jù)運算結(jié)果會出現(xiàn)相當多的問題,這在編程時應(yīng)多加注意。</p><p>  當問題被一個個解決之后,我們終于看到了希望。整個系統(tǒng)能夠跟蹤二階環(huán)節(jié)的電壓。雖然精度還有不足,但我們已經(jīng)向成功邁進。接下來則是對程序進行控制算法的優(yōu)化,減小靜差。</p><p>  總之,在這次的課程設(shè)計中,我學習到了很多的東西,感覺自己終于能夠

36、將所學的知識跟實際應(yīng)用聯(lián)系到了一起。深刻認識到了自己的動手能力以及知識的熟悉程度等方面的欠缺。這還需要進行大量的練習才行。</p><p>  我們組本次計算機控制技術(shù)課程設(shè)計的題目是二階電壓跟蹤控制系統(tǒng)的設(shè)計,我們班采用的是抽簽的方式分配題目,當我們接到這個題目的時候頓時傻眼了。不想選這個題目,原因有兩個:第一,對于這種抽象的控制對象,設(shè)計起來比較枯燥;第二,采用單片機系統(tǒng),也就是要用到忘了很久C語言,這無異于

37、增加了編程的難度。</p><p>  說實話,經(jīng)過一個假期之后,計算機控制技術(shù)和單片機的知識,到現(xiàn)在我已經(jīng)忘得差不多了。本來學習的時候就學得不是很好,為了不拖大家的后腿,我用周末的時間把計算機控制技術(shù)和單片機的書粗略的過了一遍,把支離破碎的知識重新拾起在腦海里。</p><p>  星期一,早上八點半,我們準時來到了實驗室。我們幾個理清了所有的功能和流程,一個上午我們把整個的流程圖畫出來

38、了,再用了下午跟晚上的時間修改整理出來了主程序,和各個模塊的流程圖。第三天,我們把主程序和各個模塊的流程圖用專業(yè)工具畫了出來。然后進行了任務(wù)分工,由于我編程水平一般,所以沒有分配到特別復雜的模塊,我分配到的是PID和DA模塊。</p><p>  乍一看,我的任務(wù)太簡單了,我最初也這么以為,可是當我真正著手干的時候我才發(fā)現(xiàn),各種各樣的問題都來了。</p><p>  首先DA,我是通過老師

39、給的參考程序來學習的,程序很短,只有幾行,可是我怎么也搞不懂那個地址是怎么來的,自己想了很久還是沒有想出來,最終還是通過同學才弄懂了。其次,是PID,PID乍一看一點都不難,只是按書上把公式表達出來就行了,這也是最后最困擾我們的地方,就在這個問題上面我們就弄了兩天,最終拖到星期六才答辯。其實PID我們在程序的思想上面完全沒有問題,包括其他地方也是,大家往往在大的思想上面都不會出錯,小的地方很多時候才是最致命的地方。本次設(shè)計,我(包括我的

40、隊友)犯錯在了變量的類型上了。還好有王老師的幫助,才讓我們從錯誤的泥沼中抽身出來,在這里要特別感謝王老師。在我們組的小錯誤上面花了太多時間,同時我們我們也會總結(jié)經(jīng)驗,爭取以后都不再犯同類型的錯誤。</p><p>  在設(shè)計和調(diào)試的過程中我們遇到了各種各樣的問題,還好我們相互幫助,相互提醒,相互鼓勵,最終完成了這次的設(shè)計。這次的設(shè)計不僅讓我復習了計算機硬件基礎(chǔ)的基本知識,還讓我學會了理論與實際的結(jié)合,最重要的是我

41、體會到了一個團隊的力量。</p><p><b>  四、參考文獻</b></p><p>  【1】《計算機硬件技術(shù)基礎(chǔ)》—楊天怡等主編—重慶大學出版社</p><p>  【2】《計算機硬件技術(shù)基礎(chǔ)實驗教程》—黃勤等主編—重慶大學出版社</p><p>  【3】《單片微型計算機與接口技術(shù)》—李群芳等主編—電子工業(yè)出

42、版社</p><p>  【4】《計算機控制技術(shù)》—王建華等主編—高等教育出版社</p><p><b>  五、附錄</b></p><p><b>  5.1系統(tǒng)框圖</b></p><p><b>  5.2電原理圖</b></p><p>  圖

43、5.2.1 系統(tǒng)電源理圖</p><p><b>  5.3程序流程圖</b></p><p><b>  5.4程序清單</b></p><p>  /******************************************************/</p><p>  /* 文

44、件名: KeyScan.c */</p><p>  /* 功能描述: 控制8255完成鍵盤掃描及數(shù)碼顯示實驗 */</p><p>  /******************************************************/</p><p>  #include<

45、SST89x5x4.h></p><p>  #include<Absacc.h></p><p>  #include<intrins.h> </p><p>  #include<stdio.h> </p><p>  #define C8255_A XBYTE[0x7FFC]

46、 //8255端口地址定義</p><p>  #define C8255_B XBYTE[0x7FFD]</p><p>  #define C8255_C XBYTE[0x7FFE]</p><p>  #define C8255_CON XBYTE[0x7FFF]</p><p>  #define ad5

47、74_0 XBYTE[0x7f00]</p><p>  #define ad574_1 XBYTE[0x7f08]</p><p><b>  //數(shù)碼管顯示編碼</b></p><p>  unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x0

48、7,0x7f,0x6f,</p><p>  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,</p><p>  0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87,0xff,0xef,</p><p>  0x40,0x5c,0x1c,0x78}; //40為

49、負號</p><p><b>  //顯示緩沖</b></p><p>  unsigned char b[] = {11, 11, 11,11, 11, 11};</p><p>  unsigned char c[]= {0x5c,0x1c,0x78}; //顯示out 超出范圍</p><p&g

50、t;  unsigned char d[]={0,0,0,0,0,0}; //傳遞真實值float set_value</p><p>  //unsigned int e[11]={0};</p><p>  unsigned char f[3]={0}; //存取個十百數(shù)據(jù)</p><p&

51、gt;  unsigned char key_down;</p><p>  unsigned char key_value;</p><p>  unsigned char key_count;</p><p>  unsigned char key_v_mflag=0;</p><p>  unsigned char key_v_pfla

52、g=0; //小數(shù)點和負號標志</p><p>  sbit da_cs=P2^0;</p><p>  sbit da_wr=P2^1;</p><p>  long int advalue;</p><p>  long int set_value=-2000;</p><p

53、>  long int sym_fruit;</p><p>  long int ad_fruit;</p><p>  long int ek,ek1,eki,ekd;</p><p>  long int out;</p><p>  long int adv_fruit;

54、 //求取12次轉(zhuǎn)換結(jié)果</p><p>  int kp=1,kd=5,ki=1;</p><p>  void display();</p><p>  void delay(unsigned int time);</p><p>  void clear();</p><p>  void writebuffer

55、();</p><p>  void getkey(); //得到按鍵值</p><p>  void cmp_value();</p><p>  void keyscan(); //按鍵掃描函數(shù)</p><p>  void confirm_val

56、ue();</p><p>  void adcge();</p><p>  void adcge12();</p><p>  void symbol(); //標度變變換</p><p>  void adave();</p><p>  //////

57、//////////////////////////////中斷服務(wù)程序</p><p>  void int_timer0() interrupt 1</p><p><b>  {</b></p><p>  TH0 = 0xb1; //初始化定時器0</p><p>  TL0

58、= 0xe0;</p><p>  display();</p><p><b>  clear();</b></p><p><b>  }</b></p><p>  /////////////////////////////////ad574</p><p>  voi

59、d symbol() //標度變變換</p><p><b>  { </b></p><p>  sym_fruit=advalue*625;</p><p>  sym_fruit=sym_fruit/256;</p><p>  sym_fruit=sym_frui

60、t-5000;</p><p>  ad_fruit=sym_fruit;</p><p>  if(sym_fruit>=0)</p><p>  { b[2]=11;</p><p>  sym_fruit/=100;</p><p>  b[0]=(char)sym_fruit%10;</p>

61、<p>  sym_fruit/=10;</p><p>  b[1]=(char)sym_fruit%10; </p><p>  b[1]+=20; //將第三位加上小數(shù)點 </p><p><b>  }</b></p><p><b>  el

62、se</b></p><p>  { sym_fruit*=-1; //要將負數(shù)變?yōu)檎龜?shù),否則顯示會出錯</p><p>  sym_fruit/=100;</p><p>  b[0]=(char)sym_fruit%10;</p><p>  sym_fruit/=10;</p>

63、<p>  b[1]=(char)sym_fruit%10;</p><p>  b[1]+=20; //將第三位加上小數(shù)點</p><p><b>  b[2]=30;</b></p><p><b>  }</b></p><p><

64、;b>  }</b></p><p>  void adcge()</p><p><b>  {</b></p><p>  unsigned char Hbyte, Lbyte;</p><p>  delay(100);</p><p>  Hbyte = ad574_0

65、; // 讀取AD轉(zhuǎn)換結(jié)果的高8位</p><p>  Lbyte = ad574_1; // 讀取AD轉(zhuǎn)換結(jié)果的低8位</p><p>  advalue = (((unsigned int)Hbyte)<<4)|((Lbyte&0xf0)>>4);// 轉(zhuǎn)換結(jié)果</p>

66、;<p><b>  }</b></p><p>  void pid()</p><p>  { ekd=ek;</p><p>  ek=set_value-ad_fruit; //ek</p><p><b>  eki+=ek;</b></p><p&

67、gt;  ek1=ek*kp*0.8+ki*eki*0.001+kd*(ek-ekd);</p><p>  if(ek1>5000)</p><p><b>  ek1=5000;</b></p><p>  if(ek1<-5000)</p><p>  ek1=-5000;</p><

68、;p>  out=(ek1+5000);</p><p>  out=out*255;</p><p>  out/=10000; </p><p><b>  da_cs=0;</b></p><p><b>  da_wr=0;</b></p><p>  P1=(

69、char)(out); </p><p><b>  }</b></p><p>  void display()</p><p><b>  {</b></p><p>  unsigned char i, j = 0xDF;</p><p>  for(i=0; i

70、<6; i++)</p><p><b>  {</b></p><p>  C8255_A = 0xFF;</p><p>  C8255_B = a[b[i]]; //查表輸出顯示</p><p>  C8255_A = j;</p><p>

71、;  delay(0x100);</p><p>  j = (j>>1)|(j<<7);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void delay(unsigned int time)</p>&

72、lt;p><b>  {</b></p><p>  unsigned int i;</p><p>  for(i=0; i<time; i++);</p><p><b>  }</b></p><p>  void keyscan()

73、 //按鍵掃描函數(shù)</p><p><b>  {</b></p><p>  unsigned char cc;</p><p>  C8255_A = 0x00; //X1~X4 </p><p>  cc=C8255_C;

74、 //得到Y(jié)1~Y4的值</p><p>  key_down = (~cc) & 0x0f;</p><p><b>  }</b></p><p>  void clear() //清屏</p><p><b> 

75、 {</b></p><p>  C8255_B = 0x00;</p><p><b>  }</b></p><p>  void writebuffer()</p><p><b>  {</b></p><p>  keyscan();</p>

76、<p>  while(key_down) //鍵盤消抖</p><p><b>  {</b></p><p>  key_down=1;</p><p>  keyscan();</p><p><b>  }</b></p>

77、<p><b>  }</b></p><p>  void getkey() //得到按鍵值</p><p><b>  {</b></p><p>  unsigned char value;</p><p>  unsigned c

78、har i, j = 0xFE;</p><p>  for(i=0; i<4; i++)</p><p><b>  {</b></p><p>  C8255_A = j;</p><p>  value = C8255_C;</p><p>  if(!(value & 0x0

79、1)) //行1</p><p><b>  {</b></p><p>  key_value = i + 0;</p><p>  writebuffer();</p><p><b>  return;</b></p><p

80、><b>  }</b></p><p>  if(!(value & 0x02)) //行2</p><p><b>  {</b></p><p>  key_value = i + 4;</p><p>  writebuffer

81、();</p><p><b>  return;</b></p><p><b>  }</b></p><p>  if(!(value & 0x04)) //行3</p><p><b>  {</b></p>

82、<p>  key_value = i + 8;</p><p>  writebuffer();</p><p><b>  return;</b></p><p><b>  }</b></p><p>  if(!(value & 0x08))

83、 //行4</p><p><b>  {</b></p><p>  key_value = i + 12;</p><p>  writebuffer();</p><p><b>  return;</b></p><p><b>  }<

84、;/b></p><p><b>  j <<= 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void cmp_value()</p><p><b>  

85、{</b></p><p>  if(key_count==2)</p><p><b>  { </b></p><p>  key_count=5;</p><p><b>  b[5]=11;</b></p><p><b>  b[4]=11;&

86、lt;/b></p><p><b>  b[3]=11;</b></p><p>  key_v_mflag=0;</p><p>  key_v_pflag=0;</p><p><b>  }</b></p><p>  if(key_value>=0&am

87、p;&key_value<=9)</p><p><b>  {</b></p><p>  b[key_count]=key_value; //0~9的數(shù)就直接賦值</p><p>  d[key_count]=key_value;</p><p>  key_count--;<

88、/p><p><b>  }</b></p><p>  if(key_value==11&&key_count==5) //第一次輸入負號,且在最高位</p><p><b>  {</b></p><p>  b[key_count--]=30;</p&

89、gt;<p>  key_v_mflag=1; //負號標志</p><p><b>  }</b></p><p>  if(key_value==10&&key_v_pflag==0) //第一次輸入小數(shù)點</p><p><b>  {<

90、/b></p><p>  key_v_pflag=1; //小數(shù)點標志</p><p>  if(b[++key_count]==30) //前面一位為負號</p><p><b>  {</b></p><p>  b[--key_count]=20

91、; //自動補上0.</p><p>  key_count--;</p><p><b>  }</b></p><p>  else if( --key_count==5&&b[key_count]==11) //如果第一次輸入小數(shù)點就0.</p><p><b>  {

92、</b></p><p>  b[key_count--]=20;</p><p><b>  }</b></p><p>  Else </p><p><b>  {</b></p><p>  b[++key_count]+=20;

93、//將前面一個數(shù)自動加上小數(shù)點</p><p>  key_count--; </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void confirm_

94、value()</p><p><b>  { </b></p><p>  char h,k;</p><p>  if(b[5]==30) //最高位有負號</p><p><b>  {</b></p><p>  i

95、f(b[4]==0||b[4]==20) //第四位為0或0.</p><p>  set_value=d[3]*(100); </p><p><b>  else</b></p><p>  set_value=d[4]*1000+d[3]*(100);</p><p>  set_val

96、ue=0-set_value;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  set_value=d[5]*1000+d[4]*100+d[3]*10;</p>&

97、lt;p><b>  }</b></p><p>  if(set_value<-5000||set_value>5000) //判斷是否超出范圍</p><p><b>  {</b></p><p>  for(h=5,k=31;h>2;h--)</p><p&

98、gt;<b>  {</b></p><p><b>  b[h]=k++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>&l

99、t;p>  void main()</p><p><b>  {</b></p><p>  C8255_CON = 0x81; //8255初始化</p><p>  key_count = 5;</p><p>  //////////////////////// 中斷服務(wù)

100、程序</p><p>  TH0 = 0xb1; //初始化定時器0</p><p>  TL0 = 0xe0;</p><p>  TMOD = 0x01;</p><p>  TCON = 0x10; //啟動定時器,</p><p>  IE=0x82;

101、 //開總中斷,定時器0和int0</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  ad574_0=0;</p><p>  keyscan(); //按鍵掃描</p><p>  if(k

102、ey_down) //判是否有鍵按下</p><p><b>  { </b></p><p>  delay(400);</p><p>  getkey(); //得到按鍵值 </p><p>  if(key_value>=0&&key_value<=11)&

103、lt;/p><p>  cmp_value();</p><p>  if(key_value==12)</p><p>  confirm_value(); //判斷是否按下確定鍵</p><p><b>  }</b></p><p><b>  adcge();</b&g

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論