<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        DS18B20讀寫程序

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年05月02日   【字體:
        #include<reg51.h>    //包含單片機寄存器的頭文件
        #include<intrins.h>  //包含_nop_()函數定義的頭文件
        #define uchar unsigned char
        #define uint unsigned int
        sbit date=P3^7;
        unsigned char code table[]={0x3f,
        0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,
        0x71,0x80,0xc0};
         
        uchar falg;
        uint c,temp;
         
        void delay(uint z)//延時4微秒
        {
         while(z--);
        }
         
        void reset()
        {
         date=1;
         delay(1);
         date=0;
         delay(80);
         date=1;
         delay(8);
         if(date==0)
          P2=0xfe;//燈1亮,DS18B20應答低電平有效
         else
          P2=0xfc;//燈1,2亮,DS18B20未應答低電平
         delay(20);
         if(date==1)
          P2=0x7e;//燈1,8亮,DS18B20復位成功
         else
          P2=0x00;//燈全亮,DS18B20未釋放總線,復位不成功
        }
         
         
        void write_byte(uchar dat)//寫入一個字節
        {
         uchar i;
         for(i=1;i<=8;i++)
         {
          date=0;
          date=dat&0x01;
             delay(4);  
          dat=dat>>1;
          date=1;
          delay(1);
         }
        }
         
         
        uchar read_byte()//讀一個字節
        {
         uchar dat;
         uchar i;
         for(i=0;i<8;i++)
         {
          date=0;
          dat=dat>>1;
          date=1;
          if(date)//采數據1
           dat=dat|0x80;
          delay(4);
         }
         return(dat);
        }
         
         
        uint read_wendu()//讀溫度
        {
         uchar a,b;
         reset();//復位
         delay(1);
         write_byte(0xcc);//跳過序列號命令
         write_byte(0x44);//啟動溫度檢測
         delay(350);
         reset();
        // delay(1);
         write_byte(0xcc);//跳過序列號命令
         write_byte(0xbe);//發送讀取命令
         a=read_byte();//讀低8位
         b=read_byte();//讀高8位
         temp=((b|0xff00)<<8)|a;//合并成16位數
         if ((b&0xf0)==0xf0)//判斷正負
         { 
          temp=~temp+1; 
          falg=1;
         }
         else
          falg=0;
         c=(temp&0x000f)*0.0625*10000;//提取4位小數
         temp=temp>>4;//移出小數部分,得到整數溫度值
         return(temp);
        }
         
         
        void display()//顯示
        {
         uchar bai,shi,ge,n1,n2,n3,n4;
         
           bai=temp/100;
           shi=temp0/10;
          ge=temp;
         n1=c/1000;
         n2=c00/100;
         n3=c0/10;
         n4=c;
         
         P0=table[bai];
         if(bai==0)
         {
          P1=0xff;
         }
         else
         {
          P1=0xfe;
          delay(200);
          P1=0xff; 
         }
         P0=table[shi];
         if(bai==0)
         { 
          if(shi==0) //最高位是0,次高位也是0則不顯示
           P1=0xff;
          else       //最高位是0,次高位不是0則顯示次高位
          {
           P1=0xfd;
           delay(200);
           P1=0xff;
          } 
         }
         else           //最高位不是0,次高位全顯
         {
          P1=0xfd;
          delay(200);
          P1=0xff; 
         }
         P0=table[ge];
         P1=0xfb;
         delay(200);
         P1=0xff;
         if(falg==1)// 顯示負號
         {
          P0=table[17];
          P1=0xf7;
          delay(200);
          P1=0xff;
         }
         else
         {
          P0=table[16];
          P1=0xf7;
          delay(200);
          P1=0xff;
         }
         P0=table[n1];
         P1=0xef;
         delay(200);
         P1=0xff;
         P0=table[n2];
         P1=0xdf;
         delay(200);
         P1=0xff;
         P0=table[n3];
         P1=0xbf;
         delay(200);
         P1=0xff;
         P0=table[n4];
         P1=0x7f;
         delay(200);
         P1=0xff;  
        }
         
        void main()
        {
         
         P0=0x00;
         P1=0xff;
         while(1)
         {
          read_wendu();
          display();
         }
         
        }
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮