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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3002|回復: 2
收起左側(cè)

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

[復制鏈接]
ID:305649 發(fā)表于 2018-4-11 09:46 | 顯示全部樓層 |閱讀模式
/*
這是網(wǎng)上某位大神的程序,是用ds18b20和lcd1602實現(xiàn)溫度檢測。上課要用,小的有很多不明白之處,望大神們、發(fā)燒友們指點。
若是有小數(shù)點該如何做?

*/
#include <reg51.h>
#include <intrins.h>  
sbit ds=P3^3;//溫度傳感器信號線
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)  
{                           // 延時子程序
        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點陣,8位數(shù)據(jù)
        delay(1);  
        lcd_wcmd(0x0c);          //顯示開,關(guān)光標
        delay(1);  lcd_wcmd(0x06);          //移動光標
        delay(1);  lcd_wcmd(0x01);          //清除LCD的顯示內(nèi)容
        delay(1);
}   

void display( )
{        
        BYTE i;            
        lcd_wcmd(0x06);            //向右移動光標        
        lcd_pos(0);                //設(shè)置顯示位置為第一行的第1個字符      
        i = 0;        
        while(dis1[ i ] != '\0')      
        {                           //顯示字符"temperature"
                lcd_wdat(dis1[ i ]);        
                i++;         
                delay(5);                //控制兩字之間顯示速度      
        }        
        lcd_pos(0x40);             //設(shè)置顯示位置為第二行第1個字符      
        i = 0;      
        while(disdata [ i ] != '\0')      
        {         
        lcd_wdat(disdata [ i ]);      //顯示字符" WWW#PRECHIN#COM  "        
        i++;         
        delay(5);                //控制兩字之間顯示速度      
        }        
        delay(5);                //控制停留時間     
}   
/**************************DS18B20 程序 ***************************************/
void dsreset()//18B20復位,初始化函數(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++ 起延時作用   
        ds=1;i++;i++;   
        dat=ds;     
        i=8;
        while(i>0)i--;   
        return (dat);
}   
BYTE tempread(void)   //讀1個字節(jié)
{   
BYTE i,j,dat;   
dat=0;   
for(i=1;i<=8;i++)   
        {      
        j=tempreadbit();      
        dat=(j<<7)|(dat>>1);   //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在DAT里   
        }   
        return(dat);
}   
void tempwritebyte(BYTE dat)   //向18B20寫一個字節(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()         //讀取寄存器中存儲的溫度數(shù)據(jù)
{   
        BYTE a,b;     
        dsreset();   
        delay(1);   
        tempwritebyte(0xcc);   
        tempwritebyte(0xbe);   
        a=tempread();         //讀低8位   
        b=tempread();         //讀高8位   
        temp=b;   
        temp<<=8;            //兩個字節(jié)組合為1個字   
        temp=temp|a;   
        temp = temp *(0.625);//溫度值擴大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;//個位數(shù)
        disdata[3]=0x2e;      
        disdata[4]= temp1 %10+0x30;//小數(shù)位
}     

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

回復

使用道具 舉報

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

使用道具 舉報

ID:256174 發(fā)表于 2018-4-14 22:02 | 顯示全部樓層
用STC15單片機寫,給你看看。

DS18B20溫度傳感器.zip

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

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 夜夜爽99久久国产综合精品女不卡 | 久久精品久久久 | 亚洲人成网亚洲欧洲无码 | 97人人澡人人爽91综合色 | 日韩在线一区二区 | 亚洲二区视频 | 欧美日韩综合精品 | 亚洲精品91| 超碰在线人人 | 日韩在线播放网址 | 国产免费观看一区 | 国产成人精品一区二区三区视频 | 国产精品一区二区三区免费观看 | 欧美激情亚洲天堂 | 自拍偷拍第一页 | av免费电影在线 | 久久久国产一区二区三区 | 少妇久久久久 | 国产精品视频导航 | 男女在线免费观看 | av一区二区三区四区 | 亚洲日日夜夜 | 在线只有精品 | 亚洲国产精品va在线看黑人 | 亚洲精品一二三区 | av中文在线观看 | 日日夜精品视频 | 很黄很污的网站 | 色伊人| 亚洲天堂一区 | 亚洲播放一区 | 日本成人区 | 中文字幕成人在线 | 91日b| 国产成人精品一区二区三区视频 | 三级免费| 久久夜视频 | 久热伊人 | 亚洲欧美另类在线 | 久久精彩视频 | 99久久久无码国产精品 |