基于單片機的智能壓力檢測系統的設計
摘要
壓力是工業生產過程中的重要參數之一。壓力的檢測或控制是保證生產和設備安全運行必不可少的條件。實現智能化壓力檢測系統對工業過程的控制具有非常重要的意義。本設計主要通過單片機及專用芯片對傳感器所測得的模擬信號進行處理,使其完成智能化功能。介紹了智能壓力傳感器外圍電路的硬件設計,并根據硬件進行了軟件編程。
本次設計是基于AT89C51單片機的測量與顯示。是通過壓力傳感器將壓力轉換成電信號,再經過運算放大器進行信號放大,送至8位A/D轉換器,然后將模擬信號轉換成單片機可以識別的數字信號,再經單片機轉換成LED顯示器可以識別的信息,最后顯示輸出。而在顯示的過程中通過鍵盤,向計算機系統輸入各種數據和命令,讓單片機系統處于預定的功能狀態,顯示需要的值。
本設計的最終結果是,將軟件下載到硬件上調試出來了需要顯示的數據,當輸入的模擬信號發生變化的時候,通過A/D轉換后,LED將顯示不同的數值。
目錄
摘要
Abstract
第一章 緒論
11 研究背景
12 基于單片機的智能壓力檢測的原理
121 壓力的概念
122 測量壓力的意義
第二章 基于單片機的智能壓力檢測系統的硬件設計
21 壓力傳感器
211 壓力傳感器的選擇
212金屬電阻應變片的工作原理
213 電阻應變片的基本結構
214 電阻應變片的測量電路
22 信號放大電路
212 放大器的選擇
224 三運放大電路
23 A/D轉換器
231 A/D轉換模塊器件選擇
232 A/D轉換器的簡介
233 配置位說明
234 ADC0832工作時序圖
233 單片機對ADC0832的控制原理
24 單片機
241 AT89C51單片機簡介
242主要特性
243 管腳說明
245 芯片擦除
25 單片機于鍵盤的接口技術
251 鍵盤功能及結構概述
252 鍵盤抖動及去除
253 單片機與鍵盤的連接
26 LED顯示接口
261發光二極管及LED顯示器
262七段數碼顯示器
263 LED數碼管靜態顯示接口
第三章 軟件設計
31 A/D轉換器的軟件設計
311 ADC0832芯片接口程序的編寫
32 單片機與鍵盤的接口程序設計
34 LED數碼管顯示程序設計
第四章 總結
參考文獻
附錄A
附錄B
致謝
第一章 緒論
1.1 研究背景近年來,隨著微型計算機的發展,他的應用在人們的工作和日常生活中越來越普遍。工業過程控制是計算機的一個重要應用領域。其中由單片機構成的嵌入式系統已經越來越受到人們的關注。現在可以毫不夸張的說,沒有微型計算機的儀器不能稱為先進的儀器,沒有微型計算機的控制系統不能稱其為現代控制系統的時代已經到來。 壓力測量對實時監測和安全生產具有重要的意義。在工業生產中,為了高效、安全生產,必須有效控制生產過程中的諸如壓力、流量、溫度等主要參數。由于壓力控制在生產過程中起著決定性的安全作用,因此有必要準確測量壓力。為了測到不同位置的壓力值,本次設計為基于單片機智能壓力測量系統。通過壓力傳感器將需要測量的位置的壓力信號轉化為電信號,再經過運算放大器進行信號放大,送至8位A/D轉換器,然后將模擬信號轉換成單片機可以識別的數字信號,再經單片機轉換成LED顯示器可以識別的信息,最后顯示輸出。基于單片機的智能壓力檢測系統,選擇的單片機是基于AT89C51單片機的測量與顯示,將壓力經過壓力傳感器變為電信號,再通過三運放放將電信號放大為標準信號為0-5V的電壓信號,然后進入A/D轉換器將模擬量轉換為數字量,我們所采樣的A/D轉換器為ADC0832,ADC0832為8位分辨率A/D轉換芯片,其最高分辨可達256級,可以適應一般的模擬量轉換要求。其內部電源輸入與參考電壓的復用,使得芯片的模擬電壓輸入在0~5V之間。芯片轉換時間僅為32μS,據有雙數據輸出可作為數據校驗,以減少數據誤差,轉換速度快且穩定性能強。獨立的芯片使能輸入,使多器件掛接和處理器控制變的更加方便。通過DI數據輸入端,可以輕易的實現通道功能的選擇。 正常情況下ADC0832與單片機的接口應為4條數據線,分別是CS、CLK、DO、DI。但由于DO端與DI端在通信時并未同時有效并與單片機的接口是雙向的,所以電路設計時可以將DO和DI并聯在一根數據線上使用。 為了提高單片機系統I/O口線的利用效率,利用單片機AT87C51的串行口和串行移位寄存器74LS164擴展輸出多位LED顯示. 鍵盤是單片機系統實現人機對話的常用輸入設備。我們通過鍵盤,向計算機系統輸入各種數據和命令,亦可通過使用鍵盤,讓單片機系統處于預定的功能狀態。要想實現壓力的顯示需硬件與軟件配合,最終調試出來。 1.2 基于單片機的智能壓力檢測的原理 本次設計是以單片機組成的壓力測量,系統中必須有前向通道作為電信號的輸入通道,用來采集輸入信息。壓力的測量,需要傳感器,利用傳感器將壓力轉換成電信號后,再經放大并經A/D轉換為數字量后才能由計算機進行有效處理。然后用LED進行顯示,而鍵盤的作用是改變輸入量的系數的。它的原理圖如圖1.1所示。 
圖1.1 壓力測量儀表原理方框圖
我們這次主要做的是A/D轉換,單片機鍵盤和顯示,我們選用的A/D轉換器是ADC0832,單片機為AT89C51,鍵盤為4乘4的鍵盤,顯示為4位數碼管顯示。根據硬件電路編程,調試出來并顯示結果。 1.2.1 壓力的概念壓力是工業生產中的重要參數之一,為了保證生產正常運行,必須對壓力進行測量和控制,但需說明的是,這里所說的壓力,實際上是物理概念中的壓強,即垂直作用在單位面積上的力。 在壓力測量中,常用絕對壓力、表壓力、負壓力或真空度之分。所謂絕對壓力是指被測介質作用在容器單位面積上的全部壓力,用符號pj表示。用來測量絕對壓力的儀表稱為絕對壓力表。地面上的空氣柱所產生的平均壓力稱為大氣壓力,用符號pq表示。用來測量大氣氣壓力的儀表叫氣壓表。絕對壓力與大氣壓力之差。稱為表壓力,用符號pb表示。即pb=pj-pq。當絕對壓力值小于大氣壓力值時,表壓力為負值(即負壓力),此負壓力值的絕對值,稱為真空度,用符號pz表示。 壓力是工業生產中的重要參數,如高壓容器的壓力超過額定值時便是不安全的,必須進行測量和控制。在某些工業生產過程中,壓力還直接影響產品的質量和生產效率,如生產合成氨時,氮和氫不僅須在一定的壓力下合成,而且壓力的大小直接影響產量高低。此外,在一定的條件下,測量壓力還可間接得出溫度、流量和液位等參數。 1643年,意大利人托里拆利首先測定標準的大氣壓力值為760毫米汞柱,奠定了液柱式壓力測量儀表的基礎。1847年,法國人波登制成波登管壓力表,由于結構簡單、實用,很快在工業中獲得廣泛應用,一直是常用的壓力測量儀表。 二十世紀上半葉出現了遠傳壓力表和電接點壓力表,從而解決了壓力測量值的遠距離傳送和壓力的報警、控制等問題。60年代以后,為適應工業控制、航空工業和醫學測試等方面的要求,壓力測量儀表日益向體積輕巧、耐高溫、耐沖擊、耐振動和數字顯示等方向發展。 1.2.2 測量壓力的意義壓力是過程生產中四大重要參數之一,它在檢測生產過程能否完全可靠正常運行的重要參數指標,尤其在化工生產過程中壓力這一參數更顯得尤為重要。 在化工生產過程中,壓力即影響物料平衡,也影響化學反應速速,是標志生產過程能否正常進行的重要參數。 安全生產的需要,從確保安全生產的角度,壓力檢測也是非常重要的。如:確保壓力容器內的壓力在安全指標之內,確保易燃易爆介質的壓力不超標。 在其他工業生產中壓力檢測于控制也非常重要。常可見到一些工業裝置上都有壓力表。如:汽包壓力,當壓力過高容易爆炸,壓力低動力不足;還有爐膛壓力;一般維持在0mmH2O,高了爐門縫冒煙塵,低了膛內出現負壓降低溫度。若維持在10 mmH2O,節能20%。 壓力也是間接測量物位的手段,用孔板測量流量僅能產生差壓,而這個差壓考壓力檢測的方法來測取才能最終求出流量。液面的高度可以靠測取壓力的大小來表示。 總之,壓力檢測是一般成產過程所不可缺少的環節,只有按工藝要求保持壓力的穩定,才能維持生產的正常進行。所以壓力準確測量在實際過程是非常重要的。
第二章 基于單片機的智能壓力檢測系統的硬件設計
2.1 壓力傳感器
2.1.1 壓力傳感器的選擇壓力傳感器是壓力檢測系統中的重要組成部分,由各種壓力敏感元件將被測壓力信號轉換成容易測量的電信號作輸出,給顯示儀表顯示壓力值,或供控制和報警使用。力學傳感器的種類繁多,如電阻應變片壓力傳感器、半導體應變片壓力傳感器、壓阻式壓力傳感器、電感式壓力傳感器、電容式壓力傳感器諧振式壓力傳感器及電容式加速度傳感器等。 而電阻應變式傳感器具有悠久的歷史。由于它具有結構簡單、體積小、使用方便、性能穩定、可靠、靈敏度高動態響應快、適合靜態及動態測量、測量精度高等諸多優點,因此是目前應用最廣泛的傳感器之一。電阻應變式傳感器由彈性元件和電阻應變片構成,當彈性元件感受到物理量時,其表面產生應變,粘貼在彈性元件表面的電阻應變片的電阻值將隨著彈性元件的應變而相應變化。通過測量電阻應變片的電阻值變化,可以用來測量位移加速度、力、力矩、壓力等各種參數。 2.1.2金屬電阻應變片的工作原理應變式壓力傳感器是把壓力的變化轉換成電阻值的變化來進行測量的,應變片是由金屬導體或半導體制成的電阻體,是一種將被測件上的應變變化轉換成為一種電信號的敏感器件。它是壓阻式應變傳感器的主要組成部分之一。電阻應變片應用最多的是金屬電阻應變片和半導體應變片兩種。金屬電阻應變片又有絲狀應變片和金屬箔狀應變片兩種。通常是將應變片通過特殊的粘和劑緊密的粘合在產生力學應變基體上,當基體受力發生應力變化時,電阻應變片也一起產生形變,使應變片的阻值發生改變,從而使加在電阻上的電壓發生變化。這種應變片在受力時產生的阻值變化通常較小,一般這種應變片都組成應變電橋,并通過后續的儀表放大器進行放大,再傳輸給處理電路(通常是A/D轉換和CPU)顯示或執行機構。其阻值隨壓力所產生的應變而變化。金屬電阻應變片的工作原理是吸附在基體材料上應變電阻隨機械形變而產生阻值變化的現象,俗稱為電阻應變效應。對于金屬導體,如圖2.1所示,一段圓截面的導線的金屬絲,設其長為L,截面積為A(直徑為D) ,原始電阻為R,金屬導體的電阻值可用下式表示: R=ρL∕A (2.1) 式中:ρ——金屬導體的電阻率(Ω·cm2/m) S——導體的截面積(cm2) L——導體的長度(m) 
圖2.1 金屬電阻絲應變效應 當金屬絲受到軸向力 F而被拉伸或壓縮產生形變 ,其電阻值會隨之變化 ,通過對(2.1)式兩邊取對數后再取全微分得: (2.2) 式中 為材料軸向線應變 ,且 跟據材料力學 ,在金屬絲單向受力狀態下 ,有 (2.3)
式中μ為導體材料的泊松比。因此 ,有 (2.4)
試驗發現 ,金屬材料電阻率的相對變化與其體的相對變化間的關系為 (2.5)
式中 , c為常數(由一定的材料和加工方式決定) 將式 (2.5)代入 (2.4) ,且當ΔR=R時 ,可得 (2.6)
式中,k=(1+2µ)+c(1-2µ)為金屬絲材料的應變靈敏系數。 上式表明 ,金屬材料電阻的相對變化與其線應變成正比。這就是金屬材料的應變電阻效應。 電阻變化率 △R/R 的表達式為:K=ΔR/Rµ/ε,式中μ—材料的泊松系數;ε—應變量。 當金屬絲受外力作用時,其長度和截面積都會發生變化,從上式中可很容易看出,其電阻值即會發生改變,假如金屬絲受外力作用而伸長時,其長度增加,而截面積減少,電阻值便會增大。當金屬絲受外力作用而壓縮時,長度減小而截面增加,電阻值則會減小。只要測出加在電阻的變化(通常是測量電阻兩端的電壓),即可獲得應變金屬絲的應變情。 2.1.3 電阻應變片的基本結構電阻應變片主要由四部分組成。如圖 2.2所示 ,電阻絲是應變片敏感元件;基片、覆蓋片起定位和保護電阻絲的作用,并使電阻絲和被測試件之間絕緣;引 出線用以連接測量導線。 
圖 2.2 電阻應變片的基本結構 2.1.4 電阻應變片的測量電路應變片可以將應變轉換為電阻的變化,為了顯示于記錄應變的大小,還要將電阻的變化再轉換為電壓或電流的變化,因此需要有專用的測量電路,通常采用直流電橋和交流電橋。 2.1.4.1電橋電路的工作原理由于應變片的電橋電路的輸出信號一般比較微弱,所以目前大部分電阻應變式傳感器的電橋輸出端與直流放大器相連,如圖2.3所示。
圖2.3直流電橋 設電橋的各臂的電阻分別為R1R3R2R4 它們可以全部或部分是應變片。由于直流放大器的輸入電阻比電橋電阻大的多,因此可將電橋輸出端看成開路,這種電橋成為電壓輸出橋,輸出電壓U0為 U0= (2.7) 由上式可見:若R1R3=R2R4,則輸出電壓必為零,此時電橋處于平衡狀態,稱為平衡電橋。 平衡電橋的平衡條件為: R1R3=R2R4 應變片工作時,其電阻變化ΔR,此時有不平衡電壓輸出。  (2.8)
由式(2.8)表明:ΔR《 R1 時,電橋的輸出電壓于應變成線性關系。若相鄰兩橋臂的應變極性一致,即同為拉應變活壓應變時,輸出電壓為兩者之差,若不同時,則輸出電壓為兩者之和。若相對兩橋臂的極性一直,輸出電壓為兩者之和,反之則為兩者之差。 電橋供電電壓U越高,輸出電壓U0 越大,但是,當U大時,電阻應變片通過的電流也大,若超過電阻應變片所允許通過的最大工作電流,傳感器就會出現蠕變和零漂。基于這些原因可以合理的進行溫度補償和提高傳感器的測量靈敏度。 2.1.4.2 非線性誤差及溫度補償由式(2.8)的線性關系是在應變片的參數變化很小,極ΔR《 R1 的情況下得出的,若應變片承受的壓力太大,則上述假設不成立,電橋的輸出電壓應變之間成非線性關系。在在這種情況下,用按線性關系刻度的儀表進行測量必然帶來非線性誤差。為了消除非線性誤差,在實際應用中,常采用半橋差動或全橋差動電路,如圖2.4所示,以改善非線性誤差和提高輸出靈敏度。  
UU (a)半橋差動電路 (b) 全橋差動電路 圖2.4 差動電橋
圖2.4(a)為半橋差動電路,在傳感器這中經常使用這種方法。粘貼應變片時,使兩個應變片一個受壓,一個受拉。應變符號相反,工作時將兩個應變片接入電橋的相鄰兩臂。設電橋在初始時所示平衡的,且為等臂電橋,考慮到ΔR=ΔR1=ΔR2 則得半橋差動電路的輸出電壓為 (2.9)
由上式可見,半橋差動電路不僅可以消除非線性誤差,而且還使電橋的輸出靈敏度提高了一倍,同時還能起到溫度補償的作用。如果按圖2.4(b)所示構成全橋差動電路同樣考慮到 ΔR=ΔR1=ΔR2=ΔR3=ΔR4時得全橋差動電路的輸出電壓為 (2.10) 可見,全橋的電壓靈敏度比單臂工作時的靈敏度提高了4倍非線性誤差也得到了消除,同時還具有溫度補償的作用,該電路也得到了廣泛的應用。 2.2 信號放大電路2.1.2 放大器的選擇被測的非電量經傳感器得到的電信號幅度很小,無法進行A/D轉換,必須對這些模擬電信號進行放大處理。為使電路簡單便于調試,本設計采用三運算放大器,因為在具有較大共模電壓的條件下,儀表放大器能夠對很微弱的差分電壓信號進行放大,并且具有很高的輸入阻抗。這些特性使其受到眾多應用的歡迎,廣泛用于測量壓力和溫度的應變儀電橋接口、熱電耦溫度檢測和各種低邊、高邊電流檢測。 2.2.4 三運放大電路本次設計的放大器采用了三運放,因為它具有高共模抑制比的放大電路。它由三個集成運算放大器組成,如圖2.5所示。 
2.5 三運放高共摸抑制比放大電路 其中A1和A2為兩個性能一致(主要指輸入阻抗,共模抑制比和增益)的同相輸入通用集成運算放大器,構成平衡對稱差動放大輸入級,A3構成雙端輸入單端輸出的輸出級,用來進一步抑制A1和A2的共模信號,并適應接地負載的需要。由于每個放大器求和點的電壓等于施加在各自正輸入端的電壓,因此,整個差分輸入電壓現在都呈現在RG兩端。因為輸入電壓經過放大后(在A1 和A2的輸出端)的差分電壓呈現在R5,RG和R6這三只電阻上,所以差分增益可以通過僅改變RG進行調整。 這種連接有另外一個優點:一旦這個減法器電路的增益用比率匹配的電阻器設定后,在改變增益時不再對電阻匹配有任何要求。如果R5 = R6,R1= R3和R2 = R4,則VOUT = (VIN2-VIN1)(1+2R5/RG)(R2/R1)。 由于RG兩端的電壓等于VIN,所以流過RG的電流等于VIN/RG,因此輸入信號將通過A1 和A2 獲得增益并得到放大。然而須注意的是對加到放大器輸入端的共模電壓在RG兩端具有相同的電位,從而不會在RG上產生電流。由于沒有電流流過RG(也就無電流流過R5和R6),放大器A1 和A2 將作為單位增益跟隨器而工作。因此,共模信號將以單位增益通過輸入緩沖器,而差分電壓將按〔1+(2 RF/RG)〕的增益系數被放大。這也就意味著該電路的共模抑制比相比與原來的差分電路增大了〔1+(2 RF/RG)〕倍。
在理論上表明,得到所要求的前端增益(由RG來決定),而不增加共模增益和誤差,即差分信號將按增益成比例增加,而共模誤差則不然,所以比率〔增益(差分輸入電壓)/(共模誤差電壓)〕將增大。因此CMR理論上直接與增益成比例增加,這是一個非常有用的特性。
最后,由于結構上的對稱性,輸入放大器的共模誤差,如果它們跟蹤,將被輸出級的減法器消除。這包括諸如共模抑制隨頻率變換的誤差。 2.3 A/D轉換器模擬量輸入通道的任務是將模擬量轉換成數字量。能夠完成這一任務的器件稱之為模數轉換器,簡稱A/D轉換器。本次設計的中A/D轉換器的任務是將放大器輸出的模擬信號轉換位數字量進行輸出。 2.3.1 A/D轉換模塊器件選擇目前單片機在電子產品中已得到廣泛應用,許多類型的單片機內部已帶有A/D轉換電路,但此類單片機會比無A/D轉換功能的單片機在價格上高幾元甚至很多,我們采用一個普通的單片機加上一個A/D轉換器,實現A/D轉換的功能,這里A/D轉換器可選ADC0832、ADC0809等;串行和并行接口模式是A/D轉換器諸多分類中的一種,但卻是應用中器件選擇的一個重要指標。在同樣的轉換分辨率及轉換速度的前提下,不同的接口方式會對電路結構及采用周期產生影響。對A/D轉換器的選擇我們通過比較ADC0809和ADC0832來決定。這兩個轉換器都是常見的A/D轉換器,其中ADC0809的并行接口A/D轉換器,ADC0832是串行接口A/D轉換器。我們所做的設計選擇ADC0832,A/D轉換在單片機接口中應用廣泛 ,串行 A/D轉換器具有功耗低、性價比較高、芯片引腳少等特點。 2.3.2 A/D轉換器的簡介在這次設計中我們A/D轉換器選用兩通道輸入的八位ADC0832,ADC0832[3]是美國國家半導體公司生產的一種8 位分辨率、雙通道A/D轉換芯片。由于它體積小,兼容性強,性價比高而深受單片機愛好者及企業歡迎,其目前已經有很高的普及率。ADC0832 為8位分辨率A/D轉換芯片,其最高分辨可達256級,可以適應一般的模擬量轉換要求。其內部電源輸入與參考電壓的復用,使得芯片的模擬電壓輸入在0~5V之間。芯片轉換時間僅為32μS,據有雙數據輸出可作為數據校驗,以減少數據誤差,轉換速度快且穩定性能強。獨立的芯片使能輸入,使多器件掛接和處理器控制變得更加方便。通過DI 數據輸入端,可以輕易的實現通道功能的選擇。有關引腳說明如下: • CS 片選使能,低電平芯片使能。 • CH0 模擬輸入通道0,或作為IN+/-使用。 • CH1 模擬輸入通道1,或作為IN+/-使用。 • GND 芯片參考0電位(地)。 • DI 數據信號輸入,選擇通道控制。 • DO 數據信號輸出,轉換數據輸出。 • CLK 芯片時鐘輸入。 • Vcc/REF 電源輸入及參考電壓輸入(復用)。 正常情況下ADC0832 與單片機的接口應為4條數據線,分別是CS、CLK、DO、DI。它的結構示意圖如圖2.6所示。

圖2.6 ADC0832結構示意圖
2.3.3 配置位說明ADC0832工作時,模擬通道的選擇及單端輸入和差分輸入的選擇,都取決于輸入時序的配置位。當差輸入時,要分配輸入通道的極性,兩個輸入通道的任何一個通道都可作為正極或負極。ADC0832的配置位邏輯表如表2.1所示。 表2.1的配置位邏輯表 
表中“+”表示輸入通道的端點為正極性;“-”表示輸入端點為負極性H或L表示高、低電平。輸入配置位時,高位(CH0)在前,低位(CH1)在后。 2.3.4 ADC0832工作時序圖當 CS由高變低時,選中ADC0832 。在時鐘的上升沿,DI 端的數據移入 ADC0832內部的多路地址移位寄存器。在第一個時鐘期間,DI為高,表示啟動位,緊接著輸入兩位配置位。當輸入啟動位和配置位后,選通輸入模擬通道,轉換開始。轉換開始后,經過一個時鐘周期延接著在第一個時鐘周期延遲,以使選定的通道穩定。ADC0832緊接著在第4個時鐘下降沿輸出轉換數據。數據輸出時先輸出最高位(D7~D0)輸出完轉換結果后,又以最低位開始重新遍數據(D7~D0 ),兩次發送的最低位共用。當片選CS為高時,內部所有寄存器清 ,輸出變為高阻態。如果要再進行一次模 數轉換,片選 必須再次從高向低跳變,后面再輸入啟動位和配置位。 
圖2.7 ADC083工作時序圖
2.3.3 單片機對ADC0832的控制原理
圖2.8 ADC0832與單片機的接口電路 正常情況下ADC0832與單片機的接口應為4條數據線,分別是CS、CLK、DO、DI。但由于DO端與DI端在通信時并未同時有效并與單片機的接口是雙向的,所以電路設計時可以將DO和DI并聯在一根數據線上使用。 當ADC0832未工作時其CS輸入端應為高電平,此時芯片禁用,CLK和DO/DI的電平可任意。當要進行A/D轉換時,須先將CS使能端置于低電平并且保持低電平直到轉換完全結束。此時芯片開始轉換工作,同時由處理器向芯片時鐘輸入端CLK輸入時鐘脈沖,DO/DI端則使用DI端輸入通道功能選擇的數據信號。在第1個時鐘脈沖的下沉之前DI端必須是高電平,表示啟始信號。在第2、3個脈沖下沉之前DI端應輸入2位數據用于選擇通道功能。其功能項見表2.2。 表2.2ADC0832的功能表
如表2.2所示,當此2位數據為“1”、“0”時,只對CH0進行單通道轉換。當2位數據為“1”、“1”時,只對CH1進行單通道轉換。當2位數據為“0”、“0”時,將CH0作為正輸入端IN+,CH1作為負輸入端IN-進行輸入。當2位數據為“0”、“1”時,將CH0作為負輸入端IN-,CH1作為正輸入端IN+進行輸入。 到第3個脈沖的下沉之后DI端的輸入電平就失去輸入作用,此后DO/DI端則開始利用數據輸出DO進行轉換數據的讀取。從第4個脈沖下沉開始由DO端輸出轉換數據最高位DATA7,隨后每一個脈沖下沉DO端輸出下一位數據。直到第11個脈沖時發出最低位數據DATA0,一個字節的數據輸出完成。也正是從此位開始輸出下一個相反字節的數據,即從第11個字節的下沉輸出DATD0。隨后輸出8位數據,到第19個脈沖時數據輸出完成,也標志著一次A/D轉換的結束。最后將CS置高電平禁用芯片,直接將轉換后的數據進行處理就可以了。 作為單通道模擬信號輸入時ADC0832的輸入電壓是0~5V且8位分辨率時的電壓精度為19.53mV。如果作為由IN+與IN-輸入的輸入時,可是將電壓值設定在某一個較大范圍之內,從而提高轉換的寬度。在進行IN+與IN-的輸入時,如果IN-的電壓大于IN+的電壓則轉換后的數據結果始終為00H。 2.4 單片機隨著電子技術的發展,單片機的功能將更加完善,因而單片機的應用將更加普及。它們將在智能化儀器、家電產品、工業過程控制等方面得到更廣泛的應用。單片機將是智能化儀器和中、小型控制系統中應用最多的有種微型計算機。 2.4.1 AT89C51單片機簡介AT89C51是一種帶4K字節閃爍可編程可擦除只讀存儲(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機。單片機的可擦除只讀存儲器可以反復擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本,如圖2.9所示。AT89C51單機為很多嵌入式控制系統提供靈活性高且廉價的方案。 
圖2.9 AT89C51單片機的結構示意圖 2.4.2主要特性·與MCS-51 兼容
·4K字節可編程閃爍存儲器
壽命:1000寫/擦循環
數據保留時間:10年
·全靜態工作:0Hz-24Hz
·三級程序存儲器鎖定
·128*8位內部RAM
·32可編程I/O線
·兩個16位定時器/計數器
·5個中斷源
·可編程串行通道
·低功耗的閑置和掉電模式
·片內振蕩器和時鐘電路 2.4.3 管腳說明VCC:供電電壓。 GND:接地。 P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 P3口也可作為AT89C51的一些特殊功能口: P3口管腳 備選功能 P3.0 RXD(串行輸入口) P3.1 TXD(串行輸出口) P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1) P3.4 T0(記時器0外部輸入) P3.5 T1(記時器1外部輸入) P3.6 /WR(外部數據存儲器寫選通) P3.7 /RD(外部數據存儲器讀選通) P3口同時為閃爍編程和編程校驗接收一些控制信號。 RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。 ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,置位無效。 /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。 /EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。 2.4.4 振蕩器特性 XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅動器件,XTAL2應不接。有余輸入至內部時鐘信號要通過一個二分頻觸發器,因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。 2.4.5 芯片擦除整個PEROM陣列和三個鎖定位的電擦除可通過正確的控制信號組合,并保持ALE管腳處于低電平10ms 來完成。在芯片擦操作中,代碼陣列全被寫“1”且在任何非空存儲字節被重復編程以前,該操作必須被執行。 此外,AT89C51設有穩態邏輯,可以在低到零頻率的條件下靜態邏輯,支持兩種軟件可選的掉電模式。在閑置模式下,CPU停止工作。但RAM,定時器,計數器,串口和中斷系統仍在工作。在掉電模式下,保存RAM的內容并且凍結振蕩器,禁止所用其他芯片功能,直到下一個硬件復位為止。 2.5 單片機于鍵盤的接口技術2.5.1 鍵盤功能及結構概述鍵盤是單片機系統實現人機對話的常用輸入設備。操作員通過鍵盤,向計算機系統輸入各種數據和命令,亦可通過使用鍵盤,讓單片機系統處于預定的功能狀態。 鍵盤按照其內部不同電路結構,可分為編碼鍵盤和非編碼鍵盤二種。編碼鍵盤本身除了帶有普通按鍵之外,還包括產生鍵碼的硬件電路。使用時,只要按下編碼鍵盤的某一個鍵,硬件邏輯會自動提供被按下的鍵的鍵碼,使用十分方便,但價格較貴。由非編碼鍵盤組成的簡單硬件電路,僅提供各個鍵被按下的信息,其他工作由軟件來實現。由于價格便宜,而且使用靈活,因此廣泛應用在單片機應用系統中。 非編碼鍵盤按照其鍵盤排列的結構,又可分為獨立式按鍵和行列式按鍵兩種類型。 2.5.2 鍵盤抖動及去除目前各種結構的鍵盤,主要是利用機械觸點的合、斷作用,產生一個電壓信號,然后將這個電信號傳送給CPU。由于機械觸點的彈性作用,在閉合及斷開的瞬間均有抖動過程。抖動時間長短,與開關的機械特性有關,一般約5~10ms之間。圖2.10為閉合及斷開時的電壓抖動波形: 
圖2.10 鍵閉合及斷開時的電壓抖動波形 按鍵的穩定閉合期,由操作人員的按鍵動作所確定,一般為十分之幾秒至幾秒時間。為保證CPU對鍵的一次操作僅作一次輸入處理,必須去除抖動影響及人為的操作時問長短的影響。 通常去抖動影響的措施有硬、軟件兩種;可用基本R-S觸發器或單穩態電路構成硬件去抖動電路如圖2.11所示。也可采用軟件延時的方法除去鍵盤抖動產生的影響。采用軟件除去抖動影響的辦法是,在檢測到有鍵按下時,執行一個10ms左右的延時程序,然后再去判斷該鍵電平是否仍保持閉合狀態電平,如保持閉合狀態電平則可確認該鍵為按下狀態,從而消除了抖動影響。 
圖2.11 RC去抖動電路 2.5.3 單片機與鍵盤的連接鍵盤與單片機的連接在單片機系統中鍵盤中按鈕數量較多時,為了減少I/O口的占用,常常將按鈕排列成矩陣形式,如2.13圖所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鈕加以連接。這樣,一個端口(如P1口)就能組成4*4=16個按鈕,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就能組成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。在實際應用中,4×4鍵盤主要由數字0~9和功能鍵組成。這里給出一個比較常用的鍵盤排列方式,如表2.3所示。 表2.3 按鍵表
按照鍵盤與單片機的連接方式可分為獨立式鍵盤與矩陣式鍵盤。獨立式鍵盤相互獨立,每個按鍵占用一根I/O口線,每根I/O口線上的按鍵工作狀態不會影響其他按鍵的工作狀態。如圖2.12所示這種按鍵軟件程序簡單,但占用I/O口線較多(一根口線只能接一個鍵),適用于鍵盤應用數量較少的系統中。 
圖2.12獨立式按鍵接口電路 于獨立是按鍵接口電路要比較矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些如圖2.13所示。 
圖2.13 單片機矩陣式鍵盤接口電路
上圖中列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鈕沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。具體的識別及編程辦法如下所述。矩陣式鍵盤的按鈕識別辦法 確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鈕識別辦法,如上圖所示鍵盤,介紹過程如下。判斷鍵盤中有無鍵按下 將全部行線Y0-Y3置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鈕之中。若所有列線均為高電平,則鍵盤中無鍵按下。 判斷閉合鍵所在的位置 在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其辦法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鈕就是閉合的按鈕。 2.6 LED顯示接口本次設計是利用89C51單片機串行口和74LS164移位寄存器實現多個LED顯示的一種方法,利用該方法設計的多路LED顯示系統具有硬件結構簡單、軟件編程容易和價格低廉等特點. 2.6.1發光二極管及LED顯示器發光二極管是由半導體發光材料做成的PN結,只要在發光二極管兩端通過正向電流5-20mA就能達到正常發光。LED的發光顏色通常有紅、綠、黃、白,其外形和電氣圖形符號如圖2.14所示。單個LED通常是通過亮、滅來指示系統運行狀態和用快速閃爍來報警。 
aa)外形 b)圖形符號 圖2.14 LED 通常所說的LED顯示器由7個發光二極管組成,因此也稱之為七段LED顯示器,其排列形狀如圖2.15所示。顯示器中還有一個圈點型發光二極管(在圖中以dp表示),用于顯示小數點。通過七個發光二極管亮暗的不同組合,可以顯示多種數字、字母以及其它符號。 LED顯示器中的發光二極管共有兩種連接方法: ·共陽極接法 把發光二極管的陽極連在一起構成公共陽極。使用時公共陽極接+5V。陰極端輸入低電平的段發光二極管導通點亮,輸入高電平的則不點亮。 ·共陰極接法 把發光二極管的陰極連在一起構成公共陰極。使用時會共陰極接地,陽極端輸入高電平的段發光二極管導通點亮,輸入低電平的則不點亮。 
圖2.15 LED顯示 用LED顯示器顯示十六進制數的字型代碼如下表所示: 表2.4 十六進制數字形代碼  2.6.2七段數碼顯示器七段LED顯示器需要由驅動電路驅動。在七段LED顯示器中,共陽極顯示器,用低電平驅動;共陰極顯示器,用高電平驅動。點亮顯示器有靜態和動態兩種方式。 2.6.2.1靜態顯示所謂靜態顯示,就是當顯示器顯示某一字符時,相應段的發光二極管恒定地導通或截止。這種顯示方法的每一位都需要有一個8位輸出口控制。 靜態顯示器的優點是顯示穩定,在發光二極管導通電流一定的情況下顯示器的亮度高,控制系統在運行過程中,僅僅在需要更新顯示內容時,CPU才執行一次顯示更新子程序,這樣大大節省了CPU的時間,提高了CPU的工作效率;缺點是位數較多時,所需的I/O口太多,硬件開銷太大。 
圖2.16 四位靜態顯示電路 2.6.2.2 動態顯示所謂動態顯示就是一位一位地輪流點亮各位顯示器(掃描),對于顯示器的每一位而言,每隔一段時間點亮一次。在同一時刻只有一位顯示器在工作(點亮),利用人眼的視覺暫留效應和發光二極管熄滅時的余輝效應,看到的卻是多個字符“同時”顯示如圖2.17所示。 
圖2.17 四位動態顯示的電路 顯示器亮度既與點亮時的導通電流有關,也與點亮時間和間隔時間的比例有關。調整電流和時間參數,可實現亮度較高較穩定的顯示。 動態顯示器的優點是節省硬件資源,成本較低。但在控制系統運行過程中,要保證顯示器正常顯示,CPU必需每隔一段時間執行一次顯示子程序,占用CPU大量時間,降低了CPU的工作效率,同時顯示亮度較靜態顯示器低。 若顯示器的位數不大于8位,則控制顯示器公共極電位只需一個8位I/O口(稱為掃描口或字位口),控制各位LED顯示器所顯示的字形也需要一個8位口(稱為數據)。 2.6.3 LED數碼管靜態顯示接口在單片機應用系統中,數碼管顯示器顯示常用兩種辦法:靜態顯示和動態掃描顯示。基于LED的優點在本次設計中采用了數碼管的靜態顯示。所謂靜態顯示,就是每一個數碼管顯示器都要占用單獨的具有鎖存功能的I/O接口用于筆劃段字形代碼。這樣單片機只要把要顯示的字形代碼發送到接口電路,就不用管它了,直到要顯示新的數據時,再發送新的字形碼,因此,使用這種辦法單片機中CPU的開銷小。能供給單獨鎖存的I/O接口電路很多,常用的串并轉換電路74LS164,他的電路如圖2.18所示。 
圖2.18 靜態LED顯示電路 MCS-51單片機串行口方式為移們寄存器方式,外接4片74LS164作為4位LED數碼管顯示器的靜態顯示接口,把AT89C51的RXD作為數據輸出線,TXD作為移位時鐘脈沖。74LS164為TTL單向8位移位寄存器,可實現串行輸入,并行輸出。其中A、B(第1、2腳)為串行數據輸入端,2個管腳按邏輯與運算規律輸入信號,共公一個輸入信號時可并接。CLK(第8腳)為時鐘輸入端,可連接到串行口的TXD端。每一個時鐘信號的上升沿加到CLK端時,移位寄存器移一位,8個時鐘脈沖過后,8位二進制數全部移入74LS164中。R(第9腳)為復位端,當R=0時,移位寄存器各位復0,只有當R=1時,時鐘脈沖才起作用。Q1…Q8(第3-6和10-13管腳)并行輸出端分別接LED數碼管顯示器的hg---a各段對應的管腳上。在74LS164獲得時鐘脈沖的瞬間(是在脈沖的下降沿),如果數據輸入端(第1,2管腳)是高電平,則就會有一個1進入到74LS164的內部,如果數據輸入端是低電平,則就會有一個0進入其內部。在給出了8個脈沖后,最先進入74LS164的第一個數據到達了最高位,再來一個脈沖,第一個脈沖就會從最高位移出。 6片7LS164首尾相串,而時鐘端則接在一起,這樣,當輸入8個脈沖時,從單片機RXD端輸出的數據就進入到了第一片74LS164中了,而當第二個8個脈沖到來后,這個數據就進入了第二片74LS164,而新的數據則進入了第一片74LS164,這樣,當第六個8個脈沖完成后,首次送出的數據被送到了最左面的74LS164中,其他數據依次出現在第一、二、三、四、五片74LS164中。
第三章 軟件設計
3.1 A/D轉換器的軟件設計單片機控制系統中通常要用到AD轉換,根據輸出格式,常用的AD轉換方式可分為并行AD和串行AD。并行方式一般在轉換后可直接接收,但芯片的引腳比較多;串行方式所用芯片引腳少,封裝小,但需要軟件處理才能得到所需要的數據。可是單片機I/O引腳本來就不多,使用串行器件可以節省I/O資源。 ADC0832是8位逐次逼近模數轉換器,可支持兩個單端輸入通道和一個差分輸入通道。相同功能的器件還有ADC0834,ADC0838,ADC0831。所不同的是它們的輸入通道數量不同。它們的通道選擇和配置都是通過軟件設置。 3.1.1 ADC0832芯片接口程序的編寫單片機串行工作方式時 ,串行口是作為同步移位寄存器使用。這時以 P3.3端作為數據移位的入口和出口 ,而由P3.6端提供移位時鐘脈沖。單片機串行口方式 0與 ADC0832的接口,單片機P2.0接ADC0832的CS,P3.6接0832的CLK作為時鐘信號輸出端 ,P3.7 接 0832的 DO和DI作為啟動位、配置位的發送端以及 A/D轉換后輸出數據的接收端。由于 ADC0832在 CS變低后的前 3個周期內,DO端為高阻態;轉換開始后 ,DI線禁止 ,因此 ,DI端和 DO端可連接在一起。ADC0832的時鐘頻率最高為 400kHz,單片機晶振可選用 4MHz,在 TXD的輸出頻率為 4MHz/12 =333. 3kHz,符合要求。ADC0832輸出的串行數據共 15位 ,由兩段 8位數據組成 ,前一段是最高位在先 ,后一段是最高在后 ,兩段數據的最低位共用。只有在時鐘的下降沿 ,ADC0832的串行數據才移出一位。由單片機控制時鐘信號的發送 ,并由P3.6發出 ,以達到控制 ADC0832輸出數據位的目的。為了得到一列完整的 8位數據 ,單片機分兩次采集含有不同位的數據 ,再合成一列完整的 8位數據。 ADC0832通過內部多路器來控制選擇通道,處理器的控制命令通過DI引腳輸入。如下流程圖所示,當模擬信號輸入開始后,首先是CS使能信號也就是片選信號有效,這時是低電平有效,如果片選是高電平時停止轉換。當時鐘信號有效時輸入通道的控制字來確定所選擇的通道,讀取數據后就開始將模擬量轉換位數字量,A/D轉換結束后,單片機讀取數值,如果沒轉換完,又回到使能開始。  圖3.1 ADC0832數據讀取程序流程 3.2 單片機與鍵盤的接口程序設計AT89C51單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源+5V,并把列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。檢測當前是否有鍵被按下。檢測的辦法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,不然有鍵閉合。 去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。 若有鍵被按下,應識別出是哪一個鍵閉合。辦法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出: P1.7 1 1 1 0 P1.6 1 1 0 1 P1.5 1 0 1 1 P1.4 0 1 1 1 在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,不然有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值。為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時的抖動。 從以上分析得到單片機鍵盤掃描程序的流程圖如圖3.2所示。程序如下  圖3.2單片機矩陣式鍵盤接口流程圖 3.4 LED數碼管顯示程序設計利用單片機內部的串行接口,可以實現靜態的顯示處理。這樣不僅可以節省單片機的并行接口資源,而且在大多數不使用串行接口的情況下,可以減少或是免去擴展接口。 在這種設計中,串行口工作于方式0,數據的輸入輸出都通過RxD實現,移位脈沖則由TxD發出。每次傳送一個字節數據。每輸出一個字節數據,單片機自動使串行中斷請求標志TI置。通過測試該狀態,即可確定該字節是否發送完畢。由硬件電路圖可知,74LS164是串行輸入并行輸出的移位寄存器。它具有兩個串行輸入端和8位并行輸出端(QA~QH)。 當顯示數據從RxD端輸出到移位寄存器74LS164的輸入端AB時,74LS164將串行數據轉換成8位輸出碼QA~QH,然后加到共陽極LED顯示器上。究竟在哪一位上顯示,還要P1口的狀態而定。當某一位為低電平時,該位LED顯示,其他位不顯示。由于接口電路中顯示模型輸出地址和位選信號可一次選中,故只要一次輸出即可顯示一位。 
圖3.3 LED的顯示流程圖
第四章 總結
在設計中遇到不少困難,這對自己是一個考驗,剛開始拿到題目的時候頭緒并不是很多,通過查閱資料對整個系統有了一定的認識。單片機的相關內容在大三的課程學過,但是學得并不是很深,在設計前我重新學習了一遍單片機的知識,包括芯片接口和51系列單片機的指令等。串行A/D轉換器ADC0832是新接觸的一種芯片,除學習芯片功能外,主要了解了對芯片串行輸出的控制,這里的軟件設計是一個難點,我們這次用的是用PROTEI99繪圖軟件,我們以前學過但是學的不深這對我來說是個難點,但是通過看書和同學老師的幫忙,使得我畫好了原理圖和PCB版的出圖。還有就是焊版,焊不好就無法顯示要的數據,調試是最關鍵的時候,剛開始的時候沒有顯示,在修改程序的時候花了不少時間最后,終于顯示可以想要的結果。當程序下載到焊版的時候,首先是顯示0000,如果改變滑動變阻器時,通過ADC0832就可以顯示不同的數據,我做的首先是采集模擬量,然后顯示需要的數據。我認為我們專業學習硬件知識相對比軟件多,所以在軟件設計方面我還有很大不足。程序的設計經過“學習–模仿–編寫–修改–再修改–定型”等階段,在軟件的學習上我也花了比較多的時間和精力,讓我欣慰的是收獲也很大。
附錄A硬件原理圖 
附錄B- #include<reg51.h>
- #include<stdio.h>
- #include<math.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ADC0832CH0 channel;
- //*********定義變量區*******************
- sbit clk_adc0832=P3^6; //定義各個控制引腳
- sbit cs_adc0832=P2^0;
- sbit di_adc0832=P3^7;
- sbit do_adc0832=P3^7;
- sbit LED0_CS=P1^0;
- sbit LED1_CS=P1^1;
- sbit LED2_CS=P1^2;
- sbit LED3_CS=P1^3;
- sbit adarm=P2^2;
- uchar code table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//0,1,2,3,4,5,6,7,8,9,off //共陽極筆端碼
- uchar ch; //采樣返回數據
- //*********函數聲明區********************
- void tkey(void); //鍵盤函數
- unsigned runADC0832(bit); //A/D轉換
- void Delayms(uint x); //延時顯示函數
- void Update_LED(); //LED顯示函數
- void LED_analyze();
- //**********主函數開始**********
- void main()
- {
- P0=0XFF;
- P1=0XFF;
- P2=0XFF;
- P3=0XFF;
- Uart_Init();
- TH0=0x3C;
- TL0=0xAF;
- ET0=1; //開外部中斷0
- EA=1; //全局中斷打開
- TR0=1;
- nCounter=0;
- Change_Flag=0;
- while(1)
- {
- void tkey(void);
- runADC0832();
- if(Change_Flag==1)
- { Update_LED();
- if(ch>9999)
- ch=0;
- printf("counter refreshed %d \n",ch);
- }
- delay();
- /********矩鍵查尋鍵值4*4程序******/按鍵為P1.0---P1.7
- void Tkey(void)
- {
- uchar readkey;//rereadkey;
- uchar x_temp,y_temp;
- P1=0x0f;
- x_temp=P1&0x0f;
- if(x_temp==0x0f) goto keyout;
- P1=0xf0;
- y_temp=P1&0xf0;
- readkey=x_temp|y_temp;
- readkey=~readkey;
- switch(readkey)
- {
- case 0x11:key=0; break;
- case 0x21:key=1; break;
- case 0x41:key=2; break;
- case 0x81:key=3; break;
- case 0x12:key=4; break;
- case 0x22:key=5; break;
- case 0x42:key=6; break;
- case 0x82:key=7; break;
- case 0x14:key=8; break;
- case 0x24:key=9; break;
- case 0x44:key=10;break;
- case 0x84:key=11;break;
- case 0x18:key=12;break;
- case 0x28:key=13;break;
- case 0x48:key=14;break;
- case 0x88:key=15;break;
- default: key=16;break;
- }
- keyout:_nop_();
- }//**********A/D轉換子程序開始***************
- unsigned runADC0832(void) //讀ADC0832函數
- {
- uchar i=0;
- uchar j;
- uint dat=0;
- uchar ndat=0;
- if(channel==0)channel=2;
- if(channel==1)channel=3;
- ADDI=1;
- _nop_();
- _nop_();
- ADCS=0;//拉低CS端
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=channel&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=(channel>>1)&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿3
- ADDI=1;//控制命令結束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO;//收數據
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次時鐘脈沖
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO;
- }
- for(i=0;i<8;i++)
- {
- j=0;
- j=j|ADDO;//收數據
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次時鐘脈沖
- _nop_();
- _nop_();
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- ADCS=1;//拉高CS端
- ADCLK=0;//拉低CLK端
- ADDO=1;//拉高數據端,回到初始狀態
- dat<<=8;
- dat|=ndat;
- return(dat); //return ad k
- }
- void control(uchar d) //數據個、十、百、千取數函數
- ch=ch%10000;
- AD_bcd[0] =ch/1000;
- AD_bcd[1]=(ch/100)%10;
- AD_bcd[2] =(ch%100)/10;
- AD_bcd[3]=(ch%100)%10;
- update_disbuf();
- }
- void update_disbuf(void) //對應顯示的數據函數
- { P0=dis_code[AD_bcd[0]];
- LED_0=0;
- Delayms(10);
- LED_0=1;
- P0=dis_code[AD_bcd[1]];
- LED_1=0;
- Delayms(10);
- LED_1=1;
- P0=dis_code[AD_bcd[2]];
- LED_2=0;
- Delayms(10);
- LED_2=1;
- P0=dis_code[AD_bcd[3]];
- LED_3=0;
- Delayms(10);
- LED_3=1;
- }
復制代碼
完整的Word格式文檔51黑下載地址:
|