📄 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 + -