8051单片机控制DS18B20温度传感器,用1602显示,不知道怎么弄得温度值不变,麻烦大家帮忙看看,谢谢了!

2019-07-15 09:17发布

#include<reg51.h>//程序没有调成功!!
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int       
sbit dq=P3^7;//18b20的数据口
sbit rw=P2^5;
sbit rs=P2^6;
sbit lcden=P2^7;

void delay(uchar z)
{
        uchar x;
        for(x=0;x<z;x++);
}
void delayus(uint x,uchar y)
{
        uint i;
        uchar j;
        for(i=x;i>0;i--);
        for(j=y;j>0;j--);
}
void delay1(uchar z)
{
        uchar x,y;
        for(x=0;x<z;x++)
                for(y=110;y>0;y--);
}
void init18b20()//18b20初始化
{
        dq=1;
        _nop_();_nop_();
        dq=0;
        delay(80);
        dq=1;
        delay(5);
       
               
}
void write_18b20(uchar byte)//18b20写一个字节
{
        uchar x,temp;
        dq=1;
        _nop_();_nop_();
        for(x=0;x<8;x++)
        {
                temp=byte&0x01;
                dq=0;
                delayus(0,0);                
                if(temp==1)
                        dq=1;//释放总线(因为有上拉电阻,为高时时释放总线状态)
                delayus(2,2);
                dq=1;
                byte=byte>>1;               
        }
}
uchar read_18b20()//18b20读一个字节
{
        uchar x,temp,date;


        for(x=0;x<8;x++)
        {
                date=date>>1;
                dq=1;
                _nop_();_nop_();
                dq=0;
                _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
                dq=1;
                _nop_();_nop_();_nop_();_nop_();
                temp=dq;
                if(temp==1)
                        date=date|0x80;               
                delayus(1,1);
                       
        }
        return date;
}
uchar get_18tem()
{
        uchar temp1,temp2;
        int temp;
        float aa;
        init18b20();//初始化
        write_18b20(0xCC);//跳过ROM,因为只有1个18b20
        write_18b20(0x44);//温度转换
                      //上边一段让18b20开始转换温度
               
        init18b20();
        write_18b20(0xCC);       
        write_18b20(0xBE);//发送读取温度指令
        temp1=read_18b20();//读取温度的低8位
        temp2=read_18b20();//读取温度的高8位
        aa=(temp2*256+temp1)*6.25;
        temp=(int)aa;               
        return temp;
}
void write_com(uchar com)
{
        lcden=0;
        rs=0;
        rw=0;
        P0=com;
        delay1(20);
        lcden=1;
        delay1(20);
        lcden=0;       
}
void write_date(uchar date)
{
        lcden=0;
        rs=1;
        rw=0;
        P0=date;
        delay1(20);
        lcden=1;
        delay1(20);
        lcden=0;       
}


void init16()//1602液晶初始化
{
        write_com(0x38);
        write_com(0x0f);
        write_com(0x06);
        write_com(0x01);//清屏
       
}
void dis_temp()
{

        uint temp;
        uchar n1,n2,n3,n4;
        while(1)
        {
                temp=get_18tem();       
                n1=temp/1000;
                n2=temp%1000/100;
                n3=temp%100/10;
                n4=temp%10;       
                write_com(0x80);//指定显示的初始指针
                write_date('+');
                write_date(0x30+n1);
                write_date(0x30+n2);
                write_date('.');
                write_date(0x30+n3);
                write_date(0x30+n4);
        }
       
}
void main()
{
       
        init16();
        while(1)
        {
                dis_temp();
                delayus(50,70);
        }
}




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