?? ds18b20_drive._h
字號:
/*****************************************
返回三個值dis_buf_18b20[0]小數(shù)dis_buf_18b20[1]個位dis_buf_18b20[2]十位
調(diào)用Read_1820_temperature();
****************************************/
#include <iom8v.h>
#include <macros.h>
#define ddrt DDRD
#define port PORTD
#define uchar unsigned char
#define uint unsigned int
#define D0 0x01 //18b20端口,PD.0
#define pin PIND
#define CL_DQ PORTD&=~(1<<PD0)
#define SET_DQ PORTD|=(1<<PD0)
#define SET_OUT DDRD|=(1<<PD0)
#define SET_IN DDRD&=~(1<<PD0)
#define IN_DQ PIND&(1<<PD0)
unsigned int temp=0;
unsigned char temp_data[2]={0};
unsigned char dis_buf_18b20[3]={0};
uchar temp_comp;
void write_1820(unsigned char x) ;
/*-----------------------------------------------------------------
函數(shù)名稱:void init_1820()
函數(shù)功能: 18b20的復(fù)位
參 數(shù):
返 回 值:
-----------------------------------------------------------------*/
void init_1820(void)
{
SET_OUT; //設(shè)置端口輸出
SET_DQ; //輸出一個脈沖
CL_DQ; //低電平保持480us以上
delay_us(500); //延時480us以上
SET_DQ; //沒有輸出一個脈沖
SET_IN; //設(shè)置端口輸入,即釋放總線,外接上拉電阻,端口被拉高
delay_us(60); //延時15~60us
while(IN_DQ); //等待應(yīng)答,即等待低電平信號
delay_us(80);
SET_OUT; //設(shè)置輸出
SET_DQ; //輸出高電平
delay_us(80); //60~240us
}
/*-----------------------------------------------------------------
函數(shù)名稱:void write_1820(unsigned char x)
函數(shù)功能: 寫18B20溫度
參 數(shù): x
返 回 值:
-----------------------------------------------------------------*/
{
unsigned char m;
//SET_DQ;
for(m=0;m<8;m++)
{
CL_DQ; //寫數(shù)據(jù),從低位開始
if(x&(1<<m)) //判斷數(shù)據(jù)極性
SET_DQ;
else
CL_DQ;
delay_us(40); //延時15~60us
SET_DQ;
delay_us(1); //連續(xù)寫兩位數(shù)據(jù)的間隔要大于1us
}
SET_DQ; //結(jié)束寫數(shù)據(jù),置高總線
}
/*-----------------------------------------------------------------
函數(shù)名稱:unsigned char read_1820(void)
函數(shù)功能: 讀取18B20溫度
參 數(shù):
返 回 值: count
-----------------------------------------------------------------*/
unsigned char read_1820(void) //上升沿讀數(shù)據(jù)
{
unsigned char temp=0,k,n;
for(n=0;n<8;n++)
{
CL_DQ; //輸出一個起始脈沖
delay_us(1); //保持1us
SET_DQ;
SET_IN; //設(shè)端口為輸入
k=IN_DQ; //讀數(shù)據(jù),從低位開始
delay_us(1);
if(k) //判斷數(shù)據(jù)極性
temp|=(1<<n);
else
temp&=~(1<<n);
delay_us(60); //延時60~120us
SET_OUT; //設(shè)端口為輸出
}
return (temp); //返回讀出的數(shù)據(jù)
}
/*-----------------------------------------------------------------
函數(shù)名稱:unsigned int Read_1820_temperature(void)
函數(shù)功能: 讀取18B20溫度,計算
參 數(shù):
返 回 值: count
-----------------------------------------------------------------*/
void Read_1820_temperature(void)
{
unsigned int count;
unsigned char temh,teml;
init_1820(); //復(fù)位18b20
write_1820(0xcc); //跳過ROM
write_1820(0x44); //發(fā)出溫度轉(zhuǎn)換命令
delay_ms(750);
init_1820();
write_1820(0xcc); //發(fā)出讀命令
write_1820(0xbe);
teml=read_1820(); //讀數(shù)據(jù)
temh=read_1820();
temp_data[0]=read_1820();
temp_data[1]=read_1820();
count=temh<<8+teml;
count=count*0.0625;
count=(temh*256+teml)*6.25; //計算具體溫度
dis_buf_18b20[2]=(count%10000)/1000+0x30;
dis_buf_18b20[1]=(count%1000)/100+0x30;
dis_buf_18b20[0]=(count%100)/10+0x30;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -