液體點滴速度監(jiān)控裝置(最終版)_第1頁
液體點滴速度監(jiān)控裝置(最終版)_第2頁
液體點滴速度監(jiān)控裝置(最終版)_第3頁
液體點滴速度監(jiān)控裝置(最終版)_第4頁
液體點滴速度監(jiān)控裝置(最終版)_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 液體點滴速度監(jiān)控裝置組員:李海豹 王會強 楊亞娟時間:2011年7月27日液體點滴速度監(jiān)控裝置 摘要:本系統(tǒng)設計是以單片機stc89c52為核心,以鍵盤及紅外對射式傳感器作為輸入系統(tǒng),以液晶顯示屏及電動機作為輸出系統(tǒng)的智能化輸液控制及監(jiān)測系統(tǒng)。鍵盤系統(tǒng)為矩陣式按鍵系統(tǒng),紅外傳感器的功能為檢測點滴的速度,紅外對管監(jiān)測儲液瓶內(nèi)液體剩余量,少于一定量時報警。報警系統(tǒng)用蜂鳴器。電動機具有轉速可控功率大及輸入脈沖不變時可保持大力矩等優(yōu)點,這樣就可以自如控制吊瓶的上、下緩移可以達到智能控制的目的。關鍵字:紅外對射式傳感器 矩陣式按鍵系統(tǒng) 智能化輸液控制監(jiān)測系統(tǒng)目錄1 系統(tǒng)設計11.1 方案選擇11.1.

2、1 點滴速度監(jiān)測方案 .11.1.2 儲液量監(jiān)測方案.11.1.3 鍵盤顯示模塊方案設計11.1.4 電機控制系統(tǒng)模塊11.2 系統(tǒng)最終方案確定.12 單元電路設計22.1 點滴速度測量電路設計.22.2 儲液檢測電路.22.3 鍵盤顯示電路.32.4 點滴速度控制電路設計.33 系統(tǒng)軟件設計53.1 檢測點滴速度子程序.53.2 儲液檢測子程序.53.3點滴速度控制子程序.63.4鍵盤顯示子程序.63.5系統(tǒng)的主程序設計.74 系統(tǒng)測試.85結論.9參考文獻.10附錄.111 系統(tǒng)設計1.1 方案選擇1.1.1 點滴速度監(jiān)測方案 方案一,采用紅外對管測量點滴一段時間落下的液滴數(shù),點滴落下時擋

3、住了紅外發(fā)射管發(fā)出的光,接收管無法接受。此時計數(shù)一次。采用塑料泡沫將對管固定在滴斗上,簡單輕巧,減小滴管擺動帶來的采集誤差,同時不影響電機工作。方案二, 采用電感式傳感器測量點滴速度。在輸液器的漏斗外圍繞線圈作為敏感元件。當液滴滴下是電感量發(fā)生變化,通過lc振蕩電路后輸出變化的頻率值,經(jīng)過f/v變換電路及電壓比較后輸出ttl電平信號來檢測點滴速度。此方案測量精度比較高,但是外圍電路比較復雜。1.1.2 儲液量監(jiān)測方案方案一:同點滴速度測量模塊,仍然采用紅外對管發(fā)射接收。根據(jù)該接收管收到的光強的大小來判斷液位是否達到警戒水位。方案二:采用稱重傳感器檢測。利用稱重傳感器檢測總質量,并與實際測量中當

4、液體液面達到設定位置時的總質量相比較,根據(jù)液體體積與質量的關系,當測量總質量與設定值相等時發(fā)出報警。1.1.3 鍵盤顯示模塊方案設計方案一:采用液晶顯示屏和通用矩陣鍵盤。液晶顯示屏用1602。液晶顯示屏(lcd)具有功耗小、輕薄短小無輻射危險,平面直角顯示以及影象穩(wěn)定不閃爍,可視面積大,畫面效果好,抗干擾能力強等特點。輸入簡單,靈活。方案二:采用三位led七段數(shù)碼管顯示點滴數(shù)目。按鍵采用單列三按鍵。數(shù)碼管具有:低能耗、低損耗、低壓、壽命長、耐老化,對外界環(huán)境要求較低。但數(shù)碼管顯示時,每個字符都要查詢段碼值,使用起來沒有液晶顯示方便。1.1.4 電機控制系統(tǒng)模塊方案一:通過改變滴斗到受液瓶的高度

5、來調(diào)節(jié)點滴的速度。由電動機帶動儲液瓶使儲液瓶上升或下降改變滴斗到受液瓶的高度,從而調(diào)節(jié)點滴速度。此種調(diào)節(jié)方法簡單,容易實現(xiàn)。方案二:通過控制滴速夾的松緊來控制點滴的速度。不過滴速夾用于大范圍的調(diào)節(jié)滴速,調(diào)節(jié)是不精確,1.2 最終方案確定綜合考慮,最終方案確定為點滴速度和儲液均用紅外對管監(jiān)測,鍵盤顯示模塊用44矩陣鍵盤和1602液晶顯示,液滴速度控制用電機實現(xiàn)。2 單元電路設計2.1 點滴速度測量電路設計采用紅外對管發(fā)射接收測量點滴速度,其電路原理圖如圖2.1.1.所示。 圖2.1點滴速度測量電路由電路圖可以看到,接收管與發(fā)射管正相對,無液滴滴下時,接收管收到信號,輸出低電平;有液滴滴下時,下落

6、的水滴對紅外光有較強的漫反射、吸收及一定的發(fā)散作用,導致接收光強的較大改變,接收管不能收到較強的信號,產(chǎn)生一個較長的脈動,但是波形不是太好,需要經(jīng)過一級施密特觸發(fā)器整形,輸出一個正向的脈沖信號送給單片機中斷口,據(jù)此就可以正確的測出液滴的滴數(shù),即點滴的速度(滴/分)。 2.2 儲液檢測電路液檢測電路圖仍然是和點滴速度測量電路一樣,只是所接單片機的接口不同。其電路圖如2.2.2圖所示。 2.2.1 儲液檢測電路 該電路圖的原理和點滴雕塑度檢測電路的原理是一樣的。由于紅外光在水中和空氣中的吸收系數(shù)不同,從而通過空氣和水后的光強也是不同的。其報警信號也是由儲液信號來決定的。當儲液的液面的高度為23cm

7、后,會由紅外對管發(fā)射接收產(chǎn)生檢測信號,即為報警信號。2.3 鍵盤顯示電路 鍵盤采用44矩陣鍵盤,按鍵有09,+,-,=,on 字符, 采用1602液晶顯示屏 2.4 點滴速度控制電路設計系統(tǒng)將點滴速度采集信號和儲液信號進行處理后,在相應的單片機的i/o控制口輸出對應的控制信號來驅動電動機的正反轉,從而進行精確的控制。點滴的控制其實是靠單片機檢測滴速,得到一個反饋量,輸出一定信號驅動電動機,控制電動機的正轉或反轉,進而帶動儲液瓶的上升或下降來調(diào)節(jié)滴斗的高度即控制點滴的速度。電動機驅動電路就如圖2.4.1示。圖2.2. 4路是用uln20003來驅動電機,圖2.4.1 電動機驅動電路點滴控制靠單片

8、機檢測滴速,得到一個反饋量,輸出一定信號控制電機上升或下降調(diào)節(jié)滴斗的高度。3 系統(tǒng)軟件設計 系統(tǒng)的軟件設計采用c語言,對單片機進行編程來實現(xiàn)各項功能。主程序對模塊進行初始化,接收從傳感器傳來的信號,并對此信號進行處理,輸出調(diào)整信號控制電動機的轉動,掃描鍵盤進行動態(tài)顯示。用的是循環(huán)查詢方式,來顯示和控制點滴的速度。3.1 監(jiān)測點滴速度子程序檢測點滴速度子程序主要是用與系統(tǒng)信號的采集。經(jīng)過光電傳感器采集,后由施密特觸發(fā)器整形,輸出到單片機的端口送入單片機內(nèi)部。3.2 儲液監(jiān)測子程序本程序主要是用于測量儲液瓶內(nèi)部的液位高度的,當液位低于23cm時,發(fā)出報警信號。如果液位的高度不在此區(qū)間內(nèi),則點滴的速

9、度照常采集,并送入單片機內(nèi)部。其儲液子程序流程圖如圖3.2.1所示。開 始光電傳感信號變化否?發(fā)出報警信號,儲液面進入23cm的警戒水位進入檢測點滴速度子程序yn發(fā)出報警信號,儲液面進入23cm的警戒水位圖3.2.1儲液子程序流程圖3.3 點滴速度控制子程序開 始當前值與設定值比較小于大于等于電動機正轉,儲出液瓶下降電動機維持,滴速穩(wěn)定電動機反轉,儲液瓶上升先設定一個速度值,隨著點滴數(shù)落下,檢測到信號后。滴數(shù)值加一,同時定時器工作計時,每有液滴被檢測到時,程序計算出當前液滴落下速,與之前設定的值比較,來控制電機是正轉、反轉還是停止。3.4 鍵盤顯示子程序鍵盤及顯示字程序主要是用于判斷速度有沒有

10、調(diào)整的動向和點滴速度的顯示(包括當前值和設定值)。其程序流程圖如3.4.1所示。開 始初始化繼續(xù)掃描顯示判斷有沒有鍵盤的按下延時子程序顯 示數(shù)據(jù)轉化成bcd碼,查表送入顯示緩沖區(qū)yn圖3.4.1系統(tǒng)鍵盤顯示子程序3.5 系統(tǒng)的主程序開 始初 始 化判斷液位的高度,有沒有產(chǎn)生中斷有沒有調(diào)整鍵按下調(diào)用按鍵處理程序數(shù)據(jù)的bcd碼轉換 顯 示繼續(xù)執(zhí)行,等待4 系統(tǒng)測試4.1 系統(tǒng)測試數(shù)據(jù)表4.2.1液滴速度檢測測試速據(jù)單片機檢測速度(滴/分) 實際速度 30 30 52 53 23 23 34 35 85 85 73 74 133 133 144 145表4.2.2流速調(diào)整測試原始值(滴/分)預置值(

11、滴/分)調(diào)整后低速(滴/分)穩(wěn)定時間秒2380833493120119781038077434.2 報警功能測試:將夾頭放松,使瓶中的水快速流出至警戒線附近,稍稍夾緊夾頭,可以看到當水位降至警戒水位時,從機蜂鳴器發(fā)出報警信號。此功能正常。4.3 測試結果分析從以上測試結果可以看出,本系統(tǒng)已基本完成題目中的各項要求并在此基礎上有所發(fā)揮,其中點滴速度的測量比較精確,在全量程內(nèi)其誤差小于3(滴/分)。設置點滴速度功能中,控制精度在全量程范圍內(nèi)優(yōu)于4(滴/分),但是還是有一定的誤差,經(jīng)分析主要是由以下原因造成的:1由于瓶中的水不斷減少,造成水滴的下落速度不均勻。2中斷處理的進入和中斷處理程序都會有一定

12、時間的延時,這也是造成測量誤差的一個因素。3在動態(tài)控制時,由于瓶處于運動狀態(tài),其上升、下降運動不可避免的會產(chǎn)生加速度,導致水滴下落時速度不穩(wěn)定。5 結論 本系統(tǒng)完成了在滴斗處檢測點滴速度,并制作了一個數(shù)碼管顯示裝置,能動態(tài)顯示點滴速度(滴/分)。通過改變高度控制點滴速度,點滴速度可用鍵盤設定并顯示,設定范圍為20150(滴/分),誤差在要求范圍內(nèi)。當高度降到警戒值是能發(fā)出報警信號。每個從站都可以和主站通信。主站可以工作在定點和巡回檢測兩種方式下,可以顯示從站傳輸來的從站號和點滴速度。參考文獻:1郭天祥.51單片機c語言教程m.北京:電子工業(yè)出版社,20092譚浩強.c程序設計.北京:清華大學出

13、版社,19913單片機應用開發(fā)實用子程序. 邊春元等 編著. 人民郵電出版社. 2005附錄: 元器件明細表:序號元器件數(shù)量備注1stc89c512個2液晶顯示16021個3紅外對管2對444矩陣鍵盤1個528byj-48電機1個6lm3241個7iln20031個8電阻若干9晶振1個12mhz10排阻1個103程序清單:#include #define db0_db7 p0 #define busy 0x80 #define scanport p1 sbit e=p25; sbit rw=p26; sbit rs=p27; unsigned char uca_linescan4=0xef,0

14、xdf,0xbf,0x7f;/列線掃描電壓,分為第1,2,3,4 根列線unsigned char key_ctt4=0; unsigned int time_sq4=0; / 連續(xù)測得的三點的時間unsigned char speed_bcd4=0; /unsigned int speed_ck4=0; /unsigned int di_xx2=0; unsigned char speed_sc2=0; unsigned char yy=0,temp; unsigned int ct=0,ttb=0,xx=0,tt3=0,speedct=0,speed=0,speedcd=10,cott=0

15、; typedef unsigned char uchar; uchar code lcd3=0123456789abcdef; uchar code lcdnow=now:000; uchar code lcdset=set:000; unsigned char control8=0x38,0x18,0x98,0x88,0xc8,0x48,0x68,0x28; unsigned char codes18=0xb8,0x98,0xd8,0xc8,0xe8,0x68,0x78,0x38;/9,18,36,45,54,63,72,81度順時針/ unsigned char codes28=0x38

16、,0x78,0x68,0xe8,0xc8,0xd8,0x98,0xb8; /9,18,36,45,54,63,72,81度逆時針unsigned char counts,pt; bit flag=1; / 度數(shù),正反轉,速度控制 bit a_ac=0;/比較系統(tǒng)標志unsigned char uc_keytemp=0;/按鍵鍵碼暫存。 unsigned char uc_clickcount=0; unsigned char uccount; void vkeyprocess(unsigned char uckeycode); void bleep();/報警 bit bleept=0;/報警標

17、準 bit moto=0;/電機標志位void ac();/電機速度比較 void akey();/功能處理a bit a_key=0; bit b_key=0; void getspeed();/速度檢測 void stdisplay();/顯示void delay(unsigned int t);/延時 void delay_50ms(unsigned int t); void sendcommand(unsigned char ch);/發(fā)送命令void vwritedata(unsigned char ch);/發(fā)送數(shù)據(jù)void initlcd();/初始化 void displayo

18、nechar(unsigned char x,unsigned y,unsigned char ddata);/按指定位置顯示一個字符void displaylistchar(unsigned char x, unsigned char y, unsigned char *ddata);/按指定位置顯示一串字符 /= void delay(unsigned int t) / delay 40us /for(;t!=0;t-) ; while(t-); void delay_50ms(unsigned int t) unsigned int j; /* 可以在此加少許延時補償,以禰補大數(shù)值傳遞時

19、(如delay_50ms(1000))造成的誤差, 但付出的代價是造成傳遞小數(shù)值(delay_50ms(1))造成更大的誤差。 因為實際應用更多時候是傳遞小數(shù)值,所以補建議加補償! */ for(;t0;t-) for(j=6245;j0;j-); void sendcommand(unsigned char ch)/發(fā)送命令 /*checkbusy();*/ rs=0; rw=0; db0_db7=ch; e=1; delay(1000); e=0; delay(1000); /delay 40us /= void vwritedata(unsigned char ch)/發(fā)送數(shù)據(jù) /* c

20、heckbusy(); */ rs=1; rw=0; db0_db7=ch; e=1; delay(1000); e=0; delay(1000); /delay 40us /= void initlcd()/ sendcommand(0x38); delay(1000); sendcommand(0x08); / delay(10); sendcommand(0x01); /顯示狀態(tài)設置 delay(1000); sendcommand(0x06); /清屏 delay(2000); sendcommand(0x0c); /輸入方式設置 /= void displayonechar(unsi

21、gned char x,unsigned y,unsigned char ddata)/按指定位置顯示一個字符 y &= 0x1; x &= 0xf; /限制x不能大于15,y不能大于1 if (y) x |= 0x40; /當要顯示第二行時地址碼+0x40; x |= 0x80; /算出指令碼 sendcommand(x); vwritedata(ddata); /= void displaylistchar(unsigned char x, unsigned char y, unsigned char *ddata)/按指定開始位置顯示字符串 unsigned char listlengt

22、h; listlength = 0; y &= 0x1; x &= 0xf; /限制x不能大于15,y不能大于1 while (ddatalistlength0x20) /若到達字串尾則退出 if (x = 0xf) /x坐標應小于0xf displayonechar(x, y, ddatalistlength); /顯示單個字符 listlength+; x+; void vshowonechar(unsigned char ucchar) switch(ucchar) case 0: vwritedata(0x30);break; case 1: vwritedata(0x31);brea

23、k; case 2: vwritedata(0x32);break; case 3: vwritedata(0x33);break; case 4: vwritedata(0x34);break; case 5: vwritedata(0x35);break; case 6: vwritedata(0x36);break; case 7: vwritedata(0x37);break; case 8: vwritedata(0x38);break; case 9: vwritedata(0x39);break; case a: vwritedata(0x61);break; case b: v

24、writedata(0x62);break; case c: vwritedata(0x63);break; case d: vwritedata(0x64);break; case e: vwritedata(0x65);break; case f: vwritedata(0x66);break; default: break; /= unsigned char uckeyscan() unsigned char uctemp=0; /掃描狀態(tài)暫存。 unsigned char ucrow=0,ucline=0; /行號,列號。 for(ucline=0;ucline4;ucline+) /

25、列掃描 scanport=uca_linescanucline; /輸出掃描電位。 uctemp=scanport&0x0f; /輸入掃描電位,并屏蔽高4位。 if(uctemp!=0x0f) /判斷該列是否有按鍵按下。 switch(uctemp) case 0x0e: ucrow=10;break; /如果有,則判斷行號。 case 0x0d: ucrow=20;break; case 0x0b: ucrow=30;break; case 0x07: ucrow=40;break; default: ucrow=50;break; break; /恢復鍵掃描處理前初始狀態(tài) scanport

26、=0x0f; /恢復p1口 return ucrow+ucline+1; /返回按鍵編碼。格式為2位數(shù),高位為行號,低位為列號 void vkeyprocess(unsigned char uckeycode) sendcommand(0xc4+uc_clickcount); if(a_key=1) switch(uckeycode) case 41:vshowonechar(7);temp=7;break; /7 case 42:vshowonechar(8);temp=8;break; /8 case 43:vshowonechar(9);temp=9;break; /9 case 31:

27、vshowonechar(4);temp=4;break; /4 case 32:vshowonechar(5);temp=5;break; /5 case 33:vshowonechar(6);temp=6;break; /6 case 21:vshowonechar(1);temp=1;break; /1 case 22:vshowonechar(2);temp=2;break; /2 case 23:vshowonechar(3);temp=3;break; /3 case 12:vshowonechar(0);temp=0;break; /0 sendcommand(0xc4+uc_c

28、lickcount); sendcommand(0x0f); switch(uckeycode) case 44:/*vshowonechar(c);*/temp=12;break; / case 34:/*vshowonechar(d)*/temp=13;break; /* case 24:/*vshowonechar(e)*/temp=14;break; /- case 14:/*vshowonechar(f)*/temp=15;break; /+ case 13:/*vshowonechar(b);*/temp=11;break; /= case 11:/*vshowonechar(a)

29、;*/temp=10;break; /on/c default:break; if(temp=11) /判斷按鍵與上一次所按的鍵是否相同 delay_50ms(100); if(uc_clickcount255) /同一個按連續(xù)按下的次數(shù):1255 uc_clickcount+; sendcommand(0xc3+uc_clickcount); sendcommand(0x0f); if(uc_clickcount=3) uc_clickcount=0; sendcommand(0xc4+uc_clickcount); sendcommand(0x0f); if(temp=9) switch(

30、uc_clickcount) case 0:key_ctt0=temp;break; case 1:key_ctt1=temp;break; case 2:key_ctt2=temp;break; default:break; void int_timer0(void) tmod=0x10; tmod=0x01; th0=0x3c; tl0=0xb0; th1=0x3c; tl1=0xb0; et1=1; tr1=1; et0=1; tr0=1; ea=1; it1=1; ex1=1; void timer1() interrupt 3 th1=0x3c; tl1=0xb0; pt+; /控制

31、速度 if(pt=2) pt=0; if(flag=0&moto=1) p2=(p2&0x0f)|controlcounts; if(flag=0&moto=0) p2=(p2&0x0f)|codes2counts; counts+; if(counts=8)counts=0; /角度重置 void timer0() interrupt 1 th0=0x3c; tl0=0xb0; yy+; if(yy=2) ct+; tt3+; yy=0; if(ct=600)/60秒定時 ct=0; xx=0; if(tt3=20) tt3=0; di_xx1=di_xx0; di_xx0=xx; if(d

32、i_xx0=di_xx1)&a_ac=1) bleept=1;flag=1; void int1() interrupt 2 static cott=0; cott+; if(cott=2) xx+; time_sq2=time_sq1; /把當前檢測到液滴的時間保存起來 time_sq1=time_sq0; time_sq0=ct; if(a_key=0) displayonechar(10,0,lcd3speed/100); displayonechar(11,0,lcd3speed%100/10); displayonechar(12,0,lcd3speed%10); displayon

33、echar(10,1,lcd3xx/100); displayonechar(11,1,lcd3xx%100/10); displayonechar(12,1,lcd3xx%10); sendcommand(0xc4+uc_clickcount); getspeed(); cott=0; void stdisplay() displaylistchar(0,0,lcdnow); displaylistchar(0,1,lcdset); displayonechar(14,0,0x4f); displayonechar(15,0,0x46); displaylistchar(8,0,s:); d

34、isplaylistchar(8,1,t:); void main(void) delay_50ms(1); int_timer0(); initlcd(); p2_3=1; scanport=0x0f; stdisplay(); while(1) bleep(); if(scanport!=0x0f) for(uccount=0;uccount=(speedcd+5) moto=0;flag=0; else if(speedct=(speedcd-5) moto=1;flag=0; else flag=1; void bleep() if(a_ac=1) if(bleept=1) p2_3=0; if(bleept=0) p2_3=1; void akey() if(a_key=1) sendcommand(0x0c); displayonechar(14,0,0x4f); displayonechar(15,0,0x4e); /

溫馨提示

  • 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

提交評論