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

📄 ds18b20c2.c

📁 单片机C语言教程
💻 C
字号:
/****************************************************************
/* 这是直接用C51高级语言编写的DS18B20转换程序-没有调用汇编语言,*/
/* 文件名DS18B20C.C                                             */
/* 功能:本程序主要是读出单个DS18B20芯片转换后的温度值,范围    */
/*    (-55℃~125℃)。单片机的P1.0接DS18B20 的BQ。              */
/*    flag为温度值的正负号标志单元, flag 为"1"时表示温度值为负值*/
/*    ,为"0"时表示温度值为正值。 变量cc中保存读出的温度值。    */
/*    本程序仅适合单个DS18B20 和51单片机的连接,晶振为12MHZ左右。*/
/****************************************************************/
#include <REG52.H>

#define uchar unsigned char
#define uint unsigned int

sbit DQ =P1^0;                           //定义端口
union{
    uchar c[2];
    uint x;
}temp;
uchar flag;
uint cc;

void delay(uint useconds)                 //延时程序
{
  for(;useconds>0;useconds--);
}

uchar ow_reset(void)                       //复位
{
  uchar presence;
  DQ = 0;                                  // DQ 低电平
  delay(29);                               // 480us
  DQ = 1;                                  // DQ 高电平
  delay(3);                                // 等待
  presence = DQ;                           // presence 信号
  delay(25);
  return(presence);                        // 0允许, 1 = 禁止
}                                          


uchar read_byte(void)         //从1-wire 总线上读取一个字节
{
  uchar i;
  uchar value = 0;
  for (i=8;i>0;i--)
  {
    value>>=1;
    DQ = 0;
    DQ = 1;
    delay(1);
    if(DQ)value|=0x80;
    delay(6);
  }
  return(value);
}

void write_byte(uchar val)     //向 1-wire 总线上写一个字节
{
  uchar i;
  for (i=8; i>0; i--)          // 一次写一字节
  {
    DQ = 0;
    DQ = val&0x01;
    delay(5);
    DQ = 1;
    val=val/2;
  }
  delay(5);
}

uchar Read_Temperature(void)    //读取温度
{
  ow_reset();
  write_byte(0xCC);             // 跳过 ROM
  write_byte(0xBE);             // 读
  temp.c[1]=read_byte();
  temp.c[0]=read_byte();
  ow_reset();
  write_byte(0xCC);
  write_byte(0x44);             // 开始
  return temp.x/2;
}
void main()                     //主程序
{
  delay(10);
  EA=0;
  flag=0;
  Read_Temperature();           //读取双字节温度
  cc=temp.c[0]*256.0+temp.c[1];
  if  (temp.c[0]>0xf8) {flag=1;cc=~cc+1;}
  cc=cc*0.0625;                 //计算出温度值
  while(1);
}

⌨️ 快捷键说明

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