标题: 18b20的初始化程序 [打印本页]

作者: 2336460504    时间: 2016-4-18 01:14
标题: 18b20的初始化程序
#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);
}








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1