请大神帮我看一下为什么这个DS18B20测温显示的温度不变啊

2019-07-15 14:15发布

本帖最后由 annyW 于 2016-4-25 19:25 编辑

#include "STC15F2K60S2.H"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uint temp1; //整型的温度数据
uint temp2; //整型的温度数据

sbit DS1=P0^5; //DS18B20温度传感器1的接口信号
sbit DS2=P0^2; //DS18B20温度传感器2的接口信号                                                           z
sbit rs=P4^0;    //1602的数据/指令选择控制线
sbit rw=P4^1;        //1602的读写控制线
sbit en=P4^2;        //1602的使能控制线
sbit lcdsel=P4^3;

uchar code table[]="Difference:";//温度差


void delayms(unsigned int xms)//延时函数,单位ms
{
        unsigned int i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}


void write_com(unsigned char com)//写命令
{
rs=0;            //选择指令寄存器
    rw=0;            //选择写
    P2=com;            //把命令字送入P2
    delayms(5);            //延时一小会儿,让1602准备接收数据
    en=1;           //使能线电平变化,命令送入1602的8位数据口
    en=0;
}

void write_data(unsigned char dat)//写数据
{        rs=1;        //选择数据寄存器
    rw=0;        //选择写
    P2=dat;        //把要显示的数据送入P2
   delayms(5);        //延时一小会儿,让1602准备接收数据
    en=1;        //使能线电平变化,数据送入1602的8位数据口
    en=0;
}

void init_lcd()//液晶初始化
{
write_com(0x38);       //8位数据,双列,5*7字形      
   write_com(0x0c);      //开启显示屏,关光标,光标不闪烁
    write_com(0x06);    //显示地址递增,即写一个数据后,显示位置右移一位
   write_com(0x01);    //清屏
}

        

void dsreset1(void) //DS18B201发送初始化及复位信号
{
        uint i; //DS18B20 初始化
        DS1=0;//DS18B20温度传感器1 初始化
        i=103;
        while(i>0)i--;
        DS1=1;
        i=4;
        while(i>0)i--;
}

void dsreset2(void) //DS18B202发送初始化及复位信号
{
        uint i; //DS18B20 初始化
        DS2=0;//DS18B20温度传感器2 初始化
        i=103;
        while(i>0)i--;
        DS2=1;
        i=4;
        while(i>0)i--;
}

bit tmpreadbit1(void) //DS18B20温度传感器1读一位数据
{
        uint i;
        bit dat1;
        DS1=0;i++; //i++ for delay 小延时一下
        DS1=1;i++;i++;
        dat1=DS1;
        i=8;
        while(i>0)i--;
        return (dat1);
}

bit tmpreadbit2(void) //DS18B20温度传感器2读一位数据
{
        uint i;
        bit dat2;
        DS2=0;i++; //i++ for delay 小延时一下
        DS2=1;i++;i++;
        dat2=DS2;
        i=8;
        while(i>0)i--;
        return (dat2);
}

uchar tmpread1(void) //DS18B20温度传感器1读一个字节
{
        uchar i,j,dat1;
        dat1=0;
        for(i=1;i<=8;i++)
        {
                j=tmpreadbit1();
                dat1=(j<<7)|(dat1>>1);
//读出的数据最低位在最前面,这样刚好一个字节在DAT里
        }
        return(dat1); //将一个字节数据返回
}

uchar tmpread2(void) //DS18B20温度传感器2读一个字节
{
        uchar i,j,dat2;
        dat2=0;
        for(i=1;i<=8;i++)
        {
                j=tmpreadbit2();
                dat2=(j<<7)|(dat2>>1);
//读出的数据最低位在最前面,这样刚好一个字节在DAT里
        }
        return(dat2); //将一个字节数据返回
}

void tmpwritebyte1(uchar dat1) //DS18B20温度传感器1写一个字节到DS18B20里
{
        uint i;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
                testb=dat1&0x01;
                dat1=dat1>>1;
                if(testb) //写1 部分
                {
                        DS1=0;
                        i++;i++;
                        DS1=1;
                        i=8;while(i>0)i--;
                }
                else
                {
                        DS1=0; //写0 部分
                        i=8;while(i>0)i--;
                        DS1=1;
                        i++;i++;
                }
        }
}

void tmpwritebyte2(uchar dat2) //DS18B20温度传感器2写一个字节到DS18B20里
{
        uint i;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
                testb=dat2&0x01;
                dat2=dat2>>1;
                if(testb) //写1 部分
                {
                        DS2=0;
                        i++;i++;
                        DS2=1;
                        i=8;while(i>0)i--;
                }
                else
                {
                        DS2=0; //写0 部分
                        i=8;while(i>0)i--;
                        DS2=1;
                        i++;i++;
                }
        }
}

void tmpchange1(void) //DS18B20温度传感器1发送温度转换命令
{
        dsreset1(); //初始化DS18B20-1
        delayms(2); //延时
        tmpwritebyte1(0xcc); // 温度传感器1跳过读序列号命令
        tmpwritebyte1(0x44); //温度传感器1发送温度转换命令
}

void tmpchange2(void) //DS18B20温度传感器2发送温度转换命令
{
        dsreset2(); //初始化DS18B20-2
        delayms(2); //延时
        tmpwritebyte2(0xcc); // 温度传感器2跳过读序列号命令
        tmpwritebyte2(0x44); //温度传感器2发送温度转换命令
}


uint tmp1() //读取DS18B20温度传感器1寄存器中存储的温度数据
{
        float tt;
        uchar a,b;
        dsreset1();
        delayms(2);
        tmpwritebyte1(0xcc);
        tmpwritebyte1(0xbe); //发送读取数据命令
        a=tmpread1(); //连续读两个字节数据,读取低8位
        b=tmpread1(); //读取高8位
        temp1=b;
        temp1<<=8;    //两字节合成一个整型变量。
        temp1=temp1|a;
        tt=temp1*0.0625; //得到真实十进制温度值,因为DS18B20
        //在寄存器中默认是12位,可以精确到0.0625 度,
        //所以读回数据的最低位代表的是0.0625 度。
        temp1=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位
        //也转换为可显示数字,同时进行一个四舍五入操作。
        return temp1; //返回温度值
}

uint tmp2() //读取DS18B20温度传感器2寄存器中存储的温度数据
{
        float tt;
        uchar a,b;
        dsreset2();
        delayms(2);
        tmpwritebyte2(0xcc);
        tmpwritebyte2(0xbe); //发送读取数据命令
        a=tmpread2(); //连续读两个字节数据,读取低8位
        b=tmpread2(); //读取高8位
        temp2=b;
        temp2<<=8;    //两字节合成一个整型变量。
        temp2=temp2|a;
        tt=temp2*0.0625; //得到真实十进制温度值,因为DS18B20
        //在寄存器中默认是12位,可以精确到0.0625 度,
        //所以读回数据的最低位代表的是0.0625 度。
        temp2=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位
        //也转换为可显示数字,同时进行一个四舍五入操作。
        return temp2; //返回温度值
}





void display(uint temp1,uint temp2) //LCD1602液晶屏显示程序
{
        uchar A1,A2,A2t,A3,ser,B1,B2,B2t,B3,C1,C2,C2t,C3,C,num;
        init_lcd();

        ser=temp1/10; //分离出三位要显示的数字
        SBUF=ser;
        A1=temp1/100;//十位数字
        A2t=temp1%100;
        A2=A2t/10;//个位数字
        A3=A2t%10;//小数位数字

        write_com(0x80);
        write_data('A');//显示A点温度
        write_com(0x81);
        write_data(':');//显示冒号
        write_com(0x82);
        write_data(A1+0x30);//显示十位
        write_com(0x83);
        write_data(A2+0x30);//显示个位
        write_com(0x84);
        write_data('.');//显示小数点
        write_com(0x85);
        write_data(A3+0x30);//显示小数位

        ser=temp2/10; //分离出三位要显示的数字
        SBUF=ser;
        B1=temp2/100;//十位数字
        B2t=temp2%100;
        B2=B2t/10;//个位数字
        B3=B2t%10;//小数位数字

        write_com(0x80+8);
        write_data('B');//显示B点温度
        write_com(0x81+8);
        write_data(':');//显示冒号
        write_com(0x82+8);
        write_data(B1+0x30);//显示十位
        write_com(0x83+8);
        write_data(B2+0x30);//显示个位
        write_com(0x84+8);
        write_data('.');//显示小数点
        write_com(0x85+8);
        write_data(B3+0x30);//显示小数位

//两点温度之差显示程序
        if(temp2>temp1)//判断大小,确保温度差数值为正
                C=temp2-temp1;
        else
                C=temp1-temp2;

        ser=C/10;
        SBUF=ser;
        C1=C/100;
        C2t=C%100;
        C2=C2t/10;//个位数字
        C3=C2t%10;//小数位数字

        write_com(0x80+40);
        for(num=0;num<11;num++)
                write_data(table[num]);//显示两点温度差
        write_com(0x80+51);
        write_data(C2+0x30);//显示个位
        write_com(0x80+52);
        write_data('.');//显示小数点
        write_com(0x80+53);
        write_data(C3+0x30);//显示小数位
}



void main() //主函数
{         uchar n,m=0;
        P4M1=0x00;
        P4M0=0x00;
        P2M0=0xff;
        P2M1=0x00;        //将P2设为推挽   
        
do
        {
                tmpchange1(); //温度传感器1的温度转换函数
                tmpchange2(); //温度传感器2的温度转换函数
        //        deal(temp1,temp2); //进行温度处理
                display(tmp1(),tmp2());//调用温度显示函数,起到延时作用
        }
        
         
    while(1);        //动态停机
                 
         


}



请大神帮忙看一下,真的是十分感谢。。。。。。虽然我只有一个积分

20160425_192040.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。