一.硬件部分

GND脚接地;

DQ脚接P03,外加4K7上拉电阻;

VCC脚接3.3v供电;

二.软件部分

1.配置P03为准准双向 IO类型:

void Init_power_gpio(void)
{
  P03_Quasi_Mode; //DS18B20
  P03=1;
}

2.配置定时器2(可任意选用定时器):

void Timer2_init(void)
{ //系统上电默认16M高速时钟源使能,并作为系统时钟

  clr_TR2;      //TR2停止时写入重新装载值

  TIMER2_DIV_16;   //使用1/16分频 一秒震动为16000000/16

  TIMER2_Auto_Reload_Delay_Mode; //配置为自动重装载模式
  RCMP2L =(65536-1)/256;    
  RCMP2H =(65536-1)%256;
  TL2 = 0;        //重装载值
  TH2 = 0;       

//  set_ET2;       //使能定时器3中断
//  set_EA;       //使能所有中断
  set_TR2;       //使能定时器3
}

3.初始化:

/*----------------------------------------------------------
函数名称:void Init_DS18B20(void)
函数功能:初始化
描述:480-960微妙低电平,然后释放为高电平 完成一次复位
--------------------------------------------------------*/
void Init_DS18B20(void)
{
  P03=1; //起始位高电平
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<900);
  P03=0; // 拉低
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<500);// 延时约500us, 符合协议要求480-960微秒的低电平脉冲
  P03=1; //产生一个上升沿, 进入等待应答状态
}

4.

/*----------------------------------------------------------
函数名称:void Wait_DS18B20(void)
函数功能:等待应答
描述:
--------------------------------------------------------*/
void Wait_DS18B20()
{
  while(P03); //等待应答
  while(~P03) //检测到应答脉冲
  // {
  // printf("应答\n");
  // }
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<70);
}

5.

/*----------------------------------------------------------
函数名称:bit ReadOneBit(void)
函数功能:读取一字节
读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,
之后DS18B20则会输出持续一段时间的一位数据
-------------------------------------------------------*/
bit ReadOneBit(void)
{
  bit b;
  P03 = 0;
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<10); //延时约10us, 符合协议要求至少保持1us
  P03 = 1;
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<20); //延时约20us, 符合协议要求的至少延时15us以上
  b = P03;
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<70); //延时约70us, 符合读时隙不低于60us要求
  return b;
}

6.

/*********************************************
函数功能:向DS18B20读一字节数据
入口参数:dat

***********************************************/
unsigned char ReadOneByte()
{
  unsigned int i;
  unsigned char j, dat;
  dat = 0;
  for(i=0; i<8; i++)
  {
  j = ReadOneBit();
  //最先读出的是最低位数据
  dat = (j << 7) | (dat >> 1);
  }
  return dat;
}

7.

/*********************************************
函数功能:向DS18B20写一字节数据
入口参数:dat
描述:写0:拉低1us-15us后拉低最少60,最长120us,再释放高电平
写1:拉低1us-15us后释放高最少60,最长120us直到周期结束
***********************************************/
void WriteOneByte(unsigned char dat)
{
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
//写"1", 拉低15us后, 在15us~60us内将DQ拉高, 即完成写1
if(b)
{
P03 = 0;
TL2=0;
TH2=0;
while((TH2*256+TL2)<3); //拉低约3usus, 符合协议要求1~15us内,提示写开始
P03 = 1;
TL2=0;
TH2=0;
while((TH2*256+TL2)<70); //延时约70us, 符合写时隙不低于60us要求
}
else //写"0", 将DQ拉低60us~120us
{
P03 = 0;
TL2=0;
TH2=0;
while((TH2*256+TL2)<70); //延时约70us, 符合写时隙不低于60us要求
P03 = 1;
TL2=0;
TH2=0;
while((TH2*256+TL2)<3); //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了
}
}
}

8.

/*********************************************
函数名:SendChangeCmd
参数:
返回值:
功能:向DS18B20发送温度转换命令
***********************************************/
void SendChangeCmd()
{
Init_DS18B20(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化
Wait_DS18B20(); //等待DS18B20应答
TL2=0;
TH2=0;
while((TH2*256+TL2)<200); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号
WriteOneByte(0xcc); //写入跳过序列号命令字 Skip Rom
WriteOneByte(0x44); //写入温度转换命令字 Convert T
}

9.

/*********************************************
函数名:SendReadCmd
参数:
返回值:
功能:向DS18B20发送读取数据命令
***********************************************/
//
void SendReadCmd()
{
Init_DS18B20();
Wait_DS18B20();
TL2=0;
TH2=0;
while((TH2*256+TL2)<200); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号
WriteOneByte(0xcc); //写入跳过序列号命令字 Skip Rom
WriteOneByte(0xbe); //写入读取数据令字 Read Scratchpad
}

10.

/*********************************************
函数名:GetTmpValue
参数:
返回值:
功能:获取当前温度值
***********************************************/
int GetTmpValue()
{
unsigned int tmpvalue;
int value; //存放温度数值
float t;
unsigned char low, high;
SendReadCmd();
//连续读取两个字节数据
low = ReadOneByte();
high = ReadOneByte();
//将高低两个字节合成一个整形变量
//计算机中对于负数是利用补码来表示的
//若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;

//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度
t = value * 0.0625;
//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入
//如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度
//如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度
value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
return value;
}

11.

void main (void)

{

  int tempValue;

  InitialUART0_Timer1(115200);   //串口0使用timer1

while(1)

{

  SendChangeCmd();
  tempValue=GetTmpValue();
  printf(" %d \n ",tempValue);

}

}

NE76003单片机调试DS18B20 步骤的更多相关文章

  1. Linux——【转】gcc编译与gdb调试简要步骤

    原文:gcc编译与gdb调试简要步骤 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定义和include文件展开等工作:(.i) l 根据编译参数进行不同程 ...

  2. ios真机调试详细步骤

    •真机调试的主要步骤 1.登录开发者主页 2.生成cer证书:cer是一个跟电脑相关联的证书文件,让电脑具备真机调试的功能 3.添加App ID:调试哪些app? 4.注册真机设备:哪台设备需要做真机 ...

  3. 使用Vs2012开发Metro时在另一台win8平板上调试的步骤

    需求:开发一个metro应用,因为要给平面设计师参谋, 需要将软件安装在win8平板上. 环境:开发机是win8,  win8平板是win8.1rtm , 是用老的win7平板改装的. 步骤: 1:拷 ...

  4. gcc编译与gdb调试简要步骤

    http://blog.chinaunix.net/uid-24103300-id-108248.html 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定 ...

  5. ios 利用Reveal来调试界面2--真机调试(步骤详解)

    使用真机调试我们的App界面,如果你的真机是没有越狱的设备,那么使用Reveal来调试UI的步骤是最麻烦的.

  6. iOS开发:创建真机调试证书步骤(还有一篇是真机测试步骤)(2015年)

    (关于真机测试步骤的blog:http://blog.csdn.net/hbblzjy/article/details/51680282) 1.首先打开苹果的开发者网站(https://develop ...

  7. WebStorm+Chrome调试Vue步骤

    在调试时请 注意 : 在WebStorm中启动调试时,WebStorm会根据你设置的url,自动打开新的Chrome浏览器进程访问这个设置的url,而且这个浏览器页面和你平常看到的浏览器差异会比较大, ...

  8. 使用天祥TX-1C调试DS18B20温度传感器的收获

    翻查DS18B20的DataSheet编写操作函数,其过程遇到了不少坎,记下来备查. 对于单总线的DS18B20芯片,首先严格按照时序图写出正确的“写0”.“写1”和“读0.1”的基础函数,再以此写出 ...

  9. 【转】Xcode 7 真机调试详细步骤

    原文网址:http://www.jianshu.com/p/fa5f90b61ad6 文/ldjhust(简书作者)原文链接:http://www.jianshu.com/p/fa5f90b61ad6 ...

随机推荐

  1. python MySQL执行SQL查询结果返回字典

    写自动化测试的时候我希望执行数据库前置任务,把数据库查询的结果作为请求的参数,但是正常返回结果为列表嵌套里面,这样就会影响到关键字准确的获取,特别的受限于SQL的查询字段的的顺序,所以希望返回的单条数 ...

  2. SQL :“传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确” 错误

    其中在DAL层调用存储过程来插入数据的参数 SqlParameter[] parameters = {                                            new S ...

  3. Linux基础入门-用户及文件权限管理

    一.Linux用户管理: 不同的用户的文件都是放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,但是由于Linux的用户管理和权限机制,不同用户不能轻易查看.修改彼此的文件. 1. 查看用户: wh ...

  4. MongoDB解压报错gzip: stdin: not in gzip format的解决方法

    MongoDB解压报错gzip: stdin: not in gzip format的解决方法 在安装MongoDB时出现如下报错: [root@vm172--- mongodb]# tar -zxv ...

  5. hiero.ui获取实例名的方法

    在hiero.ui中经常会通过hiero.ui.windowManager().windows()来获取当前QMainWindow中的QWidget子窗口,而这些子窗口是以实例对象的方式返回的,如果想 ...

  6. webpack打包vue -->简易讲解

    ### 1. 测试环境: 推荐这篇文章:讲的很细致 https://www.cnblogs.com/lhweb15/p/5660609.html 1. webpack.config.js自行安装 { ...

  7. 浅谈C#在网络波动时防重复提交

    前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同).排查原因,发现是网络波动造成了重复提交. 由于网络波动而重复提交的例子也比较多: 网络上,防重复提交的方法也很多,使用redis锁, ...

  8. Centos 7 64位 minimal 最小化安装的系统中静默安装oracle 11g r2

    1:安装好centos 7 操作系统: 虚拟机安装centos 7,在vmware中一步步来就可以成功. 2:安装vim 最小化安装的系统只有vi编辑器,这里装一下vim,个人习惯,可以不安装, 那么 ...

  9. Laya for H5 之Bug追踪

    Laya For H5之Bug追踪 H5游戏一旦上线后,如何跟踪用户的崩溃日志呢?现在有很多第三方的工具,比如fundebug,其sdk接入简单,只需寥寥几行代码就可以追踪h5游戏的崩溃日志,bug日 ...

  10. Windows下安装Python虚拟环境

    Windows下安装Python虚拟环境 虚拟环境安装 需求概要 "虚拟环境"是从电脑独立开辟出来的环境.就好比我们生活中的橱柜中,会把酱油放在一个瓶子里,把醋放在另外一个瓶子里, ...