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

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

        溫度測量DSB1820 lcd1602液晶顯示

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月10日   【字體:

        程序中要用到LCD1602display.h頭文件 可以在我的另一篇文章中取得: http://www.thefapper.com/mcu/3292.html  為同一個文件
        #include <reg52.h>
        #include <intrins.h>
        #include "LCD1602display.h"
        sbit DQ=P2^0;    //ds18b20
        uint wendu=0;
        uchar num,num1;
        uint temperature=0;
        uchar code range[]="===TEMPERTURE===";
        uchar code ASCII[]="0123456789.";
        uchar code table0[]="ROME TEMP:00.0C ";
        uchar code table1[]="    ERRO !!!    ";
        uchar temp[3]={0,0,0};
        //********************延時
        void delay1ms(uint z)
        {
         uint x,y;
         for(x=z;x>0;x--)
          for(y=114;y>0;y--);
        }
        //*************************初始化
        bit init_DS18B20()
        {
         bit flag;     //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在
         DQ=1;
         _nop_();       //先拉高
         DQ=0;
         for(num=0;num<200;num++); //要求保持480~960us
         DQ=1;      //釋放數據線
         for(num=0;num<10;num++); //等待DS18B20響應
         flag=DQ;     // 響應
         for(num=0;num<200;num++); //延時足夠長時間(此延時函數為了防止收不到信號而進入死胡同)
         DQ=1;      //釋放數據線
         return (flag);    //返回檢測成功標志
        }
        //*******************************寫溫度數據
        void DS18B20_WR_CHAR(uchar byte) // 先寫低位
        {
         for(num1=0;num1<8;num1++)
         {  
          DQ=1;
          _nop_();
          DQ=0;  //將數據線從高拉低時即啟動寫時序
          for(num=0;num<5;num++);//等待15us
          DQ=byte&0x01;
          for(num=0;num<15;num++); //延時約45us,DS18B20在約15~45us期間從數據線上采樣
          byte>>=1;
          for(num=0;num<1;num++);//延時3us,兩個寫時序間至少需要1us的恢復期 
         }
         DQ=1;//釋放數據線 
        }
        //**********************************讀出溫度數據
        uchar DS18B20_RD_CHAR() //先讀低位
        {
         uchar byte=0;
         for(num1=0;num1<8;num1++)
         {
          DQ=1;  
          _nop_();
          DQ=0;  //給個低脈沖 
          _nop_();
          DQ=1;
          for(num=0;num<5;num++);  //延時約15us,使主機在15us內采樣 
          byte>>=1;
          if(DQ==1)
           byte|=0x80;
          else
           byte|=0x00;
          for(num=0;num<1;num++);//延時3us,兩個讀時序之間必須有大于1us的恢復期
         }
         return (byte);
        }
        //*********************************溫度計算
        void DS18B20_WENDU()
        {
         uchar temperaturel=0,temperatureh=0;
         if(init_DS18B20()==0)
         {
          DS18B20_WR_CHAR(0xcc);
          DS18B20_WR_CHAR(0x44);
          delay1ms(1000);
          if(init_DS18B20()==0)
          {
           DS18B20_WR_CHAR(0xcc);
           DS18B20_WR_CHAR(0xBE);
           _nop_();
           temperaturel=DS18B20_RD_CHAR();
           temperatureh=DS18B20_RD_CHAR();
           temperature=(temperatureh*256+temperaturel)*0.625;
           init_DS18B20();
          }
          //return (temperature);   
         }
        }
        //******************************溫度顯示
        void display_DS18B20()  
        {
         temp[2]=temperature/100%10;
         temp[1]=temperature%100/10;
         temp[0]=temperature%10;
         
         DisplayListChar(0, 1, table0);
         DisplayOneChar(10, 1, ASCII[ temp[2] ] );
         DisplayOneChar(11, 1, ASCII[ temp[1] ]  );
         DisplayOneChar(12, 1, ASCII[10] );
         DisplayOneChar(13, 1, ASCII[ temp[0] ] );
        }
        //*******************************主函數
        main()
        {
         InitLCM();
         DisplayListChar(0,0,range);
         DisplayListChar(0,1,table0);
         while(1)
         {
          if( init_DS18B20()==0)  
              { 
            DS18B20_WENDU();
            display_DS18B20();    
          }
         }
        }
         

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