生活随笔
收集整理的這篇文章主要介紹了
利用51单片机和霍尔水流量传感器开发水流量计
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
開發準備
(1)YF-B1流量傳感器一個
(2)51開發板一個
基礎知識
(1)YF-B1流量傳感器只有三根線。即數據線、VCC、GND。數據線輸出為占空比為50%的方波。當水流通過水流轉子組件時,磁性轉子轉動并且轉速隨著流量的變化而成線性變化。霍爾傳感器(霍爾元件采樣)輸出相應的脈沖信號。其流量脈沖特性計算公式為:脈沖f(Hz)=8.1x流量Q(L/min)-3。
(2)51單片機的中斷工作方式。51單片機有定時器T0和T1,他們既有定時又有計數的功能。通過設置相關的特殊功能寄存器就可以啟用定時或計數功能。需要注意的是,定時器系統是單片機內部一個獨立的硬件部分,CPU一旦設置定時功能,定時器便在晶振的作用下計時,當計數器計滿便會產生中斷,通知CPU該如何去處理。而作為計數器時,計數脈沖來自相應的外部輸入引腳T0(P3.4),T1(P3.5)或者T2(P1.0,52單片機)。
電路設計
(1)將霍爾傳感器數據線插在P3.4,VCC接在VCC,GND接GND。
(2)這是我的開發板數碼管的電路,提供參考。
軟件設計
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char //宏定義
#define uint unsigned int //宏定義
sbit we = P2^7; //位定義數碼管位選鎖存器接口
sbit du = P2^6; //位定義數碼管位選鎖存器接口
float frency,Q,F,num;//Q為流量,單位L/min;F為頻率,單位HZ
uchar code leddata[]={ 0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9"0x77, //"A"0x7C, //"B"0x39, //"C"0x5E, //"D"0x79, //"E"0x71, //"F"0x76, //"H"0x38, //"L"0x37, //"n"0x3E, //"u"0x73, //"P"0x5C, //"o"0x40, //"-"0x00, //熄滅0x00 //自定義};//數碼管帶小數點顯示
uchar code leddatapoint[]={ 0xBF, //"0"0x86, //"1"0xDB, //"2"0xCF, //"3"0xE6, //"4"0xED, //"5"0xFD, //"6"0x87, //"7"0xFF, //"8"0xEF, //"9"0x00, //熄滅0x00 //自定義};
//毫秒級延時函數
void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
}
//四位數碼管動態顯示函數
void display(float i)
{uchar shi, ge,fen,shifen;float x,y;shi = i / 10; //顯示十位ge = (int)i % 10;//顯示個位x=i*10;y=i*100;fen = (int)x%10;//分位shifen = (int)y%10;//十分位P0 = 0xff;//清除斷碼we = 1; //打開位選P0 = 0xef;//1110 1111 we = 0; //關閉位選du = 1;//打開段選P0 = leddata[shi]; du = 0; //關閉段選delay(5);//延時5毫秒P0 = 0xff;//清除斷碼we = 1; //打開位選P0 = 0xdf;//1101 1111 we = 0; //關閉位選du = 1;//打開段選P0 = leddatapoint[ge]; du = 0; //關閉段選delay(5);//延時5毫秒P0 = 0xff; //清除斷碼we = 1;//打開位選P0 = 0xbf;//1011 1111 we = 0; //關閉位選du = 1; //打開段選P0 = leddata[fen];du = 0; //關閉段選delay(5);//延時5毫秒P0 = 0xff; //清除斷碼we = 1;//打開位選P0 = 0x7f;//0111 1111 we = 0; //關閉位選du = 1; //打開段選P0 = leddata[shifen];du = 0; //關閉段選delay(5);//延時5毫秒
}
uint read()//得到計數器0當前脈沖次數函數
{uint tl,th1,th2;//讀兩次高位,兩次高位一樣說明沒有低位進位,讀數更加精確。uint val;while(1){th1=TH0;tl=TL0;th2=TH0;if(th1==th2)break;}val=th1*256+tl;return val;
}
void main()
{TMOD=0x15;//定時器計數器工作方式配置TH0=0;TL0=0;TH1=(65536-45872)/256;TL1=(65536-45872)%256;EA=1;//開總中斷ET0=1;//中斷允許ET1=1;TR0=1;//運行控制位TR1=1;while(1){ display(Q);}}
void T0_time()interrupt 1
{TH0=0;TL0=0;
}
void T1_time()interrupt 3
{TH1=(65536-45872)/256;//50毫秒TL1=(65536-45872)%256;num++;if(num==20) //1s更新一次數據,送至數碼管顯示{num=0;F=read();//每隔1s讀一次計數器0,該值則為頻率。計算出Q后立馬把計數器0清零重新計數。if(F>0){Q=(F+3)/8.1;//流量傳感器經驗公式TH0=0;TL0=0;}else{Q=0;//如果不加這句,當F=0,由公式知道Q!=0。TH0=0;TL0=0;}}
}
測試效果
總結
以上是生活随笔為你收集整理的利用51单片机和霍尔水流量传感器开发水流量计的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。