新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > DS18B20溫度傳感器64位ROM地址讀取(STC89C52)

        DS18B20溫度傳感器64位ROM地址讀取(STC89C52)

        作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
        最近在做一個溫度監(jiān)測系統(tǒng),采用DS18B20數(shù)字溫度傳感器,要用到64位ROM地址匹配,在網(wǎng)上查了一些資料,編寫了DS18b20的64位ROM地址讀取的程序,LCD1602顯示。分享給大家,有什么不足請大家留言。

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

        程序代碼:

        #include

        #defineucharunsignedchar

        #defineuintunsignedint

        sbitlcdrw=P1^1;//LCD1602讀/寫選擇H/L

        sbitlcdrs=P1^0;//LCD1602數(shù)據(jù)/命令選擇H/L

        sbitlcden=P2^5;//LCD1602使能

        sbitds=P2^2;//溫度傳感器信號線

        ucharcodetable[]="NO.1:.C";

        ucharcodetable1[]="";

        uchardatafCode[8];

        inttemp;//整型溫度數(shù)據(jù)

        floatf_temp;//浮點型溫度數(shù)據(jù)

        uchartflag;//溫度正負(fù)標(biāo)志

        //*****************LCD1602*******************************

        voiddelay(uintz)//延時函數(shù)延時z毫秒

        {

        uintx,y;

        for(x=z;x>0;x--)

        for(y=110;y>0;y--);

        }

        voidwrite_com(ucharcom)//lcd1602寫指令

        {

        lcdrs=0;

        P0=com;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

        }//lcd1602寫數(shù)據(jù)

        voidwrite_date(uchardate)

        {

        lcdrs=1;

        P0=date;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

        }

        voidinit1602()//初始化LCD1602

        {

        uchari;

        lcdrw=0;

        lcden=0;

        write_com(0x38);

        write_com(0x0c);

        write_com(0x06);

        write_com(0x01);

        write_com(0x80);

        for(i=0;i<13;i++)

        {

        write_date(table[i]);

        delay(5);

        }

        write_com(0x80+0x40);

        for(i=0;i<13;i++)

        {

        write_date(table1[i]);

        delay(5);

        }

        write_com(0x80+11);

        write_date(0xdf);

        write_com(0x80+0x40+11);

        write_date(0xdf);

        }

        //*******************DS18B20****************************

        voiddsreset()//DS18B20復(fù)位,初始化函數(shù)

        {

        uinti;

        ds=0;

        i=103;

        while(i>0)

        i--;

        ds=1;

        i=4;

        while(i>0)

        i--;

        }

        bittempreadbit()//讀一位數(shù)據(jù)函數(shù)

        {

        uinti;

        bitdat;

        ds=0;

        i++;

        ds=1;

        i++;

        i++;

        dat=ds;

        i=8;

        while(i>0)

        i--;

        returndat;

        }

        uchartempread()//讀一字節(jié)數(shù)據(jù)函數(shù)

        {

        uchari,j,dat;

        dat=0;

        for(i=1;i<=8;i++)

        {

        j=tempreadbit();

        dat=(j<<7)|(dat>>1);

        }

        returndat;

        }

        voidtempwrite(uchardat)//向DS18B20寫一字節(jié)數(shù)據(jù)函數(shù)

        {

        uinti;

        ucharj;

        bittestb;

        for(j=1;j<=8;j++)

        {

        testb=dat&0x01;

        dat=dat>>1;

        if(testb)//寫1

        {

        ds=0;

        i++;i++;

        ds=1;

        i=8;

        while(i>0)

        i--;

        }

        else//寫0

        {

        ds=0;

        i=8;

        while(i>0)

        i--;

        ds=1;

        i++;i++;

        }

        }

        }

        voidtempchange()//DS18B20開始獲取溫度并轉(zhuǎn)換

        {

        dsreset();

        delay(1);

        tempwrite(0xcc);//寫跳過讀ROM指令

        tempwrite(0x44);//寫溫度轉(zhuǎn)換指令

        }

        uintget_temp()

        {

        uchara,b;

        dsreset();

        delay(1);

        tempwrite(0xcc);//寫“跳過讀ROM”指令

        tempwrite(0xbe);//寫“讀內(nèi)部RAM中9字節(jié)的溫度數(shù)據(jù)”指令

        a=tempread();//讀高8位

        b=tempread();//讀低8位

        temp=b;

        temp<<=8;

        temp=temp|a;//兩個字節(jié)合為一個字節(jié)

        if(temp<0x0fff)

        tflag=0;//正值標(biāo)識符

        else

        {

        temp=~temp+1;

        tflag=1;//負(fù)值標(biāo)識符

        }

        f_temp=temp*0.0625;//溫度在寄存器中為12位,分辨路為0.0625

        temp=f_temp*10+0.5;//乘以10表示小數(shù)點后面只取一位,加0.5是四舍五入

        //f_temp=f_temp+0.05;

        returntemp;//temp是整型

        }

        voidwrite_wendu(ucharaddress,uchardate)//寫溫度

        {

        write_com(address);

        write_date(date);

        }

        voiddisplay()//顯示函數(shù)

        {

        uintw1,w2,w3,w4;

        w1=get_temp()/1000;//百位

        w2=get_temp()00/100;//十位

        w3=get_temp()0/10;//個位

        w4=get_temp();//小數(shù)點位

        if(tflag==0)

        write_wendu(0x80+5,0x20);//不顯示正號

        else

        write_wendu(0x80+5,0x2d);//顯示負(fù)號

        if(w1==0)

        {

        write_wendu(0x80+6,0x20);//百位為0,不顯示

        if((w1==0)&&(w2==0))

        write_wendu(0x80+7,0x20);//百位,十位都為0,不顯示

        else

        write_wendu(0x80+7,0x30+w2);

        write_wendu(0x80+8,0x30+w3);

        write_wendu(0x80+10,0x30+w4);

        }

        else

        {

        write_wendu(0x80+6,0x30+w1);

        write_wendu(0x80+7,0x30+w2);

        write_wendu(0x80+8,0x30+w3);

        write_wendu(0x80+10,0x30+w4);

        }

        }

        voidDispCode()//讀取ROM

        {

        uinti,xulie;

        dsreset();

        delay(1);

        tempwrite(0x33);

        for(i=0;i<8;i++)

        {

        fCode[i]=tempread();

        }

        write_com(0x80+0x40);

        for(i=0;i<8;i++)

        {

        xulie=fCode[i]>>4;//顯示高四位

        xulie=xulie*1.0;

        if(xulie<10)

        write_date(0x30+xulie);

        else

        write_date(0x37+xulie);

        xulie=fCode[i]&0x0f;//顯示低四位

        xulie=xulie*1.0;

        if(xulie<10)

        write_date(0x30+xulie);

        else

        write_date(0x37+xulie);

        }

        }

        //************************************************

        voidmain()//主函數(shù)

        {

        init1602();

        DispCode();

        while(1)

        {//searchrom();

        tempchange();

        display();

        }

        }



        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 青海省| 武宁县| 柳江县| 伊宁市| 通榆县| 塔城市| 弋阳县| 台南市| 定南县| 湟源县| 南投县| 浮梁县| 佛山市| 东莞市| 泾阳县| 聂拉木县| 类乌齐县| 甘孜县| 盐边县| 四川省| 宜都市| 莱阳市| 南和县| 景东| 宁南县| 金湖县| 澄城县| 太康县| 乌鲁木齐县| 文成县| 延安市| 舟山市| 罗定市| 巴青县| 滦平县| 宜兴市| 常德市| 黄龙县| 工布江达县| 吉林市| 江西省|