?? ds18b20.c
字號:
/****************************************Copyright (c)**************************************************
**
**
**功能:P0.2作為GPIO口,用做數字信號輸出接收的,I2C結構,所以他要接個上拉電阻
** 左端口接地,右端口接5V
**日期:2008-08-31
**
********************************************************************************************************/
#include "config.h"
#define TEMPPIN 1<<2 //p0.2作為IO口使用
/***********************************************************************
函數名:DelayNs(uint32 dly)
功 能:延時子程序
輸 入:循環次數
返 回:
備 注:當x=1時,延時9us左右(晶振為11.0592M)
**********************************************************************/
void DelayNS(uint32 dly)
{
while(dly--);
}
/***********************************************************************
函數名:init_18B20()
功 能:DS18B20初 始 化
輸 入:
返 回:
備 注:先對總線置1,然后清0,并延時400~960us,再次對總線置1,進入接收
狀態,DS18B20在檢測到上升沿后,等待15~60us,然后發出一脈沖(低
電平,維持60~240us),表明DS18B20能正常工作
**********************************************************************/
uint8 DS18B20_Init(void)
{
uint32 i,j;
uint32 status;
PINSEL0=(PINSEL0&(~0x30))|0x00; //選擇p0.2作為IO口使用,不影響其他引腳
IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN; //p0.2設為輸出
for(i=5;i;i--)
{
IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN; //p0.2輸出
IO0SET=TEMPPIN;
//DelayNS(1); //延遲1us,使信號穩定
IO0CLR=TEMPPIN;
//DelayNS(6000); //驅動信號,輸出低電平6000/11059200us
for(j=6000;j;j--);
IO0SET=TEMPPIN;
IO0DIR=(IO0DIR&(~TEMPPIN)); //p0.2設為輸入,接收DS18B20回饋信號
//DelayNS(60); //延遲60us,開始檢測回饋信號有效性15-60us
for(j=80;j;j--) //在60-240us內,如果持續為低電平,表示回饋信號有效
{
status=IO0PIN&TEMPPIN;
if(!status)
break;
}
if(!j)
continue;
for(j=6000;j;j--)
{
status=IO0PIN&TEMPPIN;
if(status)
break;
}
status=IO0PIN&TEMPPIN;
if(status)
break;
}
if(!i)
return 1; //返回1,初始化失敗
return 0; //返回零,初始化成功
}
/***********************************************************************
函數名:Read_Data(void)
功 能:讀DS18B20
輸 入:
返 回:
備 注: 先對總線置1,然后清0,延時3us, 再對總線置1,產生讀信號,在
15us內讀取數據,并在60~120us內把總線置1
**********************************************************************/
uint32 Read_Data(void)
{
uint32 result,status;
uint32 i,j;
result=0;
IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;
IO0SET=TEMPPIN;
for(i=15;i;i--) //DS18B20返回數據為16位
{
IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;
IO0SET=TEMPPIN;
//DelayNS(3);
IO0SET=TEMPPIN;
IO0CLR=TEMPPIN;
IO0CLR=TEMPPIN;
IO0CLR=TEMPPIN;
IO0CLR=TEMPPIN;
//DelayNS(3);
IO0SET=TEMPPIN;
IO0SET=TEMPPIN;
//DelayNS(25);
for(j=25;j;j--);
IO0DIR=(IO0DIR&(~TEMPPIN));
status=IO0PIN&TEMPPIN;
if(status)
result|=0x8000;
result>>=1;
//DelayNS(600);
for(j=600;j;j--);
}
IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;
IO0SET=TEMPPIN;
return result;
}
/***********************************************************************
函數名:Write_Data(uint8 cmd)
功 能:寫DS18B20
輸 入:
返 回:
備 注:先對總線置1,然后清0,在15us內將一位數據送到總線上,DS18B20
在15~60us(傳送數據的15us包括再內)后對總線采樣,若為0,則寫入
0,為1,則寫入1,連續寫兩位的時間間隔應大于1us,
**********************************************************************/
void Write_Data(uint8 cmd)
{
uint32 i,j;
for(i=8;i;i--)
{
IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;
IO0SET=TEMPPIN;
IO0SET=TEMPPIN;
IO0SET=TEMPPIN;
IO0SET=TEMPPIN;
//DelayNS(12);
IO0CLR=TEMPPIN;
//DelayNS(12);
IO0CLR=TEMPPIN;
IO0CLR=TEMPPIN;
IO0CLR=TEMPPIN;
if(cmd&0x01)
IO0SET=TEMPPIN;
else
IO0CLR=TEMPPIN;
cmd>>=1;
for(j=600;j;j--);
}
IO0SET=TEMPPIN;
}
/***********************************************************************
函數名:read_temp(void)
功 能:讀DS18B20溫度值
輸 入:
返 回:
備 注:
**********************************************************************/
uint32 read_temp(void)
{
uint32 result;
if(DS18B20_Init())
return 0xffffffff;
Write_Data(0xcc);
Write_Data(0x44);
if(DS18B20_Init())
return 0xffffffff;
Write_Data(0xcc);
Write_Data(0xbe);
result=Read_Data();
if(result&0xf000)
{
result=~result;
result>>=4;
result|=0x80000000;
}
else
result>>=4;
return result;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -