找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2425|回复: 0
打印 上一主题 下一主题
收起左侧

18b20的初始化程序

[复制链接]
跳转到指定楼层
楼主
ID:114851 发表于 2016-4-18 01:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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);
}



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表