找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3011|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

ds18b20和lcd1602實(shí)現(xiàn)溫度檢測 若是有小數(shù)點(diǎn)該如何做? 求助帖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:305649 發(fā)表于 2018-4-11 09:46 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
/*
這是網(wǎng)上某位大神的程序,是用ds18b20和lcd1602實(shí)現(xiàn)溫度檢測。上課要用,小的有很多不明白之處,望大神們、發(fā)燒友們指點(diǎn)。
若是有小數(shù)點(diǎn)該如何做?

*/
#include <reg51.h>
#include <intrins.h>  
sbit ds=P3^3;//溫度傳感器信號(hào)線
typedef unsigned char BYTE;
typedef bit BOOL;   
typedef unsigned int uint;
sbit LCD_RS = P2^0;              
sbit LCD_RW = P2^1;
sbit LCD_EP = P2^2;
uint temp;  
BYTE code dis1[] = {"   temperature   "};
BYTE data disdata[5];

delay(int ms)  
{                           // 延時(shí)子程序
        int i;
        while(ms--)
        {   
        for(i = 0; i< 250; i++)   
                {     
                _nop_();   
                _nop_();            
                _nop_();   
                _nop_();   
                }
        }
}   
BOOL lcd_bz()  
{                          // 測試LCD忙碌狀態(tài)
        BOOL result;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_EP = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();  
        result = (BOOL)(P0 & 0x80);
        LCD_EP = 0; return result;  
}

lcd_wcmd(BYTE cmd)  
{                          // 寫入指令數(shù)據(jù)到LCD while(lcd_bz());
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_EP = 0;
        _nop_();
        _nop_();  
        P0 = cmd;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD_EP = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD_EP = 0;   
}

lcd_pos(BYTE pos)  
{                          //設(shè)定顯示位置
        lcd_wcmd(pos | 0x80);
}

lcd_wdat(BYTE dat)   
{                          //寫入字符顯示數(shù)據(jù)到LCD while(lcd_bz());
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_EP = 0;
        P0 = dat;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD_EP = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD_EP = 0;  
}   

lcd_init()  
{                        //LCD初始化設(shè)定  
        lcd_wcmd(0x38);          //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
        delay(1);  
        lcd_wcmd(0x0c);          //顯示開,關(guān)光標(biāo)
        delay(1);  lcd_wcmd(0x06);          //移動(dòng)光標(biāo)
        delay(1);  lcd_wcmd(0x01);          //清除LCD的顯示內(nèi)容
        delay(1);
}   

void display( )
{        
        BYTE i;            
        lcd_wcmd(0x06);            //向右移動(dòng)光標(biāo)        
        lcd_pos(0);                //設(shè)置顯示位置為第一行的第1個(gè)字符      
        i = 0;        
        while(dis1[ i ] != '\0')      
        {                           //顯示字符"temperature"
                lcd_wdat(dis1[ i ]);        
                i++;         
                delay(5);                //控制兩字之間顯示速度      
        }        
        lcd_pos(0x40);             //設(shè)置顯示位置為第二行第1個(gè)字符      
        i = 0;      
        while(disdata [ i ] != '\0')      
        {         
        lcd_wdat(disdata [ i ]);      //顯示字符" WWW#PRECHIN#COM  "        
        i++;         
        delay(5);                //控制兩字之間顯示速度      
        }        
        delay(5);                //控制停留時(shí)間     
}   
/**************************DS18B20 程序 ***************************************/
void dsreset()//18B20復(fù)位,初始化函數(shù)
{   
        uint i;   
        ds=0;   
        i=103;   
        while(i>0)i--;   
        ds=1;   
        i=4;   
        while(i>0)i--;
}   

bit tempreadbit(void)   //讀1位函數(shù)
{     
        uint i;   
        bit dat;     
        ds=0;i++;          //i++ 起延時(shí)作用   
        ds=1;i++;i++;   
        dat=ds;     
        i=8;
        while(i>0)i--;   
        return (dat);
}   
BYTE tempread(void)   //讀1個(gè)字節(jié)
{   
BYTE i,j,dat;   
dat=0;   
for(i=1;i<=8;i++)   
        {      
        j=tempreadbit();      
        dat=(j<<7)|(dat>>1);   //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在DAT里   
        }   
        return(dat);
}   
void tempwritebyte(BYTE dat)   //向18B20寫一個(gè)字節(jié)數(shù)據(jù)
{   
        uint i;   
        BYTE j;  
        bit testb;   
        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     
                {        
                        ds=0;       //寫 0      
                        i=8;while(i>0)i--;      
                        ds=1;      
                        i++;i++;
                }   
        }
}  

void tempchange(void)  //DS18B20 開始獲取溫度并轉(zhuǎn)換
{   
        dsreset();   
        delay(1);   
        tempwritebyte(0xcc);  // 寫跳過讀ROM指令   
        tempwritebyte(0x44);  // 寫溫度轉(zhuǎn)換指令
}

uint get_temp()         //讀取寄存器中存儲(chǔ)的溫度數(shù)據(jù)
{   
        BYTE a,b;     
        dsreset();   
        delay(1);   
        tempwritebyte(0xcc);   
        tempwritebyte(0xbe);   
        a=tempread();         //讀低8位   
        b=tempread();         //讀高8位   
        temp=b;   
        temp<<=8;            //兩個(gè)字節(jié)組合為1個(gè)字   
        temp=temp|a;   
        temp = temp *(0.625);//溫度值擴(kuò)大10倍,精確到1位小數(shù)      
        return temp;         //temp是整型  
}
void ds1820disp(uint temp1)//溫度值顯示
{  
        disdata[0]= temp1 /1000+0x30;//百位數(shù)      
        disdata[1]= temp1 %1000/100+0x30;//十位數(shù)      
        disdata[2]= temp1%100/10+0x30;//個(gè)位數(shù)
        disdata[3]=0x2e;      
        disdata[4]= temp1 %10+0x30;//小數(shù)位
}     

void main()  
{   
lcd_init();//初始化顯示   
while(1)
        {      
        tempchange();      
        ds1820disp(get_temp());//顯示   
        display();  
        }   
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:301130 發(fā)表于 2018-4-11 18:50 | 只看該作者
        disdata[3]=0x2e;                disdata[4]= temp1 %10+0x30;//小數(shù)位 這個(gè)不就是顯示的小數(shù)嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:256174 發(fā)表于 2018-4-14 22:02 | 只看該作者
用STC15單片機(jī)寫,給你看看。

DS18B20溫度傳感器.zip

27.68 KB, 下載次數(shù): 15

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表