新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用18B20做溫度補償的超聲波測距程序

        用18B20做溫度補償的超聲波測距程序

        作者: 時間:2016-11-25 來源:網絡 收藏
        18B20溫度補償超聲波測距程序
        #include
        #include
        #define uint unsigned int
        #define uchar unsigned char
        sbit rs=P1^0;
        sbit rw=P1^1;
        sbit en=P1^2;
        sbit wave=P1^4;
        uint tvalue;//溫度值用18B20做溫度補償的超聲波測距程序
        uchar tflag;//溫度正負標志
        sbit DQ=P1^3;//ds18b20單片機連接口
        char idata disp_buf1[16];//1602顯示緩沖區1(即上排16個字符)
        char idata disp_buf2[16];//1602顯示緩沖區2(即下排16個字符)
        uchar code table[]=" Celiang Ok ! ";
        uchar i;
        char idata julidata[3]; //存放距離值變量
        uchar data disdata[4];//溫度
        unsigned long int JuLi;//距離
        unsigned char Gao,Di;//存儲計時器高位,低位
        void ChuShiHua();//初始化
        void FaShe();//發射聲波
        void Shou();//接收外部中斷程序
        void Deng();//空等待
        void delay(uint n) //延時時間為n*1ms
        { uchar x=0;
        for(; n>0; n--)
        {
        for(; x<250; x++)
        {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        }
        }
        }
        void delayus(uint n)
        {
        while(n--);
        }
        void check_busy()
        {
        P2=0xff;
        rs=0;
        rw=1;
        en=1;
        while(P2&0x80);
        en=0;
        }
        void lcd_wcom(uchar com)
        { check_busy();
        rw=0;
        rs=0;
        P2=com;
        en=1;
        en=0;
        }
        void lcd_wdat(uchar dat)
        { check_busy();
        rw=0;
        rs=1;
        P2=dat;
        en=1;
        en=0;
        }
        void lcd_init()
        {
        lcd_wcom(0x38),delay(1);//8位,雙列,5*7
        lcd_wcom(0x0c),delay(1); //開顯示,關光標,光標所在字符不閃電子小制作_我愛制作_電子DIY制作套件http://www.5imcu.net/
        lcd_wcom(0x06),delay(1);//顯示地址遞增18B20做溫度補償的超聲波測距程序
        lcd_wcom(0x01),delay(1); //清屏,光標移到左上角
        }
        void chushi_display()
        {
        uchar m=0;
        lcd_init();
        lcd_wcom(0x80);
        for(m=0; m<16; m++)
        {
        lcd_wdat(table[m]); //將數組中字符顯示出來18B20做溫度補償的超聲波測距程序
        delay(1000);
        }
        delay(100);
        lcd_wcom(0x01);
        }
        void ds1820rst()
        { unsigned char x=0;
        DQ = 1,delayus(4); //DQ復位
        DQ = 0; //DQ拉低
        delayus(100); //精確延時大于480us
        DQ = 1; //拉高http://www.duankudp.com/
        delayus(40);
        }
        uchar ds1820rd()
        {
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        { DQ = 0; //給脈沖信號
        dat>>=1;
        DQ = 1; //給脈沖信號電子小制作_我愛制作_電子DIY制作套件http://www.5imcu.net/
        if(DQ)
        dat|=0x80;
        delayus(10);
        }
        return(dat);
        }
        void ds1820wr(uchar wdata)
        {
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
        DQ = 0;
        DQ = wdata&0x01;
        delayus(10);
        DQ = 1;
        wdata>>=1;
        }
        }
        read_temp()
        {
        uchar a,b;
        ds1820rst();
        ds1820wr(0xcc);/
        ds1820wr(0x44);/
        ds1820rst();
        ds1820wr(0xcc);/
        ds1820wr(0xbe);/
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b;
        tvalue<<=8;
        tvalue=tvalue|a;
        if(tvalue<0x0fff)
        tflag=0;
        else
        {
        tvalue=~tvalue+1;
        tflag=1;
        }
        tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
        return(tvalue);
        }
        void ds1820disp()
        {
        uchar flagdat;
        disdata[0]=tvalue/1000+0x30;//百位數
        disdata[1]=tvalue00/100+0x30;//十位數
        disdata[2]=tvalue0/10+0x30;//個位數http://www.duankudp.com/
        disdata[3]=tvalue+0x30;//小數位
        if(tflag==0)
        flagdat=0x20;//正溫度不顯示符號電子小制作_我愛制作_電子DIY制作套件http://www.5imcu.net/
        else
        flagdat=0x2d;//負溫度顯示負號:-18B20做溫度補償的超聲波測距程序
        if(disdata[0]==0x30)
        {
        disdata[0]=0x20;//如果百位為0,不顯示
        if(disdata[1]==0x30)
        {
        disdata[1]=0x20;//如果百位為0,十位為0也不顯示
        }
        }
        }
        void updata_disp()
        {
        disp_buf1[0]=W, disp_buf1[1]=e;
        disp_buf1[2]=n, disp_buf1[3]=D;
        disp_buf1[4]=u,disp_buf1[5]=-;
        disp_buf1[6]=-, disp_buf1[7]=D;
        disp_buf1[8]=i,disp_buf1[9]=s;;
        disp_buf1[10]=t,disp_buf1[11]=a;;
        disp_buf1[12]=n,disp_buf1[13]=t;;
        disp_buf1[14]=:,disp_buf1[15]=:;
        disp_buf2[0]=*, disp_buf2[1]=disdata[1];
        disp_buf2[2]=disdata[2],disp_buf2[3]=.;
        disp_buf2[4]=disdata[3],disp_buf2[5]=-;
        disp_buf2[6]=-, disp_buf2[7]=0;
        disp_buf2[8]=0;
        disp_buf2[9] =julidata[0]+0x30;
        disp_buf2[10]=julidata[1]+0x30;
        disp_buf2[11]=julidata[2]+0x30;
        disp_buf2[12]=c,disp_buf2[13]=m;
        disp_buf2[14]=*,disp_buf2[15]=*;
        }
        void display()
        {
        uchar i;
        lcd_wcom(0x80);
        for(i=0;i<16;i++)
        lcd_wdat(disp_buf1[i]);
        lcd_wcom(0xc0);
        for(i=0;i<16;i++)
        lcd_wdat(disp_buf2[i]);
        }
        void int_t0() interrupt 1 using 1 //定時中斷http://www.jiaoqb.com/
        {
        TH0=0x3c;
        TL0=0xb0;
        i++;
        if(i== 10)
        {
        i=0;
        display(); //更新顯示數據
        }
        }
        void ChuShiHua()
        {
        IE = 0x82; //開T0中斷
        TMOD = 0x10; //定時器1模式1,定時器0模式0
        PX1 = 1; //INT1高優先級18B20做溫度補償的超聲波測距程序
        PT0 = 0; //T0 低級中斷
        IT1 = 0; //INT1電平觸發0
        TR0 = 1; //啟動定時器T0http://www.jiaoqb.com/
        wave= 0;
        }
        void Deng()
        {
        unsigned int i,j;
        wave=0;
        for (i = 0; i < 200; i++)
        for (j = 0; j < 200; j++);
        }
        void FaShe()
        {
        IE = 0; //關中斷
        wave= 0;
        delay(80);
        TH1 = 0;
        TL1 = 0; //計數器清零
        wave=1;
        TR1 = 1; //啟動計算器;
        delayus(125);
        wave=0;
        delayus(300);
        IE=0X86;
        }
        void Shou() interrupt 2 //外部中斷INT1
        {
        IE = 0; //關中斷
        JuLi= 0;
        TR1 = 0; //關定時器1
        Gao = TH1, Di = TL1;
        JuLi = JuLi | Gao, JuLi = JuLi << 8;
        JuLi = JuLi | Di,JuLi = JuLi*17;
        JuLi = JuLi/1000,julidata[0] = JuLi / 100;
        julidata[1] = (JuLi - (julidata[0]*100))/10;
        julidata[2] = JuLi, updata_disp();
        IE = 0x82; //關int1中斷,開顯示中斷http://www.jiaoqb.com/
        }
        main()
        {
        display(); //更新顯示數據
        chushi_display();
        ChuShiHua();
        while (1)
        {
        read_temp();//讀取溫度
        ds1820disp();//顯示
        FaShe();
        Deng(); //數據送入顯示緩沖區http://www.duankudp.com/
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 微博| 三门县| 弥勒县| 拉孜县| 奉新县| 海门市| 县级市| 淄博市| 托克逊县| 襄城县| 汪清县| 彭山县| 河津市| 怀宁县| 福贡县| 高清| 将乐县| 阳朔县| 汉阴县| 竹北市| 阳高县| 永吉县| 大庆市| 禹州市| 延津县| 武定县| 梓潼县| 博白县| 呼玛县| 青龙| 龙陵县| 兴国县| 吴桥县| 清远市| 滨州市| 定结县| 克山县| 池州市| 云南省| 鄂伦春自治旗| 南宫市|