紅外線報警器畢業(yè)設計搶先版_第1頁
紅外線報警器畢業(yè)設計搶先版_第2頁
紅外線報警器畢業(yè)設計搶先版_第3頁
紅外線報警器畢業(yè)設計搶先版_第4頁
紅外線報警器畢業(yè)設計搶先版_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于單片機控制的紅外報警器設計基于單片機控制的紅外報警器設計PAGE 32PAGE 31 正文一、選題背景及類型1.1背景現(xiàn)代社會智能化水平越來越高,給我們的生活帶來了很大便利。人們對安全有了很高的要求,以前的機械報警器已經(jīng)不能滿足人們對安全的要求了,電子報警器代替了機械報警器,電子報警器安裝方便,成本價格低,安全性高,已經(jīng)走進人們的視野,在對于企業(yè)來講,高端技術的應用能夠給企業(yè)帶來很高的利潤,減少不必要的安全損失或者是財產(chǎn)損失;對于居民而言,生活水平的提高使大部分人都住進了樓房,安全問題就出現(xiàn)了,為了防止不必要的損失,加強自身財產(chǎn)的安全管理,使用報警器就是必然的了。這不僅加強了安全,而且還使

2、得我們應用更方便、更經(jīng)濟,為此更準確與更經(jīng)濟的控制方式使我們一直追求的目標。單片機控制的紅外線報警器就是一種比較實用而且價格實惠的報警器,在這方面的應用是比較好的。1.2報警器的分類報警器是一種為防止或預防某事件發(fā)生所造成的后果,以聲音、光、氣壓等形式來提醒或警示我們應當采取某種行動的電子產(chǎn)品。分為兩種報警器:機械報警器和電子報警器。隨著科技的進步,機械式報警器越來越多地被先進的電子報警器代替,經(jīng)常應用于系統(tǒng)故障、安全防范、交通運輸、醫(yī)療救護、應急救災、感應檢測等領域,與社會生產(chǎn)密不可分。以下是常見的報警器。(1)氣體報警器(2)煙霧報警器(3)燃氣報警器(4)可燃性氣體報警器(5)紅外線報警

3、器本文主要介紹的是紅外線報警器,以下就著重說一下有關紅外線報警器的一些知識。紅外線報警器分為主動式和被動式兩種。主動式紅外線報警器,是報警器主動發(fā)出紅外線,紅外線碰到障礙物,就會反彈回來,被報警器的探頭接收。如果探頭監(jiān)測到,紅外線是靜止不動的,也就是不斷發(fā)出紅線線又不斷反彈的,那么報警器就不會報警。當有會動的物體觸犯了這根看不見的紅線的時候,探頭就會檢測到有異常,就會報警。 被動式報警器少了一項功能,就是發(fā)射紅外線。物理學上告訴我們,當物體的溫度高于0K的時候,就會發(fā)出紅外線,換句話說任何物體都能發(fā)出紅外線。而其后的原理,被動式報警器和主動式是一樣的。 紅外線報警器對溫度敏感,溫度越高的物體輻

4、射出的紅外線越強,當感應到環(huán)境中存在高出背景強度的輻射時,就觸發(fā)反警。把報警主機通電放在固定位置,把報警探頭掛在約2米高的地方,使其向前下方傾斜,以獲得較高的靈敏度。接通電源,經(jīng)過1分鐘左右的延時后,報警器進入警戒狀態(tài),這時,若有人進入監(jiān)控區(qū),即刻報警。報警約1分鐘,自動停止。然后重新處于警戒狀態(tài)。主人進入時,首先按一下遙控器上的關機鍵,隨著報警器一聲“嘀”響,即關閉了報警器,進入警戒區(qū)也不再報警。當主人離開警戒區(qū)后,按一下開機鍵,隨一聲“嘀”響,報警器重處于警戒狀態(tài)。遇到緊急情況,按一下緊急報警鍵,報警器即緊急報警。報警器內(nèi)設有高,中,低三檔靈敏度調(diào)整,用戶可根據(jù)需要自行調(diào)整。二、硬件部分2

5、.1DS18B20(溫度傳感器)的簡介 基于單片機控制的紅外報警器中的傳感器是DS18B20(溫度傳感器),該傳感器由DALLS半導公司生產(chǎn)的DS18B20型單線智能溫度傳感器,屬于新一代適配微處理器的智能溫度傳感器,可廣泛用于工業(yè)、民用、軍事等領域的溫度測量及控制儀測控系統(tǒng)和大型設備中。它具有體積小,接口方便,傳輸距離遠等特點。下面主要是溫度傳感器的性能特點、內(nèi)部結(jié)構及控制方法。2.1.1DS18B20性能特點(1)采用單總線專用技術,既可通過串行口線,也可通過其它I/O口線與微機接口,無須經(jīng)過其它變換電路,直接輸出被測溫度值(9位二進制數(shù),含符號位)。(2)測溫范圍為-55-+125,測量

6、分辨率為0.0625。(3)內(nèi)含64位經(jīng)過激光修正的只讀存儲器ROM。(4)適配各種單片機或系統(tǒng)機。(5)用戶可分別設定各路溫度的上、下限。(6)內(nèi)含寄生電源 。2.1.2DS18B20內(nèi)部結(jié)構 DS18B20內(nèi)部結(jié)構主要由四部分組成:64位光刻ROM(它是出廠前被光刻好的,它可以看作是該DS18B20的地址序列號。不同的器件地址序列號不同。),溫度傳感器,非揮發(fā)的溫度報警觸發(fā)器TH和TL,高速暫存器。DS18B20的管腳排列如圖1所示。 圖1DS18B20引腳分布圖 2.1.3DS18B20控制方法 在硬件上,DS18B20與單片機的連接有兩種方法,一種是Vcc接外部電源,GND接地,I/O

7、與單片機的I/O線相連;另一種是用寄生電源供電,此時UDD、GND接地,I/O接單片機I/O。無論是內(nèi)部寄生電源還是外部供電,I/O口線要接5K左右的上拉電阻。 DS18B20有六條控制命令,如表1所示: 指 令約定代碼操 作 說 明 溫度轉(zhuǎn)換44H啟動DS18B20進行溫度轉(zhuǎn)換 讀暫存器BEH讀暫存器9個字節(jié)內(nèi)容 寫暫存器4EH將數(shù)據(jù)寫入暫存器的TH、TL字節(jié) 復制暫存器48H把暫存器的TH、TL字節(jié)寫到E2RAM中 重新調(diào)E2RAMB8H把E2RAM中的TH、TL字節(jié)寫到暫存器TH、TL字節(jié) 讀電源供電方式B4H啟動DS18B20發(fā)送電源供電方式的信號給主CPU CPU對DS18B20的訪

8、問流程是:先對DS18B20初始化,再進行ROM操作命令,最后才能對存儲器操作,數(shù)據(jù)操作。DS18B20每一步操作都要遵循嚴格的工作時序和通信協(xié)議。如主機控制DS18B20完成溫度轉(zhuǎn)換這一過程,根據(jù)DS18B20的通訊協(xié)議,須經(jīng)三個步驟:每一次讀寫之前都要對DS18B20進行復位,復位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對DS18B20進行預定的操作。2.21602液晶屏 液晶顯示器以其微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧的諸多優(yōu)點,在袖珍式儀表和低功耗應用系統(tǒng)中得到越來越廣泛的應用。液晶顯示器可以分為兩大類,一類是點陣型,另一類是字符型。點陣型通常面積較大,可以顯示圖形;

9、而一般的字符型液晶只有兩行,面積小,只能顯示字符和一些簡單的圖形,簡單易控制且成本低。與此同時1062液晶屏的實用性很高。下面簡要的說明一下它的電氣連接。1.1電氣連接1602液晶屏采用標準的16腳接口,定義如下表2所示: 表2 1602液晶屏的引腳定義注: 液晶顯示偏壓信號:是指用于驅(qū)動1602液晶屏上的像素點改變顏色所用的電壓,此電壓可能接近GND,本實驗板所用的1602液晶是接近GND。 讀寫選擇端是用于控制對液晶的讀和寫的信號,在本實驗板內(nèi)被直接連接在GND上,即采用只寫不讀的方式(只要在兩次寫中間加適當?shù)难訒r即可)。第1腳:VSS為地電源。第2腳:VDD接5V正電源。第3腳:V0為液

10、晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。第5腳:RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和RW共同為低電平時可以寫入指令或者顯示地址,當RS為低電平RW為高電平時可以讀忙信號,當RS為高電平RW為低電平時可以寫入數(shù)據(jù)。第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。第714腳:D0D7為8位雙向數(shù)據(jù)線。 第1516腳:空腳。圖2 1602液晶屏2.3蜂鳴器蜂鳴器發(fā)聲原理是電流通過

11、電磁線圈,使電磁線圈產(chǎn)生磁場來驅(qū)動振動膜發(fā)聲的,因此需要一定的電流才能驅(qū)動它,單片機IO引腳輸出的電流較小,單片機輸出的TTL電平基本上驅(qū)動不了蜂鳴器,因此需要增加一個電流放大的電路。實驗板通過一個三極管Q1來放大驅(qū)動蜂鳴器。蜂鳴器的正極接到Q1的集電極C極上面,蜂鳴器的負極地,三極管發(fā)射極E極接電源VCC,基級B經(jīng)過限流電阻R33后由單片機的P1.7引腳控制,當P1.7輸出高電平時,三極管T1截止,沒有電流流過線圈,蜂鳴器不發(fā)聲當P17輸出低電平時,三極管導通,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過程序控制P1.7腳的電平來使蜂鳴器發(fā)出聲音和關閉。程序中改變單片機P1.7引腳

12、輸出波形的頻率,就可以調(diào)整控制蜂鳴器音調(diào),產(chǎn)生各種不同音色、音調(diào)的聲音。另外,改變P1.7輸出電平的高低電平占空比,則可以控制蜂鳴器的聲音大小。2.4stc89c51單片機2.4.1簡介單片機又稱單片微控制器,它不是完成某一個邏輯功能的芯片,而是把一個計算機系統(tǒng)集成到一個芯片上。概括的講:一塊芯片就成了一臺計算機。它的體積小、質(zhì)量輕、價格便宜、為學習、應用和開發(fā)提供了便利條件。同時,學習使用單片機了解計算機原理與結(jié)構的最佳選擇.可以說,二十世紀跨越了三個“電”的時代,即電氣時代、電子時代和現(xiàn)已進入的電腦時代。不過,這種電腦,通常是指個人計算機,簡稱PC機。它由主機、鍵盤、顯示器等組成(如圖1所

13、示)。還有一類計算機,大多數(shù)人卻不怎么熟悉。這種計算機就是把智能賦予各種機械的單片機(亦稱微控制器,如圖2所示)。顧名思義,這種計算機的最小系統(tǒng)只用了一片集成電路,即可進行簡單運算和控制。因為它體積小,通常都藏在被控機械的“肚子”里。它在整個裝置中,起著有如人類頭腦的作用,它出了毛病,整個裝置就癱瘓了。現(xiàn)在,這種單片機的使用領域已十分廣泛,如智能儀表、實時工控、通訊設備、導航系統(tǒng)、家用電器等。各種產(chǎn)品一旦用上了單片機,就能起到使產(chǎn)品升級換代的功效,常在產(chǎn)品名稱前冠以形容詞“智能型”,如智能型洗衣機等。現(xiàn)在有些工廠的技術人員或其它業(yè)余電子開發(fā)者搞出來的某些產(chǎn)品,不是電路太復雜,就是功能太簡單且極

14、易被仿制。究其原因,可能就卡在產(chǎn)品未使用單片機或其它可編程邏輯器件上。在紅外線報警器當中我們應用的單片機是stc89c51單片機,由它來控制報警器的運行。2.5紅外對管紅外對管是紅外線發(fā)射管與光敏接收管,或者紅外線接收管,或者紅外線接收頭配合在一起使用時候的總稱。下面主要是對紅外對管中紅外線以及功能的說明。2.5.1紅外線 在光譜中波長自0.76至400微米的一段稱為紅外線,紅外線是不 HYPERLINK /view/68621.htm t _blank 可見光線。所有高于絕對零度(-273.15)的物質(zhì)都可以產(chǎn)生紅外線。現(xiàn)代物理學稱之為熱 HYPERLINK /view/290246.htm

15、 t _blank 射線。醫(yī)用紅外線可分為兩類:近紅外線與遠紅外線。 HYPERLINK /image/263e802f1d6ac17c1f30898c o 查看圖片 t _blank 圖3紅外線發(fā)射管紅外線發(fā)射管在LED封裝行業(yè)中主要有三個常用的波段,如下850NM、875NM、940NM。根據(jù)波長的特性運用的產(chǎn)品也有很大的差異,850NM波長的主要用于紅外線監(jiān)控設備、875NM主要用于醫(yī)療設備、940NM波段的主要用于紅外線控制設備。EG:紅外線遙控器、光電開關、光電記數(shù)設備等。2.5.2功能說明(1)光敏接收管它是一個具有光敏特征的PN結(jié),屬于光敏三極管,具有單向?qū)щ娦裕虼斯ぷ鲿r需加上

16、反向電壓。無光照時,有很小的飽和反向漏電流(暗電流)。此時光敏管不導通。當光照時,飽和反向漏電流馬上增加,形成光電流,在一定的范圍內(nèi)它隨入射光強度的變化而增大。(2)紅外接收管功能與光敏接收管相似只是不受可見光的干擾,屬于光敏二極管,只對紅外線有反應。(3)紅外線接收頭就是在紅外線接收管的基礎上進行放大的信號的作用,類似與三極管的放大效果。三、軟件部分3.1原理圖與程序3.1.1原理圖紅外線報警器是由單片機最小系統(tǒng)以及其他元件組成的,單片機最小系統(tǒng)是其中不可缺少的,是其中的核心元件,下面是紅外線報警器的原理圖。 圖4 紅外線報警器原理圖3.1.2以下是基于單片機控制紅外線報警器的程序 #inc

17、lude#include#include #include LCD1602.h#include ds18b20.c#include 38khz.c#define uchar unsigned char#define uint unsigned intsbit OUT=P22;sbit P32=P32;uchar bInt0 = 0;uint mstcnt=0;uchar t,set;bit outflag;bit write=0;bit flag;bit flag2;bit TR1_flag; /控制蜂鳴器報警uchar code str0= system running ;uchar cod

18、e str1= OK SA: . C;uchar code str2=wrong SA: . C;void init_timer0(void); void displayfun1(void);uchar ReadOneChar(void);void WriteOneChar(unsigned char dat);void ReadTemperature(void);void playalarm(void); /*LCD display function*/void displayfun1(void)WriteCommandLCM(0 x0c,1); DisplayListChar(0,0,st

19、r0);/DisplayListChar(0,1,str1); DisplayOneChar(11,1,temp1/10+0 x30); DisplayOneChar(12,1,temp1%10+0 x30);DisplayOneChar(14,1,temp2/10+0 x30);void display() if(!TR1_flag) / 為0時顯示OK,為1時顯示W(wǎng)RONG DisplayListChar(0,1,str1); displayfun1(); delay_LCM(1000); else DisplayListChar(0,1,str2); displayfun1(); del

20、ay_LCM(1000); /*timer t0 initialization*/void init_timer1(void) TMOD=TMOD|0 x12; TH1=0 x3c; TL1=0 xb0; EA=1; ET1=1; /TR1=1; void timer1(void) interrupt 3 using 0 TH1=0 x3c; TL1=0 xb0; /OUT = OUT; OUT = 1;/蜂鳴器長鳴 mstcnt+; if(mstcnt=400)/蜂鳴器響10秒 mstcnt=0; TR1 = 0;TR0 = 1; flag = 0; /停止報警,進入正常模式TR1_flag

21、 = 0;/切換顯示OUT = 0;/*the main funtion*/ void main(void) int_mcu(); P1=0 xff; / initialize p1delay_LCM(500); /500ms time delayinitLCM( ); /initialize LCDinit_timer1( ); /initialize Timer0 Init_DS18B20( ); /initialize Ds18b20DisplayListChar(0,0,str0);DisplayListChar(0,1,str1); /out_high();/測試輸出38k載波 TR

22、1_flag = 0; while (1) /TR0 = 1; if(!flag) /flag為0時正常顯示,為1時執(zhí)行報警 OUT = 0; TR0 = 1;TR1_flag = 0; ReadTemperature(); /read temperaturedisplay();/for(m=0;m8;m+) /讀取P32狀態(tài)8次,若有高電平則報警 / if(P32) delay_LCM(50); if(P32) flag = 1; flag2 = 1; TR1_flag = 1; else delay_LCM(100); / else if(flag2) TR0 = 0;/關定時器0,停止發(fā)

23、送脈沖 TR1 = 1;/啟動定時器1,蜂鳴器響 display(); flag2 = 0; 結(jié)論 紅外報警器是一種基于單片機控制的報警器,是一種簡單的報警器。在制作實物的過程中遇到一些小問題,就是往單片機里面寫程序的時候,剛開始寫了幾次都不能夠運行,經(jīng)過最后的努力終于成功了。當最后完成的時候有一種自豪感,完成一件事的過程遠比結(jié)果好。雖然我們做的紅外線報警器只是一個簡單的模型,但是能選到這個設計我也從中學到了很多東西,這些是以前在書本上學不到的東西,一種實際的動手能力,一種自己的探索,一種查閱資料自己學習的付出。原來自己能過成一件事是多么的讓人高興啊。報警器也不是完美的東西,有的時候也會引起誤

24、報、漏報,至于具體原因這里也不多說了,這是以后的研究課題。參考資料1電子驛站 HYPERLINK 2百度文庫及百度百科 3杜樹春.單片機應用系統(tǒng)開發(fā)實例詳解.北京:機械工業(yè)出版社,20074無線電雜志社.無線電.北京:人民郵電出版社,2007-20105 李廣弟.單片機基礎. 電子工業(yè)出版社,2007致謝 經(jīng)過自己的努力,加上老師的指導,同學的幫助,我完成了紅外線報警器的畢業(yè)設計。由于長時間沒有學習單片機知識了,剛開始做的時候感覺到比較吃力,可是在別人的幫助下總算是把所忘記的知識慢慢想起來了,而且順利的完成了設計。在本次的畢業(yè)設計當中我感覺到學習知識的時候很簡單,可是實際運用的時候感覺到就比較

25、吃力了,有點學無所用的感覺,也許也就是自己學的不夠好吧。通過這次設計,我感覺自己的知識面是很窄的很多東西都不是很清楚不得不請教老師或者是同學,再就是上網(wǎng)去查找資料。要想使自己更上一層樓,還是要不斷的去學習的,不斷的提升自己啊。能夠完成這個設計我感覺到很自豪,畢竟是自己做的第一設計。感謝一切幫助我的人啊,感謝學校。再次感謝指導老師和我的搭檔們,辛苦了!三年的大學生活即將結(jié)束,學生時代的最后一項任務也畫上了句號。希望在以后的日子里,不斷學習、進步,讓自己做得更好。附錄以下是紅外線報警器的實物圖圖5紅外線報警器實物圖6畢業(yè)論文評閱、評審意見表專業(yè):學生姓名:題目:指導教師評語:成績:指導教師(簽字)

26、: 年月日答辯委員會(或答辯小組)評審意見:成績:組長(簽字): 年月日附錄資料:不需要的可以自行刪除C語言編譯器的設計與實現(xiàn) 我們設計的編譯程序涉及到編譯五個階段中的三個,即詞法分析器、語法分析器和中間代碼生成器。編譯程序的輸出結(jié)果包括詞法分析后的二元式序列、變量名表、狀態(tài)棧分析過程顯示及四元式序列程序,整個編譯程序分為三部分:(1) 詞法分析部分(2) 語法分析處理及四元式生成部分 (3) 輸出顯示部分一詞法分析器設計 由于我們規(guī)定的程序語句中涉及單詞較少,故在詞法分析階段忽略了單詞輸入錯誤的檢查,而將編譯程序的重點放在中間代碼生成階段。詞法分析器的功能是輸入源程序,輸出單詞符號。我們規(guī)定

27、輸出的單詞符號格式為如下的二元式: (單詞種別,單詞自身的值)#define ACC -2#define syl_if 0#define syl_else 1#define syl_while 2#define syl_begin 3#define syl_end 4#define a 5#define semicolon 6#define e 7#define jinghao 8#define s 9#define L 10#define tempsy 11#define EA 12#define EO 13#define plus 14#define times 15#define bec

28、omes 16#define op_and 17#define op_or 18#define op_not 19#define rop 20#define lparent 21#define rparent 22#define ident 23#define intconst 24函數(shù)說明 讀取函數(shù) readline( )、readch( )詞法分析包含從源文件讀取字符的操作,但頻繁的讀文件操作會影響程序執(zhí)行效率,故實際上是從源程序文件” source.dat ”中讀取一行到輸入緩沖區(qū),而詞法分析過程中每次讀取一個字符時則是通過執(zhí)行 readch( )從輸入緩沖區(qū)獲得的;若緩沖區(qū)已被讀空,則

29、再執(zhí)行readline( )從 source.dat 中讀取下一行至輸入緩沖區(qū)。掃描函數(shù) scan( ) 掃描函數(shù) scan( )的功能是濾除多余空格并對主要單詞進行分析處理,將分析得到的二元式存入二元式結(jié)果緩沖區(qū)。變量處理 find( )變量處理中首先把以字母開頭的字母數(shù)字串存到 spelling 數(shù)組中,然后進行識別。識別過程是先讓它與保留關鍵字表中的所有關鍵字進行匹配,若獲得成功則說明它為保留關鍵字,即將其內(nèi)碼值寫入二元式結(jié)果緩沖區(qū);否則說明其為變量,這時讓它與變量名表中的變量進行匹配( 變量匹配函數(shù) find( ) ),如果成功,則說明該變量已存在并在二元式結(jié)果緩沖區(qū)中標記為此變量(

30、值填為該變量在變量名表中的位置),否則將該變量登記到變量名表中,再將這個新變量存入二元式緩存數(shù)組中。數(shù)字識別 number( ) 數(shù)字識別將識別出的數(shù)字填入二元式結(jié)果緩存數(shù)組。顯示函數(shù) 顯示函數(shù)的功能在屏幕上輸出詞法分析的結(jié)果( 即二元式序列程序),同時給出二元式個數(shù)及源程序行數(shù)統(tǒng)計。二語法分析器設計 語法分析器的核心是三張 SLR 分析表以及針對這三張 SLR 分析表進行語義加工的語義動作。編譯程序中語法分析處理及四元式生成部分主要是以二元式作為輸入,并通過 SLR 分析表對語法分析處理過程進行控制,使四元式翻譯的工作有條不紊的進行,同時識別語法分析中的語法錯誤。在處理 if 和 while

31、 語句時,需要進行真值或假值的拉鏈和返填工作,以便轉(zhuǎn)移目標的正確填入。1. 控制語句的 SLR 分析表1 設計過程如下: 將擴展文法GS S1)S if e S else S2)S while e S3)S L 4)S a;5)L S6)L SL用_CLOSURE方法構造LR(0)項目規(guī)范簇為:I0: S SS if e S else SS while e S S L S a ;I1: S SI2: S ife S else SI3: S while e SI4: S L L S L SL S if e S else SS while e S S L S a ; I5: S a; I6: S

32、if e S else S S if e S else SS while e S S L S a ; I7: S while e S S if e S else SS while e S S L S a ; I8: S L I9: L S L SL L SL L S S if e S else SS while e S S L S a ; I10: S a ; I11: S if e S else SI12: S while e S I13: S L I14: S SL I15: S if e S else S S if e S else SS while e S S L S a ; I16:

33、 S if e S else S 構造文法G中非終結(jié)符的FOLLOW集如下:FOLLOW(S) = # S if e S else S得FOLLOW(S) = else S L 得FOLLOW(L) = 3) S S 得FOLLOW(S) = else , # L S 因為FIRST(S) = ,所以FOLLOW(S) = else , #, 在()項目規(guī)范簇中,只有9有“移進歸約”沖突,L SL SL因為FOLLOW(L) FIRST(L) = 所以可以用方法解決以上沖突,最后我們得到的分析表如下:ACTIONGOTO ifElsewhilea;e#SL0S2S3S4S511ACC2S63S

34、74S2S3S4S5985S106S2S3S4S5117S2S3S4S5128S139S2S3S4R5S591410R4R4R4111512R2R2R213R3R3R314R615S2S3S4S51616R1R1R1static int action2011=/* 0 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 1, -1,/* 1 */ -1, -1, -1, -1, -1, -1, -1, -1,ACC, -1, -1,/* 2 */ -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1,/* 3 */ -1, -1, -1, -1,

35、 -1, -1, -1, 7, -1, -1, -1,/* 4 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 9, 8,/* 5 */ -1, -1, -1, -1, -1, -1, 10, -1, -1, -1, -1,/* 6 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 11, -1,/* 7 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 12, -1,/* 8 */ -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1,/* 9 */ 2, -1, 3, 4,105, 5, -1,

36、-1, -1, 9, 14,/* 10*/ -1,104, -1, -1,104, -1, -1, -1,104, -1, -1,/* 11*/ -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 12*/ -1,102, -1, -1,102, -1, -1, -1,102, -1, -1,/* 13*/ -1,103, -1, -1,103, -1, -1, -1,103, -1, -1,/* 14*/ -1, -1, -1, -1,106, -1, -1, -1, -1, -1, -1,/* 15*/ 2, -1, 3, 4, -1, 5, -1,

37、 -1, -1, 16, -1,/* 16*/ -1,101, -1, -1,101, -1, -1, -1,101, -1, -1;其中,前 9 列為 action 值,后 2 列為 goto 值;016 表示 17 個移進狀態(tài)( 即 Si);-1表示出錯;ACC 表示分析成功;而 100106 對應 7 個歸約產(chǎn)生式:S SS if e S else SS while e SS L S a;L SL SL2. 算術表達式的 LR 分析表 2 設計如下:S EE E+EE E*EE (E)E i (過程略)ACTIONGOTOI+*()#E0S3S211S4S5ACC2S3S263R4R4R

38、4R44S3S275S3S286S4S5S97R1R5R1R18R2R2R2R29R3R3R3R3static int action1107=/* 0 */ 3, -1, -1, 2, -1, -1, 1,/* 1 */ -1, 4, 5, -1, -1,ACC, -1,/* 2 */ 3, -1, -1, 2, -1, -1, 6,/* 3 */ -1,104,104, -1,104,104, -1,/* 4 */ 3, -1, -1, 2, -1, -1, 7,/* 5 */ 3, -1, -1, 2, -1, -1, 8,/* 6 */ -1, 4, 5, -1, 9, -1, -1,/

39、* 7 */ -1,101, 5, -1,101,101, -1,/* 8 */ -1,102,102, -1,102,102, -1,/* 9 */ -1,103,103, -1,103,103, -1;3.布爾表達式的 SLR 分析表3 設計如下:(過程略)S BB iB i rop iB ( B )B ! BA B &B ABO B |B OBACTIONGOTOiRop()!&|#BAO0S1S4S513781S2R1R1R1R12S33R2R2R2R24S1S4S511785S1S4S56786R4S9S10R47S1S4S514788S1S4S515789R5R5R510R7R7R

40、711S12S9S1012R3R3R3R313S9S10ACC14R6S9S10R615R8S9S10R8static int action21611=/* 0 */ 1, -1, 4, -1, 5, -1, -1, -1, 13, 7, 8,/* 1 */ 1, 2, -1,101, -1,101,101,101, -1, -1, -1,/* 2 */ 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 3 */ -1, -1, -1,102, -1,102,102,102, -1, -1, -1,/* 4 */ 1, -1, 4, -1, 5, -1,

41、 -1, -1, 11, 7, 8,/* 5 */ 1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8,/* 6 */ -1, -1, -1,104, -1, 9, 10,104, -1, -1, -1,/* 7 */ 1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8,/* 8 */ 1, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8,/* 9 */ 105, -1,105, -1,105, -1, -1, -1, -1, -1, -1,/*10 */ 107, -1,107, -1,107, -1, -1, -1, -1

42、, -1, -1,/*11 */ -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1,/*12 */ -1, -1, -1,103, -1,103,103,103, -1, -1, -1,/*13 */ -1, -1, -1, -1, -1, 9, 10,ACC, -1, -1, -1,/*14 */ -1, -1, -1,106, -1, 9, 10,106, -1, -1, -1,/*15 */ -1, -1, -1,108, -1, 9, 10,108, -1, -1, -1;LR 分析表控制語義加工的實現(xiàn):當掃描 LR 分析表的當前狀態(tài)為歸約狀態(tài)時,則在

43、調(diào)用與該狀態(tài)對應的產(chǎn)生式進行歸約的同時,調(diào)用相應的語義子程序進行有關的翻譯工作。現(xiàn)在對 LR 分析器的分析棧加以擴充,使得每個文法符號之后都跟著它的語義值。為了清晰起見,我們把這個棧的每一項看成由三部分組成:狀態(tài) state ,文法符號 syl 和語義值 val。編譯程序?qū)崿F(xiàn)算術表達式、布爾表達式及程序語句的語義加工時,都是按這種狀態(tài)棧加工方式進行的。例如:( 5 + 3 ) * 6的分析過程序號STATEValsylinput10-#( 5 + 3 ) * 6 #202-#(5 + 3 ) * 6 #3023#(5+ 3 ) * 6 #4026-5#(E+ 3 ) * 6 #50264-5-

44、#(E+3 ) * 6 #602643-5-#(E+3 ) * 6 #702647-5-3#(E+E) * 6 #8026-8#(E) * 6 #90269-8-#(E)* 6 #1001-8#E* 6 #11015-8-#E* 6 #120153-8-#E*6#130158-8-6#E*E#1401-48#E#15ACC在分析過程中,第(3)步操作后的狀態(tài)棧為 023,根據(jù)棧頂狀態(tài)“ 3”和現(xiàn)行輸入符號“ +”( input 欄字符串的第一個字符)查分析表 ACTION3,+=R4,即按第(4)個產(chǎn)生式 En 來進行歸約;由于產(chǎn)生式右部僅含一項,故去掉狀態(tài)棧棧頂“3”;此時 2 變?yōu)樾碌臈m?/p>

45、狀態(tài),再查( 2,E)的下一狀態(tài) s:GOTO2,E=6,即將狀態(tài) 6 和文法符號 E 壓棧,最后得到第( 4)步的狀態(tài)。第( 7)步操作后也是如此,當前狀態(tài)棧為 02647,根據(jù)棧頂狀態(tài) 7 和現(xiàn)行輸入符號“ )”查分析表 ACTION7,)=R1,即按第(1)個產(chǎn)生式 EE1+E2進行歸約;由于產(chǎn)生式右部有三項,故去掉狀態(tài)棧棧頂?shù)?647 三項;此時 2 變?yōu)樾碌臈m敔顟B(tài),再查( 2,E)的下一狀態(tài) s:GOTO2,E=6,即將狀態(tài) 6 和文法符號 E 壓棧,最后得到第(8)步的狀態(tài)。三中間代碼生成器設計:布爾表達式 布爾表達式在程序語言中有兩個基本作用:一是用作控制語句( 如 if -e

46、lse 或 while語句)的條件式;二是用于邏輯演算,計算邏輯值。布爾表達式是由布爾算符( &、| 、!)作用于布爾變量( 或常數(shù))或關系表達式而形成的。關系表達式的形式是 E1 rop E2,其中 rop 是關系符( 如或),E1和 E2是算術式。在這里,我們只考慮前面給定文法所產(chǎn)生的布爾表達式:BB &B | B | B | ! B | (B) | i rop i | i遵照我們的約定,布爾算符的優(yōu)先順序( 從高到低)為:!、&、|,并假定&和|都服從左結(jié)合規(guī)則。所有關系符的優(yōu)先級都是相同的,而且高于任何布爾算符,低于任何算術算符,關系算符不得結(jié)合。表達式的真、假出口的確定:考慮表達式

47、B1 | B2 ,若 B1為真,則立即知道 B 也為真;因此,B1的真出口也就是整個 B 的真出口。若 B1?為假,則 B2必須被計值,B2的第一個四元式就是 B1的假出口。當然,B2的真、假出口也就是整個 B的真、假出口。類似的考慮適用于對 B1 & B2的翻譯,我們將 B1 | B2和 B1 & B2 的翻譯用下圖表示,在自下而上的分析過程中,一個布爾式的真假出口往往不能在產(chǎn)生四元式的同時就填上。我們只好把這種未完成的四元式的地址( 編號)作為 B 的語義值暫存起來,待到整個表達式的四元式產(chǎn)生完畢之后再來回填這個未填入的轉(zhuǎn)移目標。條件語句對條件語句 if e S1 else S2 中的布爾

48、表達式 e,其作用僅在于控制對 S1和 S2的選擇。因此,作為轉(zhuǎn)移條件的布爾式e,我們可以賦予它兩種“ 出口”:一是“ 真”出T口,出向 S1;一是“ 假”出口,出向 S2。于是,e的代碼F條件語句可以翻譯成如圖的一般形式。非終結(jié)符 e 具有兩項語義值 e _TC 和e_FC,它們分別指出了尚待回填真、S2的代碼假出口的四元式串。e 的“ 真”出口只有在往回掃描到if時才能知道,而它圖 3-2 條件語句的代碼結(jié)構 的“ 假”出口則需到處理過 S1并且到達 else 才能明確。這就是說,必須把 e_FC 的值傳下去,以便到達相應的 else時才進行回填。另外,當 S1語句執(zhí)行完時意味著整個 if

49、-else 語句也已執(zhí)行完畢;因此,在 S1的編碼之后應產(chǎn)生一條無條件轉(zhuǎn)移指令。這條轉(zhuǎn)移指令將導致程序控制離開整個 if-else 語句。但是,在完成 S2的翻譯之前,這條無條件轉(zhuǎn)移指令的轉(zhuǎn)移目標是不知道的。甚至,在翻譯完 S2之后,這條轉(zhuǎn)移指令的轉(zhuǎn)移目標仍無法確定。這種情形是由于語句的嵌套性所引起的。例如下面的語句:if e1 if e2 S1 else S2 else S3 在 S1的代碼之后的那條無條件轉(zhuǎn)移指令不僅應跨越 S2而且應跨越 S3。這也就是說,轉(zhuǎn)移目標的確定和語句所處的環(huán)境密切相關。條件循環(huán)語句條件循環(huán)語句 while e S 通常被翻譯成圖的代碼結(jié)構。布爾式 e 的“ 真”

50、出口出向 S 代碼段的第一個四元式。緊接 S 代碼段之后應產(chǎn)生一條轉(zhuǎn)向測試 e 的無條件轉(zhuǎn)移指令。e 的“ 假”出口將導致程序控制離開整個 while 語句。e 的“ 假”出口目標即使在整個 while 語句翻譯完之后也未必明確。例如: if e1 while e2 S1 else S2這種情況仍是由于語句的嵌套性引起的。所以,我們只好把它作為語句的語義值 SCHAIN 暫留下來,以便在處理外層語句時再伺機回填。語法翻譯實現(xiàn)方法 將上述語法翻譯付諸實現(xiàn)過程中,我們僅保留了算術表達式和布爾表達式翻譯的文法和語義動作;面對程序語句的翻譯,由于改造后含有較多的非終結(jié)符且語義動作又相對簡單,故仍恢復為

51、改造之前的程序語句文法。由于總體上構造一個 SLR 分析表來實現(xiàn)語法分析及語義加工將使得所構造的 SLR 分析表過大,所以將其分為下面三部分處理:對算術表達式單獨處理,即為算術表達式構造一個 SLR 分析表,并將賦值語句A=E 與算術表達式歸為一類處理,處理之后的賦值語句僅看作為程序語句文法中的一個終結(jié)符 a。對布爾表達式也單獨處理,并為其構造一個 SLR 分析表,經(jīng) SLR 分析表處理后的布爾表達式看作為程序語句文法中的一個終結(jié)符 e。程序語句文法此時變?yōu)椋篠 if e S else S | while e S | L | a;L SL | S此時為程序語句構造相應的 SLR 分析表就簡單多

52、了。前面的程序語句文法中所添加的非終結(jié)符是為了能及時回填有關四元式轉(zhuǎn)移目標而引入的,在取消了這些非終結(jié)符后又如何解決及時回填轉(zhuǎn)移目標的問題呢?我們采取的解決方法是增加兩個數(shù)組 labelmark 和 labeltemp 來分別記錄語句嵌套中每一層布爾表達式( 如果有的話)e 的首地址以及每一層else( 如果有的話)之前的四元式地址( 即無條件轉(zhuǎn)出此層 if 語句的四元式)。也即,對程序語句的翻譯來說:在處理完布爾表達式 e 后,回填 if 或 while 語句的真值鏈;在歸約完每一個語句 S 之后檢查符號棧,看在 S 之前的文法符號是否 if 或 while,若是則回填假值鏈( 假值入口為語句 S 所對應的四元式序列之后;對 if 語句,此時已在該序列之后加入了一條無條件轉(zhuǎn)移的四元式);在 if 語句中,else 前面要加入一個無條件轉(zhuǎn)移的四元式轉(zhuǎn)向 if 語句末尾;在 while語句尾要有一個無條件轉(zhuǎn)移四元式轉(zhuǎn)向 whi

溫馨提示

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

評論

0/150

提交評論