stc89c52單片機(jī)畢業(yè)論文_第1頁(yè)
已閱讀1頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

2、實(shí)時(shí)時(shí)鐘電路、LED顯示以及通訊模塊電路等。系統(tǒng)程序主要包括主程序,讀出溫度子程序,計(jì)算溫度子程序、按鍵處理程序、LCD顯示程序以及數(shù)據(jù)存儲(chǔ)程序等。</p><p>  關(guān)鍵詞: STC89C52單片機(jī);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單片機(jī)結(jié)構(gòu)和原理</p><p>  單片微型計(jì)算機(jī)簡(jiǎn)稱單片機(jī),也稱為微控制器(Micro Controller U

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

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

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

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

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

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

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

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

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

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

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

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

18、r51協(xié)議,需要硬件支持)功能,但我們?cè)诶盟挠布抡婀δ艿臅r(shí)候,它會(huì)受到一定的限制。如果我們將Proteus ISIS與Keil整合起來(lái)使用,充分利用各自的仿真功能,單片機(jī)軟硬件的調(diào)試將變的十分有效。</p><p>  打開(kāi)LED.dsn,刪除LED設(shè)計(jì)頁(yè)中的ULA2003A驅(qū)動(dòng)部分,在LED設(shè)計(jì)頁(yè)新建一個(gè)子電路LED_DRIVER,為該子電路見(jiàn)撒謊那個(gè)輸入/輸出端子。移動(dòng)鼠標(biāo)指針帶子電路上。按Ctrl+C

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

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

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

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

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

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

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

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

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

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

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

33、03A作為驅(qū)動(dòng)器件。8255A端口B的PB0~PB5經(jīng)ULN2003A反相后的輸出B0~B5,作為LED的位選信號(hào),排阻R10~R15作為ULN2003A的下拉電阻。</p><p><b>  實(shí)驗(yàn)程序</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動(dòng)態(tài)顯示運(yùn)行效果圖</p><p>  3.3.4 鍵盤(pán)監(jiān)測(cè)基本原理</p><p>  鍵盤(pán)猶如一個(gè)開(kāi)關(guān),當(dāng)鍵盤(pán)未閉合時(shí),A點(diǎn)為高電平,當(dāng)K閉合后,電路導(dǎo)通,A點(diǎn)電平拉低,如將A點(diǎn)以某種方式介入計(jì)算機(jī)系統(tǒng),計(jì)算機(jī)就可以通過(guò)檢測(cè)A點(diǎn)電平的高低來(lái)判別K鍵是否閉合。在鍵的按下和松動(dòng)過(guò)程中,電平都有一個(gè)抖動(dòng)的過(guò)程,會(huì)引發(fā)鍵的誤檢測(cè)。電平抖動(dòng)過(guò)程一般持續(xù)5~10ms,對(duì)抖動(dòng)過(guò)

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

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

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

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

52、lt;/b></p><p>  DISPLAY.H程序(如前)</p><p>  DISPLAY.C程序(如前)</p><p><b>  按鍵檢測(cè)程序</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>  在計(jì)算機(jī)實(shí)時(shí)測(cè)量和智能化儀表等應(yīng)用系統(tǒng)中,經(jīng)常會(huì)遇到從時(shí)間到數(shù)值均連續(xù)變化的模擬量,如溫度、壓力、位移、速度等,與

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

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

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

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

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

72、OE送讀數(shù)據(jù)的信號(hào),ADC0808將轉(zhuǎn)換結(jié)果從Out7~Out0送到數(shù)據(jù)總線并讀入CPU。實(shí)現(xiàn)在LED上顯示讀取的A/D轉(zhuǎn)換值。</p><p><b>  程序流程圖如下;</b></p><p><b>  實(shí)驗(yàn)硬件圖</b></p><p><b>  實(shí)驗(yàn)程序</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>  實(shí)驗(yàn)仿真圖</b></p><p>  AD轉(zhuǎn)換(總線查詢方式和中斷方式)</p><p>  讀片外地址0x4XXX,P2和/RD位低電平,經(jīng)74LS02反相后打開(kāi)三態(tài)門(mén)74LS125,將轉(zhuǎn)換是否完成的標(biāo)志EOC通過(guò)數(shù)據(jù)總線D7讀入CPU,檢查D7是否為1,若不為1,則重新讀端口0x4XXX在檢測(cè),直到D7

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

89、>  中斷方式硬件圖</b></p><p><b>  實(shí)驗(yàn)程序</b></p><p>  1、總線查詢方式程序</p><p>  A、DISPLAY.H和DISPLAY.C程序同上次實(shí)驗(yàn)</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程序同上次實(shí)驗(yàn)</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>  實(shí)驗(yàn)仿真圖</b></p><p><b>  總線查詢方式仿真圖</b></p><p><b>  總線查詢方式仿真圖</b></p><p><b>  中斷方式仿真圖</b></p><p>  第5章 測(cè)溫放大電路</p>

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

115、變換成線性關(guān)系,則通過(guò)運(yùn)算放大、A/D轉(zhuǎn)換后可方便地將Ul轉(zhuǎn)換為熱電阻所測(cè)溫度。</p><p><b>  程序流程圖如下:</b></p><p><b>  實(shí)驗(yàn)硬件圖</b></p><p><b>  試驗(yàn)程序</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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論