?? ds1820.c
字號:
/**********************************************************
*DS1820驅動程序
*版本:V1.0
*編程:飛揚
**********************************************************/
#include <at89x52.h>
//引腳定義
sbit DS1820_DQ= P2^7; //單總線引腳
//函數(shù)聲明
bit DS1820_Reset();
void DS1820_WriteData(unsigned char wData);
unsigned char DS1820_ReadData();
//存放溫度數(shù)據
unsigned char data temperature[2]; //將溫度存儲在低128RAM單元
/**********************************************************
*讀溫度數(shù)據函數(shù)
**********************************************************/
void read_temp()
{
unsigned char i;
DS1820_Reset(); //復位
DS1820_WriteData(0xcc); //跳過ROM命令
DS1820_WriteData(0x44); //溫度轉換命令
DS1820_Reset(); //復位
DS1820_WriteData(0xcc); //跳過ROM命令
DS1820_WriteData(0xbe); //讀DS1820溫度暫存器命令
for (i=0;i<2;i++)
{
temperature[i]=DS1820_ReadData();
}
DS1820_Reset(); //復位,結束讀數(shù)據
}
/**********************************************************
*DS1820復位及存在檢測(通過存在脈沖可以判斷DS1820是否損壞)
*函數(shù)名稱:DS1820_Reset()
*說明:函數(shù)返回一個位標量(0或1)flag=0存在,反之flag=1不存在
**********************************************************/
bit DS1820_Reset()
{
unsigned char i;
bit flag; //DS1820存在標志位
DS1820_DQ = 0; //拉低總線
for (i=240;i>0;i--);//延時480微秒,產生復位脈沖
DS1820_DQ = 1; //釋放總線
for (i=40;i>0;i--); //延時80微秒對總線采樣
flag = DS1820_DQ;
for (i=200;i>0;i--); //延時400微秒等待總線恢復
return (flag); //根據flag的值可以知道DS1820是否存在或損壞
} //可以加聲音告警提示DS1820故障
/**********************************************************
*寫數(shù)據到DS1820
*函數(shù)名稱:DS1820_WriteData()
*
**********************************************************/
void DS1820_WriteData(unsigned char wData)
{
unsigned char i,j;
for (i=8;i>0;i--)
{
DS1820_DQ = 0; //拉低總線,產生寫信號
for (j=2;j>0;j--); //延時4us
DS1820_DQ = wData&0x01; //發(fā)送1位
for (j=30;j>0;j--); //延時60us,寫時序至少要60us
DS1820_DQ = 1; //釋放總線,等待總線恢復
wData>>=1; //準備下一位數(shù)據的傳送
}
}
/**********************************************************
*從DS1820中讀出數(shù)據
*函數(shù)名稱:DS1820_ReadData()
*
**********************************************************/
unsigned char DS1820_ReadData()
{
unsigned char i,j,TmepData;
for (i=8;i>0;i--)
{
TmepData>>=1;
DS1820_DQ = 0; //拉低總線,產生讀信號
for (j=2;j>0;j--); //延時4us
DS1820_DQ = 1; //釋放總線,準備讀數(shù)據
for (j=4;j>0;j--); //延時8微秒讀數(shù)據
if (DS1820_DQ == 1)
TmepData |= 0x80;
for (j=30;j>0;j--); //延時60us
DS1820_DQ = 1; //拉高總線,準備下一位數(shù)據的讀取.
}
return (TmepData);//返回讀到的數(shù)據
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -