浙江義烏吳志強
一前言
環境污染水資源緊張農村打井取水情況較為普遍現有的三極管電路和浮球開關水位控制器故障率較高
三極管電路構成的控制元件常出現的故障是抗干擾能力差會使三極管誤動以浮球開關為形式的控制元件由于
浮球的連接線經常會磨斷以及開關觸點的腐蝕和氧化故障率也較高且水井水量不足水泵長時間空抽容易
毀壞電機
二電路設計
控制器電路如圖所示其核心部件采用了PHILIPS公司的51LPC系列P87LPC762如果有P87LPC760則可充
分利用單片機的資源OTP單片機51LPC系列單片機是PHILIPS公司開發的一種80C51改進型MCU內置2KB
OTP程序存儲器和128字節RAM內置RC振蕩器看門狗比較器等功能單元具有集成度高可靠性高功耗
低的特點(詳細資料請參考PHILIPS 51LPC系列單片機原理及應用設計北京航空航天大學出版社出版)

該控制器是在P87LPC762的外圍加上水位采樣驅動按鈕顯示無音源峰鳴器電源回路等幾部分組成
農村的水箱一般都在0.00起始12米或以上而控制器一般安裝在底層以致采樣回路傳輸線相當于一付龐大的天
線極易受干擾為提高采樣回路的抗干擾和探極電解抗腐蝕性采用3 6mA交流電流環進行水位檢測最低的
探點con為交流12V電源接入點另外三個a b c為水位探點若水位達到相應的位置交流12V電源與
該探點接通其輸出信號經R16限流D8整流橋全波整流C1濾波和保證交流過零時U1光耦導通R5限流D5
限流和抗干擾驅動光耦給762一個開關信號輸出信號經光耦U4隔離三極管Q1放大驅動繼電器K1使得水
泵得電工作二極管D12為續流二極管R43 C5抑制火花發光二極管D1指示電機在工作狀態即顯示同驅動
復用水箱水井運行得LED D2 D3 D4經限流電阻直接由762的I/O驅動為了利用762的資源和節約成
本告警音用不帶音源得峰鳴器來產生由buz口輸出約2KHz的方波驅動三極管使峰鳴器U6發聲
三工作原理
控制器的接線圖如圖2所示當控制器上電時對LED和BUZZ進行自檢由762的上電標志POF使BUZZ
自檢時發長音延時15秒后當水箱水位低于下限a時控制器判為開機狀態水泵得電工作抽水直致到上限水
位b控制器判為水滿輸出關機當水箱水位由a b過程中時井無水c點判定則停機延時半小時再自開機
且電機連續工作不超1小時約如此循環直致到上限水位b時關機

剛開機5秒內進水口c檢測不到進水裝置進入告警狀態
為防止探極回路失效水泵連續工作1小時后進入停機狀態
對采樣回路有容錯和采樣異常告警功能有水時水位led不點亮無水時點亮
四軟件設計
P87LPC762 OTP單片機內置2KB程序存儲器中固化了系統應用程序系統采用SE 764仿真器仿真程序在
MedWin調試器上采用C51語言調試通過應用程序包括主程序T0 50ms定時中斷程序鍵盤中斷函數時標
函數峰鳴器驅動函數等相應的程序見附后
1.主程序控制器上電后首先初始化看門狗對LED進行檢查初始化T0 T1 BUZZ檢查鍵盤中斷初
始化使能中斷開定時器T0進入低功耗等待
2.T0 50ms定時中斷程序T0定時初值重裝喂狗裝置是否在告警狀態是進入告警程序否每中
斷一次采樣一次采樣15次后對采樣結果處理如采樣成功啟動采樣分析程序否則從采樣出錯處理程序中退
出如探極正確啟動抽水處理程序否則從探極出錯程序中退出中斷20次啟動時標函數和亮滅運行燈
3.峰鳴器驅動函數峰鳴器的2KHz方波和發聲間歇均有T1定時中斷函數控制且在上電時檢查上電標志POF
位POF為1則發長音清POF和置位UP_POF使上電時延時15秒輸出控制命令
- /*************************************************************
- 文件名:autocp2.c
- 主題:autocp-2型智能水泵控制器程序
- Ver 1.2
- 修改日期2001/12/21
- 修改內容:將1型的井水位檢測由井內改到水箱的出水口處,
- 剛開機時延時5秒檢測.
- ***************************************************************/
- #include<reg764.h>
- #define uchar unsigned char
- #define TH0_VAL 0X3C/*定時器0的重載值*/
- #define TL0_VAL 0Xd2
- #define TH1_VAL 0X35/*定時器1的重載值*/
- #define TL1_VAL 0X35
- #define NO_WORK 30/*水泵停機時間30分*/
- #define WORK 60/*水泵連續工作時間60分*/
- #define IN_CONT 15/*連續采樣次數15次*/
- #define STAR_DELAY 8/*開機延時檢測時間8X15/20=6秒*/
- #define STAR_BOXC 5/*開機檢測C點無水計數值*/
- uchar data h;//采樣出錯計數
- uchar data l;//探極出錯計數
- uchar data i;//采樣次數,采樣濾波用
- uchar data temp;//采樣值
- uchar bdata temp1;
- sbit boxa=temp1^0;//水箱a點采樣值
- sbit boxb=temp1^1;//b點
- sbit boxc=temp1^2;//水箱c點采樣值
- uchar bdata flag;
- sbit WELL=flag^0;//水井水位標志
- sbit SET_KB=flag^1;//鍵盤中斷標志
- sbit MOTOR=flag^2;//水泵工作標志
- sbit ERR=flag^3;//采樣出錯標志
- sbit ERR_IN=flag^4;//探極出錯標志
- sbit errsign=flag^5;//裝置告警標志
- sbit UP_POF=flag^6;//開機上電標志
- sbit MOTOR_STAR=flag^7;//剛開機標志
- sbit motor_led=P1^7;//電機驅動
- sbit box_led=P2^1;//水箱水位顯示
- sbit well_led=P2^0;//水井水位顯示
- sbit runled=P1^4;//運行燈
- sbit speak=P1^6;//峰鳴器輸出
- typedef struct{//定義存儲時間的結構
- uchar hour,min,sec;
- }timestruct;
- timestruct curtime;//存放當前的時間
- void input(void);//采樣函數
- void output_led(void);//采樣分析函數
- void con_out(void);//判斷輸出函數
- void warning(void);//告警函數
- void errin_con(void);//采樣出錯函數
- void errled_con(void);//探極出錯函數
- void delay(unsigned int);//延時函數
- void init(void);//初始化函數
- /**********************************************************************
- 名稱:WDT_FEED
- 用途:喂狗程序
- 說明:請參照87LPC764的喂狗方法說明
- /***********************************************************************
- void WDT_FEED(void){
- WDRST=0X1E;
- WDRST=0XE1;
- }
- /***********************************************************************
- 名稱:INIT_WDT
- 用途:看門狗初始化程序
- 說明:
- ***********************************************************************/
- void INIT_WDT(void){
- WDCON=WDCON|0X17;//開啟看門狗定時器(溢出時間約為2.1秒)
- WDT_FEED();//設置完后喂狗一次
- }
- /**********************************************************************
- 函數名kb_int
- 功能描述延時清鍵盤中斷標志SET_KB置位如滿足上水條件啟動電機
- 參數無
- 返回無
- ************************************************************************/
- void kb_int(void)interrupt 7 using 1{
- EKB=0;//禁能鍵盤中斷
- TR0=0;
- AUXR1=AUXR1&0x7F;//清鍵盤中斷標志
- if((P0^7==0)&&(motor_led==1)&&(boxc==1)){//低電平有效
- SET_KB=1;//置位手動標志
- }
- TR0=1;
- EKB=1;
- }
- /***********************************************************************
- 函數名input
- 功能描述對P0進行采樣如果連續5次一樣則ERR=0;
- 輸入參數無
- 返回參數無
- **********************************************************************/
- void input(void){//采樣濾波
- static uchar K=5;//連續采樣相同次數
- if(temp==(P0&0x0f)){
- K--;
- if(K==0){//連續5次相同
- ERR=0;
- temp1=temp;
- h=0;
- }
- }else{//采樣值不同
- temp=(P0&0x0f);
- K=5;
- ERR=1;//置位采樣出錯標志
- }
- }
- /*********************************************************************
- 函數名output_led
- 功能描述對采樣值進行分析如果探極有問題則ERR_IN=1;
- 如無問題則點亮相應的水位led
- 輸入參數無
- 返回參數無
- ***********************************************************************/
- void output_led(void){
- if((boxb==0)&&(boxa==1)){
- ERR_IN=1;//置位探極出錯標志
- }else{
- ERR_IN=0;//清探極出錯標志和探極出錯計數器
- l=0;
- box_led=~boxa;//無水點亮
- }
- }
- /*********************************************************************
- 函數名warning
- 功能描述runled閃,進入裝置告警狀態
- 輸入參數無
- 返回參數無
- ***********************************************************************/
- void warning(void)
- {EA=0;//禁能總中斷
- EKB=0;//關閉鍵盤中斷
- motor_led=1;//關機
- MOTOR=0;
- well_led=1;//滅顯示燈
- box_led=1;
- errsign=1;//置位裝置告警標志
- TR1=1;//啟動T1峰鳴器控制中斷函數
- EA=1;//使能總中斷
- }
- /***********************************************************************
- 函數名errin_con
- 功能描述采樣出錯記數在兩次內不作反映3次以上停機6次以上告警死循
- 輸入參數無
- 返回參數無
- ************************************************************************/
- void errin_con(void){
- h++;//采樣出錯計數
- if((MOTOR==1)&&(h>4)){//水泵工作,出錯4次,關機
- motor_led=1;
- MOTOR=0;
- }
- if(h>8){//8次以上則進入告警狀態
- warning();
- }
- }
- /*************************************************************************
- 函數名errled_con
- 功能描述探極出錯重新采樣記數連續6次告警15次停機
- 輸入參數無
- 返回參數無
- **************************************************************************/
- void errled_con(void){
- l++;//探極出錯計數
- if((MOTOR==1)&&(l>8)){//水泵工作,8次以上關機
- motor_led=1;
- MOTOR=0;
- }
- else if(l>15){//15次進入裝置告警
- warning();
- }
- }
- /**************************************************************************
- 函數名INIT_TMR
- 功能描述定時器初始化
- 輸入參數無
- 返回參數無
- ***************************************************************************/
- void INIT_TMR(void){
- TMOD=0X21;//定時器0置為模式1
- //定時器1置為模式2
- TH0=TH0_VAL;//定時器0初值
- TL0=TL0_VAL;
- TH1=TH1_VAL;//定時器1初值
- TL1=TL1_VAL;
- ET0=1;//開放T0/T1中斷使能.*/
- ET1=1;
- -8-
- }
- /************************************************************************
- 名稱:CHK_LED
- 說明:用于檢查LED的顯示.
- ************************************************************************/
- void CHK_LED(void){
- speak=1;
- motor_led=1;
- well_led=0;
- box_led=0;
- runled=0;
- delay(350);
- well_led=1;
- box_led=1;
- runled=1;
- delay(100);
- }
- /************************************************************************
- 名稱:CHK_BUZ
- 用途:用于檢查峰鳴器,.
- 說明:
- /************************************************************************/
- void CHK_BUZ(void){
- EA=1;//使能總中斷
- P1M2=P1M2|0x40;//P1.6設為上拉輸出
- TR1=1;//開啟峰鳴器振蕩輸出
- delay(250);
- TR1=0;//停T1
- EA=0;//禁能總中斷
- }
- /************************************************************************
- 名稱:INIT_KBI
- 說明:鍵盤初始化子程序
- /************************************************************************/
- void INIT_KBI(void){
- KBI=0x80;//P0^7鍵盤中斷允許
- P0M2=P0M2&0X7f;//P0.7僅為輸入
- P0M1=P0M1|0X80;
- EKB=1;//使能鍵盤中斷
- }廣州周立功單片機發展有限公司Tel:(020)38730976 38730977 Fax:38730925 http://
- /************************************************************************
- 函數名delay
- 功能描述延時
- 參數uchar x
- 返回無
- *************************************************************************/
- void delay(unsigned int x){
- uchar y;
- while(x--){
- for(y=0;y<250;y++)
- {;}
- }
- }
- /*************************************************************************
- 功能second_tick
- 描述每秒鐘執行一次函數功能時間更新
- 參數無
- 返回無
- *************************************************************************/
- void second_tick(void){
- static unsigned char motor_work;//水泵工作計時
- static unsigned char motor_nowork;//水泵不工作計時
- curtime.sec++;
- if(curtime.sec>=15){//開機上電延時15s
- UP_POF=0;
- }
- if(curtime.sec>59){
- curtime.sec=0;
- curtime.min++;
- if((motor_led==1)&&(MOTOR==1)){//停機狀態
- motor_nowork++;//停機計時
- if(motor_nowork>=NO_WORK){//延時到,開機
- motor_led=0;
- MOTOR_STAR=1;//剛開機置位
- }
- }else{
- motor_nowork=0;
- }
- if(motor_led==0){//電機工作
- motor_work++;//工作計時
- if(motor_work>=WORK){//電機連續工作時間到,停機.
- motor_led=1;
- }
- }else{
- motor_work=0;
- }
- if(curtime.min>59){
- curtime.min=0;
- curtime.hour++;
- if(curtime.hour>23){
- curtime.hour=0;
- }
- }
- }
- }
- /**********************************************************************
- 函數名time0
- 功能描述50ms中斷一次,采樣一次,采樣滿20次后,對采樣結果進行處理
- 如采樣成功啟動采樣分析程序否則從采樣出錯處理程序重退出
- 如探極正確啟動抽水處理程序否則從探極出錯程序中退出
- 輸入參數無
- 返回參數無
- ***********************************************************************/
- void time0(void)interrupt 1 using 1{
- static unsigned char second_cnt=20;//正常運行時標
- static unsigned char err_cnt=5;//裝置告警時標
- TR0=0;//重裝初值
- TH0=TH0_VAL;
- TL0=TL0_VAL;
- TR0=1;
- WDT_FEED();//喂狗
- if(errsign==1){//裝置告警
- err_cnt--;
- if(!err_cnt){
- err_cnt=5;
- runled=~runled;
- }
- }else{//裝置正常
- i++;//采樣計數
- input();//采樣函數
- if(i==IN_CONT){//采樣次數到
- i=0;
- if(ERR==0){//采樣成功
- output_led();//采樣分析
- if(ERR_IN==0){//探極正確
- if(UP_POF==0){//上電延時到
- con_out();//控制輸出
- }
- }else{errled_con();}//探極出錯處理
- }else{errin_con();}//采樣出錯處理
- }
- second_cnt--;//記數值減
- if(!second_cnt){//如果經過1秒
- second_cnt=20;//設置記數值
- runled=~runled;
- second_tick();//時標函數
- }
- }
- }
- /***************************************************************
- 函數名time1
- 功能描述生成峰鳴器間歇性的2K方波
- 輸入參數無
- 返回參數無
- ****************************************************************
- void time1(void)interrupt 3 using 1{
- static unsigned int buz_cnt=1000;
- bit l;
- if(!l){//2K方波
- speak=~speak;
- }else{//間歇時間
- speak=1;
- }
- buz_cnt--;//記數值減1
- if(!buz_cnt){
- if((PCON&0X10)==0x10){//檢查上電標志
- PCON=PCON&0XEF;//清上電標志
- UP_POF=1;//置位開機延時
- buz_cnt=2000;//設置記數值
- }else{
- buz_cnt=1000;//設置記數值
- l=~l;
- }
- }
- }
- /*************************************************************************
- 主函數
- *************************************************************************/
- void main(void){
- EA=0;//禁能總中斷
- INIT_WDT();//看門狗初始化
- CHK_LED();//led檢查
- INIT_TMR();//定時器初始化
- CHK_BUZ();//峰鳴器檢查
- INIT_KBI();//鍵盤初始化
- EA=1;//使能總中斷
- TR0=1;//開啟定時器T0
- for(;;){//低功耗等待
- PCON=0x01;
- }
- }
- /***********************************************************************
- 函數名star_monent
- 功能描述剛開機,延時,判斷有無水,無水告警
- 輸入參數無
- 返回參數無
- ***********************************************************************/
- void star_monent(void){
- static uchar star_delay,boxc_con;
- if(MOTOR_STAR==1){//剛開機時的延時
- star_delay++;
- if(boxc){
- boxc_con++;
- }else{
- boxc_con=0;
- }
- if(star_delay>=STAR_DELAY){//達到開機延時
- if(boxc_con>=STAR_BOXC){
- warning();
- boxc_con=0;
- }else{
- boxc_con=0;
- MOTOR_STAR=0;
- star_delay=0;
- well_led=1;
- }
- }
- }else{//不是剛開機
- if(boxc==1){//井無水
- motor_led=1;//停機
- well_led=0;//無水點亮
- }
- }
- }
- /*************************************************************************
- 函數名con_out
- 功能描述對采樣值進行分析水箱B點無水條件下如果水箱A點無水
- 啟動水泵延時5秒檢測出水口,如無水,告警,有水則正常抽水
- 水箱水位在AB之間時保持抽水狀態到過B點停機
- 輸入參數無
- 返回參數無
- ***************************************************************************/
- void con_out(void){
- if(boxb==1){//水未滿
- if(SET_KB==0){//手動未按下
- if(MOTOR==0){//關機狀態
- if(boxa==1){//水箱無水,
- motor_led=0;//開機
- MOTOR=1;//電機運行標志
- MOTOR_STAR=1;//剛開機置位
- }
- }
- if(motor_led==0){
- star_monent();}//剛開機延時5秒
- }else{//手動按下
- SET_KB=0;
- motor_led=0;//開機
- MOTOR=0;//手動,停止條件:水箱滿或水井無水
- MOTOR_STAR=1;
- }
- }else{//水滿,關機
- motor_led=1;
- MOTOR=0;
- }
- }
復制代碼
五討論
民用深井泵的功率一般都小于1KW單相水泵的工作電流來在水泵空抽和抽水狀態時無明顯的邊界量故
無法用水泵的工作電流來判斷井內是否有水對于功率較大的深井泵則可用工作電流邊界量來判斷井內是否有水
則可省掉水位C點采樣回路同時還可利用該電機電流采樣回路V/F法或ADC進行電機過載堵轉保
護則可使該控制器功能更為完善同時也充分利用了P87LPC762的潛能
六后記
編輯寄語作者自己購買了SE 764仿真器MP 764編程器及西爾特萬用編程器等開發工具在業余條件下
用專業的手段自行開發了深井泵自動控制器首先我為他立志向上的求學精神所感動其次作者在很多網站
上表現得十分樂于助人足以說明他的愛心可嘉其三作者將自己設計的作品完全公開其無私奉獻的思想境界能
夠幫助后學先進的年輕人同時對所有的初學者來說這無疑是一個很好的學習機會通過對一個簡單的控制項
目的學習和調試如能達到學好PHILIPS P87LPC762單片機和C51高級語言的目的那又何樂而不為呢學習單片
機應用開發技術關鍵在于實踐特別是配合實驗板來學習效果尤其明顯請有興趣的網友自行與作者聯系購買實驗
板如果在實驗中遇到困境請與作者聯系解答我想作者一定會十分熱心地幫助您解決問題如果您有更好的設計
思想也請與作者和我聯系讓我們一起合作來完善這個作品千萬不要認為這是一個小控制器只要我們認真完善
但也能充分體現一個人的設計思想那么一定有可能會成為一個好作品