#include "DSP28x_Project.h"
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
//设置全局变量,专门用于严格延时
#define nop() {asm(" NOP ");}
#define DATA_PORT GpioCtrlRegs.GPBDIR.all
#define DATAIN GpioDataRegs.GPBDAT.bit.GPIO34
#define PIN_HIGH() {EALLOW;DATA_PORT|=0x000F;EDIS;DATAIN=1;} //
#define PIN_LOW() {EALLOW;DATA_PORT|=0x000F;EDIS;DATAIN=0;}
#define PIN_LEAVE() {EALLOW;DATA_PORT&=~0x000F;EDIS;}//
/*****************************************************
函数功能:将DS18B20传感器初始化,读取应答信号
出口参数:flag
***************************************************/
unsigned char Init_DS18B20(unsigned char xx)
{
unsigned char flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
flag=xx;
PIN_HIGH(); //先将数据线拉高
DELAY_US(6); //略微延时约6微秒
PIN_LOW(); //再将数据线从高拉低,要求保持480~960us
DELAY_US(600); //略微延时约600微秒
//以向DS18B20发出一持续480~960us的低电平复位脉冲
PIN_HIGH(); //释放数据线(将数据线拉高)
DELAY_US(1);
DELAY_US(30); //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
PIN_LEAVE();
if(DATAIN==0)
flag=0; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
else
flag=1;
DELAY_US(600); //延时足够长时间,等待存在脉冲输出完毕
return (flag); //返回检测成功标志
}
/*************************************************/
/* 读字节子函数 */
/*************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0,dat=0;
for (i=8;i>0;i--)
{
dat>>=1;//读到数据后右移一位
PIN_LOW();
DELAY_US(6);//6us
PIN_HIGH(); //数据线置高电平,释放总线
DELAY_US(8);//延时8us
PIN_LEAVE();
if(DATAIN)
dat|=0x80;//取回最高位数据
else
dat|=0x00;
DELAY_US(30);//延时30us
PIN_HIGH(); //释放总线,恢复高电平
}
return(dat);
}
/*************************************************/
/* 写字节子函数 */
/*************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i;
for(i=8;i>0;i--)
{
PIN_LOW();
DELAY_US(14);//14us延时
if(dat&0x01==1) //写入一位数据
PIN_HIGH();
if(dat&0x01==0)
PIN_LOW();
DELAY_US(40); //延时40微秒,等待DS18B20采样
PIN_HIGH(); //释放总线
dat>>=1; //右移一位数据
DELAY_US(4);
} }
/*****************************************************
函数功能:做好读温度的准备
***************************************************/
unsigned char ReadyReadTemp(unsigned char xx)
{
unsigned char flag;
flag= Init_DS18B20(xx); //将DS18B20初始化
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
DELAY_US(20000); //转换一次需要延时一段时间
flag=Init_DS18B20(flag); //将DS18B20初始化
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
return(flag);
}
|