<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 用18B20做溫度補(bǔ)償?shù)某暡y距程序

          用18B20做溫度補(bǔ)償?shù)某暡y距程序

          作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
          18B20溫度補(bǔ)償超聲波測距程序
          #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做溫度補(bǔ)償?shù)某暡y距程序
          uchar tflag;//溫度正負(fù)標(biāo)志
          sbit DQ=P1^3;//ds18b20單片機(jī)連接口
          char idata disp_buf1[16];//1602顯示緩沖區(qū)1(即上排16個字符)
          char idata disp_buf2[16];//1602顯示緩沖區(qū)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();//發(fā)射聲波
          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); //開顯示,關(guān)光標(biāo),光標(biāo)所在字符不閃電子小制作_我愛制作_電子DIY制作套件http://www.5imcu.net/
          lcd_wcom(0x06),delay(1);//顯示地址遞增18B20做溫度補(bǔ)償?shù)某暡y距程序
          lcd_wcom(0x01),delay(1); //清屏,光標(biāo)移到左上角
          }
          void chushi_display()
          {
          uchar m=0;
          lcd_init();
          lcd_wcom(0x80);
          for(m=0; m<16; m++)
          {
          lcd_wdat(table[m]); //將數(shù)組中字符顯示出來18B20做溫度補(bǔ)償?shù)某暡y距程序
          delay(1000);
          }
          delay(100);
          lcd_wcom(0x01);
          }
          void ds1820rst()
          { unsigned char x=0;
          DQ = 1,delayus(4); //DQ復(fù)位
          DQ = 0; //DQ拉低
          delayus(100); //精確延時大于480us
          DQ = 1; //拉高h(yuǎn)ttp://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);//溫度值擴(kuò)大10倍,精確到1位小數(shù)
          return(tvalue);
          }
          void ds1820disp()
          {
          uchar flagdat;
          disdata[0]=tvalue/1000+0x30;//百位數(shù)
          disdata[1]=tvalue00/100+0x30;//十位數(shù)
          disdata[2]=tvalue0/10+0x30;//個位數(shù)http://www.duankudp.com/
          disdata[3]=tvalue+0x30;//小數(shù)位
          if(tflag==0)
          flagdat=0x20;//正溫度不顯示符號電子小制作_我愛制作_電子DIY制作套件http://www.5imcu.net/
          else
          flagdat=0x2d;//負(fù)溫度顯示負(fù)號:-18B20做溫度補(bǔ)償?shù)某暡y距程序
          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(); //更新顯示數(shù)據(jù)
          }
          }
          void ChuShiHua()
          {
          IE = 0x82; //開T0中斷
          TMOD = 0x10; //定時器1模式1,定時器0模式0
          PX1 = 1; //INT1高優(yōu)先級18B20做溫度補(bǔ)償?shù)某暡y距程序
          PT0 = 0; //T0 低級中斷
          IT1 = 0; //INT1電平觸發(fā)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; //關(guān)中斷
          wave= 0;
          delay(80);
          TH1 = 0;
          TL1 = 0; //計數(shù)器清零
          wave=1;
          TR1 = 1; //啟動計算器;
          delayus(125);
          wave=0;
          delayus(300);
          IE=0X86;
          }
          void Shou() interrupt 2 //外部中斷INT1
          {
          IE = 0; //關(guān)中斷
          JuLi= 0;
          TR1 = 0; //關(guān)定時器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; //關(guān)int1中斷,開顯示中斷http://www.jiaoqb.com/
          }
          main()
          {
          display(); //更新顯示數(shù)據(jù)
          chushi_display();
          ChuShiHua();
          while (1)
          {
          read_temp();//讀取溫度
          ds1820disp();//顯示
          FaShe();
          Deng(); //數(shù)據(jù)送入顯示緩沖區(qū)http://www.duankudp.com/
          }
          }



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();