?? ds18b20.c
字號:
//這是一個溫度采集模塊的驅動程序。
/*
|----|
| DS | DS18B20管腳排列
+----+
| | |
| | |
| | |----------Vdd
| |------------DQ-->P0.0
|---------------GND
*/
#include <config.h>
//外部函數
//--------------delay.c--------------------
extern void delay(unsigned int delay_time); //延時子程序
//----------------------------------------
//------------DS18B20控制命令-----------------------------
#define T_CONVER 0x44 //開始溫度轉換
#define T_CONFIG 0x5f //11位轉換
#define T_READ 0xbe //讀暫存器
#define T_WRITE 0x4e //寫暫存器
#define T_ROM_JMP 0xcc //忽略64ROM地址
#define T_COPY_E2 0x48 //將溫度上下限數值寫到E2ROM
#define T_RECALL_E2 0xb8 //將E2中存儲的溫度上下限數值復制到上下限寄存器中。
#define T_cont 0.0625 //溫度轉換常數
//------------------------------------------------------
sbit DQ=P0^0; //DS18B20數據輸出端
sbit LED=P1^5; //LED
bit REC_suc=0; //DS18B20成功復位標志位
bit T_sign; //溫度正負符號
float temp=0; //轉換好的溫度數值
signed char temp_TH=25,temp_TL=10; //溫度上下限
unsigned char t_bai,t_shi,t_ge,t_feng; //溫度轉換好的各個位
void DS18B20_init(); //DS18B20初始化函數
void DS18B20_send(unsigned char in_data); //DS18B20發送一個字節數據函數
unsigned char DS18B20_read(); //從DS18B20讀取一個字節函數
void ReadTemperature(); //讀取溫度數值
void temp_data_turn(float in_data); //溫度轉換
//--------------------------------------------------------
/****************************DS18B20初始化函數**************************/
/*函數原型:void DS18B20_init()
/*函數功能:DS18B20初始化
/*輸入參數:無
/*輸出參數:無
/*調用模塊:delay()
/**********************************************************************/
void DS18B20_init()
{
unsigned char i=1;
DQ=0;
DQ=1;
delay(20); //延時227us
while(REC_suc==0)
{
DQ=0;
delay(45); //延時502us
DQ=1;
delay(3); //等待DS18B20作出相應 延時40us
while(1)
{ i=DQ;
if(i==0)
{
REC_suc=1;
delay(20); //延時227us
break;
}
}
}
REC_suc=0;
}
/****************************DS18B20發送函數**************************/
/*函數原型:void DS18B20_send(unsigned char in_data)
/*函數功能:DS18B20發送數據
/*輸入參數:要發送的數據
/*輸出參數:無
/*調用模塊:_cror_()
/**********************************************************************/
void DS18B20_send(unsigned char in_data)
{
unsigned char i,out_data,k;
out_data=in_data;
for(i=1;i<9;i++) //串行發送數據
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=out_data&0x01;
if(k==0x01) //判斷數據 寫1
{
DQ=1;
}
else //寫0
{
DQ=0;
}
delay(5); //延時62us
DQ=1;
out_data=_cror_(out_data,1); //循環左移1位
}
}
/**************************DS18B20讀函數**************************/
/*函數原型:void DS18B20_read()
/*函數功能:DS18B20讀數據
/*輸入參數:無
/*輸出參數:讀到的一字節內容
/*調用模塊:delay()
/******************************************************************/
unsigned char DS18B20_read()
{
unsigned char i,in_data,k;
in_data=0;
for(i=1;i<9;i++) //串行發送數據
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=DQ; //讀DQ端
if(k==1) //讀到的數據是1
{
in_data=in_data|0x01;
}
else
{
in_data=in_data|0x00;
}
delay(4); //延時51us
DQ=1;
in_data=_cror_(in_data,1); //循環左移1位
}
return(in_data);
}
/**************************DS18B20讀取溫度函數**************************/
/*函數原型:void ReadTemperature()
/*函數功能:DS18B20讀取溫度轉換好的數據
/*輸入參數:無
/*輸出參數:無
/*調用模塊:DS18B20_send(),DS18B20_send(),DS18B20_init(),DS18B20_send(),DS18B20_send(),
T_L=DS18B20_read(),T_H=DS18B20_read()
/******************************************************************/
void ReadTemperature()
{
unsigned char T_L=0;
unsigned char T_H=0;
unsigned char k;
DS18B20_init();
DS18B20_send(T_ROM_JMP); // 跳過讀序號列號的操作
DS18B20_send(T_CONVER); // 啟動溫度轉換
DS18B20_init();
DS18B20_send(T_ROM_JMP); //跳過讀序號列號的操作
DS18B20_send(T_READ); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
T_L=DS18B20_read();
T_H=DS18B20_read();
k=T_H&0xf8;
if(k==0xf8)
T_sign=1; //溫度是負數
else
T_sign=0; //溫度是正數
T_H=T_H&0x07;
temp=(T_H*256+T_L)*T_cont;
}
/**************************DS18B20溫度轉換函數**************************/
/*函數原型:void temp_data_turn(float in_data)
/*函數功能:DS18B20讀取溫度轉換
/*輸入參數:無
/*輸出參數:無
/*調用模塊:無
/******************************************************************/
void temp_data_turn(float in_data)
{
unsigned int y;
in_data=in_data*10; //數值擴大10倍,精度到0.1
t_bai=in_data/1000;
y=(unsigned int)in_data%1000;
t_shi=y/100;
y=y%100;
t_ge=y/10;
t_feng=y%10;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -