新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機寫DS18B20的驅動

        51單片機寫DS18B20的驅動

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

        初始化操作方法:單片機先給總線一個高電平,略微延時,然后拉低總線,至少延時480us(我們取600us),然后拉高總線,等待15~60us的時間(我們取80us),此后DS18B20如果響應,則會發出0,拉低總線,否則為1,單片機檢測是否響應的時間在60~240us之內,之后釋放總線,程序如下:
        bit DS18B20_init()//初始化

        本文引用地址:http://www.104case.com/article/201611/320856.htm

        {
        uchar i;
        bit flag_response=0;
        DQ=1;
        _nop_();_nop_();
        DQ=0;
        delay_us(90); //延時600us
        DQ=1;
        delay_us(10); //延時80us
        for(i=0;i<15;i++)
        {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        if(!DQ)
        {
        flag_response=1;
        break;
        }
        }
        delay_us(63);//延時420us
        DQ=1;//釋放總線
        return(flag_response);
        }



        寫操作方法:由于是單總線,讀寫操作都分為寫0和寫1,從一個字節的最低位逐次往DS18B20里寫,先使總線產生一個由1到0的跳變,等待15us(我們取13us),然后判斷要寫的那位是1還是0,如果是1,則拉高總線,0則不去操作總線(因為總線開始產生跳變時已被拉低),等待45us(我們取64us)以后釋放總線(這段時間DS18B20會采樣,如上圖所示),程序如下:

        void DS18B20_write(uchar dat)//寫1個字節
        {
        uchar i;
        for(i=0;i<8;i++)
        {
        DQ=1;
        _nop_();_nop_();
        DQ=0;
        delay_us(1);//延時13us
        if(dat&0x01)
        DQ=1;
        delay_us(8);//延時64us
        DQ=1;//釋放總線
        dat>>=1;
        }
        }

        讀操作方法:使總線產生一個由1到0的跳變,等待1us,馬上拉高總線,等待大約12個us(datasheet推薦的采樣時間是快接近15us的時候,我們略微提前),單片機采樣,如果總線被拉低,則讀出的是0,否則就讀出1,然后延時45us以上(我們取55us)釋放總線;注意,讀也是從最低位開始的,這里讀出的0,1加到字節最高位,讀完后,最高位被移到最低位,實際上是右移了7次

        uchar DS18B20_read()//讀1個字節
        {
        uchar i,dat=0;
        for(i=0;i<8;i++)
        {
        dat>>=1;
        DQ=1;
        _nop_();_nop_();
        DQ=0;
        _nop_();
        DQ=1;
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//按datasheet上的推薦時序,略微提前
        if(DQ)
        dat|=0x80;
        delay_us(7); //延時55us
        DQ=1;
        }
        return dat;
        }



        關鍵詞: 51單片機DS18B20驅

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 布尔津县| 秀山| 陇南市| 太谷县| 巴彦淖尔市| 察雅县| 龙陵县| 右玉县| 莱西市| 雅江县| 景洪市| 湄潭县| 昌黎县| 汤原县| 梨树县| 镇赉县| 司法| 天津市| 吉木萨尔县| 文山县| 石阡县| 平乐县| 桐柏县| 巴彦县| 安平县| 故城县| 隆昌县| 抚州市| 玉门市| 开封市| 昭苏县| 高安市| 黄平县| 南澳县| 同江市| 龙岩市| 麻城市| 永寿县| 禄劝| 扎兰屯市| 隆安县|