新聞中心

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

一款液晶顯示的超聲波測(cè)距板

作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏

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

void main()

{

unsigned long Sum;

uchar i;

uchar num;

bit bOK;

uchar

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

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

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

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) //測(cè)量系統(tǒng)主循環(huán)

{

bOK=0;

num=0;

Sum=0;

ReadTemperature(); //檢測(cè)當(dāng)前環(huán)境溫度

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

{

StartInit(); //測(cè)量初始化

StartMeasure(); //開(kāi)始測(cè)量第1次,確定大概范圍

if(Success==1)

{

bOK=1; //有1次成功,則測(cè)距成功

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

}

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

}

nCount=Sum;

Success=bOK;

DisplayResult();

}

}

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

void INT_0() interrupt 0 using 0 //運(yùn)行到此處說(shuō)明測(cè)距成功

{

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

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

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

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

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

nCount=TH0;

nCount=nCount<<8;

nCount|=TL0;

Success=1;

Done=1;

return;

}

void INT_T0() interrupt 1 using 1

{

//運(yùn)行到此處說(shuō)明測(cè)距失敗

TR0=0;

EX0=0;

Success=0;

Done=1;

return ;

}

void StartInit()

{

TH0=0;

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

EA=1; //開(kāi)總中斷

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

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

Success=0; //測(cè)量成功標(biāo)志位

Done=0; //測(cè)量一次標(biāo)志位

}

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; //啟動(dòng)計(jì)數(shù)器

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

{

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

}

else //遠(yuǎn)距離測(cè)量模式

{

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

}

EX0=1; //開(kāi)INT0中斷

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

}

void DisplayResult()

{

float temp=0;

char String[10];

//算出當(dāng)前溫度

temp=TempInt+TempDot/10000.0;

//顯示當(dāng)前溫度

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

DisplayEnglish(33,0,String);

//算出當(dāng)前聲速

temp=332+0.607*temp;

//顯示當(dāng)前聲速

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

DisplayEnglish(33,2,String);

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

{

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

//顯示遠(yuǎn)、近距離測(cè)量的結(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]=