一款液晶顯示的超聲波測距板
////////////////////////主函數(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]=