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

📄 wenkong.c

📁 DS18B20 C语言源文件,测试通过.请参考
💻 C
字号:
#include <reg51.h>      //   调用头文件
sbit BAI =P2^3;        //    数码管是四位的(三位显示整数,一位显示小数),有四个电源使能端,BAI驱动百位 SHI驱动十位
sbit SHI =P2^2;        //    GE驱动个位
sbit GE =P2^1;         //
sbit XIAO=P2^0;        //    XIAO驱动小数位
sbit dp=P0^5;        //   小数点标致
sbit beng=P2^4;     //    驱动鸣声器
sbit DQ =P2^5;   //定义通信端口
static unsigned char HT,LT;      //定义用于存放温度值的高位
unsigned char tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};
                                             //0,    1,   2   3    4    5    6    7    8    9
void delay(unsigned int i)     //    
{
     while(i--);
   
}
void delayms(unsigned int i)     //延时 1MS
{ unsigned char j=0;
  for (;i>0;i--)
   { for (j=0;j<125;j++)
      {;}
   }
}   

//DB18B20初始化函数
Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 delay(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delay(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay(14);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay(20);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;  // 逐位右移 
  DQ = 1; // 给脉冲信号
  if(DQ)     //DQ为1 时,表示收到高电平1
   dat|=0x80;      //  把收到的高电平置给DAT的最高位
  delay(4);
 }
 return(dat);      //
}
//写一个字节
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;      //把要发送的高电平或者低电平给DQ 发送出去
  delay(5);
  DQ = 1;
  dat>>=1;       //逐位右移
 }
delay(4);
}
//读取温度
void  ReadTemperature()
{
unsigned char a=0;
unsigned char b=0;
Init_DS18B20();       //调用初始化函数
WriteOneChar(0xCC); // 跳过读序号列号的操作
                    //不需要验证序列号。
WriteOneChar(0x44); // 发送温度转换命令 启动温度转换
Init_DS18B20();      
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //
a=ReadOneChar();   //读取温度值低位
b=ReadOneChar();   //读取温度值高位
LT=(a&0xF0)?5:0;   //
HT=b<<4;            //
HT+=(a&0xF0)>>4;      //   
}
void display_tempmain( )             //主程序温度显示函数
{
  static char k;
  if (HT>99)                  //
  { P0=tab[1];
    BAI=0;
    SHI=1;
 GE =1;
 XIAO=1;
    delay(600);
   }
   if (HT<1)                   // 如果温度低于1度
  { P0=0x7f;                   //数码管百显示"-",表示零下温度
    BAI =0;                    //驱动百位数码管,屏蔽其他位数码管
    SHI=1;
 GE=1;
 XIAO=1;
 delay(600);
   }
    P0=tab[LT];                  // 
    BAI =1;
 SHI=1;
    GE =1;
    XIAO=0;                     //
    delay(600);
  P0=tab[HT/10];                //    显示十位温度值,屏蔽其他位
  BAI=1;
  SHI=0;                      
  GE=1;
  XIAO=1;
  delay(600);
  if(k!=tab[HT%10])             // 
  { if(beng)
    {beng=0;
     delayms(350);              //  个位温度值发生变化,短鸣一声,告示
  beng=1;
 }
 
  }
  P0=tab[HT%10];                    //显示各位温度值
  k=tab [HT%10];
  SHI=1;                         //一定要把各位放在最后面,因为要确保个位的后面的小数点被点亮
  GE =0;                        
  XIAO=1;
  delay (600);
}
 
void main(void)
{                
  P2=0xff;
  while(1)                         //主循环
   { dp=0;                         //点亮小数点
     ReadTemperature();            //读取温度值
     display_tempmain();           //对读到的温度值进行处理
     if(HT>37|HT<20)               // 判断温度范围
 {beng=0;}                      //  如果温度高于37度或者低于20度,则报警告示
    else
  beng=1;
    
   }  
}

⌨️ 快捷键说明

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