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

下載本文檔

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

文檔簡介

1、<p><b>  摘 要</b></p><p>  隨著微機測量和控制技術(shù)的迅速發(fā)展與廣泛應(yīng)用,以單片機為核心的溫度采集與控制系統(tǒng)的研發(fā)與應(yīng)用在很大程度上提高了生產(chǎn)生活中對溫度的控制水平。本設(shè)計論述了一種以STC89C52單片機為主控制單元。該控制系統(tǒng)可以實時存儲相關(guān)的溫度數(shù)據(jù)。系統(tǒng)設(shè)計了相關(guān)的硬件電路和相關(guān)應(yīng)用程序。硬件電路主要包括STC89C51單片機最小系統(tǒng),測溫電路、

2、實時時鐘電路、LED顯示以及通訊模塊電路等。系統(tǒng)程序主要包括主程序,讀出溫度子程序,計算溫度子程序、按鍵處理程序、LCD顯示程序以及數(shù)據(jù)存儲程序等。</p><p>  關(guān)鍵詞: STC89C52單片機;DS18B20;顯示電路</p><p><b>  Abstract</b></p><p>  Along with the comput

3、er measurement and control technology of the rapid development and wide application, based on singlechip temperature gathering and control system development and application greatly improve the production of temperature

4、in life level of control. This design STC89C52 describes a kind of mainly by MCU control unit, for temperature sensor DS18B20 temperature control system. The control system can real-time storage temperature data and reco

5、rd related to the current time. System </p><p>  Keywords :STC89C52 microcontroller;DS18B20;display circuit</p><p>  第1章 51單片機結(jié)構(gòu)和原理</p><p>  單片微型計算機簡稱單片機,也稱為微控制器(Micro Controller U

6、nit),英文縮寫為MCU.單片機的結(jié)構(gòu)及功能均是按照工業(yè)控制要求而設(shè)計的,它把微型計算機的宮格功能部件(中央處理器CPU、隨機存取存儲器RAM、只讀存儲器ROM、輸入輸出I/O接口、定時器/計數(shù)器以及串行通信接口等)集成在一塊芯片上,構(gòu)成一個完整的微型計算機,故又稱為單片微型計算機。除工業(yè)領(lǐng)域外,單片機還廣泛應(yīng)用于各種民用電子、電器之中。</p><p>  MCS-51是由美國INTEL公司20世紀80年代生

7、產(chǎn)的一系列8位單片機的總稱,此系列單片機包括很多型號,如:8031、8051、8751、8032、8052等,其中8051是最早最典型的產(chǎn)品。該系列其他單片機都是在8051的基礎(chǔ)上進行功能的增、減改變而來的,所以人們習(xí)慣用8051來稱呼MCS-8051系列單片機,而其中的8031在20世紀80年代末90年代初是我國最流行的單片機之一。INTEL公司后來將MCS-51的核心技術(shù)授權(quán)給了其他公司,現(xiàn)在生產(chǎn)8051內(nèi)核單片機的公司,主要有AT

8、MEL、WINBOND、NXP、NC?。模遥粒牵希蔚?。</p><p>  隨著技術(shù)的發(fā)展,各種高性能的16位、32位MCU不斷出現(xiàn),但以8051、PIC、AVG以及MC68HC等系列為典型代表的8位MCU,由于成本低、開發(fā)工具完善、易學(xué)易用等特點,仍具有強大的生命力和極高的實使用價值。</p><p> ?。?1 51單片機的結(jié)構(gòu)</p><p>  1.1.1

9、基本結(jié)構(gòu)</p><p>  8位CPU,片內(nèi)振蕩器。4KB程序存儲器ROM(4096個8位淹沒ROM)。128字節(jié)的數(shù)據(jù)存儲器RAM(128個8位淹沒RAM)。21個特殊功能寄存器。32條I/O口線。外部數(shù)據(jù)存儲器尋址空間為64KB。外部程序存儲器尋址空間為64KB。2個16位的可編程定時/計數(shù)器。中斷結(jié)構(gòu):具有5個中斷源,2個優(yōu)先級。一個全雙工串行通信口。有位尋址功能,適于布爾處理的位處理機制。</p&

10、gt;<p>  1.2.1 8051單片機引腳圖</p><p>  圖1-1 at89c51單片機</p><p>  第2章 相關(guān)編程與仿真軟件的介紹</p><p>  常用的單片機語言有很多,如:匯編、C語言、BASIC、C++等,對51單片機而言,使用最為廣泛的還是匯編語言和C語言。有經(jīng)驗的程序員用匯編語言可以寫出高效率的程序,但每種

11、語言都有自己個子的特點。</p><p>  2.1 從標(biāo)準(zhǔn)C轉(zhuǎn)向Keil C</p><p>  C51是專門為51系列單片機設(shè)計的,根據(jù)51單片機自身的特點進行了若干擴展,與ANSIC在語法和庫函數(shù)方面存在稍許差別,但絕大部分是兼容的。但在學(xué)習(xí)中,使用最多的還是Keil C8.08 u Vision3。</p><p>  2.2 Keil C上機的基本方

12、法</p><p>  2.2.1 uVision 3中編程的基本步驟</p><p>  在uVision 3集成開發(fā)環(huán)境中創(chuàng)建一個新項目(Project),并為該項目選定合適的單片機型號。利用uVision 3的文件編譯器編寫C語言(或者匯編語言)源程序文件,并將文件添加到項目中去。通過uVision 3的各種選項,配置Cx51編譯器、Ax51宏編譯器、BL51/Lx51連接定位

13、器以Debug 調(diào)試器的功能。利用uVision 3的構(gòu)造功能對項目中的源程序文件進行編譯鏈接,生成絕對目標(biāo)代碼和可選的HEX格式的可執(zhí)行文件,如果出現(xiàn)編譯鏈接錯誤則返回上一步,修改源程序中的錯誤后重新構(gòu)造整個項目。將沒有錯誤的絕對目標(biāo)代碼裝入uVision 3調(diào)試器進行仿真調(diào)試,調(diào)試成功后用編程器將可執(zhí)行文件寫入到單片機應(yīng)用系統(tǒng)的程序存儲器或者單片機內(nèi)部的Flash ROM中。</p><p>  2.2.2

14、 uVision 上機注意事項</p><p>  C51源程序汗?jié)h字注釋內(nèi)容時,刪除、插入漢字會出現(xiàn)亂碼。解決方法為:選擇Edit|Configuration 菜單項,彈出界面,將C源程序文本字體選擇為DotumChe , 此字體可避免出現(xiàn)漢字亂碼現(xiàn)象。原版的Keil C編譯器會忽略編碼為0xFD的字符,當(dāng)編寫中文顯示程序時會出現(xiàn)問題,應(yīng)安裝針對這一問題的專用補丁,許多Keil C安裝包都含有該補丁程序,安裝時

15、間可根據(jù)幫助文件安裝該補丁。</p><p>  2.3 Proteus簡介</p><p>  Proteus是英國Labcenter公司開發(fā)的嵌入式系統(tǒng)仿真軟件,組合了高級原理圖設(shè)計工具ISIS、混合模式SPICE仿真、PCB設(shè)計以及自動布線而形成了一個完整的電子設(shè)計系統(tǒng)。它運行于Windows操作系統(tǒng)上,可以仿真、分析各種模擬和數(shù)字電路,并且對PC機的硬件配置要求不高。</p

16、><p>  2.3.1 Proteus 與Keil C 的聯(lián)合仿真</p><p>  目前,單片機仿真軟件很多,Proteus ISIS 與其他單片機仿真軟件不同的是,它不僅能仿真單片機CPU的工作情況,也能夠仿真單片機外圍電路或沒有單片機參與的其他電路的工作情況。一次在仿真和程序調(diào)試時,關(guān)心的不再是某些語句執(zhí)行時單片機寄存器和存儲器內(nèi)容的改變,而是從工程師的角度直接看程序運行和電路工作

17、的過程和結(jié)果。同事,當(dāng)原理圖調(diào)試成功后,利用Proteus ARES軟件,很容易獲得PCB圖,為今后的制造提供了方便。</p><p>  Keil是美國Keil Software公司開發(fā)的,是目前世界上最好的51單片機的匯編和C語言的開發(fā)工具。它支持匯編、C語言以及混合編程,同時具備功能強大的軟件仿真,在軟件模擬仿真方式下不需要任何單片機硬件即可完成用戶程序仿真調(diào)試;雖然Keil也提供了硬件仿真(用Monito

18、r51協(xié)議,需要硬件支持)功能,但我們在利用它的硬件仿真功能的時候,它會受到一定的限制。如果我們將Proteus ISIS與Keil整合起來使用,充分利用各自的仿真功能,單片機軟硬件的調(diào)試將變的十分有效。</p><p>  打開LED.dsn,刪除LED設(shè)計頁中的ULA2003A驅(qū)動部分,在LED設(shè)計頁新建一個子電路LED_DRIVER,為該子電路見撒謊那個輸入/輸出端子。移動鼠標(biāo)指針帶子電路上。按Ctrl+C

19、計入子電路所在的設(shè)計頁,原ULA2003驅(qū)動部分加上相應(yīng)的端子。由于LED的驅(qū)動部分有多中方案,將來采用別的方案時不需要做任何的修改。用BUTTON元件繪出鍵盤的部分,并為行掃描線和列掃描線上的端子命名,此處不采用Proteus中現(xiàn)成的鍵盤模型是為了是讀者更透徹的理解鍵盤的設(shè)計和按鍵識別的原理,但在商業(yè)產(chǎn)品的開發(fā)中可購買現(xiàn)成的鍵盤模塊。</p><p>  第3章 基于單片機的PID溫度控制系統(tǒng)</p&g

20、t;<p>  3.1 PID溫控器簡介</p><p>  圖3-1 PID溫控器原理圖</p><p>  電爐內(nèi)的熱電阻溫度傳感器測出的溫度信號經(jīng)運算放大器放大和模/數(shù)轉(zhuǎn)換后,由8051讀出電阻爐爐溫,控制程序根據(jù)當(dāng)前爐溫和目標(biāo)溫度的偏差,按照一定的控制方法控制開關(guān)K的開與斷,提供適當(dāng)?shù)募訜峁β?,以使?fàn)t溫盡快趨近目標(biāo)溫度。</p><p> 

21、 本設(shè)計是接口技術(shù)、應(yīng)用系統(tǒng)設(shè)計、Proteus仿真的結(jié)合,介紹存儲系統(tǒng)、數(shù)據(jù)采集、串口通信等知識及其在PID溫控器設(shè)計中的應(yīng)用于仿真,從個子系統(tǒng)開始,設(shè)計并逐步完善,直至整個應(yīng)用系統(tǒng)的實現(xiàn)。</p><p>  3.2 8051存儲系統(tǒng)擴展和PID溫控器的存儲系統(tǒng)設(shè)計</p><p>  3.2.1 PID溫控器存儲系統(tǒng)設(shè)計</p><p>  PID溫控器的

22、存儲系統(tǒng)設(shè)計中使用了一片3-8譯碼器74LS138來產(chǎn)生各芯片所需的片選信號。要是為低電平選中6264,則C、B、A的輸出應(yīng)為011,由此可以計算出6264的二進制地址范圍為0110 0000 0000 0000 ~0111 1111 1111 1111,寫成十六進制為0x6000~0x7fff,2764的地址范圍為0x0000~0x1fff。</p><p>  圖3-2 溫控系統(tǒng)擴展圖</p>

23、<p>  3.3 人機接口和PID溫控器的輸入/輸出設(shè)計及仿真</p><p>  鍵盤和顯示器是最常用的人機交互設(shè)備,在單片機系統(tǒng)中顯示器常用筆段式LED或者多段式液晶LCD做顯示設(shè)備,如微波爐、洗衣機、DVD等家用電器采用此類顯示方式。輸出內(nèi)容較復(fù)雜的系統(tǒng)也有才有字符型點陣式LED、字符型LCD等,這里只介紹八段LED顯示器,可用于數(shù)字和部分字符顯示。</p><p> 

24、 3.3.1 八段LED顯示器</p><p>  下圖為筆段式八段LED數(shù)碼管原理圖。LED顯示器有共陰極和共陽極之分,其中的每段為一個發(fā)光二極管,常用的有紅綠兩種。共陰極LED的com公共端應(yīng)接低電平,割斷引腳接高電平則該段點亮,接低電平則該段熄滅。共陽極LED與其相反。</p><p>  圖3-3 筆段式八段LED數(shù)碼管原理圖</p><p>  不考慮

25、com端,可知共陽極顯示字符0時的各段二進制編碼為1100 0000 ,寫成十六進制為0xC0。C語言形式給出的共陽極LED能顯示的部分數(shù)字和字符編碼,可直接用在C51程序中。</p><p>  圖3-4 段位置及編號</p><p>  圖3-5 共陽極LED</p><p>  圖3-6 共陰極LED</p><p>  3.3.

26、2 LED顯示器的顯示方式</p><p>  實際使用LED時,一般將幾個八段顯示器排列成一組使用,其中的一個LED顯示器被稱為一位。多位LED顯示器的顯示方式分為靜態(tài)方式和動態(tài)掃描方式。靜態(tài)方式中各LED的段引腳和com端都獨立接線,這種方式的好處是程序相對簡單,顯示無閃爍;缺點是功耗大。采用動態(tài)掃描時,各LED的段引腳鏈接在一起,而com段獨立,程序是通過控制各LED的com端的電平來決定點亮某一位LED

27、。其優(yōu)點是功耗小,缺點為編程相對復(fù)雜,當(dāng)CPU負擔(dān)較重時可能達不到理想的刷新速度,導(dǎo)致效果變差。</p><p>  圖3-7 試驗硬件圖</p><p>  圖3-8 LED靜態(tài)顯示仿真圖</p><p><b>  試驗程序</b></p><p>  #include"absacc.h"<

28、;/p><p>  unsigned char code LED_CODES[]= {0xc0,0xf9,0xa4,0xb0,0x99,</p><p>  0x92,0x82,0xf8,0x80,0x90,</p><p>  0x88,0x83,0xc6,0xa1,0x86,</p><p>  0x8e,0xff,0x0c,0x89,0x7

29、f,0xbf</p><p><b>  };</b></p><p>  void main() </p><p><b>  {</b></p><p>  XBYTE[0x0000]= LED_CODES[1];</p><p>  XBYTE[0x

30、0200]= LED_CODES[2];</p><p>  XBYTE[0x0400]= LED_CODES[8];</p><p><b>  while(1);</b></p><p><b>  }</b></p><p>  圖3-9 試驗仿真圖</p><p>

31、;  3.3.3 PID溫控器LED顯示及仿真</p><p>  圖3-10 LED程序流程圖</p><p>  下圖為PID溫控器LED顯示部分的Proteus仿真原理圖。8255A是一個教復(fù)雜的并行接口芯片,在PID溫控器主要用作I/O口擴展,用于LED的顯示。在編程時應(yīng)注意,由于8255A的復(fù)位時間較長,字應(yīng)用程序訪問8255A之前,應(yīng)有足夠的延時保證8255A已正確復(fù)位。

32、</p><p>  圖3-11 PID溫控器LED顯示仿真原理圖</p><p>  圖3-11中有6位動態(tài)掃描共陰極LED,它們的段引腳A~G、DP是并聯(lián)在一起的;引腳1~6位是各位LED的com端,相互獨立。8255A端口C經(jīng)74LS244的相同輸出S0~S7作為LED的段驅(qū)動信號,當(dāng)某位LED各段全部點亮?xí)r,com端電流會達到120~150mA,所以,選用驅(qū)動能力較強的ULN20

33、03A作為驅(qū)動器件。8255A端口B的PB0~PB5經(jīng)ULN2003A反相后的輸出B0~B5,作為LED的位選信號,排阻R10~R15作為ULN2003A的下拉電阻。</p><p><b>  實驗程序</b></p><p>  DISPLAY.H程序</p><p>  #define BASE 0x0000</p>&l

34、t;p>  #define PORT_A (BASE)</p><p>  #define PORT_B (BASE+ 1)</p><p>  #define PORT_C (BASE+ 2)</p><p>  #define PORT_CONTROL (BASE+ 3)</p><p>  #define LEDS 6

35、</p><p>  #define CA 0</p><p>  #define CC 1</p><p>  void turn_on(char led,char ChNumber,char mode);</p><p>  void LedsOff();</p><p>  void oneByone (ch

36、ar datas[]);</p><p>  extern void Init8255();</p><p>  unsigned char code Setect[];</p><p>  unsigned char code LED_CODES[];</p><p>  DISPLAY.C程序</p><p>  

37、#include "absacc.h"</p><p>  #include "reg51.h"</p><p>  #include "display.h"</p><p>  unsigned char code Select[]={0x01,0x02,0x04,0x08,0x10,0x20};<

38、/p><p>  unsigned char code LED_CODES[]={0xc0,0xF9,0xA4,0xB0,0x99,</p><p>  0x92,0x82,0xF8,0x80,0x90,</p><p>  0x88,0x83,0xC6,0xA1,0x86,</p><p>  0x8E,0xFF,0x0C,0x89,0x7F,

39、0xBF</p><p><b>  };</b></p><p>  void Init8255()</p><p>  {unsigned char i,j;</p><p>  for(j=0;j<10;j++) </p><p>  for(i=0;i<255;i++);&l

40、t;/p><p>  XBYTE[PORT_CONTROL]=0x90;</p><p>  LedsOff();</p><p><b>  }</b></p><p>  void turn_on(char led,char ChNumber,char mode)</p><p><b>

41、;  {</b></p><p>  if (mode== CA)</p><p>  XBYTE[PORT_C] =LED_CODES[ChNumber];</p><p><b>  else</b></p><p>  XBYTE[PORT_C] =~LED_CODES[ChNumber];</p

42、><p>  XBYTE[PORT_B] =Select[led];</p><p><b>  }</b></p><p>  void LedsOff()</p><p><b>  {</b></p><p>  XBYTE[PORT_B]=0x00;</p>

43、<p><b>  }</b></p><p><b>  MIAN.C程序</b></p><p>  #include "reg51.h"</p><p>  #include"display.h"</p><p>  void main()&

44、lt;/p><p><b>  {</b></p><p>  unsigned int m;</p><p>  unsigned char i;</p><p>  Init8255();</p><p><b>  i=LEDS-1;</b></p><

45、p><b>  while(1)</b></p><p><b>  {</b></p><p>  LedsOff();</p><p>  for(m= 50;m!=0;m--);</p><p>  turn_on(i,i,CC);</p><p>  for(m

46、= 50;m!=0;m--);</p><p>  if(i==0)i=LEDS-1;</p><p><b>  else i--;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  圖3-12

47、 PID溫控器LED動態(tài)顯示運行效果圖</p><p> ?。?3.4 鍵盤監(jiān)測基本原理</p><p>  鍵盤猶如一個開關(guān),當(dāng)鍵盤未閉合時,A點為高電平,當(dāng)K閉合后,電路導(dǎo)通,A點電平拉低,如將A點以某種方式介入計算機系統(tǒng),計算機就可以通過檢測A點電平的高低來判別K鍵是否閉合。在鍵的按下和松動過程中,電平都有一個抖動的過程,會引發(fā)鍵的誤檢測。電平抖動過程一般持續(xù)5~10ms,對抖動過

48、程的處理有硬件消抖和軟件消抖,在鍵較少時可采用硬件方式。但當(dāng)按鍵較多時適合用軟件消抖方式,如矩陣式鍵盤。</p><p><b>  a.獨立式鍵盤</b></p><p>  下圖是獨立式鍵盤的接線示意圖。其優(yōu)點是電路簡單,檢測方便;缺點是與矩陣鍵盤相比,占用太多I/O口,浪費資源。</p><p>  圖3-13 獨立式鍵盤</p&

49、gt;<p><b>  b.矩陣式鍵盤</b></p><p>  下圖是矩陣式鍵盤原理圖。圖中的鍵盤為4行4列共16個鍵,行掃描線為X0、X1、X2,X3,列掃描線為Y0、Y1、Y2、Y3。矩陣鍵盤的識別有行掃描法和行反轉(zhuǎn)法兩種。</p><p>  圖3-14 矩陣式鍵盤原理圖</p><p>  3.3.5 PID溫控

50、器的鍵盤設(shè)計及其Proteus仿真</p><p>  在6位LED上利用矩陣式鍵盤實現(xiàn)將按鍵的行、列顯示在LED的第1、2位和5、6位上。行掃描信號R0~R3來自于51單片機P1口的P1.0~P1.3,列掃描來自于51單片機的P1.4、P1.7。本次用到的是行反轉(zhuǎn)法識別按鍵,也就是說將行、列各接至一個端口,編程使CPU往行線說連端口全部輸出低電平,然后從列線所連端口讀入列線值。如果有某一個鍵被按下,則必有一條列

51、線位低電平,在進行反轉(zhuǎn),即將讀入的列線值從列線所連的端口輸出,在從行線所連端口讀入行線的值,那么閉合鍵所對應(yīng)的行線必位低電平。在通過程序?qū)λ昧芯€值和行線值的處理,就可以識別出按鍵所對應(yīng)的列號和行號。</p><p>  圖3-15 鍵盤程序流程圖如下:</p><p>  圖3-16 PID溫控器鍵盤原理圖:</p><p><b>  實驗程序;&

52、lt;/b></p><p>  DISPLAY.H程序(如前)</p><p>  DISPLAY.C程序(如前)</p><p><b>  按鍵檢測程序</b></p><p>  #include "absacc.h"</p><p>  #include &qu

53、ot;display.h"</p><p>  #include "Reg51.h"</p><p>  void delay()</p><p><b>  {char i;</b></p><p>  for(i=1000;i!=0;i--);</p><p>&

54、lt;b>  }</b></p><p>  char keyCheck(char*row,char*col)</p><p><b>  {</b></p><p>  unsigned char t1,t2,t3,i;</p><p>  unsigned char Result=0;</p&

55、gt;<p>  P1=0xf0;t1=P1;</p><p>  if(t1== 0xf0)goto exit;</p><p>  for(i= 11;i!=0;i--)</p><p><b>  delay();</b></p><p><b>  t1=P1;</b><

56、/p><p>  if(t1== 0xf0)goto exit;</p><p>  Result= 1;</p><p>  t2= 0x80;t1=~t1;</p><p>  for(i= 4;i!=0;i--)</p><p>  {t3=t2&t1;</p><p>  if(t3

57、!=0){*col=i-1;break;}</p><p>  else t2=t2 >>1;</p><p><b>  }</b></p><p><b>  t1=~t1;</b></p><p>  t1= t1|0x0f;</p><p><b&g

58、t;  P1=t1;</b></p><p><b>  t1=P1;</b></p><p>  t2= 0x08;t1=~t1;</p><p>  for(i=4;i!=0;i--)</p><p>  {t3=t2&t1;</p><p>  if(t3!=0){*ro

59、w=i-1;break;}</p><p>  else t2= t2>> 1;</p><p><b>  }</b></p><p><b>  exit:</b></p><p>  return Result;</p><p><b>  }&l

60、t;/b></p><p><b>  mian源程序</b></p><p>  #include "display.h"</p><p>  #include "absacc.h"</p><p>  #include "Reg51.h"</p&

61、gt;<p>  extern char keyCheck(char*row,char*col);</p><p>  void main()</p><p>  {char row,col,r;</p><p>  char strIndexs[6]={20,20,20,20,20,20};</p><p>  unsigne

62、d char i,k;</p><p>  Init8255();</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  r=keyCheck(&row,&col);</p><p><b>

63、;  if(r== 0)</b></p><p>  {strIndexs[5]=20;strIndexs[4]=20;</p><p>  strIndexs[1]=20;strIndexs[0]=20;</p><p><b>  }</b></p><p><b>  else</b&g

64、t;</p><p>  {strIndexs[5]=0;strIndexs[1]=0;</p><p>  strIndexs[4]=row;strIndexs[0]=col;</p><p><b>  }</b></p><p>  for(k= 6;k!=0;k--)</p><p>  

65、{LedsOff();</p><p>  for(i= 250;i!=0;i--);</p><p>  turn_on(k-1,strIndexs[k-1],CC);</p><p>  for(i=250;i!=0;i--);</p><p><b>  }</b></p><p><

66、;b>  }</b></p><p><b>  }</b></p><p>  圖3-17 程序仿真圖</p><p>  第4章 PID溫控器的爐溫采樣接口及仿真</p><p>  在計算機實時測量和智能化儀表等應(yīng)用系統(tǒng)中,經(jīng)常會遇到從時間到數(shù)值均連續(xù)變化的模擬量,如溫度、壓力、位移、速度等,與

67、此相對應(yīng)的電信號稱為模擬信號。因單片機只能處理數(shù)字量,因此這些模擬電信號必須轉(zhuǎn)化為離散的數(shù)字信號,才能被送給單片機進行相應(yīng)的處理。將模擬信號轉(zhuǎn)化為數(shù)字量的器件稱為A/D轉(zhuǎn)換器,簡稱A/D。</p><p>  4.4.1 A/D轉(zhuǎn)化器的主要技術(shù)指標(biāo)</p><p><b>  a.分辨率</b></p><p>  分辨率是指輸出數(shù)字量變化的一

68、個相鄰數(shù)碼所需要輸入模擬電壓的變化量。習(xí)慣上用輸出的二進制位數(shù)或BCD碼位數(shù)表示。例如,分辨率為12位的A/D轉(zhuǎn)換器,表示該轉(zhuǎn)化器的輸出數(shù)據(jù)可以用2^12個二進制數(shù)進行量化。分辨率用唄分數(shù)表示如下:</p><p>  1/2^12 *100%=1/4096 *100%=0.0244%</p><p>  故一個滿刻度為10V的12位A/D轉(zhuǎn)換器能夠分辨輸入電壓變化的最小值為2.4V。&l

69、t;/p><p><b>  b.量化誤差</b></p><p>  量化誤差是指由A/D轉(zhuǎn)換器的優(yōu)先分辨率多引起的誤差。若不考慮其他誤差的影響,一個分辨率有限的A/D轉(zhuǎn)換器的階梯狀轉(zhuǎn)移特性曲線與具有無限分辨率的A/D轉(zhuǎn)換器轉(zhuǎn)移特性曲線(直線)之間的最大誤差,稱為誤差量化。提高分辨率能夠減少量化誤差。</p><p><b>  c.轉(zhuǎn)

70、換精度</b></p><p>  轉(zhuǎn)換精度是指A/D轉(zhuǎn)換器的時間量化值與理想A/D轉(zhuǎn)換器的差值。轉(zhuǎn)換精度可以分為絕對精度和相對精度,是由非線性、零點刻度、滿量程刻度以及溫漂等因素所引起的誤差。</p><p><b>  d.轉(zhuǎn)換速率</b></p><p>  轉(zhuǎn)換速率就是指能夠重復(fù)進行數(shù)據(jù)轉(zhuǎn)換的速度,即每秒轉(zhuǎn)換的次數(shù)。而完成一

71、次的A/D轉(zhuǎn)換所需要的時間,則是轉(zhuǎn)換速率的倒數(shù)。</p><p>  4.4.2 PID溫控器A/D轉(zhuǎn)換編程方法</p><p>  采用的是端口查詢方式,先向51單片機P3.3寫入1,然后讀入P3口。檢查P3.3是為位0,不為0則重新讀入P3在檢測,直到P3.3為0 ,此時表示數(shù)據(jù)轉(zhuǎn)換過程已結(jié)束,讀片外地址0x2XXX,P1,/RD為低電平,經(jīng)74LS02反向為高電平,向ADC0808的

72、OE送讀數(shù)據(jù)的信號,ADC0808將轉(zhuǎn)換結(jié)果從Out7~Out0送到數(shù)據(jù)總線并讀入CPU。實現(xiàn)在LED上顯示讀取的A/D轉(zhuǎn)換值。</p><p><b>  程序流程圖如下;</b></p><p><b>  實驗硬件圖</b></p><p><b>  實驗程序</b></p>&

73、lt;p>  DISPLAY.H程序和DISPLAY.C程序(如前)</p><p>  主程序ADC0808.c</p><p>  #include <display.h></p><p>  #include <absacc.h></p><p>  #include <reg51.h><

74、/p><p>  #define ADC_0808 1</p><p>  #define ADC0808_DATA_PORT 0x2000</p><p>  #define ADC0808_QUERY_PORT 0x4000</p><p>  #define ADC0808_START_PORT 0x2000</p>

75、<p>  unsigned char getData2(unsigned char ADC_Chip,unsigned char channel)</p><p><b>  {</b></p><p>  unsigned char flag= 0;</p><p>  unsigned char value= -1;</p

76、><p>  unsigned xdata ale;</p><p>  switch (ADC_Chip)</p><p><b>  {</b></p><p>  case ADC_0808:</p><p>  P3= P3|0x08;</p><p>  XBYTE[

77、ADC0808_START_PORT]= channel;</p><p>  P3= P3&0xdf;</p><p>  P3= P3|0x20;</p><p>  P3= P3&0xdf;</p><p><b>  flag= P3;</b></p><p><b&

78、gt;  while(1)</b></p><p><b>  {</b></p><p><b>  ale= 1;</b></p><p>  flag=flag & 0x08;</p><p>  if(flag==0) break;</p><p>

79、;<b>  flag= P3;</b></p><p><b>  }</b></p><p>  value= XBYTE[ADC0808_DATA_PORT];</p><p>  return value;</p><p><b>  break;</b></p&

80、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  void dispStr(char strIndexs[],unsigned char value,char channel)</p><p><b>  {</b></p>

81、<p><b>  char i,k;</b></p><p>  for(i= 0;i<3;i++)</p><p><b>  {</b></p><p>  strIndexs[i]= value%10;</p><p>  value= value/10;</p>

82、<p><b>  }</b></p><p>  strIndexs[4]= channel;</p><p>  LedsOff();</p><p>  for(i=250;i!=0;i--);</p><p>  for(k=6;k!=0;k--)</p><p><b

83、>  {</b></p><p>  LedsOff();</p><p>  for(i=250;i!=0;i--);</p><p>  turn_On(k-1,strIndexs[k-1],CC);</p><p>  for(i=250;i!=0;i--);</p><p><b>

84、  }</b></p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p>  unsigned char value;</p><p>  unsigned int k;</p

85、><p>  char strIndexs[6]={20,20,20,20,1,12};</p><p>  Init8255();</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  value= getData2(

86、ADC_0808,1);</p><p>  for(k=100;k!=0;k--)</p><p>  dispStr(strIndexs,value,1);</p><p>  LedsOff();</p><p><b>  }</b></p><p><b>  }</b&

87、gt;</p><p><b>  實驗仿真圖</b></p><p>  AD轉(zhuǎn)換(總線查詢方式和中斷方式)</p><p>  讀片外地址0x4XXX,P2和/RD位低電平,經(jīng)74LS02反相后打開三態(tài)門74LS125,將轉(zhuǎn)換是否完成的標(biāo)志EOC通過數(shù)據(jù)總線D7讀入CPU,檢查D7是否為1,若不為1,則重新讀端口0x4XXX在檢測,直到D7

88、為1為止,讀片外地址0x2XXX,P1,/RD為低電平,經(jīng)74LS02反向為高電平,向ADC0808的OE送讀數(shù)據(jù)的信號,ADC0808將轉(zhuǎn)換結(jié)果從Out7~Out0送到數(shù)據(jù)總線并讀入CPU。</p><p><b>  實驗硬件圖</b></p><p><b>  總線查詢方式硬件圖</b></p><p><b

89、>  中斷方式硬件圖</b></p><p><b>  實驗程序</b></p><p>  1、總線查詢方式程序</p><p>  A、DISPLAY.H和DISPLAY.C程序同上次實驗</p><p>  B、主程序ADZX.C</p><p>  #include &

90、lt;display.h></p><p>  #include <absacc.h></p><p>  #include <reg51.h></p><p>  #define ADC_0808 1</p><p>  #define ADC0808_DATA_PORT 0X2000</p&g

91、t;<p>  #define ADC0808_QUERY_PORT 0x4000</p><p>  #define ADC0808_START_PORT 0x2000</p><p>  unsigned char getData1(unsigned char ADC_Chip,unsigned char channel)</p><p>  {u

92、nsigned char flag= 0;</p><p>  unsigned char value= -1;</p><p>  unsigned xdata ale;</p><p>  switch (ADC_Chip)</p><p>  {case ADC_0808:</p><p>  XBYTE[ADC

93、0808_START_PORT]=channel;</p><p>  P3=P3|0x08;</p><p>  P3=P3&0xdf;</p><p>  P3=P3|0x20;</p><p>  P3=P3&0xdf;</p><p><b>  flag=P3;</b>&

94、lt;/p><p><b>  while(1)</b></p><p><b>  { ale=1;</b></p><p>  flag=flag &0x08;</p><p>  if(flag ==0) break;</p><p><b>  flag

95、=P3;</b></p><p><b>  }</b></p><p>  value=XBYTE[ADC0808_DATA_PORT];</p><p>  return value;</p><p><b>  break;</b></p><p><

96、b>  }</b></p><p><b>  }</b></p><p>  void dispStr (char strIndexs[],unsigned char value,char channel)</p><p>  {char i,k;</p><p>  for(i= 0;i<3;

97、i++)</p><p>  { strIndexs[i]=value% 10;</p><p>  value=value/10;</p><p><b>  }</b></p><p>  strIndexs[4]=channel;</p><p>  LedsOff();</p>

98、<p>  for(i= 250;i!=0;i--);</p><p>  for(k=6;k!=0;k--)</p><p>  {LedsOff();</p><p>  for(i= 250;i!=0;i--);</p><p>  turn_On(k-1,strIndexs[k-1],CC);</p>&l

99、t;p>  for(i= 250;i!=0;i--);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void main()</p><p>  {unsigned char value;</p><p>  uns

100、igned int k;</p><p>  char strIndexs[6]={20,20,20,20,1,12};</p><p>  Init8255();</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>

101、  value= getData1(ADC_0808,0);</p><p>  for(k= 100;k!=0;k--)</p><p>  dispStr(strIndexs,value,0);</p><p>  LedsOff();</p><p><b>  }</b></p><p>

102、<b>  }</b></p><p><b>  中斷方式程序</b></p><p>  A、DISPLAY.H和DISPLAY.C程序同上次實驗</p><p>  B、主程序ADC0808ZD.C</p><p>  #include <display.h></p>

103、<p>  #include <absacc.h></p><p>  #include <reg51.h></p><p>  #define ADC_0808 1</p><p>  #define ADC0808_DATA_PORT 0X2000</p><p>  #define ADC0

104、808_QUERY_PORT 0x4000</p><p>  #define ADC0808_START_PORT 0x2000</p><p>  unsigned char value;</p><p>  void dispStr (char strIndexs[],unsigned char value,char channel)</p>&

105、lt;p>  {char i,k;</p><p>  for(i= 0;i<3;i++)</p><p>  { strIndexs[i]=value% 10;</p><p>  value=value/10;</p><p><b>  }</b></p><p>  strIn

106、dexs[4]=channel;</p><p>  LedsOff();</p><p>  for(i= 250;i!=0;i--);</p><p>  for(k=6;k!=0;k--)</p><p>  {LedsOff();</p><p>  for(i= 250;i!=0;i--);</p>

107、;<p>  turn_On(k-1,strIndexs[k-1],CC);</p><p>  for(i= 250;i!=0;i--);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void main()</p>

108、<p><b>  {</b></p><p>  unsigned xdata ale;</p><p>  Init8255();</p><p>  EX1=1;IT1=1;</p><p><b>  EA=1;</b></p><p>  XBYTE[A

109、DC0808_START_PORT]=5;</p><p>  P3=P3&0xdf;</p><p>  P3=P3|0x20;</p><p>  P3=P3&0xdf;</p><p><b>  while(1)</b></p><p><b>  {ale=1;

110、</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void EX1_Int() interrupt 2</p><p>  {unsigned char value;</p><p>  char str

111、Indexs[6]={20,20,20,20,1,12};</p><p><b>  EX1= 0;</b></p><p>  value=XBYTE[ADC0808_START_PORT];</p><p>  dispStr(strIndexs,value,5);</p><p>  LedsOff();<

112、/p><p><b>  EX1= 1;</b></p><p>  P3=P3&0xdf;</p><p>  P3=P3|0x20;</p><p>  P3=P3&0xdf;</p><p><b>  }</b></p><p>&

113、lt;b>  實驗仿真圖</b></p><p><b>  總線查詢方式仿真圖</b></p><p><b>  總線查詢方式仿真圖</b></p><p><b>  中斷方式仿真圖</b></p><p>  第5章 測溫放大電路</p>

114、<p>  利用的是熱電阻測溫的原理,金屬熱電阻的電阻值與其溫度成線性關(guān)系,將熱電阻Rt介入電橋中,設(shè)在某一溫度t0時,Rt的阻值為R0,將電橋調(diào)整平衡,即R1/R0=R2/R3,此時Ul=0.當(dāng)Rt的溫度偏離t0而變?yōu)閠時,其阻值將發(fā)生變化,電橋失去平衡,若測出此時的Ul,則可根據(jù)Ul和Rt的關(guān)系,算出在溫度為t時熱電阻的阻值 Rt,再根據(jù)熱電阻的溫度-阻值關(guān)系線,換算出熱電阻的溫度t0。若電橋的輸出電壓Ul于Rt的阻值

115、變換成線性關(guān)系,則通過運算放大、A/D轉(zhuǎn)換后可方便地將Ul轉(zhuǎn)換為熱電阻所測溫度。</p><p><b>  程序流程圖如下:</b></p><p><b>  實驗硬件圖</b></p><p><b>  試驗程序</b></p><p>  1、Display.h<

116、;/p><p>  #define BASE 0x0000</p><p>  #define PORT_A (BASE)</p><p>  #define PORT_B (BASE+ 1)</p><p>  #define PORT_C (BASE+ 2)</p><p>  #define PORT_CONT

117、ROL (BASE+ 3)</p><p>  #define LEDS 6</p><p>  #define CA 0</p><p>  #define CC 1</p><p>  void turn_On (char led,char ChNumber,char mode);</p><p&

118、gt;  void LedsOff();</p><p>  void OneByOne (char datas[]);</p><p>  void turn_On_WithDot(char led,char ChNumber,char mode);</p><p>  extern void Init8255();</p><p>  u

119、nsigned char code Select[];</p><p>  unsigned char code LED_CODES[];</p><p>  2、Display.c</p><p>  #include <absacc.h></p><p>  #include <reg51.h></p>

120、<p>  #include <display.h></p><p>  unsigned char code Select[]={0x01,0x02,0x04,0x08,0x10,0x20};</p><p>  unsigned char code LED_CODES[]={0XC0,0xF9,0xA4,0xB0,0x99,</p><p&

121、gt;  0x92,0x82,0xF8,0x80,0x90,</p><p>  0x88,0x83,0xC6,0xA1,0x86,</p><p>  0x8E,0xFF,0x0C,0x89,0x7F,0xBF</p><p><b>  };</b></p><p>  void Init8255()</p&g

122、t;<p>  { unsigned char i,j;</p><p>  for(j=0;j<10;j++)</p><p>  for(i=0;i<255;i++);</p><p>  XBYTE[PORT_CONTROL]= 0x90;</p><p>  LedsOff();</p><

123、;p><b>  }</b></p><p>  void turn_On (char led,char ChNumber,char mode)</p><p><b>  {</b></p><p>  if(mode== CA)</p><p>  XBYTE[PORT_C]= LED_C

124、ODES[ChNumber];</p><p><b>  else</b></p><p>  XBYTE[PORT_C]=~LED_CODES[ChNumber];</p><p>  XBYTE[PORT_B]= Select[led];</p><p><b>  }</b></p&g

125、t;<p>  void LedsOff()</p><p><b>  {</b></p><p>  XBYTE[PORT_B]= 0x00;</p><p><b>  }</b></p><p>  void turn_On_WithDot(char led,char ChNu

126、mber,char mode)</p><p><b>  {</b></p><p>  if(mode== CA)</p><p>  XBYTE[PORT_C]=LED_CODES[ChNumber]|~0x80;</p><p><b>  else</b></p><p

127、>  XBYTE[PORT_C]=~LED_CODES[ChNumber]|0x80;</p><p>  XBYTE[PORT_B]=Select[led];</p><p><b>  }</b></p><p><b>  Main.c</b></p><p>  #include &l

128、t;display.h></p><p>  #include <absacc.h></p><p>  #include <reg51.h></p><p>  #define ADC_0808 1</p><p>  #define ADC0808_DATA_PORT 0x2000</p>

溫馨提示

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

評論

0/150

提交評論