找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3808|回复: 0
打印 上一主题 下一主题
收起左侧

单片机DS18B20的源程序代码

[复制链接]
跳转到指定楼层
楼主
ID:353431 发表于 2018-6-17 20:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit p34=P2^4;
sbit p35=P2^5 ;
sbit p36=P2^6;
sbit dp=P0^7;
sbit p37=P2^7;
sbit DQ=P2^2;
sbit SET=P3^1;
sbit LING=P2^0;
signed char m;
bit sign=0;
signed char shangxian=38;
signed char xiaxian=6;
uchar code
LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};



/****延时子程序******/
void Delay(uint i)
{
    while(i--);
}

/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
    unsigned char x=0;
        DQ=1;
        Delay(8);
        DQ=0;
        Delay(80);
        DQ=1;
        Delay(14);
        x=DQ;
        Delay(20);
}

/*******读一个字节****/
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(4);
        }
        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;
        }
}

void Tmpchange(void)
{
    Init_DS18B20();
        WriteOneChar(0xCC);
        WriteOneChar(0x44);
}

/********读取温度********/
        unsigned char ReadTemperature(void)
        {
           unsigned char a=0;
           unsigned char b=0;
           unsigned int t=0;
           float tt=0;
           Tmpchange();
           Init_DS18B20();
           WriteOneChar(0xCC);
           WriteOneChar(0xBE);
           a=ReadOneChar();
           b=ReadOneChar();
           t=b;
           t<<=8;
           t=t|a;
           tt=t*0.0625;
           t=tt*100+0.5;
           return(t);
        }

/*********显示开机初始化等待画面********/
Disp_init()
{
   P0=0x80;
   p34=1;
   p35=0;
   p36=0;
   p37=0;
   Delay(200);
   P0=0x80;
   p34=0;p35=1;p36=0;p37=0;
   Delay(200);
   P0=0x80;
   p34=0;p35=0;p36=1;p37=0;
   Delay(200);
   P0=0x80;
   p34=0;p35=0;p36=0;p37=1;
   Delay(200);
   P0=0x80;
}

/*********显示温度子程序********/
Disp_Temperature()
{
    uint a,b,c,d,e;
        e=ReadTemperature();
        a=e/1000;
        b=e/100-a*10;
        d=e%10;
        c=(e%100)/10;
        m=e/100;
        if(m>shangxian||m<xiaxian)
        LING=1;
        else
        LING=0 ;
        p34=0;p35=0;p36=0;p37=0;
        P0=LEDData[d];
        p34=1;p35=0;p36=0;p37=0;
        Delay(300);
        p34=0;p35=0;p36=0;p37=0;
        P0=LEDData[c];
        p34=0;p35=1;p36=0;p37=0;
        Delay(300);
        p34=0;p35=0;p36=0;p37=0;
        P0=LEDData[b];
        dp=0;
        p34=0;p35=0;p36=1;p37=0;
        Delay(300);
        p34=0;p35=0;p36=0;p37=0;
        P0=LEDData[a];
        p34=0;p35=0;p36=0;p37=1;
        Delay(300);
        p34=0;p35=0;p36=0;p37=0;
}

disptiaozheng()
{
   uchar f,g,j,k;
   f=shangxian/10;
   g=shangxian%10;
   j=xiaxian/10;
   k=xiaxian%10;
   p34=0;p35=0;p36=0;p37=0;
   P0=0xc0;
   p34=1;p35=0;p36=0;p37=0;
   Delay(200);
   p34=0;p35=0;p36=0;p37=0;
   P0=0xc0;
   p34=0;p35=1;p36=0;p37=0;
   Delay(200);
   p34=0;p35=0;p36=0;p37=0;
   if(SET==1)
   {
      P0=LEDData[g];
          dp=0;
        }
        else
        {
          P0=LEDData[k];
          dp=0;
        }
        p34=0;p35=0;p36=1;p37=0;
        Delay(200);
        p34=0;p35=0;p36=0;p37=0;
        if(SET==1)
        P0=LEDData[f];
        else
        {
           if(f==0)
           P0=0x00;
           else
           P0=LEDData[j];
         }
         p34=0;p35=0;p36=0;p37=1;
         Delay(200);
         p34=0;p35=0;p36=0;p37=0;
         Delay(200);
}

/********外部中断0服务程序****/
void int0(void) interrupt 0
{
    EX0=0;
        sign=1;
        if(SET==1)
        shangxian++;
        else
        xiaxian++;
        Delay(500);
        EX0=1;
}

/********外部中断1服务程序*********/
void int1(void) interrupt 1
{
   EX1=0;
   if(SET==1)
   shangxian--;
   else
   xiaxian--;
   Delay(500);
   EX1=1;
}

  /******主函数********/
void main(void)
{
   uint z;
   IT0=1;
   IT1=1;
   EX0=1;
   EX1=1;
   EA=1;
   ReadTemperature();
   LING=0;
   for(z=0;z<100;z++)
   {
      Disp_init();
        }
        while(1)
        {
          Disp_Temperature();
          if(sign==1)
          {
             for(z=0;z<300;z++)
                 disptiaozheng();
                 sign=0;
          }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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