|
本系統(tǒng)由前級(jí)采集電路和運(yùn)算放大電路等信號(hào)處理模塊,A/D轉(zhuǎn)換模塊和數(shù)據(jù)顯示模塊三部分組成。單片機(jī)模塊以STC15F60S2為核心,利用PH傳感器檢測(cè)液體PH值,超聲波傳感器檢測(cè)水位。本系統(tǒng)主要實(shí)現(xiàn)PH值測(cè)量,液位情況測(cè)量和電壓測(cè)量三個(gè)功能,經(jīng)過(guò)最終級(jí)聯(lián)、調(diào)試,結(jié)果表明,PH值測(cè)量誤差低于0.3,液位測(cè)量誤差低于1mm,因此達(dá)到很高的準(zhǔn)確度,各項(xiàng)指標(biāo)均優(yōu)于題目要求。
一系統(tǒng)方案1.1 PH傳感器選擇【方案一】采用無(wú)溫度檢測(cè)的PH傳感器 該方案電路簡(jiǎn)單,易于實(shí)現(xiàn),但是在溫度變化大的情況下,易受溫度影響,測(cè)量值波動(dòng)較大,誤差較大不易修正。 【方案二】采用自帶溫度監(jiān)測(cè)的PH傳感器 該方案克服了環(huán)境溫度與液體溫度相差較小時(shí),PH檢測(cè)誤差較小,易于檢測(cè),穩(wěn)定性好,誤差易于修正。 【方案三】采用液體溫度檢測(cè)與PH傳感器相結(jié)合 該方案電路相對(duì)來(lái)說(shuō)比較復(fù)雜,可實(shí)現(xiàn)性不大,穩(wěn)定性不高。 考慮到電路的穩(wěn)定性及可實(shí)現(xiàn)性,我們選擇方案二。 1.2 液位測(cè)量選擇【方案一】光電監(jiān)測(cè) 該方法對(duì)于定位測(cè)量效果好、精度高。但不適合對(duì)水位高度的測(cè)量,無(wú)法實(shí)時(shí)檢測(cè)液面高度。 【方案二】超聲波監(jiān)測(cè) 此方法測(cè)量時(shí)間短,對(duì)實(shí)時(shí)測(cè)量液面精度高。測(cè)量范圍取決于高頻脈沖的頻率及聲波的大小,對(duì)于近距離測(cè)量精確都高,價(jià)格實(shí)惠。 【方案三】平行導(dǎo)線(xiàn)線(xiàn)跡測(cè)量 此方法測(cè)量精度高,但測(cè)量范圍小、易沾被測(cè)物,不適合強(qiáng)酸性或強(qiáng)堿性液體測(cè)量。 考慮到測(cè)量精度和系統(tǒng)的可行性,我們選擇方案二。 二系統(tǒng)理論分析與計(jì)算
2.1 水情信號(hào)處理的分析2.1.1 PH值處理的分析 本系統(tǒng)利用PH傳感器檢測(cè)液體酸堿度。PH檢測(cè)電路由前置120dB緩沖放大部分與后級(jí)高增益部分構(gòu)成。本模塊的PH檢測(cè)采取TLC4502進(jìn)行放大。最終系統(tǒng)將輸出信號(hào)與標(biāo)準(zhǔn)信號(hào)源的輸出值進(jìn)行比較,得出PH值,并計(jì)算出相對(duì)精度。 2.1.2 液位處理的分析 采用超聲波傳感器對(duì)水和白醋、純凈水進(jìn)行液位檢測(cè),運(yùn)用TI公司的高速比較器TL047對(duì)前級(jí)放大電路輸出信號(hào)進(jìn)行處理。通過(guò)超聲波發(fā)射裝置發(fā)出超聲波,根據(jù)接收器接到超聲波時(shí)的時(shí)間差就可以知道距離。超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時(shí)刻的同時(shí)開(kāi)始計(jì)時(shí),超聲波在空氣中傳播,途中碰到障礙物就立即返回來(lái),超聲波接收器收到反射波就立即停止計(jì)時(shí)。返回信號(hào)通過(guò)IO口ECHO輸出一個(gè)高電平,高電平持續(xù)的時(shí)間就是超聲波發(fā)射到返回的時(shí)間,測(cè)試距離=(高電平持續(xù)時(shí)間*聲速(340M/S))/2,最后將測(cè)量值與系統(tǒng)所得值進(jìn)行對(duì)比,并計(jì)算得到相對(duì)誤差。 2.2 電壓檢測(cè)方法的分析利用STC15F60S2單片機(jī)采用A/D轉(zhuǎn)換電路將輸入電壓轉(zhuǎn)換成時(shí)間(脈沖寬度信號(hào))或頻率(脈沖頻率),然后由定時(shí)器/計(jì)數(shù)器獲得數(shù)字值。與萬(wàn)用表所測(cè)結(jié)果進(jìn)行對(duì)比,并計(jì)算精度。
三電路與程序設(shè)計(jì)
3.1 總體方案設(shè)計(jì)該水情檢測(cè)系統(tǒng)由PH傳感器和超聲波傳感器組成。PH傳感器用于液體酸堿度測(cè)量,超聲波傳感器用于液體高度測(cè)量。信號(hào)經(jīng)過(guò)前級(jí)的放大整形后進(jìn)入A/D轉(zhuǎn)換,A/D轉(zhuǎn)換后將數(shù)據(jù)傳輸給單片機(jī),單片機(jī)對(duì)數(shù)據(jù)進(jìn)行整理和計(jì)算,并將結(jié)果顯示出來(lái)。系統(tǒng)總體實(shí)現(xiàn)框圖如圖1.1所示。
3.2 電路設(shè)計(jì)
3.2.1PH檢測(cè)電路設(shè)計(jì) PH檢測(cè)電路由前置120dB緩沖放大部分與后級(jí)高增益部分構(gòu)成。本模塊的PH檢測(cè)采取TLC4502進(jìn)行放大,可有效抑制噪聲。本模塊采用的溫度傳感器為熱敏電阻,其阻值隨溫度變化而變化。采用惠斯登電橋保證后續(xù)的差分放大時(shí),運(yùn)算放大器的正反向輸入電壓值為正值,則在此極限溫度下,電橋處于平衡狀態(tài),差分放大輸入電壓差為0。如圖3.2所示。
3.2.2液位檢測(cè)電路運(yùn)用TI公司的高速比較器TL047對(duì)前級(jí)放大電路輸出信號(hào)進(jìn)行處理。同時(shí)采用了EM78小型微處理器進(jìn)行信號(hào)轉(zhuǎn)換使其更加準(zhǔn)確,并且很好的抑制了噪聲干擾。如圖3.3所示。
3.3 軟件設(shè)計(jì)STC15F60S2單片機(jī)在該系統(tǒng)主要完成數(shù)據(jù)計(jì)算,功能切換和顯示功能。主程序流程圖如圖3.4所示。
四測(cè)試方案與測(cè)試結(jié)果
4.1 測(cè)試方法與儀器4.1.1測(cè)試方法 1)PH值的測(cè)量方法:通過(guò)對(duì)水和白醋、純凈水進(jìn)行多次測(cè)量,采取TLC4502進(jìn)行放大,最終將系統(tǒng)的輸出信號(hào)與標(biāo)準(zhǔn)信號(hào)源的輸出值進(jìn)行比較,得出PH值,并計(jì)算出相對(duì)精度。 2) 液位的測(cè)量方法:采用超聲波傳感器對(duì)水和白醋、純凈水進(jìn)行液位檢測(cè),運(yùn)用TI公司的高速比較器TL047對(duì)前級(jí)放大電路輸出信號(hào)進(jìn)行處理。如有信號(hào)返回,通過(guò)IO口ECHO輸出一個(gè)高電平,高電平持續(xù)的時(shí)間就是超聲波發(fā)射到返回的時(shí)間,測(cè)試距離=(高電平持續(xù)時(shí)間*聲速(340M/S)) /2,最后將測(cè)量值與系統(tǒng)所得值進(jìn)行對(duì)比,并計(jì)算得到相對(duì)誤差。 3) 電壓的測(cè)量方法:將萬(wàn)用表測(cè)量值與單片機(jī)所測(cè)值進(jìn)行對(duì)比,得到相對(duì)精度。 4.1.2 測(cè)試儀器 表4.1 測(cè)試儀器 | 序號(hào) | | | | | | | Agileat 33600A(DDS函數(shù)信號(hào)發(fā)生器) | | | | | | NFC-C1000-1型多功能計(jì)數(shù)器 | |
4.2 測(cè)試結(jié)果4.2.1 PH值的測(cè)量測(cè)量結(jié)果:使用信號(hào)源輸出不同幅度的直流電壓信號(hào),記錄實(shí)際測(cè)量值。測(cè)試結(jié)果如表4.2所示 表4.2 PH測(cè)量 結(jié)論:向塑料容器中注入若干毫升的水和白醋,可以在規(guī)定時(shí)間內(nèi)完成PH值測(cè)量并顯示,測(cè)量偏差遠(yuǎn)小于0.5;多次向純凈水中注入若干白醋,能在2分鐘內(nèi)穩(wěn)定顯示每次的PH值,同時(shí)測(cè)量偏差不大于0.1。 4.2.2 液位的測(cè)量 不同待測(cè)物液位測(cè)試結(jié)果如表4.3所示。 表4.3 液位測(cè)量 結(jié)論:向塑料容器中注入若干毫升的水和白醋,在1分鐘內(nèi)完成水位測(cè)量并顯示,測(cè)量偏差不大于5mm;將塑料容器清空,多次向塑料容器注入若干純凈水,在1分鐘內(nèi)穩(wěn)定顯示,每次的水位值偏差不大于2mm。 4.2.3 電壓的測(cè)量 供電電池的電壓測(cè)試結(jié)果如表4.4所示。 表4.4 電壓測(cè)量 結(jié)論:可以完成供電電池的輸出電壓測(cè)量并顯示,測(cè)量偏差小于0.01V。 綜上所述,本設(shè)計(jì)已達(dá)到要求。 五總結(jié)該系統(tǒng)以STC15F60S2為核心測(cè)量器件,配合放大電路設(shè)計(jì)了高精度水情檢測(cè)系統(tǒng)。經(jīng)過(guò)最終的調(diào)試,實(shí)現(xiàn)了不同情況下水位、PH值及電壓的測(cè)量。本系統(tǒng)性能優(yōu)良,工作可靠,操作簡(jiǎn)單,使用方便,完全滿(mǎn)足題目中所有的指標(biāo)要求。在設(shè)計(jì)過(guò)程中要注意以下問(wèn)題:電壓小于5V時(shí),采用光耦元器件誤差較大,當(dāng)電壓高于5V時(shí),應(yīng)采用A/D轉(zhuǎn)換電路減小誤差。
單片機(jī)源程序如下:
- #include <stc15f2k60s2.h>
- #include <intrins.h>
- #include <lcd12864.h>
- //引腳定義
- sbit RX = P4^2;
- sbit TX = P4^4;
- #define FOSC 11059200L
- #define BAUD 9600
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define URMD 0 //0:使用定時(shí)器2作為波特率發(fā)生器
- //1:使用定時(shí)器1的模式0(16位自動(dòng)重載模式)作為波特率發(fā)生器
- //2:使用定時(shí)器1的模式2(8位自動(dòng)重載模式)作為波特率發(fā)生器
-
- #define ADC_POWER 0x80 //ADC電源控制位
- #define ADC_FLAG 0x10 //ADC完成標(biāo)志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540個(gè)時(shí)鐘
- #define ADC_SPEEDL 0x20 //360個(gè)時(shí)鐘
- #define ADC_SPEEDH 0x40 //180個(gè)時(shí)鐘
- #define ADC_SPEEDHH 0x60 //90個(gè)時(shí)鐘
- /*---全局變量聲明---*/
- uchar code CharCode1[]="**水情監(jiān)測(cè)系統(tǒng)**";
- uchar code CharCode2[]="液位值:";
- uchar code CharCode3[]="PH值:";
- uchar code CharCode4[]="電壓值:";
- uchar number0[5]; //水位值儲(chǔ)存
- uchar number1[5]; //PH值儲(chǔ)存
- uchar number2[7]; //電壓值儲(chǔ)存
- uchar Test0; //標(biāo)志
- uint ad_data1; //十位AD值
- unsigned int time=0;
- long S=0;
- bit flag =0;
- ulong distance; //距離顯示
- /*---函數(shù)聲明---*/
- void InitUart();
- void InitADC();
- void Timer0Init(void); //10毫秒@11.0592MHz
- void Timer2Init(void); //10毫秒@11.0592MHz
- ulong GetADCResult(uchar ch);
- void Delay(uint n);
- void IO_Init(); //I/O口初始
- void LCD12864(); //LCD初始化顯示
- void PH_Value(); //PH監(jiān)測(cè)化
- ulong PH_read(long PH); //PH值轉(zhuǎn)換
- void Voltag_read(); //電壓監(jiān)測(cè)
- /*---液位---*/
- void Conut(void);
- void Distance_Value(); //液位監(jiān)測(cè)
- void delayms(unsigned int ms);
- void Timer_Count(void);
- void StartModule(); //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
- ulong datas_Value(long datas); //數(shù)據(jù)修正
- /*---主函數(shù)---*/
- void main()
- {
- IO_Init(); //I/O口初始化
- LCD12864_Init(); //LCD初始化
- InitUart(); //初始化串口
- InitADC(); //初始化ADC
- Timer0Init(); //定時(shí)器0初始化
- Timer2Init(); //定時(shí)器2初始化
- while (1)
- {
- LCD12864();
- if(Test0==1)
- {
- Test0=0;
- PH_Value();
- Voltag_read();
- Distance_Value();
- }
- }
- }
- void IO_Init() //I/O口模式選擇
- {
- P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;
- P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;P3M1 = 0x00;
- P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;
- P6M0 = 0x00;P6M1 = 0x00;P7M0 = 0x00;P7M1 = 0x00;
- }
- void LCD12864() //LCD初始化顯示
- {
- uchar i=0;
- uchar j=0;
- uchar k=0;
- uchar t=0;
- LCD12864_SetWindow(0, 0); //系統(tǒng)名稱(chēng)顯示
- while(CharCode1[i]!='\0')
- {
- LCD12864_WriteData(CharCode1[i]);
- i++;
- if(i==16)
- {
- i=0;
- break;
- }
- }
- LCD12864_SetWindow(1, 0); //液位顯示
- while(CharCode2[j]!='\0')
- {
- LCD12864_WriteData(CharCode2[j]);
- j++;
- if(j==15)
- {
- j=0;
- break;
- }
- }
- LCD12864_SetWindow(2, 0); //PH值顯示
- while(CharCode3[k]!='\0')
- {
- LCD12864_WriteData(CharCode3[k]);
- k++;
- if(k==8)
- {
- k=0;
- break;
- }
- }
- LCD12864_SetWindow(3, 0); //電壓值顯示
- while(CharCode4[t]!='\0')
- {
- LCD12864_WriteData(CharCode4[t]);
- t++;
- if(t==13)
- {
- t=0;
- break;
- }
- }
- }
- void PH_Value() //PH監(jiān)測(cè)
- {
- long PH;
- long datas;
- long num;
- uint i;
- datas=GetADCResult(0);
- // num=datas*(4.5/1.0240);
- num=datas_Value(datas*(4.5/1.024));
- PH=PH_read(num); //PH-Value對(duì)比
- number0[0]=PH/1000; //求十位
- number0[1]=PH%1000/100; //求個(gè)位
- number0[2]='.';
- number0[3]=PH%100/10; //求十分位
- number0[4]=PH%10; //求百分位
- LCD12864_SetWindow(2,3);
- for(i=0;i<5;i++)
- {
- if(i==2)
- LCD12864_WriteData(number0[i]);
- else
- LCD12864_WriteData(number0[i]+48);
- }
- }
- ulong PH_read(long PH) //PH值轉(zhuǎn)換
- {
- long datas;
- if(PH>4242)
- {
- datas=0;
- }else if(PH>4065)
- {
- datas=0+(PH-4065)/177.00;
- }else if(PH>3885)
- {
- datas=1+(PH-3885)/180.00;
- }else if(PH>3709.8)
- {
- datas=2+(PH-3709.8)/175.20;
- }else if(PH>3532.5)
- {
- datas=3+(PH-3532.5)/177.30;
- }else if(PH>3354)
- {
- datas=4+(PH-3354)/178.50;
- }else if(PH>3177.5)
- {
- datas=5+(PH-3177.5)/176.50;
- }else if(PH>3000)
- {
- datas=6+(PH-3000)/177.50;
- }else if(PH>2822.5)
- {
- datas=7+(PH-2822.5)/177.50;
- }else if(PH>2646)
- {
- datas=8+(PH-2646)/176.50;
- }else if(PH>2467.5)
- {
- datas=9+(PH-2467.5)/178.50;
- }else if(PH>2292)
- {
- datas=10+(PH-2292)/175.50;
- }else if(PH>2115)
- {
- datas=11+(PH-2115)/177.00;
- }else if(PH>1938)
- {
- datas=12+(PH-1938)/177.00;
- }else if(PH>1758)
- {
- datas=13+(PH-1758)/180.00;
- }
- else
- {
- datas=14;
- }
- datas=datas*100;
- return datas;
- }
- void Voltag_read() //電壓監(jiān)測(cè)
- {
- long voltag;
- long datas;
- uint i;
- datas=GetADCResult(1);
- // voltag=datas*(4.5/1.024);
- voltag=datas_Value(datas*(4.5/1.024));
- number1[0]=voltag/1000; //求個(gè)位
- number1[1]='.';
- number1[2]=voltag%1000/100; //求十分位
- number1[3]=voltag%100/10; //求百分位
- number1[4]='V';
- LCD12864_SetWindow(3, 4);
- for(i=0;i<5;i++)
- {
- if(i==1|i==4)
- LCD12864_WriteData(number1[i]);
- else
- LCD12864_WriteData(number1[i]+48);
- }
- }
- /*---液位---*/
- void Conut(void)
- {
- int i;
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
- S=(time*1.8)/10; //算出來(lái)是mm
- S=280-S;
- if((S>=7000)||flag==1) //超出測(cè)量范圍顯示“-”
- flag=0;
- else
- {
- number2[0]=S/1000;
- number2[1]=S/100%10;
- number2[2]=S/10%10;
- number2[3]=S%10;
- number2[4]='m';
- number2[5]='m';
- LCD12864_SetWindow(1,4);
- for(i=0;i<6;i++)
- {
- if(i==4|i==5)
- LCD12864_WriteData(number2[i]);
- else
- LCD12864_WriteData(number2[i]+48);
- }
- }
- }
- void delayms(unsigned int ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- void Timer_Count(void)
- {
- TR0=1; //開(kāi)啟計(jì)數(shù)
- while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
- TR0=0; //關(guān)閉計(jì)數(shù)
- Conut(); //計(jì)算
- }
- void StartModule() //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
- {
- TX=1; //800MS 啟動(dòng)一次模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- TX=0;
- }
- void Distance_Value()
- {
- unsigned int valA;
- delayms(60);
- RX=1;
- StartModule();
- for(valA=7510;valA>0;valA--)
- {
- if(RX==1)
- {
- Timer_Count();
- }
- }
- }
- ulong datas_Value(long datas) //數(shù)據(jù)修正
- {
- int i;
- long v,sum,value[20];
- for(i=0;i<20;i++)
- {
- value[i]=datas;
- sum+=value[i];
- }
- v=sum/50.00;
- return v;
- }
- /*---發(fā)送ADC結(jié)果到PC---*/
- /*
- void ShowResult(char ch)
- {
- // SendData(ch); //顯示通道號(hào)
- // SendData(GetADCResult(ch)); //顯示ADC高8位結(jié)果
- // SendData(ADC_RESL); //顯示低2位結(jié)果
- }
- */
- /*---讀取ADC結(jié)果---*/
- unsigned long GetADCResult(uchar ch)
- {
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
- _nop_(); //等待4個(gè)NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
- ADC_CONTR &= ~ADC_FLAG; //Close ADC
- ad_data1=ADC_RES<<2; //因?yàn)槭?0位的AD,因此需要把AD轉(zhuǎn)換后的低8位向高位移動(dòng)2位
- ad_data1=ad_data1|ADC_RESL&0x03; //再把高8位和低2位相加。
- ad_data1=ad_data1/1.024;
- return ad_data1; //返回ADC結(jié)果
- }
- /*---初始化ADC---*/
- void InitADC()
- {
- P1ASF = 0xff; //設(shè)置P1口為AD口
- CLK_DIV &=0xdf;
- ADC_RES = 0; //清除結(jié)果寄存器
- ADC_RESL= 0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDH;
- Delay(2); //ADC上電并延時(shí)
- }
- /*---初始化串口---*/
- void InitUart()
- {
- SCON = 0x5a; //設(shè)置串口為8位可變波特率
- #if URMD == 0
- T2L = 0xd8; //設(shè)置波特率重裝值
- T2H = 0xff; //115200 bps(65536-18432000/4/115200)
- AUXR = 0x14; //T2為1T模式, 并啟動(dòng)定時(shí)器2
- AUXR |= 0x01; //選擇定時(shí)器2為串口1的波特率發(fā)生器
- #elif URMD == 1
- AUXR = 0x40; //定時(shí)器1為1T模式
- TMOD = 0x00; //定時(shí)器1為模式0(16位自動(dòng)重載)
- TL1 = 0xd8; //設(shè)置波特率重裝值
- TH1 = 0xff; //115200 bps(65536-18432000/4/115200)
- TR1 = 1; //定時(shí)器1開(kāi)始啟動(dòng)
- #else
- TMOD = 0x20; //設(shè)置定時(shí)器1為8位自動(dòng)重裝載模式
- AUXR = 0x40; //定時(shí)器1為1T模式
- TH1 = TL1 = 0xfb; //115200 bps(256 - 18432000/32/115200)
- TR1 = 1;
- #endif
- }
- /*---發(fā)送串口數(shù)據(jù)---*/
- /*
- void SendData(uchar dat)
- {
- while (!TI); //等待前一個(gè)數(shù)據(jù)發(fā)送完成
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (8.27 KB, 下載次數(shù): 62)
下載附件
2019-3-16 01:37 上傳
所有資料51hei提供下載(代碼):
簡(jiǎn)易水情監(jiān)測(cè).zip
(90.36 KB, 下載次數(shù): 44)
2019-3-15 19:40 上傳
點(diǎn)擊文件名下載附件
程序 下載積分: 黑幣 -5
|