新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 一款液晶顯示的超聲波測距板

一款液晶顯示的超聲波測距板

作者: 時間:2016-11-30 來源:網(wǎng)絡 收藏

////////////////////////主函數(shù)////////////////////////////////

void main()

{

unsigned long Sum;

uchar i;

uchar num;

bit bOK;

uchar

TCON=B00000000; //INT0電平觸發(fā)

TMOD=0X01; //T0作為計數(shù)輸入

IP=B00000001; //置INT0優(yōu)先級最高

LCD_init(); //液晶初始化

LCD_clear(); //清屏顯示

DisplayChinese(0,0,13,16,3,0,0,WORD); //在LCD上顯示“溫度:”

DisplayChinese(72,0,13,16,1,3,0,WORD); //在LCD上顯示“℃”

DisplayChinese(0,2,13,16,3,4,0,WORD); //在LCD上顯示"聲速:”

while(1) //測量系統(tǒng)主循環(huán)

{

bOK=0;

num=0;

Sum=0;

ReadTemperature(); //檢測當前環(huán)境溫度

for(i=1; i<=3; ++i) //循環(huán)測量,求平均值

{

StartInit(); //測量初始化

StartMeasure(); //開始測量第1次,確定大概范圍

if(Success==1)

{

bOK=1; //有1次成功,則測距成功

Sum=(nCount>Sum)?nCount:Sum; //取測量最大值

}

Delay_ms(80); //延時10ms后繼續(xù)測量

}

nCount=Sum;

Success=bOK;

DisplayResult();

}

}

/***************所用到的相關(guān)函數(shù)功能實現(xiàn)*****************/

void INT_0() interrupt 0 using 0 //運行到此處說明測距成功

{

TR0=0; //關(guān)計數(shù)

ET0=0; //關(guān)定時器中斷

EX0=0; //關(guān)INT0中斷

while(!P3_2); //等待CX20106輸出電平變高

//將計數(shù)器數(shù)據(jù)放進nCount,用來進行數(shù)據(jù)處理

nCount=TH0;

nCount=nCount<<8;

nCount|=TL0;

Success=1;

Done=1;

return;

}

void INT_T0() interrupt 1 using 1

{

//運行到此處說明測距失敗

TR0=0;

EX0=0;

Success=0;

Done=1;

return ;

}

void StartInit()

{

TH0=0;

TL0=0; //計數(shù)器置0

EA=1; //開總中斷

ET0=0; //關(guān)T0中斷

EX0=0; //關(guān)INT0中斷

Success=0; //測量成功標志位

Done=0; //測量一次標志位

}

void StartMeasure()

{

//產(chǎn)生脈沖波

uchar LOOP;

ET0=1;

for (LOOP = 0;LOOP < 4; )

{

P3 = P3 ^ 0x80;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();

LOOP++;

}

VOUT = 1;

TR0 = 1; //啟動計數(shù)器

if(Mode==0) //近距離測量模式

{

Delay_us(41); //50us延時測量,防止回波干擾

}

else //遠距離測量模式

{

Delay_us(300); //50us延時測量,防止回波干擾

}

EX0=1; //開INT0中斷

while(Done==0); //等待測量結(jié)束

}

void DisplayResult()

{

float temp=0;

char String[10];

//算出當前溫度

temp=TempInt+TempDot/10000.0;

//顯示當前溫度

sprintf(String,"%0.2f",temp);

DisplayEnglish(33,0,String);

//算出當前聲速

temp=332+0.607*temp;

//顯示當前聲速

sprintf(String,"%0.1fm",temp);

DisplayEnglish(33,2,String);

if(Success==1) //測距成功,顯示“成功”,并顯示距離

{

temp=nCount*temp/2000+0.5; // 算出距離

//顯示遠、近距離測量的結(jié)果

if(Mode==0)

{

nResult=(0.9723*temp-14.803)+0.5; //此式由擬合得到

DisplayEnglish(0,4,"N");

}

else

{

nResult=0.9648*temp-5.7716+0.5; //此式由擬合得到

DisplayEnglish(0,4,"F");

}

sprintf(String,"%5u cm",nResult); //將整數(shù)轉(zhuǎn)換為字符串

//拼湊顯示最終結(jié)果“xxx.xcm”

DisplayEnglish(8,4,String);

DisplayEnglish(40,4,".");

String[5]=