单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:2427|回复:0

单片机时时温度监控

[复制链接]
ID:207690发表于 2017-6-4 15:22|显示全部楼层
#include<stc12c5a60s2.h>
#include"18B20.h"
extern unsigned char flag_Negative;//负数标
void delay_18B20(unsigned int i)
{
     while(i--);
}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)
{
       unsigned char x=0,i=0;
       DQ = 1;       //DQ复位
       delay_18B20(8);  //稍做延时
       DQ = 0;       //单片机将DQ拉低
       delay_18B20(80); //精确延时 大于 480us
       DQ = 1;       //拉高总线
       delay_18B20(14);
       x=DQ;         //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
       delay_18B20(20);
}

/***********ds18b20读一个字节**************/  

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_18B20(4);
       }
     return(dat);
}

/*************ds18b20写一个字节****************/  

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

/**************读取ds18b20当前温度************/

ReadTemperature(void)
{
     unsigned char a=0;
     unsigned char b=0;
     unsigned int t=0;          
     Init_DS18B20();
     WriteOneChar(0xCC); //跳过读序号列号的操作
     WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
     a=ReadOneChar();
     b=ReadOneChar();

     //启动下一次温度转换
     Init_DS18B20();
     WriteOneChar(0xCC); // 跳过读序号列号的操作
     WriteOneChar(0x44); // 启动温度转换
        
     t=b;
     t<<=8;
     t=t|a;
   flag_Negative = 0;
     if(b&0xf8)       //判断符号位是否非零,非零时为负数
     {
           t=~t+1;           //求出原码
         flag_Negative= 0xff;
     }

     t=t*6.25; //有效位到小数点后2位
     return(t);
}


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

Powered by 单片机教程网