DS18B20多点测温源程序+proteus仿真工程

发布者:静逸心境最新更新时间:2020-02-10 来源: 51hei关键字:DS18B20  多点测温  仿真工程 手机看文章 扫描二维码
随时随地手机看文章

多点测温 + 1602显示仿真原理图如下

单片机源程序如下:

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define lcddata P0

sbit rs=P2^0;

sbit rw=P2^1;

sbit e=P2^2;

sbit DQ=P2^3;

sbit key=P3^7;

uchar temp1[]={"T :       "};

uchar temp2[]={"T :       "};

/*uchar temp3[9]={"T3:      "};

uchar temp4[9]={"T4:      "};

uchar temp5[9]={"T5:      "};

uchar temp6[9]={"Ta:      "};*/ 

uchar code ds_rom1[]={0x28,0x22,0x22,0x22,0x00,0x00,0x00,0xca};//U2ROM

uchar code ds_rom2[]={0x28,0x33,0x33,0x33,0x00,0x00,0x00,0xa0};//U3ROM

uchar code ds_rom3[]={0x28,0x44,0x44,0x44,0x00,0x00,0x00,0xAF};//U4ROM

uchar code ds_rom4[]={0x28,0x55,0x55,0x55,0x00,0x00,0x00,0xC5};//U5ROM

uchar code ds_rom5[]={0x28,0x66,0x66,0x66,0x00,0x00,0x00,0x7B};//U6ROM

int temp;//温度

bit temp_flag,value_flag;//正负标志位

int t1,t2,t3,t4,t5,num=1;

/*1602LCD函数*/

void delay(uint x)

{

        uint a,b;

        for(a=x;a>0;a--)

                for(b=110;b>0;b--);

}


void writelcd(uchar dat,bit x)//写0指令,1数据

{

        e=0;

        lcddata=dat;

        rs=x;

        rw=0;

        e=1;

        delay(1);

        e=0;

}


void initlcd()

{

        writelcd(0x38,0);

        writelcd(0x0c,0);

        writelcd(0x06,0);

        writelcd(0x01,0);

}

/*DS18B20*/

void delayus(uchar x)//        延时1us

{

        while(--x);

}


bit init_DS18B20()//初始化函数

{

        bit Status_DS18B20;

        DQ=1;

        DQ=0;

        delayus(250);

        DQ=1;

        delayus(20);

        if(!DQ)

                Status_DS18B20=0;

        else

                Status_DS18B20=1;

        delayus(250);

        DQ=1;

        return Status_DS18B20;


}


uchar read_DS18B20()//读数据

{

        uchar i=0,dat=0;

        for(i=0;i<8;i++)

        {

                DQ=1;

                DQ=0;

                dat>>=1;

                DQ=1;

                if(DQ)

                        dat|=0x80;

                DQ=1;

                delayus(25);

        }

        return(dat);

}


void write_DS18B20(uchar dat)//写数据

{

        uchar i;

        for(i=0;i<8;i++)

        {

                DQ=1;

                dat>>=1;

                DQ=0;

                DQ=CY;

                delayus(25);

                DQ=1;

        }

}


void Match_rom(uchar a)         //匹配ROM

{

        uchar j;

        write_DS18B20(0x55);           //发送匹配ROM命令

        if(a==1)

        {

                for(j=0;j<8;j++)

                        write_DS18B20(ds_rom1[j]);                //发送18B20的序列号,先发送低字节 

        }

        if(a==2)

        {

                for(j=0;j<8;j++)

                        write_DS18B20(ds_rom2[j]);                //发送18B20的序列号,先发送低字节 

        }

        if(a==3)

        {

                for(j=0;j<8;j++)

                        write_DS18B20(ds_rom3[j]);                //发送18B20的序列号,先发送低字节 

        }

        if(a==4)

        {

                for(j=0;j<8;j++)

                        write_DS18B20(ds_rom4[j]);                //发送18B20的序列号,先发送低字节 

        }

        if(a==5)

        {

                for(j=0;j<8;j++)

                        write_DS18B20(ds_rom5[j]);                //发送18B20的序列号,先发送低字节 

        }


}


void gettemp(uchar z)/*读取温度值并转换*/

{        

        uchar a,b;

        while(init_DS18B20());    

        if(z==1)

        {

                Match_rom(1);                 //匹配ROM 1

        }

        if(z==2)

        {

                Match_rom(2);                 //匹配ROM         2

        }

        if(z==3)

        {

                Match_rom(3);                 //匹配ROM         3

        }

        if(z==4)

        {

                Match_rom(4);                 //匹配ROM         4

        }

        if(z==5)

        {

                Match_rom(5);                 //匹配ROM         5

        }


        write_DS18B20(0x44);//*启动温度转换*/

        while(init_DS18B20());    

        if(z==1)

        {

                Match_rom(1);                            //匹配ROM 1

        }

        if(z==2)

        {

                Match_rom(2);                                //匹配ROM         2

        }

        if(z==3)

        {

                Match_rom(3);                 //匹配ROM         3

        }

        if(z==4)

        {

                Match_rom(4);                 //匹配ROM         4

        }

        if(z==5)

        {

                Match_rom(5);                 //匹配ROM         5

        } 

        write_DS18B20(0xbe);//*读取温度*/ 

        a=read_DS18B20();

        b=read_DS18B20();

        temp=b;

        temp<<=8;

        temp=temp|a;

    if(b>=8)

        {

                temp=~temp+1;

            temp_flag=1;

        }

    else

    {        

                temp_flag=0;

        }

        if(temp_flag==1)

                temp=temp*0.625*-1;

        if(temp_flag==0)

                temp=temp*0.625;

        if(z==1)

        t1=temp;

        if(z==2)

        t2=temp;

        if(z==3)

        t3=temp;

        if(z==4)

        t4=temp;

        if(z==5)

        t5=temp;

}

void display(uchar i)//显示函数

{

        char y,value;

        temp=abs(temp);

[1] [2]
关键字:DS18B20  多点测温  仿真工程 引用地址:DS18B20多点测温源程序+proteus仿真工程

上一篇:51单片机PWM温控风扇源代码
下一篇:篮球比赛计时器的51单片机proteus仿真

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved