新聞中心

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

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

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

        ////////////////////////主函數(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(); //檢測當(dāng)前環(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; //測量成功標(biāo)志位

        Done=0; //測量一次標(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; //啟動計數(shù)器

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

        {

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

        }

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

        {

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

        }

        EX0=1; //開INT0中斷

        while(Done==0); //等待測量結(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) //測距成功,顯示“成功”,并顯示距離

        {

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

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

        主站蜘蛛池模板: 长丰县| 吉林省| 疏勒县| 龙泉市| 望江县| 邳州市| 蓝山县| 河东区| 孟州市| 手机| 原平市| 汉川市| 额敏县| 邯郸县| 白城市| 漳浦县| 桓台县| 山东省| 郑州市| 洮南市| 丰宁| 龙里县| 汨罗市| 河北省| 陆河县| 上高县| 鄂托克旗| 扎鲁特旗| 双柏县| 湛江市| 莒南县| 景东| 瑞金市| 木里| 孝昌县| 西充县| 漾濞| 吐鲁番市| 镇江市| 平远县| 璧山县|