2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  直流數控電壓源設計</b></p><p>  一.系統硬件設計結構框圖</p><p>  本數控直流穩(wěn)壓電源的設計以一穩(wěn)壓電源為基礎,以高性能單片機系統為控制核心,以穩(wěn)壓驅動放大電路、短路保護電路為外圍的硬件系統,在檢測與控制軟件的支持下實現對電壓輸出的數字控制,通過對穩(wěn)壓電源輸出的電壓進行數據采樣與給定數據比較,從而調整和控制穩(wěn)壓電

2、源的工作狀態(tài)及監(jiān)測開關電路的輸出電流大小。本數控直流穩(wěn)壓電源實現以下功能:鍵盤可以直接設定輸出電壓值;可快速調整電壓;LCD顯示電壓值等。</p><p>  1.1 8051簡介</p><p>  我們采用8051系列的AT89S51作為CPU,AT89S51是一種帶4K字節(jié)FLASH可編程可擦除只讀存儲器(FPEROM—Flash Programmable and Erasable

3、Read Only Memory)的低電壓,高性能CMOS8位微處理器。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。</p><p><b>  1.2 主要特性</b></p><p>  1)與MCS-51兼容 ;</p><p>  2)8位字長的CPU;</p>&l

4、t;p>  3)可在線ISP編程的4KB片內FLASH存儲器,用于程序存儲,可擦寫1000次;</p><p>  4) 256B的片內數據存儲器,其中高128字節(jié)地址被特殊功能寄存器SFR占用;</p><p>  5)可編程的32根I/O口線(P0~P3);</p><p>  6)2個可編程16位定時器;</p><p>  7)

5、一個數據指針DPTR;</p><p>  8)1個可編程的全雙工串行通信口;</p><p>  9)具有“空閑”和“掉電”兩種低功耗工作方式;</p><p>  10)可編程的3級程序鎖定位;</p><p>  11)工作電源的電壓為5(1±0.2)V;</p><p>  12)振蕩器最高頻率為24

6、MHz;</p><p>  13)編程頻率3 ~24 MHz,編程電流1mA,編程電壓為5V。</p><p>  1.3芯片引腳排列與名稱</p><p>  DIP封裝形式的AT89S51的芯片引腳排列與名稱如圖1所示。</p><p><b>  VCC:供電電壓。</b></p><p>

7、;<b>  GND:接地。</b></p><p>  P0口:P0口為一個8位,并行, 圖1 AT89S51的芯片引腳排列與名稱</p><p>  漏極開路雙向I/O口,作為輸出時可驅動8個TTL負載。該口內無上拉電阻,在設計中作為D/A,A/D及液晶顯示器的數據口。</p><p>  P1口:P1口是一個內部提供上拉電阻的8位雙

8、向I/O口,P1口緩沖器能接收輸出4個TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,該口在設計中低四位作為鍵盤輸入口,高四位與RST作為在線編程下載口。</p><p>  P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收/輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,可作為輸入。在作為輸出時,P2口的管腳被外部拉低,將輸出電流。該口在設計中作為D/A

9、,A/D及液晶顯示器的控制口。</p><p>  P3口:P3口管腳是帶內部上拉電阻的8位雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流,這是由于上拉的緣故。P3口也可作為AT89S51的一些特殊功能口,如下表1所示:</p><p>  表1 各端口引腳與復用功能表</p>

10、<p>  該口在設計中使用其特殊功能作為D/A,A/D讀寫信號的控制口。和A/D的中斷輸入口。</p><p>  RST:該引腳為復位信號輸入端,高電平有效。在振蕩器穩(wěn)定工作情況下,該引腳被置成高電平并持續(xù)兩個機器周期以上是系統復位。</p><p>  ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸

11、入編程脈沖。該引腳在設計中作為鎖存器器和A/D的時鐘信號。</p><p>  /PSEN:外部程序存儲器的選通信號。</p><p>  /EA/VPP:/EA為訪問芯片內部和芯片外部程序存儲器的選擇信號。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。</p><p>  XTAL1:芯片內振蕩器放大器的輸入及內部時鐘工作電路的輸入。</p

12、><p>  XTAL2:芯片內振蕩器放大器的輸出。 </p><p>  2 鍵盤控制器MM74C922</p><p><b>  2.1 簡介</b></p><p>  鍵盤的作用是對單片機輸入數據,設計中要求能是電壓進行“+”,“-”,及電壓值的設定,所以采用鍵盤為4×4的薄膜矩陣鍵盤,用MM74C922

13、芯片進行識別按鍵后送AT89S51的并行口P1, P1.0~P1.3作為鍵盤輸入口。傳統的4×4矩陣鍵盤識別處理程序的編寫相對煩瑣。所以采用MM74C922芯片來將4×4矩陣鍵盤的鍵值轉換成4位BCD碼以簡化程序的編寫。</p><p><b>  2.2 主要特性</b></p><p>  CMOS工藝技術制造,工作電壓3-15V,“二鍵鎖定”

14、功能,編碼輸出為三態(tài)輸出,可直接與微處理器數據總線相連,內部振蕩器能完成4×4矩陣鍵盤掃描,亦可用外部振蕩器使鍵盤操作與其他處理同步,通過外接電容避免開關發(fā)生前、后沿彈跳所許的延時。有按鍵按下時數據有效線變高,同時封鎖其他鍵,片內鎖存器將保持鍵盤矩陣的4位編盤,可由微處理器讀出</p><p>  2.3 芯片引腳排列與名稱</p><p>  DIP封裝形式的MM74C922的

15、芯片引腳排列與名稱如圖4所示。</p><p>  VCC:供電電壓(+5~+15);</p><p><b>  GND:接地;</b></p><p>  Y1~Y2:矩陣鍵盤行輸入, 圖4 MM74C922芯片引腳排列與名稱</p><p>  其內部接有上拉電阻;</p><p>

16、;  X1~X2:矩陣鍵盤列輸入;</p><p>  OUT1~OUT2:矩陣鍵盤列輸出;</p><p>  OSC:振蕩器輸入;</p><p>  DA:按鍵有效輸出,當有任意鍵按下是DA輸出高電平;</p><p>  /OE:輸出有效端,低電平有效。</p><p>  3 D/A轉換器DAC0832<

17、;/p><p><b>  3.3.1簡介</b></p><p>  設計要求電壓輸出范圍是0.0V~9.9V,步進0.1V,共有100種狀態(tài),因此采用8位的D/A轉換器就能滿足設計要求。因此采用常用的DAC0832芯片。8位字長的D/A轉換器DAC0832具有256種狀態(tài),能滿足設計要求。DAC0832芯片是具有兩個輸入數據寄存器的8位DAC,它能直接與AT89S51

18、單片機相連接,</p><p><b>  3.2 主要特性</b></p><p><b>  1)8位分辨率;</b></p><p>  2)電流型輸出,穩(wěn)定時間為1uS;</p><p>  3)可雙緩沖輸入,單緩沖輸入或直接數字輸入;</p><p>  4)單一電

19、源供電(+5~+15V);</p><p>  5 低功耗(20mW;)</p><p>  3.3 芯片引腳排列與名稱</p><p>  DIP封裝形式的DAC0832的芯片引腳排列與名稱如圖51所示。</p><p>  VCC:電源電壓,+5V。</p><p>  GND:地線輸入端。

20、 圖5 DAC0832的芯片引腳排列與名稱</p><p>  D0~D7:8位數字量輸入引腳。單片機由這8根線傳送給D/A轉換數字量。D7為最高有效位,D0為最低有效位。</p><p>  Vref:參考電壓端。</p><p>  /CS:片選信號,當/CS為低電平時候,芯片被選中工作。</p><p>  ILE:允許數字量輸

21、入線。高電平有效。</p><p>  /XREF:傳送控制輸入線,低電平有效。</p><p>  /WR1,/WR2:寫命令輸入線。</p><p>  Ffb:運算放大器反饋線。</p><p>  Iout1,Iout2:模擬電流輸出線,Iout1+Iout2為一常數。</p><p><b>  二

22、.硬件電路設計</b></p><p>  1.A/D轉換器ADC0809</p><p><b>  1.1 簡介</b></p><p>  ADC0809是美國國家半導體公司生產的8位ADC,它是采用逐次逼近的方法完成A/D轉換的。ADC0809的內部結構框圖如圖 所示。ADC0809由單一+5V電源供電,片內有帶鎖存功能的

23、8路模擬多路開關,,可對8路0~5V的輸入模擬電壓信號分時進行轉換,完成一次轉換約需100us;輸出具有TTL三臺鎖存緩沖器,可以直接接到單片機數據總線上。通過適當的外接電路,ADC0809可對0~5V的雙級性模擬信號進行轉換。</p><p>  1.2主要特性  1)8路8位A/D轉換器,即分辨率8位。   2)具有轉換起??刂贫?。   3)轉換時間為100μs  4)單+5V電源供電   5)模擬

24、輸入電壓范圍0~+5V,不需零點和滿刻度校準。   6)工作溫度范圍為-40~+85攝氏度   7)低功耗,約15mW。</p><p>  1.3 芯片引腳排列與名稱</p><p>  DIP封裝形式的ADC0809的芯片引腳排列與名稱如圖6所示</p><p>  各引腳功能說明如下:</p><p>  VCC:電源電壓,+5V。

25、</p><p>  GND:地線輸入端。</p><p>  D0~D7:8位數字量輸出引腳。A/D轉換結</p><p>  果由這8根線傳送給單片機。D7為最高有效位, 圖6 0809引腳圖排列與名稱</p><p><b>  D0為最低有效位。</b></p><p>  IN0~

26、IN7:8路模擬量輸入引腳。</p><p>  Vref(+):參考電壓正端。。</p><p>  Vref(-):參考電壓負端。</p><p>  START:啟動信號輸入端,START為正脈沖,其上升沿清除ADC0808的內部的各寄存器,其下降沿啟動A/D開始轉換。</p><p>  ALE:地址鎖存啟動信號,在ALE的上升沿,將

27、A、B、C上的通道地址鎖存到內部的地址鎖存器。START和ALE兩信號用于啟動A/D轉換。</p><p>  EOC:轉換完成信號,當EOC上升為高電平時,表明內部A/D轉換已完成。</p><p>  OE:允許輸出信號。當OE=1時,即為高電平,允許輸出鎖存器輸出數據。</p><p>  CLK:時鐘輸入信號,0809的時鐘頻率范圍在10~1200kHz,典

28、型值為640kHz。</p><p>  A、B、C:3位地址輸入線,經過譯碼后可選通IN0~IN78個通道中的一個通道進行轉換。A、B、C的輸入與選通的通道的關系如表2所示:</p><p><b>  表2</b></p><p><b>  2 顯示器</b></p><p>  設計要求能顯

29、示當前電壓值,因此可采用液晶顯示或者數碼管顯示兩種方法??紤]到數碼管顯示過于單調,因此采用采用液晶顯示。液晶顯示模塊具有體積小、功耗低、顯示內容豐富等特點,現在點陣型液晶顯示模塊已經是單片機應用設計中常用的信息顯示器件了。</p><p><b>  2.1 簡介</b></p><p>  本設計中采用了1602C型點陣式液晶顯示模塊。LCD技術和半導體技術的結合使

30、該顯示模塊具有高可靠性和低功耗的特點。1602C型點陣式液晶顯示模塊內部有字符產生存儲器和數據存儲器。該顯示模塊可直接與AT89s51單片機相接,所有的顯示功能由控制器用指令實現。由單一的+5V的電源供電,數據傳送方式有4位和8位兩種選擇。內有顯示92個ASCII字符和92個特殊字符的字庫。</p><p>  2.2 引腳排列與名稱</p><p>  1602C引腳排列與名稱如圖7所示

31、。</p><p><b>  GND:電源地;</b></p><p>  VCC:電源正極,4.5-5.5V,通常使用5V電壓;</p><p>  VO:LCD對比度調節(jié)端,電壓調節(jié)范圍為0-5V;</p><p>  RS:寫入數據或者指令選擇端。要寫入指令時,</p><p>  使RS

32、為低電平;要寫入數據時,使RS為高電平; </p><p>  R/W:讀寫控制端。R/W為高電平時,讀取數據;R/W為低電平時,寫入數據; </p><p>  E:LCD模塊使能信號控制端。寫數據時, 圖7 1602C引腳排列與名稱</p><p><b>  需要下降沿觸發(fā);。</b></p><p>  D

33、B0-DB7:8位數據總線,三態(tài)雙向。如果I/O口資源緊張的話,該模塊也可以只使用4位數據線DB4-DB7接口傳送數據。</p><p>  A: LED背光正極。需要背光時,A串接一個限流電阻接VDD,K接地,實測該模塊的背光電流為50mA左右;</p><p>  K: LED背光地端</p><p>  3.1 MM74C922接口電路</p>

34、<p>  設計中MM74C922的輸出口與P1口的低四位相接,DA端通過反向器與P3.2相接。每當有按鍵按下時,DA就產生高電平,同時向P1口低四位傳送16進制的BCD碼,分別對應16個按鍵。</p><p>  MM74C922與鍵盤及AT89S51的接線圖見圖9</p><p>  圖9 MM74C922接口電路</p><p>  3.2 DAC0

35、832接口電路</p><p>  DAC0832 最具特色是輸入為雙緩沖結構,數字信號在進入D/A 轉換前,需經過兩個獨立控制的8 位鎖存器傳送。其優(yōu)點是D/A 轉換的同時,DAC 寄存器中保留現有的數據,而在輸入寄存器中可送入新的數據。系統中多個D/A 轉換器內容可用一公共的選通信號選通輸出。</p><p>  設計中用2個電壓控制字代表0.1V當電壓控制字從0,2,4,……到198

36、時,可調穩(wěn)壓源輸出0.0,0.1,……,9.9。由于DAC0832是電流輸出型,輸出的電流隨輸入的電壓控制字線性變化。若要得到電壓,還需要外接一片運放來實現電流到電壓的轉換。由于DAC0832 輸出級沒有加集成運放,所以需外加LM324 相配適用。考慮到設計需要,采用了單緩沖雙級性的接法,如圖10所示:</p><p>  圖10 DAC0832接口電路</p><p><b>

37、;  其計算公式為:</b></p><p>  其中Vref為參考電壓,D為DAC0832接收到的數據。5為DAC0832基準電壓。</p><p>  如果圖中所示電阻RX,RY,RZ的阻值選取適當,則輸出電壓范圍在電壓控制字從0,2,4,……到198變換時根據上式計算可得輸出電壓為+4.9V~-5V,正好滿足后續(xù)電路的要求。其中P2.7為DAC0832的片選控制端。<

38、;/p><p>  3.3 ADC0809接口電路</p><p>  由于輸出電壓范圍是0.0V~9.9V超出了ADC0809的測量范圍,因此使用電位器將輸出電壓分壓后送至ADC0809的輸入端。</p><p>  ADC0809與AT89S51的接口電路如圖11所示</p><p>  圖11 ADC0809接口電路</p>

39、<p>  其中P2.6為0809的片選信號,與WR和RD分別通過或非門接到0809的START和OE上,EOC通過非門與AT89S51的INT0相接。由于0809需要時鐘信號,因此可以從AT89S51的ALE端得到6分頻的振蕩信號,為了使6分頻后的信號能滿足0809的需求,我們采用的是4M的晶體振蕩器。</p><p>  3.4 LCD1602C接口電路</p><p>  

40、LCD1602C與AT89S51的接口電路如圖12所示</p><p>  圖12 LCD顯示電路</p><p>  3.5 可調穩(wěn)壓源電路</p><p>  為了獲得大的負載電流,可調穩(wěn)壓部分使用了最大輸出電流為1A 的7805三端集成穩(wěn)壓塊。7805原本是輸出固定電壓為5V的集成穩(wěn)壓塊,但可以外接電路來改變輸出電壓值。可調穩(wěn)壓的電路見圖13:</p&g

41、t;<p>  設運放理想。這時,可</p><p>  認為運放輸入電壓很小。即: 圖13 可調穩(wěn)壓電路 </p><p>  其中Vin為D/A部分輸出的雙級性電壓,5為7805的穩(wěn)壓值。由上式可見,Vout與Vin之間成線形關系,當Vin變化時,輸出電壓改變。由于Vin是DAC0832輸出的范圍是+4.9V~-5V的電壓,因而Vo

42、ut的變化可以從0.0V~9.9V。經實驗證明:這種可調穩(wěn)壓輸出具有良好的負載特性,輸出最大負載電流可達到1A。電壓輸出端接上500mA負載與未接負載(空載)之間輸出電壓僅相差0.04V以內。由于。</p><p><b>  3.6流穩(wěn)壓電路</b></p><p>  本設計共用到電源有三種:即±15V,+5V ??蛇x用的有開關電源和穩(wěn)壓電源兩種,由于開

43、關電源的紋波系數比較大,且設計要求電壓紋波不大于10mV 。因此采用常用的穩(wěn)壓電源來作為整個系統的電源。穩(wěn)壓電源由電源變壓器、整流電路、濾波電路和穩(wěn)壓電路組成,如圖14所示</p><p>  圖14 電源方框及波形圖</p><p>  整流和濾波電路:整流作用是將交流電壓U2變換成脈動電壓U3。濾波電路一般由電容組成,其作用是脈動電壓U3中的大部分紋波加以濾除,以得到較平滑的直流電壓

44、U4。再通過穩(wěn)壓電路得到平直的直流電壓U5。</p><p>  電源變壓器采用了雙17.2V的變壓器,輸入220V,50Hz交流電,經全橋整流,濾波,穩(wěn)壓后得到±15V和+5V三種輸出,+5V部分供單片機及D/A,A/D,顯示等部分使用,電流最大約400mA;+15V和-15V部分供運放使用,最大電流不超過50mA。電路如圖15所示:</p><p>  圖15 電源部分原理圖

45、</p><p>  圖中繼電器部分是一個開關電路及短路保護電路。當系統接到220V交流電后經變壓器降壓,整流橋整流后接到K1,此時由于U1(7815)沒有輸入,所以K1沒有供電,整個后續(xù)系統處于關閉狀態(tài),當按下SW_ON鍵時U1得到輸入,產生+15V的輸出,同時K1得電吸合,形成自鎖狀態(tài),同時79L15也得電輸出-15V電壓。松開SW_ON鍵后由于K1處于自鎖狀態(tài),整個系統處于開啟狀態(tài)。當按下SW_OFF鍵時,

46、K1被短路,從而斷開電源達到關機的目的。同樣,在任一時刻如果產生短路,則K1也會斷開達到短路保護的目的。</p><p>  +5V部分的供電電流在400mA左右,因此采用了最大輸出電流為1A 的7805三端穩(wěn)壓集成電路,由于功耗大,負載重,加裝了散熱片。而+15V和-15V部分最大電流不超過50mA。在設計過程中發(fā)現中兩片7805的均使用了散熱片且溫度偏高,因此加裝了風扇,使用+15V電源,將78L15該為78

47、15后可滿足風扇需求。這樣在保證性能的同時也降低了成本。</p><p><b>  三.程序設計</b></p><p><b>  1主控程序</b></p><p>  圖16為系統主控程序。</p><p>  圖16 系統主控程序框圖</p><p><b&

48、gt;  2 D/A子程序</b></p><p>  圖17為D/A子程序框圖。</p><p>  圖17 D/A子程序框圖</p><p>  可以看出,D/A子程序的作用是將設定的數字量通過變換送給D/A。</p><p><b>  3 A/D子程序</b></p><p>

49、;  圖18 A/D子程序框圖</p><p>  由A/D子程序框圖看出,修改精度為一個數字量,由于A/D和D/A的精度限制,修改量只能達到0.05V,但足已滿足設計需要。</p><p><b>  4 鍵盤子程序</b></p><p>  圖19為鍵盤子程序框圖。</p><p>  圖19 鍵盤子程序框圖框圖&

50、lt;/p><p>  4.1 步進步減子程序</p><p>  圖20 步進,步減子程序框圖</p><p>  由步進,步減子程序框圖可以看出,如果每次把D/A的數字量加01H,可以使步進量和步減量由0.1V變?yōu)?.05V。如果采用更高位的D/A轉換器。可以使步進量和步減量進一步的減小,以滿足更高的要求。</p><p><b>

51、;  4.2 設置子程序</b></p><p>  圖21 設置子程序框圖</p><p>  由設置子程序可以看出,進入設置子程序后就屏蔽了“+”,“-”和設置鍵。然后逐步判斷按鍵,執(zhí)行相應程序。</p><p><b>  設計總結</b></p><p><b>  六.附件</b&

52、gt;</p><p><b>  A、程 序 實 現</b></p><p>  單片機系統初始化和存儲器分配程序</p><p><b>  $NOMOD51</b></p><p>  ;-----------------------------------------------------

53、-------------------------</p><p>  ; This file is part of the C51 Compiler package //這個文件是c51 鏈接的數據</p><p>  ;------------------------------------------------------------------------------<

54、/p><p>  ; STARTUP.A51: This code is executed after processor reset. 這個代碼在程序重啟之后執(zhí)行</p><p><b>  ;</b></p><p>  ; To translate this file use A51 with the following invocat

55、ion:</p><p><b>  ;</b></p><p>  ; A51 STARTUP.A51</p><p><b>  ;</b></p><p>  ; To link the modified STARTUP.OBJ file to your application us

56、e the following</p><p>  ; BL51 invocation:</p><p><b>  ;</b></p><p>  ; BL51 <your object file list>, STARTUP.OBJ <controls></p><p><b&

57、gt;  ;</b></p><p>  ;------------------------------------------------------------------------------</p><p><b>  ;</b></p><p>  ; User-defined Power-On Initializat

58、ion of Memory</p><p><b>  ;</b></p><p>  ; With the following EQU statements the initialization of memory</p><p>  ; at processor reset can be defined:</p><

59、p><b>  ;</b></p><p>  ; ; the absolute start-address of IDATA memory is always 0</p><p>  IDATALEN EQU 80H ; the length of IDATA memory in bytes. IDA

60、TA存儲的字節(jié)長度</p><p><b>  ;</b></p><p>  XDATASTART EQU 0H ; the absolute start-address of XDATA memory XDATA 存儲的實際起始地址</p><p>  XDATALEN EQU 0H

61、 ; the length of XDATA memory in bytes.</p><p><b>  ;</b></p><p>  PDATASTART EQU 0H ; the absolute start-address of PDATA memory</p><p>  PDATALEN

62、 EQU 0H ; the length of PDATA memory in bytes.</p><p><b>  ;</b></p><p>  ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the</p><p>  

63、; 8051 CPU. At minimum the memory space occupied from the C51 </p><p>  ; run-time routines must be set to zero. </p><p>  ;----------------------------------------------------

64、--------------------------</p><p><b>  ;</b></p><p>  ; Reentrant Stack Initilization</p><p><b>  ;</b></p><p>  ; The following EQU statement

65、s define the stack pointer for reentrant</p><p>  ; functions and initialized it:</p><p><b>  ;</b></p><p>  ; Stack Space for reentrant functions in the SMALL model.&

66、lt;/p><p>  IBPSTACK EQU 0 ; set to 1 if small reentrant is used.</p><p>  IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1.</p><p><b>  

67、;</b></p><p>  ; Stack Space for reentrant functions in the LARGE model. </p><p>  XBPSTACK EQU 0 ; set to 1 if large reentrant is used.</p><p>  XBPSTA

68、CKTOP EQU 0FFFFH+1; set top of stack to highest location+1.</p><p><b>  ;</b></p><p>  ; Stack Space for reentrant functions in the COMPACT model. </p><p>  

69、PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.</p><p>  PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.</p><p><b>  ;</b></p>

70、;<p>  ;------------------------------------------------------------------------------</p><p><b>  ;</b></p><p>  ; Page Definition for Using the Compact Model with 64 KByte

71、xdata RAM</p><p><b>  ;</b></p><p>  ; The following EQU statements define the xdata page used for pdata</p><p>  ; variables. The EQU PPAGE must conform with the PPAG

72、E control used</p><p>  ; in the linker invocation.</p><p><b>  ;</b></p><p>  PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.</p><p>

73、<b>  ;</b></p><p>  PPAGE EQU 0 ; define PPAGE number. </p><p><b>  ;</b></p><p>  PPAGE_SFR DATA 0A0H ; SFR that supplies

74、uppermost address byte</p><p>  ; (most 8051 variants use P2 as uppermost address byte)</p><p><b>  ;</b></p><p>  ;---------------------------------------

75、---------------------------------------</p><p>  ; Standard SFR Symbols </p><p>  ACC DATA 0E0H</p><p>  B DATA 0F0H</p><p>  SP DATA 81H<

76、/p><p>  DPL DATA 82H</p><p>  DPH DATA 83H</p><p>  NAME C_STARTUP</p><p>  C_C51STARTUP SEGMENT CODE</p><p>  STACK SEGMENT

77、IDATA</p><p>  RSEG STACK</p><p><b>  DS 1</b></p><p>  EXTRN CODE (?C_START)</p><p>  PUBLIC C_STARTUP</p><p>  CSEG AT 0<

78、/p><p>  ?C_STARTUP: LJMP STARTUP1</p><p>  RSEG C_C51STARTUP</p><p><b>  STARTUP1:</b></p><p>  IF IDATALEN <> 0</p><p>  MOV

79、 R0,#IDATALEN - 1</p><p><b>  CLR A</b></p><p>  IDATALOOP: MOV @R0,A</p><p>  DJNZ R0,IDATALOOP</p><p><b>  ENDIF</b></p>

80、<p>  IF XDATALEN <> 0</p><p>  MOV DPTR,#XDATASTART</p><p>  MOV R7,#LOW (XDATALEN)</p><p>  IF (LOW (XDATALEN)) <> 0</p><p>  MOV R6,#(

81、HIGH (XDATALEN)) +1</p><p><b>  ELSE</b></p><p>  MOV R6,#HIGH (XDATALEN)</p><p><b>  ENDIF</b></p><p><b>  CLR A</b></p&

82、gt;<p>  XDATALOOP: MOVX @DPTR,A</p><p>  INC DPTR</p><p>  DJNZ R7,XDATALOOP</p><p>  DJNZ R6,XDATALOOP</p><p><b>  ENDIF</b></

83、p><p>  IF PPAGEENABLE <> 0</p><p>  MOV PPAGE_SFR,#PPAGE</p><p><b>  ENDIF</b></p><p>  IF PDATALEN <> 0</p><p>  MOV R0,#LOW

84、 (PDATASTART)</p><p>  MOV R7,#LOW (PDATALEN)</p><p><b>  CLR A</b></p><p>  PDATALOOP: MOVX @R0,A</p><p>  INC R0</p><p> 

85、 DJNZ R7,PDATALOOP</p><p><b>  ENDIF</b></p><p>  IF IBPSTACK <> 0</p><p>  EXTRN DATA (?C_IBP)</p><p>  MOV C_IBP,#LOW IBPSTACKTOP</p>

86、<p><b>  ENDIF</b></p><p>  IF XBPSTACK <> 0</p><p>  EXTRN DATA (?C_XBP)</p><p>  MOV C_XBP,#HIGH XBPSTACKTOP</p><p>  MOV C_XBP+1,#LOW

87、XBPSTACKTOP</p><p><b>  ENDIF</b></p><p>  IF PBPSTACK <> 0</p><p>  EXTRN DATA (C_PBP)</p><p>  MOV C_PBP,#LOW PBPSTACKTOP</p><p>&l

88、t;b>  ENDIF</b></p><p>  MOV SP,#STACK-1</p><p>  ; This code is required if you use L51_BANK.A51 with Banking Mode 4</p><p>  ; EXTRN CODE (B_SWITCH0)</p><p

89、>  ; CALL B_SWITCH0 ; init bank mechanism to code bank 0</p><p>  LJMP C_START</p><p><b>  END</b></p><p><b>  鍵盤掃描程序</b></p>

90、;<p>  #include<reg52.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit key1=P1^0;</p><p>  sbit key2=P1^1;</p>

91、;<p>  void delay(uint z); </p><p>  uchar keyscan() // 鍵盤掃描程序</p><p><b>  {</b></p><p>  uchar temp,num;</p><p><b>

92、;  num=17;</b></p><p>  P1=0xfe; // p1.0口置0</p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p>  while(temp!=0xf0)<

93、/p><p><b>  {</b></p><p>  delay(20);</p><p>  temp=P1; </p><p>  temp=temp&0xf0; </p><p>  if(temp!=0xf0)</p><p><

94、b>  {</b></p><p>  //delay(10); //延遲去抖</p><p>  P1=P1&0xf0; </p><p>  while(P1!=0xf0);</p><p>  switch(temp)</p><p>

95、<b>  {</b></p><p>  case 0xe0:num=7;break; //0xf0和0xe0的交處,即p1.0與p1.4的交處</p><p>  case 0xd0:num=8;break; // p1.0與p1.5的交處,</p><p>  case 0xb0:num=9;break;&

96、lt;/p><p>  case 0x70:num=15;break; </p><p>  default:break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else break;</p><

97、;p><b>  }</b></p><p><b>  P1=0xfd;</b></p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p>  while(temp!=0xf0)</p>

98、<p><b>  {</b></p><p>  delay(20);</p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><

99、b>  {</b></p><p>  //delay(10);</p><p>  P1=P1&0xf0;</p><p>  while(P1!=0xf0);</p><p>  switch(temp)</p><p><b>  {</b></p>

100、<p>  case 0xe0:num=4;break;</p><p>  case 0xd0:num=5;break;</p><p>  case 0xb0:num=6;break;</p><p>  case 0x70:num=14;break;</p><p>  default:break;</p>&l

101、t;p><b>  }</b></p><p><b>  }</b></p><p>  else break;</p><p><b>  }</b></p><p><b>  P1=0xfb;</b></p><p>

102、<b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p>  while(temp!=0xf0)</p><p><b>  {</b></p><p>  delay(20);</p><p><b>  t

103、emp=P1;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p><p>  //delay(10);</p><p>  P1=P1&0xf0;</p&g

104、t;<p>  while(P1!=0xf0);</p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xe0:num=1;break;</p><p>  case 0xd0:num=2;break;</p><p>

105、  case 0xb0:num=3;break;</p><p>  case 0x70:num=13;break;</p><p>  default:break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else

106、 break;</p><p><b>  }</b></p><p><b>  P1=0xf7;</b></p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p>  while

107、(temp!=0xf0)</p><p><b>  {</b></p><p>  delay(20);</p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)<

108、;/p><p><b>  {</b></p><p>  //delay(10);</p><p>  P1=P1&0xf0;</p><p>  while(P1!=0xf0);</p><p>  switch(temp)</p><p><b>  {

109、</b></p><p>  case 0xe0:num=10;break;</p><p>  case 0xd0:num=0;break;</p><p>  case 0xb0:num=11;break;</p><p>  case 0x70:num=12;break;</p><p>  defa

110、ult:break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else break;</p><p><b>  }</b></p><p>  return num;</p>&

111、lt;p><b>  }</b></p><p><b>  主程序</b></p><p>  #include<reg52.h></p><p>  #include<absacc.h></p><p>  #include<intrins.h><

112、/p><p>  #include<math.h></p><p>  #include"keyscan.h"</p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #defin

113、e dac0832 XBYTE[0X7FFF] //P2.7作片選,啟動DA轉換</p><p>  #define int0 XBYTE[0X7FF8] //結束AD轉換,鎖存通道0,讀出AD值</p><p>  uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,<

114、;/p><p>  0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //數組table[]存放代碼</p><p>  uchar temp1,weishu,flag,dot;</p><p>  uchar volt[4]={0,0,0,0};</p><p>  void delay(

115、uint z)</p><p><b>  {</b></p><p><b>  uint x,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=110;y>0;y--);</p><p><b>  

116、}</b></p><p>  void display(uchar z) //LED顯示函數</p><p><b>  {</b></p><p><b>  uchar j;</b></p><p>  P2=0xFE;

117、 //P2.0口置0 ,選擇第一個數碼管</p><p>  for(j=0;j<z;j++) // 循環(huán)控制</p><p><b>  {</b></p><p>  P0=table[volt[j]]; // 將P0口數據送 LED顯示</p><p&

118、gt;<b>  delay(6);</b></p><p>  if(j<z-1) P2=_crol_(P2,1); //判斷,依次選擇P2.1,P2.2口 </p><p><b>  }</b></p><p><b>  }</b></p><p> 

119、 void main()</p><p><b>  { </b></p><p>  uchar keynum,i;</p><p>  float voltage,xiaoshu,sum;</p><p><b>  i=0;</b></p><p>  voltage=

120、0;</p><p><b>  temp1=0;</b></p><p><b>  flag=0;</b></p><p>  weishu=1; //定義數字量值temp1,進位標志flag,數碼管位數weishu等變量</p><p><b>  while(1)<

121、/b></p><p><b>  { </b></p><p>  dac0832=temp1; // 初始值設定為0</p><p>  keynum=keyscan(); //調用鍵盤掃描函數</p><p>  if(keynum==15

122、) //如果鍵值15,代表復位,將p0置0</p><p><b>  {</b></p><p>  P0=0; //p0口置0,復位</p><p>  while(1) </p><p><b

123、>  {</b></p><p>  keynum=keyscan(); //調用鍵盤掃描函數</p><p>  if(keynum>=0&&keynum<=9) //判斷鍵值</p><p><b>  {</b></p><

124、;p><b>  i++;</b></p><p>  for(weishu=0;weishu<i;weishu++) </p><p>  volt[i-weishu-1]=volt[i-weishu-2];</p><p>  volt[0]=keynum; // 將數值在第一個數碼管中顯示&

125、lt;/p><p>  if(flag==0) </p><p>  voltage=voltage*10+keynum;</p><p>  else {xiaoshu=pow(10,flag);</p><p>  xiaoshu=keynum/xiaoshu;</p><p>  sum=sum+xiaoshu;&l

126、t;/p><p>  flag++;} </p><p>  } // 數字處理顯示程序</p><p>  else if(keynum==10) //判斷按鍵,如果是點鍵,10代表點鍵</p><p><b>  {</

127、b></p><p><b>  flag++;</b></p><p><b>  dot=i;</b></p><p>  volt[0]=volt[0]+10; //在第二個數碼管 輸出顯示小數點</p><p><b>  }</b>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論