专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

18B20温度传感器

作者:佚名   来源:本站原创   点击数:  更新时间:2010年10月04日   【字体:
_________________________________________________________

功能:数码管显示XX.XC标示摄氏度,例如25.3C标示当前温度

时间:2010—7—20

_________________________________________________________


#include<reg52.h>
#include<math.h>
#include<INTRINS.H>

 

#define uchar unsigned char
#define uint   unsigned int;

sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^3;
sfr dataled=0x80;

uint temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar  str[6];

void delay1(uchar MS);
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);

main()
{
        unsigned char TempH,TempL;
        TMOD|=0x01;
        TH0=0xef;
        TL0=0xf0;
        IE=0x82;
        TR0=1;
        P2=0x00;  
        count=0;
        while(1)
        {
                str[5]=0x39;
                str[1]=tab[TempH/100];
                str[2]=tab[(TempH%100)/10];
                str[3]=tab[(TempH%100)%10]|0x80;
                str[4]=tab[TempL];
                if(flag_get==1)
                {
                        temp=ReadTemperature();
                        if(temp&0x8000)
                        {
                                str[0]=0x40;
                                temp=~temp;
                                temp +=1;
                        }
                        else
                                str[0]=0;
                        TempH=temp>>4;
                        TempL=temp&0x0F;
                        TempL=TempL*6/10;
                        flag_get=0;
                }
        }
}

void tim(void) interrupt 1 using 1
{
        TH0=0xef;
        TL0=0xf0;
        num++;
        if (num==50)
        {

                num=0;
                flag_get=1;
                second++;
                if(second>=60)
                {

                        second=0;
                        minute++;  
                }

        }
        count++;
        if(count==1)
        {

                P2=0;
                dataled=str[0];

        }
        if(count==2)
        {

                P2=1;
                dataled=str[1];

        }
        if(count==3)
        {

                P2=2;
                dataled=str[2];
        }
        if(count==4)
        {

                P2=3;
                dataled=str[3];
        }
        if(count==5)
        {

                P2=4;
                dataled=str[4];
        }
        if(count==6)
        {

                P2=5;
                dataled=str[5];
                count=0;

        }
}


void delay(unsigned int i)
{
        while(i--);
}

void Init_DS18B20(void)
{
        unsigned char x=0;
        DQ = 1;
        delay(8);
        DQ = 0;
        delay(80);
        DQ = 1; 
        delay(10);
        x=DQ; 
        delay(5);
}


unsigned char ReadOneChar(void)
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {
                DQ = 0;
                dat>>=1;
                DQ = 1;
                if(DQ)
                        dat|=0x80;
                delay(5);
        }
        return(dat);
}


void WriteOneChar(unsigned char dat)
{
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
                DQ = 0;
                DQ = dat&0x01;
                delay(5);
                DQ = 1;
                dat>>=1;
        }
        delay(5);
}


unsigned int ReadTemperature(void)
{
        unsigned char a=0;
        unsigned int b=0;
        unsigned int t=0;
        Init_DS18B20();
        WriteOneChar(0xCC);
        WriteOneChar(0x44);
        delay(200);
        Init_DS18B20();
        WriteOneChar(0xCC);
        WriteOneChar(0xBE);
        a=ReadOneChar();
        b=ReadOneChar();

        b<<=8;
        t=a+b;

        return(t);
}

关闭窗口

相关文章