找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 454|回复: 0
打印 上一主题 下一主题
收起左侧

DS18B20例程

[复制链接]
跳转到指定楼层
楼主
ID:460597 发表于 2025-9-9 15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <DS18B20.h>
#include "intrins.h"

unsigned char DS18B20_time;                                                     
                                                                                                                                                                                                                               
sbit DQ = P1^4 ;  //定义DS18B20端口DQ  
                                                                                                                                                                                                                               
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
void delay_18B20(unsigned int i)
{
    while (i--)
    { _nop_();_nop_();_nop_();_nop_();
    }
}
//设置全局变量,专门用于严格延时
/*****************************************************
函数功能:将DS18B20传感器初始化,读取应答信号
出口参数:flag
***************************************************/
/*初始化ds1820                                      */
/*******************************************************************/
bit Init_DS18B20(void)
{ unsigned char x=0;
DQ = 1;          //DQ拉高
delay_18B20(80); //延时
DQ = 0;          //DQ拉低
delay_18B20(800); //延时 480us以上
DQ = 1;          //DQ拉高
delay_18B20(140);
x=DQ;   delay_18B20(200);
}

/*****************************************************
函数功能:从DS18B20读取一个字节数据
出口参数:dat
***************************************************/
unsigned char ReadOneChar(void)
{
                uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
    DQ = 0; // ?????
    dat>>=1;
    DQ = 1; // ?????
    if(DQ)
    dat|=0x80;
    delay_18B20(40);     //40
}
   return(dat);
}
/*****************************************************
函数功能:向DS18B20写入一个字节数据
入口参数:dat
***************************************************/  
WriteOneChar(unsigned char dat)
{
        unsigned char i=0;
   for (i=8; i>0; i--)
   {
   DQ = 0;
    DQ = dat&0x01;
    delay_18B20(50); //50
    DQ = 1;
    dat>>=1;
}
}

/*****************************************************
函数功能:做好读温度的准备
***************************************************/
void Read_Temperature(void)
{
      Init_DS18B20();     //将DS18B20初始化
                WriteOneChar(0xCC); // 跳过读序号列号的操作
                WriteOneChar(0x44); // 启动温度转换          
           for(DS18B20_time=0;DS18B20_time<100;DS18B20_time++)
                    ;         //温度转换需要一点时间
                Init_DS18B20();     //将DS18B20初始化
                WriteOneChar(0xCC); //跳过读序号列号的操作
                WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位       
}


/******************************************************************************
以下是与温度有关的显示设置
******************************************************************************/

/****************************************************
函数功能:温度的处理
入口参数:x
***************************************************/

unsigned int  Disp_Temperature()
{       
unsigned char b=0;
unsigned char TN;      //储存温度的整数部分
unsigned char TD;       //储存温度的小数部分
unsigned int a;
unsigned int auu;
unsigned int temp_value=0;
Init_DS18B20();
WriteOneChar(0xCC);   
WriteOneChar(0x44);
delay_18B20(1);     
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(1);
a=ReadOneChar();    //???????
b=ReadOneChar();      //???????
TN=b*16+a/16;      //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
                                          //这样得出的是温度的整数部分,小数部分被丢弃了
TD=(a%16)*10/16;    //计算温度的小数部分,将余数乘以10再除以16取整,
                                          //这样得到的是温度小数部分的第一位数字(保留1位小数)

         auu=TN*10+TD;

         return auu;
}




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

快速回复 返回顶部 返回列表