⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 万年历系统
💻 C
字号:
#include <REG51.H>
#include "ds18b20.h"
#define uchar unsigned char
#define uint  unsigned int
sbit DQ=P3^0;
uchar data tplsb,tpmsb;
/*延时tms*/
void delay(uint t)
{  
    uint i;
 while(t--)
 {
   for (i=0;i<125;i++)
   {;}
   }
 }
/* 产生复位脉冲初始化DS18B20 */
void TxReset(void)
{
  uint i;
  DQ=0;
 /* 拉低约900us */
 i=100;
 while (i>0) i--;
 DQ=1;
 i=4;
 while (i>0) i--;
 }
 /* 等待应答脉冲 */
 void RxWait (void)
 {
  uint i;
  while(DQ)
  while(~DQ)
  i=4;
  while (i>0) i--;
  }
/* 读取数据的一位,满足读时隙要求 */ 
bit RdBit(void)
{
 uint i;
 bit b;
 DQ=0;
 i++;
 DQ=1;
 i++;
 i++;
 b=DQ;
 i=8;
 while(i>0) i--;
 return(b);
 }
 /* 读取数据的一个字节 */
uchar RdByte(void)
{
   uchar i,j,b;
 b = 0;
 for (i=1;i<=8;i++)
 {
  j = RdBit();
  b = (j<<7)|(b>>1);
 }
 return(b);
 }
 /* 写数据的一个字节,满足写1和写0的时隙要求 */
void WrByte(uchar b)
{
 uint i;
 uchar j;
 bit btmp;
 for(j=1;j<=8;j++)
 {
  btmp = b&0x01;
  b = b>>1;
   if (btmp)
  {
   /* 写1 */
   DQ = 0;
   i++;i++; // 延时,使得15us以内拉高
   DQ = 1;
   i = 8;
   while(i>0) i--; // 整个写1时隙不低于60us 
     }
  else
  {
   /* 写0 */
   DQ = 0;   
   i = 8;
   while(i>0) i--; // 保持低在60us到120us之间
   DQ = 1;
   i++;
   i++;
  }
 }
}

/* 启动温度转换 */
void convert(void)
{
 TxReset();   // 产生复位脉冲,初始化DS18B20
 RxWait();   // 等待DS18B20给出应答脉冲
 delay(1);   // 延时
 WrByte(0xcc);  // skip rom 命令
 WrByte(0x44);  // convert T 命令
}

/* 读取温度值 */
void RdTemp(void)
{
 TxReset();   // 产生复位脉冲,初始化DS18B20 
 RxWait();   // 等待DS18B20给出应答脉冲
 delay(1);   // 延时
 WrByte(0xcc);  // skip rom 命令
 WrByte(0xbe);  // read scratchpad 命令
 tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
 tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
   
}
void send (uchar *i)
{  
   uchar temG,temD;
   temG=(tpmsb<<4)|(tplsb>>4);
   *(i)=temG/100;
   temG=temG%100;
   *(i+1)=temG/10;
   *(i+2)=temG%10;
   temD=((tplsb&0x0f)*0.0625)*10;  //1位小数部分
   *(i+3)=temD;
}

  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -