欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 680|回復: 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表