![課程設(shè)計(基于單片機(jī)的汽車倒車?yán)走_(dá)設(shè)計)_第1頁](http://file4.renrendoc.com/view/7aeaf061a4fe809aeb040fae738ae396/7aeaf061a4fe809aeb040fae738ae3961.gif)
![課程設(shè)計(基于單片機(jī)的汽車倒車?yán)走_(dá)設(shè)計)_第2頁](http://file4.renrendoc.com/view/7aeaf061a4fe809aeb040fae738ae396/7aeaf061a4fe809aeb040fae738ae3962.gif)
![課程設(shè)計(基于單片機(jī)的汽車倒車?yán)走_(dá)設(shè)計)_第3頁](http://file4.renrendoc.com/view/7aeaf061a4fe809aeb040fae738ae396/7aeaf061a4fe809aeb040fae738ae3963.gif)
![課程設(shè)計(基于單片機(jī)的汽車倒車?yán)走_(dá)設(shè)計)_第4頁](http://file4.renrendoc.com/view/7aeaf061a4fe809aeb040fae738ae396/7aeaf061a4fe809aeb040fae738ae3964.gif)
![課程設(shè)計(基于單片機(jī)的汽車倒車?yán)走_(dá)設(shè)計)_第5頁](http://file4.renrendoc.com/view/7aeaf061a4fe809aeb040fae738ae396/7aeaf061a4fe809aeb040fae738ae3965.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、PAGE 課程設(shè)計說明書汽車倒車?yán)走_(dá)設(shè)計學(xué)生姓名XXX班級機(jī)制1001班學(xué)號201021xxxx16日期2013.07.012013.07.12 摘要 隨著社會經(jīng)濟(jì)的發(fā)展交通運(yùn)輸業(yè)日益興旺,汽車的數(shù)量大幅增長,隨著汽車的增多和停車位日趨緊張,泊車成為很多車主頭痛的問題,這時倒車?yán)走_(dá)就成了汽車的好助手。倒車?yán)走_(dá)是汽車泊車安全輔助裝置,能以比較直觀的顯示告知駕駛員后方障礙物的情況,解除了駕駛員泊車時前后左右探視所引起的困擾,并幫助駕駛員掃除了視野死角和視線模糊的缺陷,提高了倒車的安全性。超聲波測距法是常見的一種距離測距方法,本文介紹的就是利用超聲波測距法設(shè)計的一種倒車防撞報警系統(tǒng)。控制系統(tǒng)核心部分
2、就是超聲波測距儀的研制。設(shè)計通過多種發(fā)射接收電路設(shè)計方案比較,得出了最佳設(shè)計方案,并對系統(tǒng)各個單元的原理進(jìn)行了介紹,對組成系統(tǒng)電路的芯片進(jìn)行了介紹,并闡述了它們的工作原理,對超聲波傳感器的選用經(jīng)過了仔細(xì)的思考,并詳細(xì)的說明其功能和作用原理。文章介紹了系統(tǒng)系統(tǒng)的軟件結(jié)構(gòu),通過編程來實(shí)現(xiàn)系統(tǒng)功能。關(guān)鍵詞:單片機(jī);超聲波;測距;傳感器 目錄引言2背景2設(shè)計的要求和難點(diǎn)2總體方案設(shè)計3 2.1 系統(tǒng)構(gòu)成圖3 2.2 工作原理3硬件設(shè)計5 3.1 超聲波發(fā)射與接收電路5 3.1.1 發(fā)射電路5 3.1.2 接收電路7 3.2 ADC0832轉(zhuǎn)換器特點(diǎn)與接線圖9 3.3 傳感器型號及說明12軟件設(shè)計13
3、4.1 系統(tǒng)流程圖13 4.2 編程程序15設(shè)計小結(jié)17 參考文獻(xiàn)181 引言設(shè)計的背景隨著社會經(jīng)濟(jì)的發(fā)展交通運(yùn)輸業(yè)日益興旺,汽車的數(shù)量大幅增長,而隨著汽車的增多和停車位日趨緊張,泊車成為很多車主頭痛的問題。在泊車的過程中,由于駕駛員視覺的模糊以及盲區(qū)的影響,使得在倒車過程中稍不注意就會造成車子的損傷。我們的超聲波傳感器測距系統(tǒng)正是為解決此問題而設(shè)計的。本系統(tǒng)能夠在倒車的過程中掃除視野死角和視線模糊的缺陷,提高倒車的安全性。1.2設(shè)計的重點(diǎn)與難點(diǎn)1.2.1 設(shè)計的要求本任務(wù)是設(shè)計一個超聲波測距儀,可以應(yīng)用于汽車倒車監(jiān)控。要求測量范圍在0.103.00m,測量精度10cm,能夠明顯的達(dá)到報警效果
4、。1.2.2設(shè)計的難點(diǎn) eq oac(,1)、超聲波信號的發(fā)射、接收設(shè)計 eq oac(,2)、報警顯示燈電路的設(shè)計 eq oac(,3)、流程圖及程序的設(shè)計2 總體方案設(shè)計2.1 系統(tǒng)構(gòu)成圖汽車倒車?yán)走_(dá)設(shè)計系統(tǒng)單片機(jī)為核心外圍電路由超聲波發(fā)射電路、超聲波接收電路、溫度補(bǔ)償電路、A/D轉(zhuǎn)換模塊、LED顯示模塊等部分組成。其系統(tǒng)框圖如圖2-1所示。圖2-1系統(tǒng)構(gòu)成圖2.2 工作原理本系統(tǒng)安裝在汽車背后,一般是四個并排,當(dāng)汽車倒車且接近危險距離(設(shè)定值)時,系統(tǒng)能自動提示駕駛員,防止碰撞事件發(fā)生。主要是以AT89S51為核心,來設(shè)計一種低成本、高精度、微型化超聲波測距儀。本測距儀實(shí)質(zhì)上就是感應(yīng)出超
5、聲波的發(fā)射脈沖與接受脈沖的時間間隔t,利用S=C*t/2可以算出距離,由于系統(tǒng)已經(jīng)預(yù)設(shè)了一個安全距離,當(dāng)S低于此安全距離時,可以看到LED顯示器的紅色燈閃爍,綠色燈熄滅;當(dāng)S高于此安全距離時,LED顯示器的綠色燈亮,紅色燈熄滅。根據(jù)要求,由于程序較為簡單,不需要空間很大的芯片來完成,于是選用AT89S51單片機(jī)作為主控制器,而超聲波傳感器精度要求也不高(0.1m),于是選用比較經(jīng)濟(jì)的HC-SR04超聲波傳感器,運(yùn)算放大電路用來將超聲波信號放大并傳給A/D轉(zhuǎn)換模塊,A/D轉(zhuǎn)換模塊也從測量精度出發(fā)選用八位256步的A/D轉(zhuǎn)換器,同時為了方便接線與模擬仿真,選用的是ADC0832,顯示模塊用的是LE
6、D顯示燈,已足夠滿足設(shè)計要求。 3 硬件設(shè)計 根據(jù)2-1 系統(tǒng)構(gòu)成圖,我們設(shè)計了總接線圖,詳見附錄1,下面對各部分電路進(jìn)行說明。其中,我們是從A/D轉(zhuǎn)換模塊與AT89C51開始接線,逐步擴(kuò)展到輸出模塊。A/D轉(zhuǎn)換模塊主要是參考了網(wǎng)上ADC0832的知識2。輸出模塊的LED顯示模塊及時鐘信號主要是參考了文獻(xiàn)3。3.1 超聲波發(fā)射與接收電路3.1.1 發(fā)射電路超聲波發(fā)射電路如圖所示,主要由脈沖調(diào)制,信號產(chǎn)生電路,隔離電路以及驅(qū)動電路組成,用來為超聲波傳感器提供發(fā)送信號,使其發(fā)出超聲波信號1。圖3-1超聲波傳感器的發(fā)射電路3.1.2 接收電路接收部分的電路由放大電路,帶通濾波電路以及信號變換電路組成
7、。信號變換電路如圖3-2所示,放大電路和帶通濾波電路如圖3-3所示。由于超聲波信號在空氣中傳播時受到很大程度的衰減,所以反射回的超聲波信號非常的微弱,不能直接送到后級電路進(jìn)行處理,必須將信號放大到足夠的幅度,才能使后級電路對它進(jìn)行正確的處理1。圖3-2信號變換電路圖3-3接收與放大電路與帶通濾波電路3.2 ADC0832轉(zhuǎn)換器特點(diǎn)與接線圖、其主要特點(diǎn)如下:1、8位分辨率,逐次逼近型,基準(zhǔn)電壓為5V;2、5V單電源供電;3、輸入模擬信號電壓范圍為05V;4、輸入和輸出電平與TTL和CMOS兼容;5、在250KHZ時鐘頻率時,轉(zhuǎn)換時間為32us;6、具有兩個可供選擇的模擬輸入通道;7、功耗低,15
8、mW。、各引腳說明如下:1、CS片選端,低電平有效。2、CH0,CH1兩路模擬信號輸入端。3、DI兩路模擬輸入選擇輸入端。 圖3-5 ADC0832引腳圖4、DO模數(shù)轉(zhuǎn)換結(jié)果串行輸出端。5、CLK串行時鐘輸入端。5、Vcc/REF正電源端和基準(zhǔn)電壓輸入端。6、GND電源地。、單片機(jī)對ADC0832 的控制原理一般情況下ADC0832與單片機(jī)的接口應(yīng)為4條數(shù)據(jù)線,分別是CS、CLK、DO、DI。但由于DO端與DI端在通信時并未同時有效并與單片機(jī)的接口是雙向的,所以電路設(shè)計時可以將DO和DI 并聯(lián)在一根數(shù)據(jù)線上使用。當(dāng)ADC0832未工作時其CS輸入端應(yīng)為高電平,此時芯片禁用,CLK 和DO/DI
9、 的電平可任意。當(dāng)要進(jìn)行A/D轉(zhuǎn)換時,須先將CS端置于低電平并且保持低電平直到轉(zhuǎn)換完全結(jié)束。此時芯片開始轉(zhuǎn)換工作,同時由處理器向芯片時鐘輸入端CLK提供時鐘脈沖,DO/DI端則使用DI端輸入通道功能選擇的數(shù)據(jù)信號。在第1個時鐘脈沖到來之前DI端必須是高電平,表示啟動位。在第2、3個時鐘脈沖到來之前DI端應(yīng)輸入2位數(shù)據(jù)用于選擇通道功能,其功能項(xiàng)見表。輸入形式 配置位選擇通道CH0CH1CHOCH1差分輸入00+-01-+單端輸入10+11+3-6圖ADC0832配置位如表所示,當(dāng)配置位2位數(shù)據(jù)為1、0時,只對CH0 進(jìn)行單通道轉(zhuǎn)換。當(dāng)配置2位數(shù)據(jù)為1、1時,只對CH1進(jìn)行單通道轉(zhuǎn)換。當(dāng)配置2位數(shù)
10、據(jù)為0、0時,將CH0作為正輸入端IN+,CH1作為負(fù)輸入端IN-進(jìn)行輸入。當(dāng)配置2位數(shù)據(jù)為0、1時,將CH0作為負(fù)輸入端IN-,CH1 作為正輸入端IN+進(jìn)行輸入。到第3個時鐘脈沖到來之后DI端的輸入電平就失去輸入作用,此后DO/DI端則開始利用數(shù)據(jù)輸出DO進(jìn)行轉(zhuǎn)換數(shù)據(jù)的讀取。從第4個時鐘脈沖開始由DO端輸出轉(zhuǎn)換數(shù)據(jù)最高位D7,隨后每一個脈沖DO端輸出下一位數(shù)據(jù)。直到第11個脈沖時發(fā)出最低位數(shù)據(jù)D0,一個字節(jié)的數(shù)據(jù)輸出完成。也正是從此位開始輸出下一個相反字節(jié)的數(shù)據(jù),即從第11個時鐘脈沖輸出D0。隨后輸出8位數(shù)據(jù),到第19 個脈沖時數(shù)據(jù)輸出完成,也標(biāo)志著一次A/D轉(zhuǎn)換的結(jié)束。最后將CS置高電平
11、禁用芯片,直接將轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行處理就可以了。3.3 傳感器型號及說明HC-SR04 1、使用電壓:DC5V 2、靜態(tài)電流:小于2mA3、電平輸出:高5V 4、電平輸出:低0V5、感應(yīng)角度:不大于15度 6、探測距離:2cm-450cm 7、高精度:可達(dá)3mm接線方式,VCC、trig(控制端)、 echo(接收端)、 GND地線 本產(chǎn)品使用方法:一個控制口發(fā)一個10US以上的高電平,就可以在接收口等待高電平輸出.一有輸出就可以開定時器計時,當(dāng)此口變?yōu)榈碗娖綍r就可以讀定時器的值,此時就為此次測距的時間,方可算出距離.如此不斷的周期測,就可以達(dá)到移動測量的值了1.4 軟件設(shè)計4.1 系統(tǒng)流程圖
12、我們設(shè)計的系統(tǒng)流程圖如圖4-1,系統(tǒng)的軟件設(shè)計采取模塊化設(shè)計,單片器編程,這樣便于閱讀與功能擴(kuò)展。程序主要由主程序、A/D轉(zhuǎn)換子程序、延時子程序、液晶顯示子程序等幾個部分構(gòu)成。雷達(dá)測距開始由汽車倒車控制,一旦倒車開始,即啟動AT89C51片內(nèi)的T1連續(xù)發(fā)射40 kHz的PWM,計數(shù)器開始計數(shù)??紤]到實(shí)際倒車環(huán)境有遠(yuǎn)有近,為防止其他干擾可能引起的誤測,以最長距離3m計算,超聲波發(fā)送到返回的時間t至少為3/ HYPERLINK /tech/detail/340.html t _blank 340 HYPERLINK /tech/dzg/200010140014/756768.html t _bla
13、nk 15 HYPERLINK /tech/dzg/200010140014/757719.html t _blank ms。這樣持續(xù)發(fā)送PWM直至接收到超聲波時停止發(fā)送,這個過程大約需要15 ms以上,所以不管所測距離遠(yuǎn)近,一律每25 ms發(fā)送一次超聲波。圖4-1系統(tǒng)流程圖4.2 編程程序我們通過keil軟件運(yùn)用單片機(jī)語言編程,選用AT89S51的芯片編譯過后,生成.hex文件后的程序。仿真時,在proteus軟件中找到AT89S51芯片,雙擊添加所生成的.hex文件,進(jìn)行仿真,以下是仿真結(jié)果,編程程序見附錄2.仿真結(jié)果:當(dāng)電平小于設(shè)定值(2.5v)時紅燈閃爍,綠燈熄滅當(dāng)電平大于設(shè)定值(2.
14、5v)時,綠燈亮,紅燈熄滅5 設(shè)計小結(jié)6月28日,我們的課程設(shè)計任務(wù)下來了,前面剛剛搞完兩周的機(jī)電傳動控制實(shí)習(xí),雖然還在那高強(qiáng)度、高難度的實(shí)習(xí)中沒有解脫出來,但一想到這是本學(xué)期最后的一個任務(wù),也是我們離開云塘前的最后一個任務(wù),我們也就釋然了,準(zhǔn)備認(rèn)真完成,算是給自己的大三生活一個最后的交代。我們的課題是“基于單片機(jī)的汽車倒車?yán)走_(dá)超聲波測距系統(tǒng)的設(shè)計”,為了更好地完成這個任務(wù),首先,我們組在網(wǎng)上查閱了大量的相關(guān)方面的資料,下載了一些對我們有用的文件,然后在圖書館借閱了許多關(guān)于單片機(jī)、傳感器的書籍,為我們的課程設(shè)計做好準(zhǔn)備。由于我們單片機(jī)的基礎(chǔ)打得不是很好,所以在設(shè)計的過程中遇到了很多的難題,比如
15、編程,比如數(shù)模轉(zhuǎn)換器的選擇、接線.但是我們沒有被這些難題所阻住,而是仔細(xì)分析了這些難題,然后查找相關(guān)資料,最后一一解決。在這個過程中,勾起了對單片機(jī)知識的回憶并使之得到強(qiáng)化,同時,對于我們機(jī)械專業(yè)的同學(xué),強(qiáng)化對電方面的知識在當(dāng)今社會也顯得尤為重要。同時,通過這次課程設(shè)計,讓我們對自己有了進(jìn)一步的認(rèn)識,看到了自己在一些方面還存在許多缺陷,同時,在這次課程設(shè)計中,李亞非老師給了我們許多指點(diǎn),讓我們獲益匪淺。參考文獻(xiàn)1、陳書旺,張秀清,董健彬.傳感器應(yīng)用及電路設(shè)計M.北京:化學(xué)工業(yè)出版社,20082、紀(jì)宗南.集成A/D轉(zhuǎn)換器應(yīng)用技術(shù)與實(shí)用線路M.北京:中國電力出版社,20093、賴麒文.8051單片
16、機(jī)嵌入式系統(tǒng)應(yīng)用M.北京:科學(xué)出版社,20024、胡漢才.單片機(jī)原理及接口技術(shù)M.北京:清華大學(xué)出版社,20045、Myke Predko.精通8051程序設(shè)計M.北京:人民郵電出版社,20066、/view/dcfd127e5acfa1c7aa00ccb0.html (百度文庫)7、/view/545294c758f5f61fb73666bd.html (ADC0832)附錄1 總接線圖附錄2A_0832_CS EQU P3.5 ; CS A/D模塊總開關(guān)A_0832_CLK EQU P3.4 ; CLK 時鐘信號A_0832_DI EQU P3.3 ; DI數(shù)據(jù)信號輸入,選擇通道控制A_0
17、832_D EQU P3.3 ; DO數(shù)據(jù)信號輸出,轉(zhuǎn)換 HYPERLINK /view/324739.htm t _blank 數(shù)據(jù)輸出A_0832_T EQU 40H ; 讀取時的脈沖計數(shù)A_0832_DA EQU 41H ; 數(shù)據(jù)所存位置ORG 0LJMP ADORG 30HAJMP MAINORG 60HMAIN:MOV B,80HDJNZ A_0832_DA,MAIN2AJMP REDRED:SETB P1.1LJMP DELAYCPL P1.1AJMP REDMAIN2:DJNZ B,MAINSETB P1.0AD: LCALL ADC_RDMOV A,A_0832_DAAJMP
18、$ADC_RD:MOV A_0832_T,#8CLR A_0832_CLKCLR A_0832_CSSETB A_0832_DI ;STARTSETB A_0832_CLK ; 第一個上升沿NOPNOPNOPCLR A_0832_CLKNOPNOPSETB A_0832_DI ; 選擇CH1,通過組合選取通道(SGL/DIF)NOPSETB A_0832_CLK ; 第二個上升沿NOPNOPNOPCLR A_0832_CLKNOPNOPSETB A_0832_DI ; 選擇CH1,通過組合選取通道(ODD/SIGN)NOPSETB A_0832_CLK ; 第三個上升沿NOPNOPNOPCLR
19、 A_0832_CLK ; 首個下降沿NOPNOPNOPSETB A_0832_CLKNOPNOPA_0832_RD: ; 讀取前,8位CLR A_0832_CLKNOPNOPNOPSETB A_0832_CLKMOV C,A_0832_DRLC ADJNZ A_0832_T,A_0832_RDMOV A_0832_DA,ARR AMOV A_0832_T,#7A_0832_RD1: ; 讀后7位,+前1位CLR A_0832_CLKNOPNOPNOPSETB A_0832_CLKMOV C,A_0832_DRRC ADJNZ A_0832_T,A_0832_RD1CJNE A,A_0832_
20、DA,ADC_RDSETB A_0832_CSRETDELAY:MOV 81H,#03HDL0:MOV 82H,#03HDL1:DJNZ 82H,DL1DJNZ 81H,DL0END附錄資料:不需要的可以自行刪除 C語言圖形模式速成第一節(jié) 圖形模式的初始化Turbo C 提供了非常豐富的圖形函數(shù),所有圖形函數(shù)的原型均在graphics. h 中,本節(jié)主要介紹圖形模式的初始化、獨(dú)立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數(shù)。另外,使用圖形函數(shù)時要確保有顯示器圖形驅(qū)動程序*.BGI,同時將集成開發(fā)環(huán)境options/Linker中的Graphics lib選為on,只有這
21、樣才能保證正確使用圖形函數(shù)。 不同的顯示器適配器有不同的圖形分辨率。即是同一顯示器適配器,在不同模式下也有不同分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類將顯示器設(shè)置成為某種圖形模式,在未設(shè)置圖形模式之前,微機(jī)系統(tǒng)默認(rèn)屏幕為文本模式(80列,25行字符模式),此時所有圖形函數(shù)均不能工作。設(shè)置屏幕為圖形模式,可用下列圖形初始化函數(shù):void far initgraph(int far *gdriver, int far *gmode,char *path);其中g(shù)driver和gmode分別表示圖形驅(qū)動器和模式,path是指圖形驅(qū)動程序所在的目錄路徑。有關(guān)圖形驅(qū)動器、圖形模式的符號常數(shù)
22、及對應(yīng)的分辨率見graphics. h。圖形驅(qū)動程序由Turbo C出版商提供,文件擴(kuò)展名為.BGI。 根據(jù)不同的圖形適配器有不同的圖形驅(qū)動程序。例如對于EGA、 VGA 圖形適配器就調(diào)用驅(qū)動程序EGAVGA.BGI。#include stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph()
23、;return 0;有時編程者并不知道所用的圖形顯示器適配器種類,或者需要將編寫的程序用于不同圖形驅(qū)動器,Turbo C 提供了一個自動檢測顯示器硬件的函數(shù),其調(diào)用格式為:void far detectgraph(int *gdriver, *gmode);其中g(shù)driver和gmode的意義與上面相同。 自動進(jìn)行硬件測試后進(jìn)行圖形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自動測試硬件*/printf(the graphics driv
24、er is %d, mode is %dn,gdriver,gmode); /*輸出測試結(jié)果*/getch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根據(jù)測試結(jié)果初始化圖形*/bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph();return 0;上例程序中先對圖形顯示器自動檢測,然后再用圖形初始化函數(shù)進(jìn)行初始化設(shè)置,但Turbo C提供了一種更簡單的方法, 即用gdriver=DETECT 語句后再跟initgraph()函數(shù)就行了。采用這種方法后,上例可改為:#incl
25、ude stdio.h#include graphics.hint main()int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出圖形狀態(tài)的函數(shù)closegraph(),其調(diào)用格式為:void far closegraph(void);第二節(jié) 屏幕顏色的設(shè)置和清屏函數(shù)對于圖形模式的屏幕顏色設(shè)置,同樣分為背景色的設(shè)置和前景色的設(shè)置。在Turbo C中分別用下面兩個函
26、數(shù): 設(shè)置背景色: void far setbkcolor(int color);設(shè)置作圖色: void far setcolor(int color);其中color 為圖形方式下顏色的規(guī)定數(shù)值,對EGA,VGA顯示器適配器,有關(guān)顏色的符號常數(shù)及數(shù)值見graphics.h。清除圖形屏幕內(nèi)容但不清除圖形背景使用清屏函數(shù),其調(diào)用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdrive
27、r, &gmode, C:TC2.0BGI); /*圖形初始化*/setbkcolor(0); /*設(shè)置圖形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*設(shè)置不同作圖色*/circle(320, 240, 20+i*10); /*畫半徑不同的圓*/getch();for(i=0; i=15; i+)setbkcolor(i); /*設(shè)置不同背景色*/cleardevice();circle(320, 240, 20+i*10);getch();aa=getmaxcolor();printf(maxcolor=%d,aa);getch();
28、closegraph();return 0;另外,TURBO C也提供了幾個獲得現(xiàn)行顏色設(shè)置情況的函數(shù)。 int far getbkcolor(void); 返回現(xiàn)行背景顏色值。int far getcolor(void); 返回現(xiàn)行作圖顏色值。int far getmaxcolor(void); 返回最高可用的顏色值。第三節(jié) 基本畫圖函數(shù)基本圖形函數(shù)包括畫點(diǎn),線以及其它一些基本圖形的函數(shù)。本節(jié)對這些函數(shù)作一全面的介紹。 、畫點(diǎn). 畫點(diǎn)函數(shù) void far putpixel(int x, int y, int color); 該函數(shù)表示有指定的象元畫一個按color 所確定顏色的點(diǎn)。對于顏色
29、color的值可從表3中獲得而對x, y是指圖形象元的坐標(biāo)。在圖形模式下,是按象元來定義坐標(biāo)的。對VGA適配器,它的最高分辨率為640 x480,其中640為整個屏幕從左到右所有象元的個數(shù),480為整個屏幕從上到下所有象元的個數(shù)。屏幕的左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(639, 479),水平方向從左到右為x 軸正向,垂直方向從上到下為y軸正向。TURBO C的圖形函數(shù)都是相對于圖形屏幕坐標(biāo),即象元來說的。關(guān)于點(diǎn)的另外一個函數(shù)是: int far getpixel(int x, int y); 它獲得當(dāng)前點(diǎn)(x, y)的顏色值。 II、有關(guān)坐標(biāo)位置的函數(shù) int far getmaxx(v
30、oid);返回x軸的最大值。int far getmaxy(void);返回y軸的最大值。int far getx(void); 返回游標(biāo)在x軸的位置。void far gety(void); 返回游標(biāo)有y軸的位置。void far moveto(int x, int y); 移動游標(biāo)到(x, y)點(diǎn),不是畫點(diǎn),在移動過程中亦畫點(diǎn)。void far moverel(int dx, int dy); 移動游標(biāo)從現(xiàn)行位置(x, y)移動到(x+dx, y+dy)的位置,移動過程中不畫點(diǎn)。、畫線I. 畫線函數(shù)TURBO C提供了一系列畫線函數(shù): void far line(int x0, int y
31、0, int x1, int y1); 畫一條從點(diǎn)(x0, y0)到(x1, y1)的直線。void far lineto(int x, int y); 畫一作從現(xiàn)行游標(biāo)到點(diǎn)(x, y)的直線。void far linerel(int dx, int dy); 畫一條從現(xiàn)行游標(biāo)(x,y)到按相對增量確定的點(diǎn)(x+dx, y+dy)的直線。void far circle(int x, int y, int radius); 以(x, y)為圓心,radius為半徑,畫一個圓。void far arc(int x, int y, int stangle, int endangle,int radi
32、us); 以(x,y)為圓心,radius為半徑,從stangle開始到endangle結(jié)束(用度表示)畫一段圓弧線。在TURBO C中規(guī)定x軸正向?yàn)? 度,逆時針方向旋轉(zhuǎn)一周, 依次為90,180, 270和360度(其它有關(guān)函數(shù)也按此規(guī)定,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)為中心,xradius,yradius為x軸和y軸半徑,從角stangle 開始到endangle結(jié)束畫一段橢圓線,當(dāng)stangle=0,endangle=360時, 畫出
33、一個完整的橢圓。void far rectangle(int x1, int y1, int x2, inty2); 以(x1, y1)為左上角,(x2, y2)為右下角畫一個矩形框。 void far drawpoly(int numpoints, int far *polypoints); 畫一個頂點(diǎn)數(shù)為numpoints,各頂點(diǎn)坐標(biāo)由polypoints給出的多邊形。polypoints整型數(shù)組必須至少有2 倍頂點(diǎn)數(shù)個無素。每一個頂點(diǎn)的坐標(biāo)都定義為x,y,并且x在前。值得注意的是當(dāng)畫一個封閉的多邊形時,numpoints 的值取實(shí)際多邊形的頂點(diǎn)數(shù)加一,并且數(shù)組polypoints中第一個
34、和最后一個點(diǎn)的坐標(biāo)相同。下面舉一個用drawpoly()函數(shù)畫箭頭的例子。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;int arw16=200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(12); /*設(shè)置作圖顏色*/drawpoly(8, arw
35、); /*畫一箭頭*/getch();closegraph();return 0;II、設(shè)定線型函數(shù)在沒有對線的特性進(jìn)行設(shè)定之前,TURBO C 用其默認(rèn)值,即一點(diǎn)寬的實(shí)線,但TURBO C 也提供了可以改變線型的函數(shù)。線型包括:寬度和形狀。其中寬度只有兩種選擇:一點(diǎn)寬和三點(diǎn)寬。而線的形狀則有五種。下面介紹有關(guān)線型的設(shè)置函數(shù)。void far setlinestyle(int linestyle,unsigned upattern,int thickness);該函數(shù)用來設(shè)置線的有關(guān)信息,其中l(wèi)inestyle是線形狀的規(guī)定,見graphics.h。對于upattern,只有l(wèi)inestyle
36、選USERBIT_LINE 時才有意義 (選其它線型,uppattern取0即可)。此時uppattern的16位二進(jìn)制數(shù)的每一位代表一個象元,如果那位為1,則該象元打開,否則該象元關(guān)閉。 void far getlinesettings(struct linesettingstypefar *lineinfo);該函數(shù)將有關(guān)線的信息存放到由lineinfo 指向的結(jié)構(gòu)中,表中l(wèi)inesettingstype的結(jié)構(gòu)如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面兩句程序可以讀出當(dāng)前線的特性
37、struct linesettingstype *info;getlinesettings(info);void far setwritemode(int mode);該函數(shù)規(guī)定畫線的方式。如果mode=0,則表示畫線時將所畫位置的原來信息覆蓋了(這是TURBO C的默認(rèn)方式)。如果mode=1, 則表示畫線時用現(xiàn)在特性的線與所畫之處原有的線進(jìn)行異或(XOR)操作,實(shí)際上畫出的線是原有線與現(xiàn)在規(guī)定的線進(jìn)行異或后的結(jié)果。因此,當(dāng)線的特性不變,進(jìn)行兩次畫線操作相當(dāng)于沒有畫線。有關(guān)線型設(shè)定和畫線函數(shù)的例子如下所示。#include stdio.h#include graphics.hint main
38、()int gdriver, gmode, i;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(GREEN);circle(320, 240, 98);setlinestyle(0, 0, 3); /*設(shè)置三點(diǎn)寬實(shí)線*/setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHITE);setlinestyle(4, 0 xaaaa, 1);/*設(shè)置一點(diǎn)寬用戶定義線*/line(220, 240, 420,
39、 240);line(320, 140, 320, 340);getch();closegraph();return 0;第四節(jié) 基本圖形的填充填充就是用規(guī)定的顏色和圖模填滿一個封閉圖形。 一般是先畫輪廓再填充。TURBO C提供了一些先畫出基本圖形輪廓, 再按規(guī)定圖模和顏色填充整個封閉圖形的函數(shù)。在沒有改變填充方式時,TURBO C 以默認(rèn)方式填充。 void far bar(int x1, int y1, int x2, int y2);確定一個以(x1,y1)為左上角,(x2,y2)為右下角的矩形窗口,再按規(guī)定圖模和顏色填充。說明:此函數(shù)不畫出邊框,所以填充色為邊框。void far b
40、ar3d(int x1, int y1, int x2, int y2,int depth,int topflag);當(dāng)topflag為非0時, 畫出一個三維的長方體。當(dāng)topflag為0時,三維圖形不封頂,實(shí)際上很少這樣使用。說明: bar3d()函數(shù)中,長方體第三維的方向不隨任何參數(shù)而變,即始終為45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);畫一個以(x, y)為圓心,radius為半徑,stangle為起始角度,endangle 為終止角度的扇形,再按規(guī)定方式填充。當(dāng)stangle=0,
41、endangle=360 時變成一個實(shí)心圓,并在圓內(nèi)從圓點(diǎn)沿X軸正向畫一條半徑。void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);畫一個以(x, y)為圓心分別以xradius, yradius為x軸和y軸半徑,stangle 為起始角,endangle為終止角的橢圓扇形,再按規(guī)定方式填充。第五節(jié) 設(shè)定填充方式TURBO C有四個與填充方式有關(guān)的函數(shù)。下面分別介紹: void far setfillstyle(int pattern, int color); color的值是當(dāng)前屏幕圖形模
42、式時顏色的有效值。pattern的值及與其等價的符號常數(shù)見graphics.h。除USER_FILL(用戶定義填充式樣)以外,其它填充式樣均可由setfillstyle() 函數(shù)設(shè)置。當(dāng)選用USER_FILL時,該函數(shù)對填充圖模和顏色不作任何改變。 之所以定義USER_FILL主要因?yàn)樵讷@得有關(guān)填充信息時用到此項(xiàng)。void far setfillpattern(char * upattern,int color); 設(shè)置用戶定義的填充圖模的顏色以供對封閉圖形填充。其中upattern是一個指向8個字節(jié)的指針。這8個字節(jié)定義了8x8點(diǎn)陣的圖形。每個字節(jié)的8位二進(jìn)制數(shù)表示水平8點(diǎn),8個字節(jié)表示8行
43、,然后以此為模型向個封閉區(qū)域填充。void far getfillpattern(char * upattern); 該函數(shù)將用戶定義的填充圖模存入upattern指針指向的內(nèi)存區(qū)域。void far getfillsetings(struct fillsettingstypefar * fillinfo); 獲得現(xiàn)行圖模的顏色并將存入結(jié)構(gòu)指針變量fillinfo中。其中fillsettingstype結(jié)構(gòu)定義如下:struct fillsettingstypeint pattern; /* 現(xiàn)行填充模式 * /int color; /* 現(xiàn)行填充模式 * /; 有關(guān)圖形填充圖模的顏色的選擇,
44、請看下面例程。#include stdio.h#include graphics.hmain()char str8=10,20,30,40,50,60,70,80; /*用戶定義圖模*/int gdriver,gmode,i;struct fillsettingstype save;/*定義一個用來存儲填充信息的結(jié)構(gòu)變量*/gdriver=DETECT;initgraph(&gdriver,&gmode,C:TC2.0BGI);setbkcolor(BLUE);cleardevice();for(i=0;i13;i+)setcolor(i+3);setfillstyle(i,2+i); /*
45、設(shè)置填充類型 */bar(100,150,200,50); /*畫矩形并填充*/bar3d(300,100,500,200,70,1); /* 畫長方體并填充*/pieslice(200, 300, 90, 180, 90);/*畫扇形并填充*/sector(500,300,180,270,200,100);/*畫橢圓扇形并填充*/getch();cleardevice();setcolor(14);setfillpattern(str, RED);bar(100,150,200,50);bar3d(300,100,500,200,70,0);pieslice(200,300,0,360,90
46、);sector(500,300,0,360,100,50);getch();getfillsettings(&save);/*獲得用戶定義的填充模式信息*/closegraph();clrscr();printf(The pattern is %d, The color of filling is %d,save.pattern, save.color);/*輸出目前填充圖模和顏色值*/getch();第六節(jié) 任意封閉圖形的填充截止目前為止,我們只能對一些特定形狀的封閉圖形進(jìn)行填充,但還不能對任意封閉圖形進(jìn)行填充。為此,TURBO C 提供了一個可對任意封閉圖形填充的函數(shù),其調(diào)用格式如下:
47、void far floodfill(int x, int y, int border); 其中:x, y為封閉圖形內(nèi)的任意一點(diǎn),border為邊界的顏色,也就是封閉圖形輪廓的顏色。調(diào)用了該函數(shù)后,將用由函數(shù)setfillstyle()規(guī)定的顏色和模式填滿整個封閉圖形。注意:a. 如果x或y取在邊界上,則不進(jìn)行填充。b. 如果不是封閉圖形則填充會從沒有封閉的地方溢出去,填滿其它地方。c. 如果x或y在圖形外面,則填充封閉圖形外的屏幕區(qū)域。d. 由border指定的顏色值必須與圖形輪廓的顏色值相同, 但填充色可選任意顏色。下例是有關(guān)floodfill()函數(shù)的用法,該程序填充了bar3d()所畫
48、長方體中其它兩個未填充的面。#include stdio.h#include graphics.hmain()int gdriver, gmode;struct fillsettingstype save;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(LIGHTRED);setlinestyle(0,0,3);setfillstyle(1,14); /*設(shè)置填充方式*/bar3d(100,200,400,350,200,1); /*畫長方體并填充*/f
49、loodfill(450,300,LIGHTRED);/*填充長方體另外兩個面*/floodfill(250,150, LIGHTRED);rectangle(450,400,500,450); /*畫一矩形*/floodfill(470,420, LIGHTRED); /*填充矩形*/getch();closegraph();第七節(jié)屏幕操作函數(shù)除了清屏函數(shù)以外,關(guān)于屏幕操作還有以下函數(shù): void far setactivepage(int pagenum); void far setvisualpage(int pagenum);這兩個函數(shù)只用于EGA,VGA 以及HERCULES圖形適配
50、器。setctivepage()函數(shù)是為圖形輸出選擇激活頁。所謂激活頁是指后續(xù)圖形的輸出被寫到函數(shù)選定的pagenum頁面,該頁面并不一定可見。setvisualpage()函數(shù)才使pagenum所指定的頁面變成可見頁。頁面從0開始(Turbo C默認(rèn)頁)。如果先用setactivepage() 函數(shù)在不同頁面上畫出一幅幅圖像,再用setvisualpage() 函數(shù)交替顯示,就可以實(shí)現(xiàn)一些動畫的效果。void far getimage(int xl,int yl, int x2,int y2,void far *mapbuf); void far putimge(int x,int,y,vo
51、id * mapbuf, int op); unsined far imagesize(int xl,int yl,int x2,int y2);這三個函數(shù)用于將屏幕上的圖像復(fù)制到內(nèi)存,然后再將內(nèi)存中的圖像送回到屏幕上。首先通過函數(shù)imagesize() 測試要保存左上角為(xl,yl),右上角為(x2,y2)的圖形屏幕區(qū)域內(nèi)的全部內(nèi)容需多少個字節(jié),然后再給mapbuf分配一個所測數(shù)字節(jié)內(nèi)存空間的指針。通過調(diào)用getimage()函數(shù)就可將該區(qū)域內(nèi)的圖像保存在內(nèi)存中,需要時可用putimage()函數(shù)將該圖像輸出到左上角為點(diǎn)(x, y)的位置上,其中g(shù)etimage()函數(shù)中的參數(shù)op規(guī)定如何
52、釋放內(nèi)存中圖像。 關(guān)于這個參數(shù)的定義參見下表。對于imagesize()函數(shù),只能返回字節(jié)數(shù)小于64K字節(jié)的圖像區(qū)域,否則將會出錯,出錯時返回-1。本節(jié)介紹的函數(shù)在圖像動畫處理、菜單設(shè)計技巧中非常有用。下面程序模擬兩個小球動態(tài)碰撞過程。#include stdio.h#include graphics.h#include malloc.hint main()int i, gdriver, gmode, size;void *buf;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevic
53、e();setcolor(LIGHTRED);setlinestyle(0,0,1);setfillstyle(1, 10);circle(100, 200, 30);floodfill(100, 200, 12);size=imagesize(69, 169, 131, 231);buf=malloc(size);if(!buf) return -1;getimage(69, 169, 131, 231,buf);putimage(500, 269, buf, COPY_PUT);for(i=0; i185; i+)putimage(70+i, 170, buf, COPY_PUT);put
54、image(500-i, 170, buf, COPY_PUT);for(i=0;i185; i+)putimage(255-i, 170, buf, COPY_PUT);putimage(315+i, 170, buf, COPY_PUT);getch();closegraph();第八節(jié)用戶對文本字符大小的設(shè)置前面介紹的settextstyle()函數(shù),可以設(shè)定圖形方式下輸出文本字符這字體和大小但對于筆劃型字體(除8*8點(diǎn)陣字以個的字體),只能在水平和垂直方向以相同的放大倍數(shù)放大。 為此Turbo C2.0又提供了另外一個setusercharsize() 函數(shù),對筆劃字體可以分別設(shè)置水平
55、和垂直方向的放大倍數(shù)。該函數(shù)的調(diào)用格式為: void far setusercharsize(int mulx, intdivx, int muly, int divy); 該函數(shù)用來設(shè)置筆劃型字和放大系數(shù),它只有在settextstyle()函數(shù)中的charsize為0(或USER_CHAR_SIZE)時才起作用,并且字體為函數(shù)settextstyle()規(guī)定的字體。 調(diào)用函數(shù)setusercharsize()后,每個顯示在屏幕上的字符都以其缺省大小乘以mulx/divx為輸出字符寬,乘以muly/divy為輸出字符高。 #include stdio.h#include graphics.h
56、int main()int gdriver, gmode;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setfillstyle(1, 2); /*設(shè)置填充方式*/setcolor(WHITE); /*設(shè)置白色作圖*/rectangle(100, 100, 330, 380);floodfill(50, 50, 14); /*填充方框以外的區(qū)域*/setcolor(12); /*作圖色為淡紅*/settextstyle(1, 0, 8); /*三重筆劃字體,放大8倍*/
57、outtextxy(120, 120, Very Good);setusercharsize(2, 1, 4, 1);/*水平放大2倍,垂直放大4倍*/setcolor(15);settextstyle(3, 0, 5);/*無襯字筆劃,放大5倍*/outtextxy(220, 220, Very Good);setusercharsize(4, 1, 1, 1);settextstyle(3, 0, 0);outtextxy(180, 320, Good);getch();closegraph();return 0;第九節(jié)文本字體、字型和輸出方式的設(shè)置有關(guān)圖形方式下的文本輸出函數(shù),可以通過s
58、etcolor()函數(shù)設(shè)置輸出文本的顏色。另外,也可以改變文本字體大小以及選擇是水平方向輸出還是垂直方向輸出。 void far settexjustify(int horiz, int vert); 該函數(shù)用于定位輸出字符串。對使用outtextxy(int x, int y, char far *str textstring)函數(shù)所輸出的字符串,其中哪個點(diǎn)對應(yīng)于定位坐標(biāo)(x,y)在TurboC2.0中是有規(guī)定的。如果把一個字符串看成一個長方形的圖形,在水平方向顯示時,字符串長方形按垂直方向可分為頂部,中部和底部三個位置,水平方向可分為左,中,右三個位置,兩者結(jié)合就有9個位置。settext
59、justify()函數(shù)的第一個參數(shù)horiz 指出水平方向三個位置中的一個,第二個參數(shù)vert指出垂直方向三個位置中的一個,二者就確定了其中一個位置。當(dāng)規(guī)定了這個位置后,用outtextxy() 函數(shù)輸出字符串時, 字符串長方形的這個規(guī)定位置就對準(zhǔn)函數(shù)中的(x,y)位置。而對用uttext()函數(shù)輸出字符串時,這個規(guī)定的位置就位于現(xiàn)行游標(biāo)的位置。 有關(guān)參數(shù)horiz和vert的取值參見graphics.h。void far settextstyle(int font, int direction,int charsize); 該函數(shù)用來設(shè)置輸出字符的字形(由font確定)、輸出方向(由dire
60、ction確定)和字符大小(由charsize確定)等特性。 Turbo C2.0對函數(shù)中各個參數(shù)的規(guī)定見graphics.h。有關(guān)圖形屏幕下文本輸出和字體字型設(shè)置函數(shù)的用法請看下例: #include stdio.h#include graphics.hint main()int i, gdriver, gmode;char s30;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setviewport(100, 100, 540, 380, 1);/*定義一個圖形窗口
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 木工承包合同內(nèi)腳手架
- 啤酒銷售合同書
- 農(nóng)村住房安全保障工程實(shí)施指南
- 網(wǎng)站維護(hù)與SEO優(yōu)化作業(yè)指導(dǎo)書
- 投資理財與風(fēng)險防范作業(yè)指導(dǎo)書
- 2025年甘肅貨運(yùn)從業(yè)資格證題目答案
- 2025年三明道路貨運(yùn)駕駛員從業(yè)資格證考試題庫完整
- 2025年貨車從業(yè)資格證答題軟件
- 2024-2025學(xué)年四年級語文上冊第二單元明月4走月亮作業(yè)設(shè)計北師大版
- 個人前臺自我總結(jié)
- 學(xué)前比較教育第二版全套教學(xué)課件
- 操作工考核評分表
- 俄羅斯水資源現(xiàn)狀分析
- 非法捕撈水產(chǎn)品罪
- 新概念第一冊單詞匯總帶音標(biāo)EXCEL版
- 作用于血液及造血器官的藥 作用于血液系統(tǒng)藥物
- 春節(jié)節(jié)后施工復(fù)工安全培訓(xùn)
- GB/T 3478.1-1995圓柱直齒漸開線花鍵模數(shù)基本齒廓公差
- GB/T 1346-2001水泥標(biāo)準(zhǔn)稠度用水量、凝結(jié)時間、安定性檢驗(yàn)方法
- FZ/T 25001-2012工業(yè)用毛氈
- 中國工運(yùn)史知識競答附答案
評論
0/150
提交評論