• <rp id="wfxtb"><acronym id="wfxtb"></acronym></rp><em id="wfxtb"></em><dd id="wfxtb"><big id="wfxtb"><video id="wfxtb"></video></big></dd>
  • <rp id="wfxtb"></rp>

    <mark id="wfxtb"><center id="wfxtb"></center></mark>

      <rp id="wfxtb"><span id="wfxtb"><u id="wfxtb"></u></span></rp>

      <rp id="wfxtb"><object id="wfxtb"></object></rp>

      注意:訪問本站需要Cookie和JavaScript支持!請設置您的瀏覽器! 打開購物車 查看留言付款方式聯系我們
      初中電子 單片機教材一 單片機教材二
      搜索上次看見的商品或文章:
      商品名、介紹 文章名、內容
      首頁 電子入門 學單片機 免費資源 下載中心 商品列表 象棋在線 在線繪圖 加盟五一 加入收藏 設為首頁
      本站推薦:
      四個DS1820溫度讀取C源程序
      文章長度[5430] 加入時間[2006/7/1] 更新時間[2025/5/4 3:18:52] 級別[3] [評論] [收藏]
      四個DS1820溫度讀取C源程序 
      日期:2006-1-14 9:29:30 人氣:3 查看:[大字體 中字體 小字體] 

      // 以下是四個DS1820溫度讀取程序
      //使用時先調用"rom()"子程序讀出每個器件的序列號
      //再將各個序列號填入SN數組中才能讀出各個溫度

      #include
      #define uchar unsigned char

      sbit TMDAT = P0^1; //根據實實際情況設定
      uchar TMP[4]; //讀取后的4個溫度值,將其除以2即可得出實際溫度;
      uchar SN[4][8]; //4個器件的序列號,先讀出單個序列號后填上才可以讀取溫度
      uchar f[4]; //結果是否為負溫,“0”為正溫,“1”為負溫!

      ////////////////////////////////////////延時部分//////////////////////////
      void dmsec (unsigned int count)    //
      {     //
      unsigned int i;       //
      while (count)    //
      {    //
       i = 115;   //
       while (i>0) i--;   //
       count--;   //
        }     //
      }     //
      //////////////////////////////////////////////////////////////////////////

      /////////////////////////////////////// 發送復位//////////////////////////
      void tmreset (void)    //
      {             //
      unsigned int i;    //
      TMDAT = 0;    //
      i = 103;    //
      while (i>0) i--;     // 延時 900 uS(11.0592Mhz時) //
      TMDAT = 1;    //
      i = 4;    //
      while (i>0) i--;   //
      }     //
      //////////////////////////////////////////////////////////////////////////

      //判斷DS1820是否存在的子程序。最好不要用,因為當器件不存在時將會進入死循環

      ////////////////////////////////////// 等待存在脈沖///////////////////////
      void tmpre (void)  //判斷器件是否存在 //
      {              //
      unsigned int i;    //
      while (TMDAT);    //
      while (~TMDAT);    //
      i = 4; while (i>0) i--;   //
      }     //
      //////////////////////////////////////////////////////////////////////////

      ///////////////////////////////////// 讀一位//////////////////////////////
      bit tmrbit (void)    //
      {             // 
      unsigned int i;    //
      bit dat;    //
      TMDAT = 0; i++;    //
      TMDAT = 1; i++; i++; //微量延時  //
      dat = TMDAT;    //
      i = 8; while (i>0) i--; // 延時  //
      return (dat);    //
      }     //
      //////////////////////////////////////////////////////////////////////////

      //////////////////////////////////////// 讀一個字節///////////////////////
      unsigned char tmrbyte (void)    //
      {         //
      unsigned char i,j,dat;   //
      dat = 0;    //
      for (i=1;i<=8;i++)   //
      {    //
       j = tmrbit ();   //
       dat = (j << 7) | (dat >> 1);  //
      }    //
      return (dat);    //
      }     //
      //////////////////////////////////////////////////////////////////////////

      /////////////////////////////////////// 寫一個字節////////////////////////
      void tmwbyte (unsigned char dat)   //
      {            //
      unsigned int i;    //
      unsigned char j;   //
      bit testb;    //
      for (j=1;j<=8;j++)   //
      {    //
       testb = dat & 0x01;   //
       dat = dat >> 1;   //
       if (testb)   //
       {    //
        TMDAT = 0;              // 寫0 //
        i++; i++;               //
        TMDAT = 1;   //
        i = 8; while (i>0) i--;        //
       }    //
       else    //
       {    //
        TMDAT = 0;              // 寫0 //
        i = 8; while (i>0) i--;        //
        TMDAT = 1;   //
        i++; i++;               //
       }    //
      }    //
      }     //
      //////////////////////////////////////////////////////////////////////////

      /////////////////////////////////發送ds1820 開始轉換//////////////////////
      void tmstart (void)    //
      {             //
      tmreset (); //復位   //
      //tmpre (); //等待存在脈沖  //
      dmsec (1); //延時   //
      tmwbyte (0xcc); //跳過序列號命令,對所有器件有效 //
      tmwbyte (0x44); //發轉換命令 44H,  //
      }     //
      //////////////////////////////////////////////////////////////////////////


      //////////////////////////////////讀取溫度////////////////////////////////
      void tmrtemp ()    //
      {             //
      uchar i,j;    //
      uchar a,b;    //
      for(j=0;j<4;j++)   //
      {    //
       tmreset(); //復位  //
       dmsec(1); //延時  //
       tmwbyte(0x55); //發送ROM匹配命令 //
       for(i=0;i<8;i++)   //
       {    //
        tmwbyte(SN[j][i]); //發送64位序列號 //
       }    //
       tmwbyte (0xbe); //發送讀取命令  //
       a = tmrbyte (); //連續讀取兩位溫度 //
       b = tmrbyte ();    //
       f[j]=b;  //若b為1則為負溫 //
       if(f[j])   //
       {    //
        TMP[j]=~a+1; //如果為負溫則去除其補碼 //
       }    //
       else    //
       {    //
        TMP[j]=a;   //
       }    //
      }    //
      }     //
      //////////////////////////////////////////////////////////////////////////


      //以下是讀取器件序列號的子程序,需要讀取序列時可在程序中調用;
      //調用時確?偩中只有一只器件,若有多個器件時則讀取出來的號碼無效;
      //將讀取出來的序列號填到前面的數組中即可使用;
      //平時可以將此子程序刪除以節約空間。
       
      //////////////////////////讀取器件序列號子程序////////////////////////////
      void rom()     //
      {     //
      //以下是定義8個序列號變量   //
      uchar sn1;    //
      uchar sn2;    //
      uchar sn3;    //
      uchar sn4;    //
      uchar sn5;    //
      uchar sn6;    //
      uchar sn7;    //
      uchar sn8;    //
           //
      tmreset (); //復位   //
      dmsec (1); //延時   //
      tmwbyte(0x33); //發送讀序列號子程序  //
      sn1=tmrbyte(); //讀取第一個序列號,應為16H; //
      sn2=tmrbyte(); //讀取第二個序列號,應為10H; //
      sn3=tmrbyte();    //
      sn4=tmrbyte();    //
      sn5=tmrbyte();    //
      sn6=tmrbyte();    //
      sn7=tmrbyte();    //
      sn8=tmrbyte();    //
      }     //
      //////////////////////////////////////////////////////////////////////////

      //////////////////////////////////////////////////////////////////////////
      main()     //
      {     //
      do{   //
       rom(); //調用讀序列號子程序  //
       //tmstart();   //
       dmsec(100); //如果是不斷地讀取的話可以不延時 //
       //tmrtemp(); //讀取溫度,執行完畢溫度將存于TMP[]數組中//
      }while(1);    //
      }     //
      //////////////////////////////////////////////////////////////////////////


      1、 本站不保證以上觀點正確,就算是本站原創作品,本站也不保證內容正確。
      2、如果您擁有本文版權,并且不想在本站轉載,請書面通知本站立即刪除并且向您公開道歉! 以上可能是本站收集或者轉載的文章,本站可能沒有文章中的元件或產品,如果您需要類似的商品請 點這里查看商品列表!
      本站協議。 版權信息。 關于我們。 本站地圖。 營業執照。 發票說明。 付款方式。 聯系方式
      深圳市寶安區西鄉五壹電子商行——粵ICP備16073394號-1;地址:深圳西鄉河西四坊183號;郵編:518102
      E-mail:51dz$163.com($改為@);Tel:(0755)27947428
      工作時間:9:30-12:00和13:30-17:30和18:30-20:30,無人接聽時可以再打手機13537585389
      91嫩草黄片动漫版