久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 關于DS18B20程序 [打印本頁]

作者: omikeai    時間: 2018-6-23 15:54
標題: 關于DS18B20程序
直接上板子后,溫度一直顯示127
我只是試驗下,并沒有精確到小數點后面的
我用別人的程序,把接口都改成自己的,試驗可以的
那么我自己寫的程序哪里出錯了?DS18B20都搞了5天了還沒有搞懂
求大神指教

#include <reg52.h>
#include <intrins.h>
#include <string.h>


void ds18b20_init();
void ds18b20_write(char comde);
char ds18b20_read();
void ds18b20_wendu(char *wendu);
void Ds18b20_Busy_Check(void);


void lcd_1602_delay(char,char,char *);
void lcd_1602_write_comde(char comde);
void lcd_1602_write_date(char date);
void lcd_1602_busy();
void lcd_1602_init();
void Delay15ms();
void Delay5ms();
void Delay68us();
void Delay500us();

sbit RS = P2^5;
sbit RW = P2^6;
sbit E  = P2^4;
sbit DQ = P2^2;

char tmp[4]= {'0','0','0','\0'};

void main()
{
        lcd_1602_init();
        ds18b20_init();
        lcd_1602_delay(1,1,"ok!");

        while(1)
        {
                ds18b20_wendu(tmp);
                lcd_1602_delay(1,1,tmp);
        }
}

void lcd_1602_delay(char hang,char lie,char *str)
{
        char i,j,k,l;
        switch(hang)
        {
                case 1: i = 0x00; break;
                case 2: i = 0x40; break;
        }
        j = lie - 1;
        k = strlen(str);
        for(l=0;l<k;l++)
        {
                lcd_1602_write_comde(0x80+i+j+l);
                lcd_1602_write_date(str[l]);
        }       
}


void lcd_1602_init()
{
        Delay15ms();//延時15ms
        lcd_1602_write_comde(0x38);//寫指令38H  不檢測忙信號
        Delay5ms();//延時5ms
        lcd_1602_write_comde(0x38);//寫指令38H  不檢測忙信號
        Delay5ms();//延時5ms
        lcd_1602_write_comde(0x38);//寫指令38H  不檢測忙信號
        //以后每次寫指令、讀/寫數據操作之前均需要檢測忙信號
        lcd_1602_write_comde(0x38);//寫指令38H  顯示模式設置
        lcd_1602_write_comde(0x08);//寫指令08H  顯示關閉
        lcd_1602_write_comde(0x01);//寫指令01H  顯示清屏
        lcd_1602_write_comde(0x06);//寫指令06H  顯示光標移動設置
        lcd_1602_write_comde(0x0c);//寫指令0cH  顯示開及光標設置       
}



void Delay15ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 27;
        j = 226;
        do
        {
                while (--j);
        } while (--i);
}



void Delay5ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 9;
        j = 244;
        do
        {
                while (--j);
        } while (--i);
}



void lcd_1602_write_comde(char comde)
{
        lcd_1602_busy();
        RS = 0;
        RW = 0;
        E  = 0;
        _nop_();
        P0 = comde;
        _nop_();
        E  = 1;
        _nop_();
        E  = 0;
        _nop_();
}



void lcd_1602_write_date(char date)
{
        lcd_1602_busy();
        RS = 1;
        RW = 0;
        E  = 0;
        _nop_();
        P0 = date;
        _nop_();
        E  = 1;
        _nop_();
        E  = 0;
        _nop_();
}



void lcd_1602_busy()
{
        char tmp;
        P0 = 0xff;
        do{
                RS = 0;
                RW = 1;
                E  = 0;
                _nop_();
                E  = 1;
                _nop_();
                tmp = P0;
                _nop_();
                E  = 0;
                _nop_();
        }while(tmp & 0x80);       
}

void Delay68us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        i = 28;
        while (--i);
}


void Delay500us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        i = 227;
        while (--i);
}


void ds18b20_init()
{
        DQ = 0;
        Delay500us();
        DQ = 1;
        Delay68us();
        while(DQ);
        Delay500us();
}

void ds18b20_write(char comde)
{
        char i, flag;
        for(i=0;i<8;i++)
        {
                flag = comde & 0x01;
                comde >>= 1;
                if(flag)
                {
                        DQ = 0;
                        Delay68us();
                        DQ = 1;
                        _nop_();
                        _nop_();       
                }
                else
                {
                        DQ = 0;
                        _nop_();
                        _nop_();
                        DQ = 1;
                        Delay68us();
                }
//                comde >>= 1;   //修改
        }
}


char ds18b20_read()
{
        char i,flag;
        char date = 0x00;
        for(i=0;i<8;i++)
        {
//                date >>= 1;
                DQ = 0;
                _nop_();
                _nop_();
                DQ = 1;
                _nop_();
                _nop_();
                flag = DQ;
//                if(DQ) date|=0x80;
//                Delay68us();
                date = (flag << 7) | (date >> 1);
        }
        return date;
}


void ds18b20_wendu(char *wendu)
{
       
        char du,low,high;

        ds18b20_init();
        ds18b20_write(0xcc);
        ds18b20_write(0x44);
        Ds18b20_Busy_Check();
        ds18b20_init();
        ds18b20_write(0xcc);
        ds18b20_write(0xbe);

        low = ds18b20_read();
        high = ds18b20_read();
        low >>= 4;
        du = high * 16 + low;
       
        *(wendu+0) = du/100+0x30;
        *(wendu+1) = du%100/10+0x30;
        *(wendu+2) = du%100%10+0x30;         
}


void Ds18b20_Busy_Check(void){
        bit flag; //0-busy 1-done
        do{
                DQ = 0;
                _nop_();
                _nop_();
                DQ = 1;
                _nop_();
                _nop_();
                flag = DQ;
                Delay68us();               
        }while(!flag);
}


作者: chaoself    時間: 2018-6-23 16:51
你沒有做溫度數據處理吧
作者: feiji666    時間: 2018-6-23 17:25
是做溫度傳感器?
作者: zl2168    時間: 2018-6-23 18:34
本帖最后由 zl2168 于 2018-6-23 18:35 編輯

實例97  一線式DS18B20測溫
⒈ DS18B20簡介
⑴ 內部組織結構    …
⑵ 操作步驟和操作指令    …
⒉ 電路設計    …
⒊ 程序設計    …
⒋ Keil調試    …
⒌ Proteus仿真    …

Proteus仿真一下,確認有效。 實例97 DS18B20測溫.rar (51.78 KB, 下載次數: 12)
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。

作者: yzy19780608    時間: 2018-6-23 18:43
這個DS18b20的我運行成功了,你可以參考下

DS18b20.docx

12.22 KB, 下載次數: 18


作者: ahshmj    時間: 2018-6-23 21:57
你可以自己測試一下。給ds18b20加以大的溫差,看看數字會否變化,如果變化,檢查一下數據轉換程序。否則問題就廣泛了。軟硬件的問題都有可能。
作者: zhb2004xp    時間: 2018-6-23 23:47
我今天也碰到這個問題,在protues仿真沒問題,實際硬件不能正常讀取。
你試試在char ds18b20_read()子函數中
               DQ = 0;
                _nop_();
                _nop_();
                DQ = 1;
DQ=0和DQ=1中延時加大到15us或以上
作者: omikeai    時間: 2018-6-25 09:05
感謝大家的幫忙,我最后找到問題了,是void ds18b20_write(char comde)函數里的寫1和0搞錯了,把寫0和寫1的內容互換下就好了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 992人人草 | 一级免费毛片 | 成人亚洲网站 | 人人爽日日躁夜夜躁尤物 | 午夜精品久久久久久久久久久久久 | 欧洲一区在线观看 | 爱爱视频在线观看 | 国产一区二区在线免费播放 | 国产在线资源 | 国产亚洲网站 | 精品视频网 | 亚洲精品91 | 国产ts一区 | 日韩中文字幕一区二区 | 99久久夜色精品国产亚洲96 | 国产污视频在线 | 精品欧美一区二区三区久久久 | 99福利在线观看 | 一区二区三区免费网站 | 在线观看国产视频 | 91香蕉视频在线观看 | 丁香婷婷综合激情五月色 | 午夜久久久久久久久久一区二区 | 国产精品国产精品国产专区不片 | 午夜精品久久久久久久99黑人 | 国产免费色 | 91一区二区三区在线观看 | 久久久久久久久国产 | 亚洲视频在线免费观看 | 亚洲视频一区二区三区 | 中文字幕欧美一区二区 | 91看片免费版 | 97精品视频在线观看 | 国产精品一区二区三区久久久 | 日韩精品免费播放 | 欧美一级欧美三级在线观看 | 91高清在线视频 | 国产日韩精品视频 | 亚洲精品在线视频 | 日韩人体视频 | 国产精品美女久久久 |