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