//DS18B20驅動程序
//溫度范圍:-55-125攝氏度
//C8051F410,外部晶振(22.1184MHz),DS18B20上拉4.7K,1腳GND,2腳DQ,3腳VCC。
//功能:調用ds18b20_get_tem()程序,讀取溫度整數,小數值及符號位
//格式:溫度整數為10進制1至125,溫度小數為十進制0至9,符號為位狀態0或1。
//變量:溫度整數dswendu,溫度小數dsxiao,符號DSWDFH。
#include "intrins.h" //_nop_();延時函數用
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^5;
//#define DQHIN (P1MDOUT&=~0x20;P0 |= 0x01;)
//#define DQ RC1
//#define DQH TRISC1=1;//DS18B20定義為高電平并設置為輸入端
//#define DQL TRISC1=0;//DS18B20定義為低電平并設置為輸出端
uchar dswendu,dsxiao;
bit DSWDFH;
void delay_18b20(uint x) //18B20延時程序
{while(x--);}
void ds18b20_reset()//18B20復位程序
{//C8051F410,22.1184外部晶振
uchar st=1;//狀態位置1
DQ=1;//總線高
while(st)
{
DQ=0;
delay_18b20(600); //需要延時480us-960us
DQ=1;
delay_18b20(50); //需要延時15us-60us
if(DQ==1)//等待時間約為240us-420us
st=1;
else
st=0;
}
DQ=1;
delay_18b20(300);//100需要延時60us-240us
}
void ds18b20_write_byte(uchar dat)//18B20寫一個字節
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18b20(100);
DQ = 1;
dat>>=1;
}
}
uchar ds18b20_read_byte()//18B20讀一個字節
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay_18b20(80);
}
return(dat);
}
void ds18b20_get_tem() //讀出溫度并轉換成顯示BCD碼
{
uchar low,high,huhao;
uint dstemp,xs;
ds18b20_reset(); //復位
ds18b20_write_byte(0xCC);//跳過ROM
ds18b20_write_byte(0x44);//溫度轉換
ds18b20_reset();//18B20復位程序
ds18b20_write_byte(0xCC);//跳過ROM
ds18b20_write_byte(0xBE);//發送讀取命令
low=ds18b20_read_byte();
high=ds18b20_read_byte();
huhao=high&0xf8;
dstemp=high;
dstemp<<=8;
dstemp=dstemp|low;
if(huhao==0xf8) //符號判斷
{
dstemp=~dstemp+1;
DSWDFH=1;
}
else DSWDFH=0;
xs=(dstemp&0x0f)*625;
dsxiao=xs/1000%10;//計算出小數位。
dswendu=dstemp>>4;
dswendu=dswendu&0x7f;//計算出溫度值
}
|