?? ds18b20.c
字號(hào):
/**************************************DS18B20驅(qū)動(dòng)程序************************************************
*單總線(xiàn)通信協(xié)義:
*復(fù)位脈沖:480us低電平.
復(fù)位脈沖發(fā)出后經(jīng)70us檢測(cè)存在脈沖,DQ=0器件存在,DQ=1不存在
*寫(xiě)時(shí)間隙.寫(xiě)時(shí)間隙不小于60us.
*寫(xiě)0:將DQ拉低60us.
*寫(xiě)1:將DQ拉低后15us內(nèi)釋放.
*讀時(shí)間隙.讀時(shí)間隙不小于60us.
將DQ拉低后15us內(nèi)釋放,在15-50us內(nèi)若DQ=0則讀0,DQ=1則讀1.
*通過(guò)單總線(xiàn)端口仿問(wèn)DS18B20的過(guò)程如下:
*初始化
*ROM操作命令
*存儲(chǔ)器操作命令
*數(shù)據(jù)處理
*DS18B20引腳:1.GND 2.DQ 3.VDD
*ROM操作命令:
*讀出ROM,代碼33H,用于讀出DS18B20的序列號(hào),取64位激光ROM代碼.
*匹配ROM,代碼55H,用于辨識(shí)(或選中)某一特定的DS18B20進(jìn)行操作.
*搜索ROM,代碼F0H,用于確定總線(xiàn)上的節(jié)點(diǎn)數(shù)以及所有節(jié)點(diǎn)的序列號(hào).
*跳過(guò)ROM,代碼CCH,命令發(fā)出后系統(tǒng)將對(duì)所有DS18B20進(jìn)行操作.
*報(bào)警搜索,代碼ECH,主要用于鑒別和定位系統(tǒng)中超出程序設(shè)定的報(bào)警溫度
界限的節(jié)點(diǎn).
*DS18B20的存儲(chǔ)器資源如下表 (為了便于理解,存儲(chǔ)器A、B、C是我自己定義的名字):
ROM(8個(gè)字節(jié)) A0 A1 A2 A3 A4 A5 A6 A7 --
RAM(9個(gè)字節(jié)) B0 B1 B2 B3 B4 B5 B6 B7 B8
EEPROM(3個(gè)字節(jié)) C0 C1 C2 -- -- -- -- -- --
A0既是64位ID碼的一部分,也是64位ID碼的的CRC校驗(yàn)值,A1~A6是ID碼其中的48位,A7是器件碼(28H)。
B0溫度低8位值、B1是溫度高8位值,B2、B3是溫度報(bào)警值,B4是溫度轉(zhuǎn)換精度值,B5、B6、B7是系統(tǒng)保留用,
就相當(dāng)于運(yùn)算內(nèi)存,B8是B0~B7的校驗(yàn)碼
*存儲(chǔ)器操作命令:
-------------------------------------------------------------------------------
代碼 指令說(shuō)明
-------------------------------------------------------------------------------
44 溫度轉(zhuǎn)換指令,并把轉(zhuǎn)換后的數(shù)據(jù)存放在RAM的B0、B1的兩個(gè)字節(jié)里
BE 讀取指令,器件收到這個(gè)指令后把B0、B1兩個(gè)字節(jié)的數(shù)據(jù)傳送給主機(jī)
4E 改寫(xiě)RAM的B2、B3、B4的數(shù)據(jù),主機(jī)發(fā)出這個(gè)指令后跟著再分別發(fā)送相應(yīng)的數(shù)據(jù)
48 器件收到這個(gè)指令后就將B2、B3、B4的數(shù)據(jù)寫(xiě)到EEPROM
B8 器件收到這個(gè)指令后就把EEPROM的高H、低L溫度報(bào)警值寫(xiě)到進(jìn)B2、B3
B4 器件收到這個(gè)指令后就返回0或者1給主機(jī),0為寄生電源,1為外部電源
-------------------------------------------------------------------------------
******************************************************************************************************/
#include<reg52.h>
#include"DS18B20.h"
#define uchar unsigned char
sbit DQ= P1^5;
//sbit LED=P1^0;
/**************復(fù)位函數(shù)*****************
*功能:完成單總線(xiàn)的復(fù)位操作
*返回值:0-器件存在,1-器件不存在
***************************************/
bit ow_reset(void)
{ uchar t;
bit ea=EA;
bit presence;
EA=0;
DQ=0;
for(t=240;t>0;t--); //延時(shí)480us
DQ=1;
for(t=35;t>0;t--); //延時(shí)70us
presence=DQ;
for(t=30;t>0;t--); //延時(shí)60us
EA=ea;
return presence;
}
/**************位寫(xiě)入函數(shù)**************
*功能:向單總線(xiàn)寫(xiě)入1位值
**************************************/
void write_bit(bit bitval)
{ uchar t;
bit ea=EA;
EA=0;
DQ=0;
DQ=bitval;
for(t=30;t>0;t--); //延時(shí)60us
DQ=1;
EA=ea;
}
/**************字節(jié)寫(xiě)入函數(shù)***********
*功能:向單總線(xiàn)寫(xiě)入一個(gè)字節(jié)值.先寫(xiě)低位
*************************************/
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
write_bit(val&0x01);
val>>=1;
}
}
/***********位讀取函數(shù)**************
*功能:從單總線(xiàn)上讀取一位信號(hào)
***********************************/
bit read_bit(void)
{
uchar t;
bit temp;
bit ea=EA;
EA=0;
DQ=0;
DQ=1;
for(t=8;t>0;t--); //延時(shí)16us
temp=DQ;
for(t=22;t>0;t--);
EA=ea;
return temp;
}
/***********字節(jié)讀取函數(shù)***********
*功能:從單總線(xiàn)上讀取一字節(jié).先讀低位
**********************************/
uchar read_byte(void)
{
uchar i,value=0;
for(i=8;i>0;i--)
{
value=value>>1;
if(read_bit()) value|=0x80;
}
return value;
}
/**********啟動(dòng)溫度轉(zhuǎn)換函數(shù)***********/
void start_temper(void)
{
if(ow_reset())return;
write_byte(0xcc); //跳過(guò)ROM
write_byte(0x44); //啟動(dòng)溫度轉(zhuǎn)換,默認(rèn)的12位轉(zhuǎn)化,最大轉(zhuǎn)化時(shí)間750ms
}
/**********讀溫度函數(shù)*************/
unsigned read_temper(void)
{
uchar get[2],i;
if(ow_reset())return 0x0000;
write_byte(0xcc); //跳過(guò)ROM
write_byte(0xbe); //讀暫存器
for(i=0;i<2;i++)
get[i]=read_byte();
return (get[1]<<8|get[0]);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -