版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、“溫濕度傳感器”作品簡(jiǎn)介作品名稱:基于51單片機(jī)的溫濕度檢測(cè)電路 目 錄1、 作品名稱(3)2、 作品簡(jiǎn)介及其功能(3)3、 電路設(shè)計(jì)思路及其硬件的選擇(3)4、 電路的設(shè)計(jì)與成型(3)4.1供電部分(3)4.2微控制器部分(4)4.3測(cè)溫部分(4)4.4測(cè)濕部分(5)4.5報(bào)警部分(5)4.6鍵盤部分(5)4.7顯示部分(6)4.8整體電路及其PCB板(6)5、電路軟件的設(shè)計(jì)(7)5.1溫度部分(7)5.2濕度部分(8)5.3液晶顯示部分(9)5.4主程序(10)6、所思所感(11)7、參考文獻(xiàn)(11)1、作品名稱:基于單片機(jī)的溫濕度檢測(cè)電路2、作品簡(jiǎn)介及其功能:隨著工業(yè)自動(dòng)化的愈趨完善,各
2、種各樣的傳感器被用在了各式各樣的場(chǎng)合。而溫度和濕度這兩個(gè)重要的參數(shù)成為了實(shí)現(xiàn)過(guò)程控制自動(dòng)化必不可少的過(guò)程。換言之,問(wèn)題具體化為了選擇怎樣的傳感器及如何去檢測(cè)溫濕度的變化,并根據(jù)檢測(cè)結(jié)果調(diào)整系統(tǒng)以使之保持在最佳工作狀態(tài)。本電路即是用來(lái)檢測(cè)環(huán)境溫度及濕度的情況并實(shí)時(shí)顯示及作出處理的。雖然原理很簡(jiǎn)單卻可靠實(shí)用。下面將給出詳細(xì)描述。 3、電路設(shè)計(jì)思路及其硬件的選擇 先說(shuō)測(cè)溫部分。 考慮到測(cè)溫方案有很多種,包括電阻式測(cè)溫、熱電偶測(cè)溫等等。而由于外界諸多因素的變化,由分立元件所搭建的電路會(huì)受到各種各樣的干擾而導(dǎo)致測(cè)量結(jié)果的偏差,比如電阻會(huì)因溫度升高而阻值降低,三極管在發(fā)熱狀態(tài)下基極電流會(huì)升高等等。這會(huì)帶來(lái)
3、測(cè)量誤差,從而導(dǎo)致一系列負(fù)面響應(yīng)??紤]到這些問(wèn)題,方案最終被定在了集成溫度測(cè)量傳感器DS18B20上。 DS18B20是美國(guó)DALLAS公司生產(chǎn)的集成溫度傳感器。它將測(cè)溫、處理及輸入輸出等模擬+數(shù)字電路集成在一塊形似三極管的三端芯片上,體積小巧、功能強(qiáng)大,且數(shù)據(jù)的輸入輸出只需要一跟端口線,并且可在一根總線上并聯(lián)多個(gè)芯片以實(shí)現(xiàn)多點(diǎn)測(cè)溫。用之與單片機(jī)結(jié)合簡(jiǎn)直是溫度檢測(cè)的不二選擇。 再說(shuō)濕度檢測(cè)部分。 濕度檢測(cè)部分也有許多方案可供選擇,同樣也有集成濕度檢測(cè)元件。但考慮到其價(jià)格及普遍使用程度,最后放棄了集成元件的方案,改用分立式的電容測(cè)濕電路。本電路在工業(yè)上使用普遍且方案成熟,不失為可行方法之一。 控
4、制器方面,自然是使用STC89C52了,實(shí)惠夠用。 輔助部分有鍵盤部分和顯示部分,會(huì)在后面有詳細(xì)的介紹。4、電路的設(shè)計(jì)與成型:4.1供電部分: 電路圖如圖4.1.1所示。 圖4.1.1 電源電路 考慮到取電源的方便性,電路的電源部分采取了標(biāo)準(zhǔn)9V電源接口引入然后用LM7805集成穩(wěn)壓芯片穩(wěn)壓輸出穩(wěn)定5V電壓的方案。這種方案最大的好處是節(jié)省電源部分的體積,缺點(diǎn)則是無(wú)法透徹理解電源穩(wěn)壓的原理及實(shí)現(xiàn)方法。 4.2微控制器部分:微控制器電路圖如圖4.2.1所示: 圖4.2.1 微控制器電路微控制器為通用的51單片機(jī)系統(tǒng),簡(jiǎn)單明了。4.3測(cè)溫部分: 溫度檢測(cè)電路如圖4.3.1所示。 如圖所示,集成溫度傳
5、感器的數(shù)據(jù)接口 直接與單片機(jī)的P2.5口相連,且需要加一個(gè)10K的上拉電阻。圖4.3.1 測(cè)溫電路4.4測(cè)濕部分:測(cè)濕電路圖如圖4.4.1所示。由于測(cè)濕傳感器是采用的電容式測(cè)濕傳感器,故對(duì)濕度的測(cè)量轉(zhuǎn)變?yōu)榱藢?duì)變化電容的容值檢測(cè)。檢測(cè)容值的有效方案首選由555芯片組成的多諧振蕩器,如右圖所示。 如圖,當(dāng)電路通電時(shí),電容HS0001被充電。當(dāng)觸發(fā)端2腳的電壓上升到2*VCC5/3 圖4.4.1 測(cè)濕電路時(shí),輸出端3變?yōu)榈碗娖剑瑫r(shí)電容通過(guò)7腳放電,2腳電平下降;當(dāng)2腳電平下降到VCC5/3時(shí),輸出端3腳轉(zhuǎn)變?yōu)楦唠娖健k娙軭S0001放電所需時(shí)間為:Td=RH4*CHS0001*2 當(dāng)放電結(jié)束時(shí),V
6、CC5將通過(guò)RH3、RH4向電容HS0001充電。2腳電壓由VCC5/3上升到2*VCC5/3所需的時(shí)間為:Tu=(RH4+RH3)*CHS0001*2 當(dāng)3腳上升到2*VCC5/3時(shí),電路又翻轉(zhuǎn)為低電平。如此周而復(fù)始,就在電路的輸出端3腳得到一個(gè)周期性的矩形波,通過(guò)單片機(jī)的外部中斷口可以檢測(cè)這個(gè)矩形波并得到其頻率,頻率的計(jì)算公式如下:f=1/(Td+Tu)=1/(2*RH4+RH3)* CHS0001*2 進(jìn)而得到電容值的計(jì)算公式:CHS0001=1/(2*RH4+RH3)*f*2 這樣就能得到測(cè)濕電容CHS0001的電容值并與濕度一一對(duì)應(yīng)起來(lái)了。4.5報(bào)警部分:報(bào)警部分如圖4.5.1所示。
7、當(dāng)溫度或者濕度超過(guò)設(shè)定值時(shí),單片機(jī)會(huì)控制蜂鳴器發(fā)聲報(bào)警。電路中的三極管9012當(dāng)做開(kāi)關(guān)管使用,給低電平就導(dǎo)通。 圖 圖4.5.1 報(bào)警電路4.6鍵盤部分:鍵盤部分如圖4.6.1所示。由于整體電路不需要很多按鍵,所以用不到矩陣鍵盤的方案。單片機(jī)只需要檢測(cè)哪個(gè)按鍵有了低電平,即可確定哪個(gè)按鍵被按下了。圖圖4.6.1 按鍵電路4.7顯示部分:顯示部分如圖4.7.1所示。本電路采用了1602液晶顯示,接口簡(jiǎn)單,控制方便。由于本電路占用單片機(jī)的I/O口并不多,所以采用了并行接口方式。圖4.7.1 液晶顯示電路4.8整體電路及其PCB板:整體電路如圖4.8.1所示:圖4.8.1 整體電路PCB圖如圖4.8
8、.2所示:圖4.8.2 PCB印制板圖5、電路軟件的設(shè)計(jì):5.1溫度部分:用單片機(jī)控制DS18B20非常方便。先對(duì)之進(jìn)行初始化,之后就能從其中讀出數(shù)據(jù)了。以下是程序。/初始化程序段void init_18B20(void) reset_18B20();/總線復(fù)位 wbyte_18B20(0 xcc);/忽略檢查ROM匹配操作 wbyte_18B20(0 x4e);/設(shè)置寫模式(寫暫存器) /*wbyte_18B20(0 x21);/設(shè)置溫度上限為33【設(shè)置則精度只能是0.5】 wbyte_18B20(0 x1c);/設(shè)置最低溫度為28*/ wbyte_18B20(0 x1f);/寫溫度計(jì)配置寄
9、存器/數(shù)據(jù)提取程序段uint getdat_18B20()float c;uint temp;uchar h,l;conv_18B20();reset_18B20();delay_18B20(1);/稍作延時(shí)wbyte_18B20(0 xcc);wbyte_18B20(0 xbe);/發(fā)送讀取溫度數(shù)據(jù)的命令l=rbyte_18B20();/讀取低8位h=rbyte_18B20();/讀取高8位flag_18B20=h&0 x80;if(flag_18B20) /最高位為1,溫度為負(fù)temp=h;temp=temp8;/讀取的高8位數(shù)據(jù)裝在temp高8位temp=temp|l;temp=temp
10、+1;c=temp*0.0625;temp=c*100+0.5;elsetemp=h;temp=temp8;temp=temp|l;c=temp*0.0625;temp=c*100+0.5;return(temp); /溫度整數(shù)部分2位,小數(shù)部分2位5.2濕度部分:由于需要檢測(cè)的信號(hào)是一定頻率的方波,所以最佳檢測(cè)方案莫過(guò)于用單片機(jī)的計(jì)數(shù)器在一定時(shí)間內(nèi)進(jìn)行計(jì)數(shù),進(jìn)而計(jì)算出其頻率。其函數(shù)如下所示。/初始化程序段,用于對(duì)外部中斷0和定時(shí)器0進(jìn)行初始化設(shè)置void init_freq()TMOD=0 x02;TH0=56;TL0=56;/定時(shí)器0,計(jì)時(shí)中斷一次為200usEA=1; ET0=1;EX0
11、=1;/開(kāi)外部中斷0 IT0=1;/跳變沿觸發(fā)方式 (“0”為低電平觸發(fā)方式)TR0=1;/中斷程序段void EX0_int()interrupt 0 num+;void T0_timer0()interrupt 1 time+; if(time=500)/200us*500=100ms,此乃100ms的定時(shí) EX0=0;/先把外部中斷關(guān)掉TR0=0;/再把定時(shí)器關(guān)掉time=0;/記得復(fù)位,很重要display_freq();num=0;/同時(shí)把中斷計(jì)數(shù)清零TR0=1;/開(kāi)啟定時(shí)EX0=1;/開(kāi)啟外部中斷5.3液晶顯示部分:液晶顯示部分已經(jīng)是固化程序了,程序如下:/初始化void init
12、_1602()en_1602=0;wcom_1602(0 x38);/數(shù)據(jù)總線8位,顯示兩行5*7點(diǎn)陣/字wcom_1602(0 x0c);/開(kāi)顯示功能,且光標(biāo)不顯示,不閃爍wcom_1602(0 x06);/寫入一個(gè)字后光標(biāo)后移,且屏幕不移動(dòng)/顯示程序void wcom_1602(uchar c)rw_1602=0;rs_1602=0;P0=c;en_1602=0;delay_1602(2);en_1602=1;delay_1602(2);en_1602=0;void wdat_1602(uchar d)rw_1602=0;rs_1602=1;P0=d;en_1602=0;delay_160
13、2(2);en_1602=1;delay_1602(2);en_1602=0;void wsingle_1602(uchar hang,uchar lie,uchar dat)uchar k;if(hang=1)k=0 x80;if(hang=2)k=0 xc0;k=k+lie-1;wcom_1602(k);wdat_1602(dat);void wstring_1602(uchar hang,uchar lie,uchar *dat)uchar k;uchar *p=dat;if(hang=1)k=0 x80;if(hang=2)k=0 xc0;k=k+lie-1;wcom_1602(k);
14、while(*p!=0)wdat_1602(*p);p+;p=0;5.4主程序:為了簡(jiǎn)化主程序,使用了頭文件包含的形式,這樣主程序看起來(lái)干凈多了:#include#include#includevoid main()init_1602();init_18B20();init_freq();while(1);6、所思所感:說(shuō)實(shí)話,其實(shí)以前已經(jīng)分別做過(guò)了溫度和濕度的檢測(cè)電路,這次只不過(guò)把它們倆整合起來(lái)而已,可以說(shuō)是駕輕就熟,較為順利。通過(guò)這次制作,我強(qiáng)化了PCB板的布局、壓縮等多方面的技巧,收獲不小。可以說(shuō)這次在傳感器應(yīng)用方面的收獲沒(méi)有在制板方面的收獲主要,這也可算是不錯(cuò)了。我明白了一個(gè)道理,只要
15、用心,即使是最平凡的事上也能得到收獲的,而且千萬(wàn)不要小看每一件簡(jiǎn)單的事物,即使最細(xì)微的細(xì)節(jié)也能導(dǎo)致一個(gè)系統(tǒng)的崩盤。防微杜漸才是主要的,亡羊補(bǔ)牢之僥幸心理要不得。7、參考文獻(xiàn)張毅剛.新編MCS-51單片機(jī)應(yīng)用設(shè)計(jì).哈爾濱工業(yè)大學(xué)出版社;郭天祥.51單片機(jī)C語(yǔ)言教程.電子工業(yè)出版社附錄資料:不需要的可以自行刪除 C語(yǔ)言圖形模式速成第一節(jié) 圖形模式的初始化Turbo C 提供了非常豐富的圖形函數(shù),所有圖形函數(shù)的原型均在graphics. h 中,本節(jié)主要介紹圖形模式的初始化、獨(dú)立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數(shù)。另外,使用圖形函數(shù)時(shí)要確保有顯示器圖形驅(qū)動(dòng)程序*.B
16、GI,同時(shí)將集成開(kāi)發(fā)環(huán)境options/Linker中的Graphics lib選為on,只有這樣才能保證正確使用圖形函數(shù)。 不同的顯示器適配器有不同的圖形分辨率。即是同一顯示器適配器,在不同模式下也有不同分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類將顯示器設(shè)置成為某種圖形模式,在未設(shè)置圖形模式之前,微機(jī)系統(tǒng)默認(rèn)屏幕為文本模式(80列,25行字符模式),此時(shí)所有圖形函數(shù)均不能工作。設(shè)置屏幕為圖形模式,可用下列圖形初始化函數(shù):void far initgraph(int far *gdriver, int far *gmode,char *path);其中g(shù)driver和gmode分別
17、表示圖形驅(qū)動(dòng)器和模式,path是指圖形驅(qū)動(dòng)程序所在的目錄路徑。有關(guān)圖形驅(qū)動(dòng)器、圖形模式的符號(hào)常數(shù)及對(duì)應(yīng)的分辨率見(jiàn)graphics. h。圖形驅(qū)動(dòng)程序由Turbo C出版商提供,文件擴(kuò)展名為.BGI。 根據(jù)不同的圖形適配器有不同的圖形驅(qū)動(dòng)程序。例如對(duì)于EGA、 VGA 圖形適配器就調(diào)用驅(qū)動(dòng)程序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,
18、 300, 250, 50, 1); /*畫(huà)一長(zhǎng)方體*/getch();closegraph();return 0;有時(shí)編程者并不知道所用的圖形顯示器適配器種類,或者需要將編寫的程序用于不同圖形驅(qū)動(dòng)器,Turbo C 提供了一個(gè)自動(dòng)檢測(cè)顯示器硬件的函數(shù),其調(diào)用格式為:void far detectgraph(int *gdriver, *gmode);其中g(shù)driver和gmode的意義與上面相同。 自動(dòng)進(jìn)行硬件測(cè)試后進(jìn)行圖形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdri
19、ver, &gmode); /*自動(dòng)測(cè)試硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,gmode); /*輸出測(cè)試結(jié)果*/getch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根據(jù)測(cè)試結(jié)果初始化圖形*/bar3d(100, 100, 300, 250, 50, 1); /*畫(huà)一長(zhǎng)方體*/getch();closegraph();return 0;上例程序中先對(duì)圖形顯示器自動(dòng)檢測(cè),然后再用圖形初始化函數(shù)進(jìn)行初始化設(shè)置,但Turbo C提供了一種更簡(jiǎn)單的方法, 即用gdriver=
20、DETECT 語(yǔ)句后再跟initgraph()函數(shù)就行了。采用這種方法后,上例可改為:#include 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ù)對(duì)
21、于圖形模式的屏幕顏色設(shè)置,同樣分為背景色的設(shè)置和前景色的設(shè)置。在Turbo C中分別用下面兩個(gè)函數(shù): 設(shè)置背景色: void far setbkcolor(int color);設(shè)置作圖色: void far setcolor(int color);其中color 為圖形方式下顏色的規(guī)定數(shù)值,對(duì)EGA,VGA顯示器適配器,有關(guān)顏色的符號(hào)常數(shù)及數(shù)值見(jiàn)graphics.h。清除圖形屏幕內(nèi)容但不清除圖形背景使用清屏函數(shù),其調(diào)用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriv
22、er, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*圖形初始化*/setbkcolor(0); /*設(shè)置圖形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*設(shè)置不同作圖色*/circle(320, 240, 20+i*10); /*畫(huà)半徑不同的圓*/getch();for(i=0; i=15; i+)setbkcolor(i); /*設(shè)置不同背景色*/cleardevice();circle(320, 240, 20+i*10);getch();
23、aa=getmaxcolor();printf(maxcolor=%d,aa);getch();closegraph();return 0;另外,TURBO C也提供了幾個(gè)獲得現(xiàn)行顏色設(shè)置情況的函數(shù)。 int far getbkcolor(void); 返回現(xiàn)行背景顏色值。int far getcolor(void); 返回現(xiàn)行作圖顏色值。int far getmaxcolor(void); 返回最高可用的顏色值。第三節(jié) 基本畫(huà)圖函數(shù)基本圖形函數(shù)包括畫(huà)點(diǎn),線以及其它一些基本圖形的函數(shù)。本節(jié)對(duì)這些函數(shù)作一全面的介紹。 、畫(huà)點(diǎn). 畫(huà)點(diǎn)函數(shù) void far putpixel(int x, int
24、y, int color); 該函數(shù)表示有指定的象元畫(huà)一個(gè)按color 所確定顏色的點(diǎn)。對(duì)于顏色color的值可從表3中獲得而對(duì)x, y是指圖形象元的坐標(biāo)。在圖形模式下,是按象元來(lái)定義坐標(biāo)的。對(duì)VGA適配器,它的最高分辨率為640 x480,其中640為整個(gè)屏幕從左到右所有象元的個(gè)數(shù),480為整個(gè)屏幕從上到下所有象元的個(gè)數(shù)。屏幕的左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(639, 479),水平方向從左到右為x 軸正向,垂直方向從上到下為y軸正向。TURBO C的圖形函數(shù)都是相對(duì)于圖形屏幕坐標(biāo),即象元來(lái)說(shuō)的。關(guān)于點(diǎn)的另外一個(gè)函數(shù)是: int far getpixel(int x, int y);
25、它獲得當(dāng)前點(diǎn)(x, y)的顏色值。 II、有關(guān)坐標(biāo)位置的函數(shù) int far getmaxx(void);返回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); 移動(dòng)游標(biāo)到(x, y)點(diǎn),不是畫(huà)點(diǎn),在移動(dòng)過(guò)程中亦畫(huà)點(diǎn)。void far moverel(int dx, int dy); 移動(dòng)游標(biāo)從現(xiàn)行位置(x, y)移動(dòng)到(x+dx, y+dy)的位置,移動(dòng)過(guò)程中不畫(huà)點(diǎn)。、畫(huà)線I. 畫(huà)線
26、函數(shù)TURBO C提供了一系列畫(huà)線函數(shù): void far line(int x0, int y0, int x1, int y1); 畫(huà)一條從點(diǎn)(x0, y0)到(x1, y1)的直線。void far lineto(int x, int y); 畫(huà)一作從現(xiàn)行游標(biāo)到點(diǎn)(x, y)的直線。void far linerel(int dx, int dy); 畫(huà)一條從現(xiàn)行游標(biāo)(x,y)到按相對(duì)增量確定的點(diǎn)(x+dx, y+dy)的直線。void far circle(int x, int y, int radius); 以(x, y)為圓心,radius為半徑,畫(huà)一個(gè)圓。void far arc(
27、int x, int y, int stangle, int endangle,int radius); 以(x,y)為圓心,radius為半徑,從stangle開(kāi)始到endangle結(jié)束(用度表示)畫(huà)一段圓弧線。在TURBO C中規(guī)定x軸正向?yàn)? 度,逆時(shí)針?lè)较蛐D(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
28、開(kāi)始到endangle結(jié)束畫(huà)一段橢圓線,當(dāng)stangle=0,endangle=360時(shí), 畫(huà)出一個(gè)完整的橢圓。void far rectangle(int x1, int y1, int x2, inty2); 以(x1, y1)為左上角,(x2, y2)為右下角畫(huà)一個(gè)矩形框。 void far drawpoly(int numpoints, int far *polypoints); 畫(huà)一個(gè)頂點(diǎn)數(shù)為numpoints,各頂點(diǎn)坐標(biāo)由polypoints給出的多邊形。polypoints整型數(shù)組必須至少有2 倍頂點(diǎn)數(shù)個(gè)無(wú)素。每一個(gè)頂點(diǎn)的坐標(biāo)都定義為x,y,并且x在前。值得注意的是當(dāng)畫(huà)一個(gè)封閉的
29、多邊形時(shí),numpoints 的值取實(shí)際多邊形的頂點(diǎn)數(shù)加一,并且數(shù)組polypoints中第一個(gè)和最后一個(gè)點(diǎn)的坐標(biāo)相同。下面舉一個(gè)用drawpoly()函數(shù)畫(huà)箭頭的例子。#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);clear
30、device();setcolor(12); /*設(shè)置作圖顏色*/drawpoly(8, arw); /*畫(huà)一箭頭*/getch();closegraph();return 0;II、設(shè)定線型函數(shù)在沒(méi)有對(duì)線的特性進(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ù)用來(lái)設(shè)置線的有關(guān)信息,其中l(wèi)in
31、estyle是線形狀的規(guī)定,見(jiàn)graphics.h。對(duì)于upattern,只有l(wèi)inestyle選USERBIT_LINE 時(shí)才有意義 (選其它線型,uppattern取0即可)。此時(shí)uppattern的16位二進(jìn)制數(shù)的每一位代表一個(gè)象元,如果那位為1,則該象元打開(kāi),否則該象元關(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;uns
32、igned upattern;int thickness;例如下面兩句程序可以讀出當(dāng)前線的特性 struct linesettingstype *info;getlinesettings(info);void far setwritemode(int mode);該函數(shù)規(guī)定畫(huà)線的方式。如果mode=0,則表示畫(huà)線時(shí)將所畫(huà)位置的原來(lái)信息覆蓋了(這是TURBO C的默認(rèn)方式)。如果mode=1, 則表示畫(huà)線時(shí)用現(xiàn)在特性的線與所畫(huà)之處原有的線進(jìn)行異或(XOR)操作,實(shí)際上畫(huà)出的線是原有線與現(xiàn)在規(guī)定的線進(jìn)行異或后的結(jié)果。因此,當(dāng)線的特性不變,進(jìn)行兩次畫(huà)線操作相當(dāng)于沒(méi)有畫(huà)線。有關(guān)線型設(shè)定和畫(huà)線函數(shù)的例子
33、如下所示。#include stdio.h#include graphics.hint main()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(
34、4, 0 xaaaa, 1);/*設(shè)置一點(diǎn)寬用戶定義線*/line(220, 240, 420, 240);line(320, 140, 320, 340);getch();closegraph();return 0;第四節(jié) 基本圖形的填充填充就是用規(guī)定的顏色和圖模填滿一個(gè)封閉圖形。 一般是先畫(huà)輪廓再填充。TURBO C提供了一些先畫(huà)出基本圖形輪廓, 再按規(guī)定圖模和顏色填充整個(gè)封閉圖形的函數(shù)。在沒(méi)有改變填充方式時(shí),TURBO C 以默認(rèn)方式填充。 void far bar(int x1, int y1, int x2, int y2);確定一個(gè)以(x1,y1)為左上角,(x2,y2)為右下角的
35、矩形窗口,再按規(guī)定圖模和顏色填充。說(shuō)明:此函數(shù)不畫(huà)出邊框,所以填充色為邊框。void far bar3d(int x1, int y1, int x2, int y2,int depth,int topflag);當(dāng)topflag為非0時(shí), 畫(huà)出一個(gè)三維的長(zhǎng)方體。當(dāng)topflag為0時(shí),三維圖形不封頂,實(shí)際上很少這樣使用。說(shuō)明: bar3d()函數(shù)中,長(zhǎng)方體第三維的方向不隨任何參數(shù)而變,即始終為45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);畫(huà)一個(gè)以(x, y)為圓心,radius為半徑,sta
36、ngle為起始角度,endangle 為終止角度的扇形,再按規(guī)定方式填充。當(dāng)stangle=0,endangle=360 時(shí)變成一個(gè)實(shí)心圓,并在圓內(nèi)從圓點(diǎn)沿X軸正向畫(huà)一條半徑。void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);畫(huà)一個(gè)以(x, y)為圓心分別以xradius, yradius為x軸和y軸半徑,stangle 為起始角,endangle為終止角的橢圓扇形,再按規(guī)定方式填充。第五節(jié) 設(shè)定填充方式TURBO C有四個(gè)與填充方式有關(guān)的函數(shù)。下面分別介紹: void far setfi
37、llstyle(int pattern, int color); color的值是當(dāng)前屏幕圖形模式時(shí)顏色的有效值。pattern的值及與其等價(jià)的符號(hào)常數(shù)見(jiàn)graphics.h。除USER_FILL(用戶定義填充式樣)以外,其它填充式樣均可由setfillstyle() 函數(shù)設(shè)置。當(dāng)選用USER_FILL時(shí),該函數(shù)對(duì)填充圖模和顏色不作任何改變。 之所以定義USER_FILL主要因?yàn)樵讷@得有關(guān)填充信息時(shí)用到此項(xiàng)。void far setfillpattern(char * upattern,int color); 設(shè)置用戶定義的填充圖模的顏色以供對(duì)封閉圖形填充。其中upattern是一個(gè)指向8個(gè)字
38、節(jié)的指針。這8個(gè)字節(jié)定義了8x8點(diǎn)陣的圖形。每個(gè)字節(jié)的8位二進(jìn)制數(shù)表示水平8點(diǎn),8個(gè)字節(jié)表示8行,然后以此為模型向個(gè)封閉區(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)行填
39、充模式 * /int color; /* 現(xiàn)行填充模式 * /; 有關(guān)圖形填充圖模的顏色的選擇,請(qǐng)看下面例程。#include stdio.h#include graphics.hmain()char str8=10,20,30,40,50,60,70,80; /*用戶定義圖模*/int gdriver,gmode,i;struct fillsettingstype save;/*定義一個(gè)用來(lái)存儲(chǔ)填充信息的結(jié)構(gòu)變量*/gdriver=DETECT;initgraph(&gdriver,&gmode,C:TC2.0BGI);setbkcolor(BLUE);cleardevice();for(i
40、=0;i13;i+)setcolor(i+3);setfillstyle(i,2+i); /* 設(shè)置填充類型 */bar(100,150,200,50); /*畫(huà)矩形并填充*/bar3d(300,100,500,200,70,1); /* 畫(huà)長(zhǎng)方體并填充*/pieslice(200, 300, 90, 180, 90);/*畫(huà)扇形并填充*/sector(500,300,180,270,200,100);/*畫(huà)橢圓扇形并填充*/getch();cleardevice();setcolor(14);setfillpattern(str, RED);bar(100,150,200,50);bar3d
41、(300,100,500,200,70,0);pieslice(200,300,0,360,90);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é) 任意封閉圖形的填充截止目前為止,我們只能對(duì)一些特定形狀的封閉圖形進(jìn)行填充,但還不能對(duì)任意
42、封閉圖形進(jìn)行填充。為此,TURBO C 提供了一個(gè)可對(duì)任意封閉圖形填充的函數(shù),其調(diào)用格式如下: void far floodfill(int x, int y, int border); 其中:x, y為封閉圖形內(nèi)的任意一點(diǎn),border為邊界的顏色,也就是封閉圖形輪廓的顏色。調(diào)用了該函數(shù)后,將用由函數(shù)setfillstyle()規(guī)定的顏色和模式填滿整個(gè)封閉圖形。注意:a. 如果x或y取在邊界上,則不進(jìn)行填充。b. 如果不是封閉圖形則填充會(huì)從沒(méi)有封閉的地方溢出去,填滿其它地方。c. 如果x或y在圖形外面,則填充封閉圖形外的屏幕區(qū)域。d. 由border指定的顏色值必須與圖形輪廓的顏色值相同,
43、但填充色可選任意顏色。下例是有關(guān)floodfill()函數(shù)的用法,該程序填充了bar3d()所畫(huà)長(zhǎng)方體中其它兩個(gè)未填充的面。#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è)置
44、填充方式*/bar3d(100,200,400,350,200,1); /*畫(huà)長(zhǎng)方體并填充*/floodfill(450,300,LIGHTRED);/*填充長(zhǎng)方體另外兩個(gè)面*/floodfill(250,150, LIGHTRED);rectangle(450,400,500,450); /*畫(huà)一矩形*/floodfill(470,420, LIGHTRED); /*填充矩形*/getch();closegraph();第七節(jié)屏幕操作函數(shù)除了清屏函數(shù)以外,關(guān)于屏幕操作還有以下函數(shù): void far setactivepage(int pagenum); void far setvisual
45、page(int pagenum);這兩個(gè)函數(shù)只用于EGA,VGA 以及HERCULES圖形適配器。setctivepage()函數(shù)是為圖形輸出選擇激活頁(yè)。所謂激活頁(yè)是指后續(xù)圖形的輸出被寫到函數(shù)選定的pagenum頁(yè)面,該頁(yè)面并不一定可見(jiàn)。setvisualpage()函數(shù)才使pagenum所指定的頁(yè)面變成可見(jiàn)頁(yè)。頁(yè)面從0開(kāi)始(Turbo C默認(rèn)頁(yè))。如果先用setactivepage() 函數(shù)在不同頁(yè)面上畫(huà)出一幅幅圖像,再用setvisualpage() 函數(shù)交替顯示,就可以實(shí)現(xiàn)一些動(dòng)畫(huà)的效果。void far getimage(int xl,int yl, int x2,int y2,vo
46、id far *mapbuf); void far putimge(int x,int,y,void * mapbuf, int op); unsined far imagesize(int xl,int yl,int x2,int y2);這三個(gè)函數(shù)用于將屏幕上的圖像復(fù)制到內(nèi)存,然后再將內(nèi)存中的圖像送回到屏幕上。首先通過(guò)函數(shù)imagesize() 測(cè)試要保存左上角為(xl,yl),右上角為(x2,y2)的圖形屏幕區(qū)域內(nèi)的全部?jī)?nèi)容需多少個(gè)字節(jié),然后再給mapbuf分配一個(gè)所測(cè)數(shù)字節(jié)內(nèi)存空間的指針。通過(guò)調(diào)用getimage()函數(shù)就可將該區(qū)域內(nèi)的圖像保存在內(nèi)存中,需要時(shí)可用putimage()函
47、數(shù)將該圖像輸出到左上角為點(diǎn)(x, y)的位置上,其中g(shù)etimage()函數(shù)中的參數(shù)op規(guī)定如何釋放內(nèi)存中圖像。 關(guān)于這個(gè)參數(shù)的定義參見(jiàn)下表。對(duì)于imagesize()函數(shù),只能返回字節(jié)數(shù)小于64K字節(jié)的圖像區(qū)域,否則將會(huì)出錯(cuò),出錯(cuò)時(shí)返回-1。本節(jié)介紹的函數(shù)在圖像動(dòng)畫(huà)處理、菜單設(shè)計(jì)技巧中非常有用。下面程序模擬兩個(gè)小球動(dòng)態(tài)碰撞過(guò)程。#include stdio.h#include graphics.h#include malloc.hint main()int i, gdriver, gmode, size;void *buf;gdriver=DETECT;initgraph(&gdriver,
48、 &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();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;
49、 i185; i+)putimage(70+i, 170, buf, COPY_PUT);putimage(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é)用戶對(duì)文本字符大小的設(shè)置前面介紹的settextstyle()函數(shù),可以設(shè)定圖形方式下輸出文本字符這字體和大小但對(duì)于筆劃型字體(除8*8點(diǎn)陣字以個(gè)的字體),只能在水平和垂直方向以相同的放大倍數(shù)放大。 為此Turb
50、o C2.0又提供了另外一個(gè)setusercharsize() 函數(shù),對(duì)筆劃字體可以分別設(shè)置水平和垂直方向的放大倍數(shù)。該函數(shù)的調(diào)用格式為: void far setusercharsize(int mulx, intdivx, int muly, int divy); 該函數(shù)用來(lái)設(shè)置筆劃型字和放大系數(shù),它只有在settextstyle()函數(shù)中的charsize為0(或USER_CHAR_SIZE)時(shí)才起作用,并且字體為函數(shù)settextstyle()規(guī)定的字體。 調(diào)用函數(shù)setusercharsize()后,每個(gè)顯示在屏幕上的字符都以其缺省大小乘以mulx/divx為輸出字符寬,乘以muly
51、/divy為輸出字符高。 #include stdio.h#include graphics.hint 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);
52、/*作圖色為淡紅*/settextstyle(1, 0, 8); /*三重筆劃字體,放大8倍*/outtextxy(120, 120, Very Good);setusercharsize(2, 1, 4, 1);/*水平放大2倍,垂直放大4倍*/setcolor(15);settextstyle(3, 0, 5);/*無(wú)襯字筆劃,放大5倍*/outtextxy(220, 220, Very Good);setusercharsize(4, 1, 1, 1);settextstyle(3, 0, 0);outtextxy(180, 320, Good);getch();closegraph()
53、;return 0;第九節(jié)文本字體、字型和輸出方式的設(shè)置有關(guān)圖形方式下的文本輸出函數(shù),可以通過(guò)setcolor()函數(shù)設(shè)置輸出文本的顏色。另外,也可以改變文本字體大小以及選擇是水平方向輸出還是垂直方向輸出。 void far settexjustify(int horiz, int vert); 該函數(shù)用于定位輸出字符串。對(duì)使用outtextxy(int x, int y, char far *str textstring)函數(shù)所輸出的字符串,其中哪個(gè)點(diǎn)對(duì)應(yīng)于定位坐標(biāo)(x,y)在TurboC2.0中是有規(guī)定的。如果把一個(gè)字符串看成一個(gè)長(zhǎng)方形的圖形,在水平方向顯示時(shí),字符串長(zhǎng)方形按垂直方向可分為
54、頂部,中部和底部三個(gè)位置,水平方向可分為左,中,右三個(gè)位置,兩者結(jié)合就有9個(gè)位置。settextjustify()函數(shù)的第一個(gè)參數(shù)horiz 指出水平方向三個(gè)位置中的一個(gè),第二個(gè)參數(shù)vert指出垂直方向三個(gè)位置中的一個(gè),二者就確定了其中一個(gè)位置。當(dāng)規(guī)定了這個(gè)位置后,用outtextxy() 函數(shù)輸出字符串時(shí), 字符串長(zhǎng)方形的這個(gè)規(guī)定位置就對(duì)準(zhǔn)函數(shù)中的(x,y)位置。而對(duì)用uttext()函數(shù)輸出字符串時(shí),這個(gè)規(guī)定的位置就位于現(xiàn)行游標(biāo)的位置。 有關(guān)參數(shù)horiz和vert的取值參見(jiàn)graphics.h。void far settextstyle(int font, int direction,i
55、nt charsize); 該函數(shù)用來(lái)設(shè)置輸出字符的字形(由font確定)、輸出方向(由direction確定)和字符大小(由charsize確定)等特性。 Turbo C2.0對(duì)函數(shù)中各個(gè)參數(shù)的規(guī)定見(jiàn)graphics.h。有關(guān)圖形屏幕下文本輸出和字體字型設(shè)置函數(shù)的用法請(qǐng)看下例: #include stdio.h#include graphics.hint main()int i, gdriver, gmode;char s30;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice
56、();setviewport(100, 100, 540, 380, 1);/*定義一個(gè)圖形窗口*/setfillstyle(1, 2); /*綠色以實(shí)填充*/setcolor(YELLOW);rectangle(0, 0, 439, 279);floodfill(50, 50, 14);setcolor(12);settextstyle(1, 0, 8);/*三重筆劃字體, 水平放大8倍*/outtextxy(20, 20, Good Better);setcolor(15);settextstyle(3, 0, 5);/*無(wú)襯筆劃字體, 水平放大5倍*/outtextxy(120, 120, Good Better);setcolor(14);sette
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)浴擦網(wǎng)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)插頭端子數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)微發(fā)泡塑料裝飾材料數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)供應(yīng)鏈管理及客戶關(guān)系管理系統(tǒng)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年中國(guó)氯滅酸片市場(chǎng)調(diào)查研究報(bào)告
- 二零二五年度電梯安全拆除與安全技術(shù)咨詢服務(wù)協(xié)議4篇
- 專職更夫勞動(dòng)協(xié)議模板(2024版)一
- 二零二五年度車輛租賃合同-維護(hù)原狀及責(zé)任分明協(xié)議
- 二零二五年度酒店入住服務(wù)協(xié)議書(shū)(含健身中心使用規(guī)定)
- 二零二五年度鋼管架租賃與施工現(xiàn)場(chǎng)消防安全管理協(xié)議
- 口腔醫(yī)學(xué)中的人工智能應(yīng)用培訓(xùn)課件
- 工程質(zhì)保金返還審批單
- 【可行性報(bào)告】2023年電動(dòng)自行車項(xiàng)目可行性研究分析報(bào)告
- 五月天歌詞全集
- 商品退換貨申請(qǐng)表模板
- 實(shí)習(xí)單位鑒定表(模板)
- 六西格瑪(6Sigma)詳解及實(shí)際案例分析
- 機(jī)械制造技術(shù)-成都工業(yè)學(xué)院中國(guó)大學(xué)mooc課后章節(jié)答案期末考試題庫(kù)2023年
- 數(shù)字媒體應(yīng)用技術(shù)專業(yè)調(diào)研方案
- 2023年常州市新課結(jié)束考試九年級(jí)數(shù)學(xué)試卷(含答案)
- 正常分娩 分娩機(jī)制 助產(chǎn)學(xué)課件
評(píng)論
0/150
提交評(píng)論