新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機ds18b20配合1602屏顯示溫度

        51單片機ds18b20配合1602屏顯示溫度

        作者: 時間:2016-12-01 來源:網絡 收藏
        1、效果圖

        2、代碼
        3、小結重點

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


        效果圖:直接在51單片機開發板上面實現的.


        代 碼
        #include
        #include
        sbit RS = P2^4; //定義端口
        sbit RW = P2^5;
        sbit EN = P2^6;
        sbit DQ = P2^0; //定義總線的I/O管腳
        void SendByte(unsigned char dat);
        void zf_1602(unsigned char x,unsigned char y,unsigned dat);
        void Delay4us() //延時4us
        {
        ;
        }
        void Delay(unsigned char j) //一個循環15us
        {
        unsigned char i;
        while(j--)
        {
        i = 5;
        while (--i);
        }
        }
        bit d18b20_qs() //18b20 起始
        {
        bit dat;
        DQ = 1; //DQ復位
        Delay4us();
        DQ = 0; //拉低總線
        Delay(35); //這里延時大概 525us
        DQ = 1; //拉高總線
        Delay(2); //這里延時大概 30us
        dat = DQ; //讀取返回值(0:有18b20存在 1:是沒有)
        Delay(2);
        return dat; //返回數值
        }
        void d18b20_x(unsigned char dat) //寫 8 位 數 據
        {
        unsigned char i;
        for(i=0;i<8;i++) //8位計數器
        {
        DQ = 0; //拉低總線
        DQ = dat & 0x01; //取最低位賦值給總線
        Delay(3); //延時45us
        DQ = 1; //拉過總線準備寫下一個數據(或者總線復位)
        dat >>= 1; //數據右移一位
        }
        }
        unsigned char d18b20_d() //讀 8 位 數 據
        {
        unsigned char i,dat=0;
        for(i=0;i<8;i++) //8位計數器
        {
        DQ = 0; //拉低總線
        dat >>= 1; //數據右移一位
        DQ = 1; //拉過總線(準備讀取數據)
        if(DQ) //判斷是否是 1 如果是就把數據賦值給變量的高位
        dat |= 0x80;
        Delay(4);
        }
        return dat; //返回讀取到數據數據
        }

        unsigned int wd() //讀取溫度函數
        {
        unsigned char i = 0; //低8位數據
        unsigned char j = 0; //高8位數據
        unsigned int k = 0; //無符號16整形用來存儲讀回來的 16位溫度數據(j和i組合后的數據)
        d18b20_qs(); //初始化
        d18b20_x(0xCC); //跳過序列號的操作(因為18b20在總線上可以掛很多個,這個序列號和網卡MAC地址類似)
        d18b20_x(0x44); //開啟溫度轉換
        Delay(200); //開啟溫度轉換需要時間這里延時一下

        d18b20_qs(); //初始化
        d18b20_x(0xCC); //跳過序列號的操作(因為18b20在總線上可以掛很多個,這個序列號和網卡MAC地址類似)
        d18b20_x(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
        i = d18b20_d(); //讀取低8位
        j = d18b20_d(); //讀取高8位
        k = j;
        k <<= 8;
        k = k + i;
        return k; //返回讀取到的16位數據
        }
        void zh(unsigned int i) //1602顯示緩存寫入函數
        {
        unsigned char x,z;
        x = i & 0x0f; //取出小數
        i >>=4;
        switch(x) //小數位轉換
        {
        case 0: z=0;break;
        case 1: z=1;break;
        case 2: z=1;break;
        case 3: z=2;break;
        case 4: z=3;break;
        case 5: z=3;break;
        case 6: z=4;break;
        case 7: z=4;break;
        case 8: z=5;break;
        case 9: z=6;break;
        case 10: z=6;break;
        case 11: z=7;break;
        case 12: z=8;break;
        case 13: z=8;break;
        case 14: z=9;break;
        case 15: z=9;break;
        }
        z = z +48; //轉換成ascii碼
        zf_1602(5,1,z); //寫入1602緩存
        z = i & 0xff; //取出整數
        x = z/10; //取出十位
        x= x+48; //轉換成ascii碼
        zf_1602(2,1,x); //寫入1602緩存
        x = z%10; //取出個位
        x= x+48; //轉換成ascii碼
        zf_1602(3,1,x); //寫入1602緩存
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 淮南市| 宣恩县| 盱眙县| 阳泉市| 阿拉善左旗| 醴陵市| 繁峙县| 青神县| 安图县| 马尔康县| 鄂托克前旗| 沁源县| 松阳县| 乐至县| 江北区| 通化市| 博客| 同德县| 通渭县| 德令哈市| 都安| 商洛市| 浦北县| 华阴市| 株洲市| 宝应县| 从江县| 桂平市| 安新县| 南涧| 新宁县| 德清县| 曲麻莱县| 禹城市| 大姚县| 扎兰屯市| 固镇县| 平乐县| 尼木县| 石景山区| 新昌县|