找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2576|回复: 2
收起左侧

ds18b20和lcd1602实现温度检测 若是有小数点该如何做? 求助帖

[复制链接]
ID:305649 发表于 2018-4-11 09:46 | 显示全部楼层 |阅读模式
/*
这是网上某位大神的程序,是用ds18b20和lcd1602实现温度检测。上课要用,小的有很多不明白之处,望大神们、发烧友们指点。
若是有小数点该如何做?

*/
#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忙碌状态
        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)  
{                          // 写入指令数据到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)  
{                          //设定显示位置
        lcd_wcmd(pos | 0x80);
}

lcd_wdat(BYTE dat)   
{                          //写入字符显示数据到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初始化设定  
        lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据
        delay(1);  
        lcd_wcmd(0x0c);          //显示开,关光标
        delay(1);  lcd_wcmd(0x06);          //移动光标
        delay(1);  lcd_wcmd(0x01);          //清除LCD的显示内容
        delay(1);
}   

void display( )
{        
        BYTE i;            
        lcd_wcmd(0x06);            //向右移动光标        
        lcd_pos(0);                //设置显示位置为第一行的第1个字符      
        i = 0;        
        while(dis1[ i ] != '\0')      
        {                           //显示字符"temperature"
                lcd_wdat(dis1[ i ]);        
                i++;         
                delay(5);                //控制两字之间显示速度      
        }        
        lcd_pos(0x40);             //设置显示位置为第二行第1个字符      
        i = 0;      
        while(disdata [ i ] != '\0')      
        {         
        lcd_wdat(disdata [ i ]);      //显示字符" WWW#PRECHIN#COM  "        
        i++;         
        delay(5);                //控制两字之间显示速度      
        }        
        delay(5);                //控制停留时间     
}   
/**************************DS18B20 程序 ***************************************/
void dsreset()//18B20复位,初始化函数
{   
        uint i;   
        ds=0;   
        i=103;   
        while(i>0)i--;   
        ds=1;   
        i=4;   
        while(i>0)i--;
}   

bit tempreadbit(void)   //读1位函数
{     
        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个字节
{   
BYTE i,j,dat;   
dat=0;   
for(i=1;i<=8;i++)   
        {      
        j=tempreadbit();      
        dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里   
        }   
        return(dat);
}   
void tempwritebyte(BYTE dat)   //向18B20写一个字节数据
{   
        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 开始获取温度并转换
{   
        dsreset();   
        delay(1);   
        tempwritebyte(0xcc);  // 写跳过读ROM指令   
        tempwritebyte(0x44);  // 写温度转换指令
}

uint get_temp()         //读取寄存器中存储的温度数据
{   
        BYTE a,b;     
        dsreset();   
        delay(1);   
        tempwritebyte(0xcc);   
        tempwritebyte(0xbe);   
        a=tempread();         //读低8位   
        b=tempread();         //读高8位   
        temp=b;   
        temp<<=8;            //两个字节组合为1个字   
        temp=temp|a;   
        temp = temp *(0.625);//温度值扩大10倍,精确到1位小数      
        return temp;         //temp是整型  
}
void ds1820disp(uint temp1)//温度值显示
{  
        disdata[0]= temp1 /1000+0x30;//百位数      
        disdata[1]= temp1 %1000/100+0x30;//十位数      
        disdata[2]= temp1%100/10+0x30;//个位数
        disdata[3]=0x2e;      
        disdata[4]= temp1 %10+0x30;//小数位
}     

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

回复

使用道具 举报

ID:301130 发表于 2018-4-11 18:50 | 显示全部楼层
        disdata[3]=0x2e;                disdata[4]= temp1 %10+0x30;//小数位 这个不就是显示的小数吗?
回复

使用道具 举报

ID:256174 发表于 2018-4-14 22:02 | 显示全部楼层
用STC15单片机写,给你看看。

DS18B20温度传感器.zip

27.68 KB, 下载次数: 15

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表