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

📄 ds18b20.c

📁 基于ds18b20温度传感器的51单片C语言程序
💻 C
字号:
#include REG51.H
#define uchar unsigned char
#define uint  unsigned int
sbit DQ=P1^1;
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar tplsb,tpmsb;
延时tms
void delay(uint t)
{  
    uint i;
 while(t--)
 {
   for (i=0;i125;i++)
   {;}
   }
 }
 产生复位脉冲初始化DS18B20 
void TxReset(void)
{
  uint i;
  DQ=0;
  拉低约900us 
 i=100;
 while (i0) i--;
 DQ=1;
 i=4;
 while (i0) i--;
 }
  等待应答脉冲 
 void RxWait (void)
 {
  uint i;
  while(DQ)
  while(~DQ)
  i=4;
  while (i0) i--;
  }
 读取数据的一位,满足读时隙要求  
bit RdBit(void)
{
 uint i;
 bit b;
 DQ=0;
 i++;
 DQ=1;
 i++;
 i++;
 b=DQ;
 i=8;
 while(i0) i--;
 return(b);
 }
  读取数据的一个字节 
uchar RdByte(void)
{
   uchar i,j,b;
 b = 0;
 for (i=1;i=8;i++)
 {
  j = RdBit();
  b = (j7)(b1);
 }
 return(b);
 }
  写数据的一个字节,满足写1和写0的时隙要求 
void WrByte(uchar b)
{
 uint i;
 uchar j;
 bit btmp;
 for(j=1;j=8;j++)
 {
  btmp = b&0x01;
  b = b1;
   if (btmp)
  {
    写1 
   DQ = 0;
   i++;i++;  延时,使得15us以内拉高
   DQ = 1;
   i = 8;
   while(i0) i--;  整个写1时隙不低于60us 
     }
  else
  {
    写0 
   DQ = 0;   
   i = 8;
   while(i0) 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 (void)
{  uchar b,c;
   uint i,j;
   b=(tpmsb4)(tplsb4);
   for(j=800;j=0;j--)
   { 
   if(j!=0)
   {   
    p1=0x80;
    delay(2);
       p1=0x00;
    delay(2);
    p1=0x80;
    delay(2);
    for(i=8;i=1;i--) 
          { c=b;
            ci;   
            P1=c;  P1.7输出
            delay(4);
            }
  }
 else return;}
}
  


 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
   tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
   5位为符号位。真正通过数码管输出时,需要进行到十进
   制有符号实数(包括小数部分)的转换。              
 void main(void)
{
 do
 { 
  delay(1);   延时1ms
  convert();   启动温度转换,需要750ms
  delay(1000);  延时1s
  RdTemp();   读取温度 
  delay(1);
  send();
   
 }
 while(1);
}

⌨️ 快捷键说明

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