新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機DS18B20溫度計C語言程序

        單片機DS18B20溫度計C語言程序

        作者: 時間:2016-11-26 來源:網絡 收藏

        1. //功能:有負溫度顯示,高精度格度可以顯示-9.99C到99.99C
          //帶有報警裝置
          //當溫度為正時,顯示十位 個位 十分位 百分位
          //當溫度為負時,顯示負號 十位 個位 十分位
          //缺點是上下限報警數值不能改變
          //注明:數碼管是CC—共陰型
          //讀取溫度
        2. sbit DQ = P3^0;//定義通信端口
          bit fg=1;
          //晶振12MHz
          void delay_18B20(unsigned int i)
          {
          while(i--);
          }
          //初始化函數
          bit Init_DS18B20(void)
          {
          unsigned char x=0;
          DQ = 1;//DQ復位
          delay_18B20(8);//稍做延時
          DQ = 0;//單片機將DQ拉低
          delay_18B20(80); //精確延時 大于 480us
          DQ = 1;//拉高總線
          delay_18B20(14);
          x=DQ;//稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
          return(x); //Init_DS18B20(void) 被定義為bit則要有返回值
          delay_18B20(20);
          }
          //while(DQ);
          //while(~DQ);//檢測到應答脈沖
          //
          //讀一個字節
          ReadOneChar(void)
          {
          unsigned char i=0;
          unsigned char dat = 0;
          for (i=8;i>0;i--)
          {
          DQ = 0; // 給脈沖信號
          dat>>=1;
          DQ = 1; // 給脈沖信號
          if(DQ)
          dat|=0x80;
          delay_18B20(4);
          }
          return(dat);
          }
          //寫一個字節
          WriteOneChar(unsigned char dat)
          {
          unsigned char i=0;
          for (i=8; i>0; i--)
          {
          DQ = 0;
          DQ = dat&0x01;
          delay_18B20(5);
          DQ = 1;
          dat>>=1;
          }
          }
          ReadTemperature(void)
          {
          unsigned char a=0;
          unsigned char b=0;
          unsigned intt=0;

          Init_DS18B20();
          WriteOneChar(0xCC); // 跳過讀序號列號的操作
          WriteOneChar(0x44); // 啟動溫度轉換
          delay_18B20(100);//至少750ms
        3. Init_DS18B20();
          WriteOneChar(0xCC); //跳過讀序號列號的操作
          WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
          a=ReadOneChar();
          b=ReadOneChar();
          if((b&0xf8)==0xf8) //位為1 時溫度是負
          {
          b=~b;
          a=~a+1; //補碼轉換,取反加一
          (a==0)b++;
          fg=0; //讀取溫度為負時fg=0
          }
          //傳感器返回值除16得實際溫度值
          //技巧處理后先乘25,再除4,除4用右移實現
          t=((b*256+a)*25)>>2;
          //t=t+(t>0?0.5:-0.5); //四佘五入大于0加0.5, 小于0減0.5前面要把t定義為float型才可以
          return(t);
          }
        4. 顯示頭文件:display()

        5. char disp[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//數字0-9和‘-’的共陰段碼
          char disp_dot[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};
          void display(int tmp)
          {
          if(fg==0)
          {
          P2 = 0xff;
          P1 = 0x40;//"-"
          P2 = 0xEF;
          delay_18B20(2000);
          }
          P2 = 0xff;
          P1 = 0x39;//"C"//若先位選再段選, 由于IO口默認輸出高電平, 所以當先位選會使數碼管出現亂碼
          P2 = 0xFE;
          delay_18B20(200);
        6. P2 = 0xff;
          P1 = disp[tmp/10];
          P2 = 0xFD;
          delay_18B20(200);
        7. P2 = 0xff;
          P1 =disp_dot[tmp/10];
          P2 = 0xFB;
          delay_18B20(200);
        8. if(fg==1)
        9. {
        10. P2 = 0xff;
          P1 = disp[tmp/100];
          P2 = 0xF7;
          delay_18B20(200);
          }
          }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 治县。| 伊金霍洛旗| 奇台县| 从江县| 石景山区| 青河县| 德钦县| 绍兴市| 客服| 开封市| 平定县| 姜堰市| 竹北市| 锦州市| 思茅市| 鹿泉市| 九江县| 松潘县| 清河县| 延边| 读书| 中西区| 海晏县| 延长县| 惠水县| 保靖县| 漳平市| 武强县| 读书| 乌兰县| 宾阳县| 诸暨市| 曲靖市| 鹤峰县| 汾西县| 宜州市| 河北省| 醴陵市| 个旧市| 达拉特旗| 平远县|