新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機-溫度傳感器DS18B20

        51單片機-溫度傳感器DS18B20

        作者: 時間:2016-12-02 來源:網絡 收藏
        DS18B20的寫0和寫1時序:
        DS18B20的讀數據時序:
        讀出光刻ROM中的ID號,在LCD上顯示:
        #include <reg52.h>
        #include<intrins.h>
        sbit DQ = P3^3;
        sbit RS = P1^0;
        sbit RW = P1^1;
        sbit E = P1^2;
        sbit bell = P3^4;
        #define uchar unsigned char
        #define uint unsigned int
        #define nop() _nop_()
        uint i;
        uchar value;
        uchar DS[8];
        uchar Time_Data[]={0,1,2,3,4,5,6,7,
        8,9,A,B,C,D,E,F};
        void delay(uchar t){
        while(--t);
        }
        void lcd_com(uchar s){
        RS = 0; //低電平,寫指令
        P2 = s; //傳數據
        delay(14); //看時序圖,數據需要穩定一段時間
        E = 1; //給一個高脈沖,發送命令
        delay(14); //如圖,高脈沖延時一段時間,確保命令發送
        E = 0; //發送結束E置為低電平
        }
        void lcd_data(uchar s){
        RS = 1;
        P2 = s;
        delay(14);
        E = 1;
        delay(14);
        E = 0;
        }
        void init_lcd(){
        RS = 1; //先發指令,在初始時刻RS是高,E和RW是低
        E = 0;
        RW = 0;
        lcd_com(0x38); //設置為16*2顯示,5*7點陣,8位數據接口
        lcd_com(0x0f); //開顯示,顯示光標,光標閃爍
        lcd_com(0x06); //讀寫一個字符后地址指針加一
        lcd_com(0x01);
        }
        void Display_lcd(uchar y, uchar x, uchar value){
        if(y)
        lcd_com(0x80+0x40+x); //如果y為1,寫在第二行
        else
        lcd_com(0x80+x);
        lcd_data(value); //寫到LCD602上
        }
        void DS18B20_reset(){
        DQ = 1; //開始的時候是高脈沖
        DQ=0; //然后是低脈沖
        i=103;
        while(i>0)i--; //低脈沖需要延遲一會兒
        DQ=1; //數據線拉高
        i=4;
        while(i>0)i--; //延時等待,若初始化成功則在15"60ms內產生一個由
        if(DQ == 0){ //DS18B20返回的低電平
        while(DQ == 0);
        // bell = 0;
        }
        else
        bell = 1;
        }
        uchar DS18B20_read(void)
        {
        uchar i = 0;
        uchar Value = 0;
        for(i = 0; i < 8; i ++)
        {
        DQ = 1;
        DQ = 0;
        delay(1);
        DQ = 1; //在T1時刻將總線拉高,產生讀時間隙
        delay(1); //讀時隙在T1和T2之間有效
        if(DQ)
        {
        Value |= 0x01 << i;
        }
        delay(17); //必須在T3時刻之間主機完成讀操作
        DQ = 1;
        nop();
        }
        return Value;
        }
        void DS18B20_write(uchar Value){
        for(i = 0; i < 8; i++){
        DQ = 1;
        DQ = 0; //當t0從高拉低產生寫時隙,
        delay(5);
        DQ = Value & 0x01; //必須在t0開始的15us內將數據送到總線上
        delay(20); //DS18B20在t0后的15us"60us內對總線采樣
        DQ = 1; //如果采到低電平則寫入0,高電平寫入1
        Value >>= 1;
        delay(2);

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 浑源县| 旌德县| 北流市| 临夏县| 诏安县| 伊宁市| 英德市| 萍乡市| 华宁县| 合阳县| 崇信县| 屯留县| 财经| 阿坝| 台北县| 九龙城区| 壶关县| 塘沽区| 青浦区| 郎溪县| 中超| 察雅县| 当涂县| 太原市| 册亨县| 建平县| 喜德县| 霍山县| 天峨县| 开原市| 偃师市| 平武县| 白沙| 泽州县| 新巴尔虎左旗| 黔江区| 延川县| 伊金霍洛旗| 宜宾县| 东乡| 白银市|