新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 自制51單片機常用頭文件(DS18B20)

        自制51單片機常用頭文件(DS18B20)

        作者: 時間:2016-11-10 來源:網絡 收藏
        /*--------------------------------------------------------------------------

        TEMPERATURE.H

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

        The user function is C51.
        Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
        All rights reserved.
        --------------------------------------------------------------------------*/
        #ifndef __TEMPERATURE_H__
        #define __TEMPERATURE_H__

        #define uchar unsigned char
        #define uint unsigned int

        sbit DQ = P3^3; // ds18b20單片機連接口

        uchar data Tp[8]; // 溫度顯示數據

        /******************************ds1820程序

        ***************************************/
        /*****************************************************
        函 數 名:void Delay_DS(uint useconds)
        功 能:DS18B20延時1微秒
        說 明:DS18B20時序延時
        入口參數:useconds
        返 回 值:無
        *****************************************************/
        //延時
        void Delay_DS(uint useconds)//延時1微秒
        {
        while (useconds--);
        }

        /*****************************************************
        函 數 名:void Ow_Reset()
        功 能:DS18B20復位
        說 明:DS18B20使用時先要復位
        入口參數:無
        返 回 值:
        *****************************************************/
        void Ow_Reset()
        {
        DQ = 1; // DQ復位
        Delay_DS(4); // 延時
        DQ = 0; // DQ拉低
        Delay_DS(100); // 精確延時大于480us
        DQ = 1; // 拉高
        Delay_DS(40);
        }

        /*****************************************************
        函 數 名:uchar Read_byte()
        功 能:從 1-wire 總線上讀取一個字節
        說 明:讀總線上的數據有嚴格的時序
        入口參數:
        返 回 值:value
        *****************************************************/
        uchar Read_byte()
        {
        uchar i = 0;
        uchar value = 0;

        for (i=8; i>0; i--)
        {
        DQ = 0; // 給脈沖信號
        value >>= 1;
        DQ = 1; // 給脈沖信號
        if(DQ)
        value |= 0x80;
        Delay_DS(10);
        }

        return (value);
        }

        /*****************************************************
        函 數 名:void Write_Byte()
        功 能:向 1-WIRE 總線上寫一個字節
        說 明:寫總線上的數據有嚴格的時序
        入口參數:val
        返 回 值:無
        *****************************************************/
        void Write_Byte(uchar val)
        {
        uchar i = 0;

        for (i=8; i>0; i--)
        {
        DQ = 0;
        DQ = val & 0x01;
        Delay_DS(10);
        DQ = 1;
        val >>= 1;
        }
        }

        /*****************************************************
        函 數 名:void Read_Temperature()
        功 能:讀溫度并放入顯示數組中
        說 明:
        入口參數:xx,yy
        返 回 值:無
        *****************************************************/
        void Read_Temperature()
        {
        uchar a,b;
        uchar tflag; // 溫度正負標志
        uint tvalue; // 溫度值

        Ow_Reset();
        Write_Byte(0xcc); // 跳過讀序列號*
        Write_Byte(0x44); // 啟動溫度轉換

        Ow_Reset();
        Write_Byte(0xcc); // 跳過讀序列號
        Write_Byte(0xbe); // 讀取溫度

        a = Read_byte(); // 讀出溫度低8位
        b = Read_byte(); // 讀出溫度高8位
        tvalue = b;
        tvalue <<= 8;
        tvalue = tvalue | a;

        if( tvalue < 0x0fff)
        {
        tflag = 0;
        }
        else
        {
        tvalue = ~tvalue + 1;
        tflag = 1;
        }

        tvalue = tvalue*(0.625); // 溫度值擴大10倍,精確到1位小數

        Tp[2] = tvalue%1000/100+0x30; // 十位數
        Tp[3] = tvalue%100/10+0x30; // 個位數
        Tp[4] = 0x2e; // 顯示小數點
        Tp[5] = tvalue%10+0x30; // 顯示溫度小數位
        Tp[6] = 0x01; // 顯示自定義字符
        Tp[7]= 0x43; // 顯示字符"C"

        if (tflag == 0)
        {
        Tp[1] = 0x20; // 正溫度不顯示符號
        }
        else
        {
        Tp[1] = 0x2d; // 負溫度顯示負號:-
        }
        if (Tp[2] == 0x30)
        {
        Tp[2] = 0x20; // 如果十位為0,不顯示
        }
        }

        /*****************************************************
        函 數 名:void Adjust_Res()
        功 能:溫度分辨率調整
        說 明:此函數可以對溫度的顯示進行精度調節.
        入口參數:res
        返 回 值:無
        *****************************************************/
        void Adjust_Res(char res) // res 分別等于 0x1f, 0x3f, 0x5f 溫度讀數分辨率分別對應
        // 0.5, 0.25, 0.125
        {
        Ow_Reset(); // 復位
        Write_Byte(0xcc); // 跳過Rom
        Write_Byte(0x4e); // 寫暫存器

        Write_Byte(0x02); // 寫TH
        Write_Byte(0x01); // 寫TL
        Write_Byte(res); // 溫度轉換分辨率設置

        Ow_Reset(); // 復位
        Write_Byte(0xcc); // 跳過Rom
        Write_Byte(0x48); // 把暫存器內容寫到EPRam中
        }

        #endif



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 叶城县| 拜泉县| 合川市| 德令哈市| 米易县| 昌图县| 平果县| 永德县| 沧源| 嘉定区| 横峰县| 澄城县| 原平市| 交城县| 卢湾区| 巴彦淖尔市| 炉霍县| 华亭县| 黔西县| 和平县| 兴业县| 同江市| 高雄县| 海晏县| 松潘县| 北宁市| 若尔盖县| 东平县| 固原市| 金湖县| 佛坪县| 博客| 夏津县| 南投县| 通州区| 鹤壁市| 荣昌县| 凭祥市| 隆回县| 保靖县| 田东县|