找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS18B20读写操作单片机程序详解

[复制链接]
跳转到指定楼层
楼主
ID:366214 发表于 2018-11-7 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 一、DS18B20的初始化
  (1) 先将数据线置低电平“0”。
  (2) 延时(该时间要求的不是很严格,但是尽可能的短一点)
  (3) 数据线拉到低电平“0”。
  (4) 延时750微秒(该时间的时间范围可以从480到960微秒)。
  (5) 数据线拉到高电平“1”。
  (6) 延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
  (7) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
  (8) 将数据线再次拉高到高电平“1”后结束。
  二、 DS18B20的写操作
  (1) 数据线先置低电平“0”。
  (2) 延时确定的时间为15微秒。
  (3) 按从低位到高位的顺序发送字节(一次只发送一位)。
  (4) 延时时间为45微秒。
  (5) 将数据线拉到高电平。
  (6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止。
  (7) 最后将数据线拉高。
  三、DS18B20的读操作
  (1)将数据线拉高“1”。
  (2)延时2微秒。
  (3)将数据线拉低“0”。
  (4)延时15微秒。
  (5)将数据线拉高“1”。
  (6)延时15微秒。
  (7)读数据线的状态得到1个状态位,并进行数据处理。
  (8)延时30微秒。
  四、DS18B20读写操作程序
  1.   //----------------------------------------------------------
  2.   // 模块名称:DS18B20.h
  3.   // 模块功能:DS18B20 读写操作
  4.   //----------------------------------------------------------
  5.   sbit DS = P1^2;
  6.   //----------------------------------------------------------
  7.   // 函数名称:void DelayTmp(unsigned int count)
  8.   // 函数功能:延时
  9.   //----------------------------------------------------------
  10.   void DelayTmp(unsigned int count)
  11.   {
  12.   unsigned int i;
  13.   while(count)
  14.   {
  15.   i=200;while(i》0)i--;
  16.   count--;
  17.   }
  18.   }
  19.   //----------------------------------------------------------
  20.   // 函数名称:void DsReset(void)
  21.   // 函数功能:复位
  22.   //----------------------------------------------------------
  23.   void DsReset(void)
  24.   {
  25.   unsigned int i;
  26.   DS=0;
  27.   i=103; while(i》0)i--;
  28.   DS=1;
  29.   i=4;while(i》0)i--;
  30.   }
  31.   //----------------------------------------------------------
  32.   // 函数名称:bit TmpReadBit(void)
  33.   // 函数功能:读取一位
  34.   //----------------------------------------------------------
  35.   bit TmpReadBit(void)
  36.   {
  37.   unsigned int i;
  38.   bit dat;
  39.   DS=0;i++;
  40.   DS=1;i++;i++;
  41.   dat=DS;
  42.   i=8;while(i》0)i--;
  43.   return (dat);
  44.   }
  45.   //----------------------------------------------------------
  46.   // 函数名称:unsigned char TmpRead(void)
  47.   // 函数功能:读取一字节
  48.   //----------------------------------------------------------
  49.   unsigned char TmpRead(void)
  50.   {
  51.   unsigned char i,j,dat;
  52.   dat=0;
  53.   for(i=1;i《=8;i++)
  54.   {j=TmpReadBit();
  55.   dat=(j《《7)|(dat》》1); }
  56.   return(dat);
  57.   }
  58.   //----------------------------------------------------------
  59.   // 函数名称:void TmpWriteByte(unsigned char dat)
  60.   // 函数功能:写入一字节
  61.   //----------------------------------------------------------
  62.   void TmpWriteByte(unsigned char dat)
  63.   {
  64.   unsigned int i;
  65.   unsigned char j;
  66.   bit testb;
  67.   for(j=1;j《=8;j++)
  68.   {
  69.   testb=dat&0x01;
  70.   dat=dat》》1;
  71.   if(testb) //write 1
  72.   {
  73.   DS=0;
  74.   i++;i++;
  75.   DS=1;
  76.   i=8;while(i》0)i--;
  77.   }
  78.   else
  79.   {
  80.   DS=0; //write 0
  81.   i=8;while(i》0)i--;
  82.   DS=1;
  83.   i++;i++;
  84.   }
  85.   }
  86.   }
  87.   //----------------------------------------------------------
  88.   // 函数名称:void TmpChange(void)
  89.   // 函数功能:温度转换
  90.   //----------------------------------------------------------
  91.   void TmpChange(void)
  92.   {
  93.   DsReset();
  94.   DelayTmp(1);
  95.   TmpWriteByte(0xcc);
  96.   TmpWriteByte(0x44);
  97.   }
  98.   //----------------------------------------------------------
  99.   // 函数名称:unsigned int Tmp()
  100.   // 函数功能:获取温度
  101.   //----------------------------------------------------------
  102.   unsigned int Tmp()
  103.   {
  104.   float tt;
  105.   unsigned char a,b;
  106.   unsigned int temp;
  107.   DsReset();
  108.   DelayTmp(1);
  109.   TmpWriteByte(0xcc);
  110.   TmpWriteByte(0xbe);
  111.   a=TmpRead();
  112.   b=TmpRead();
  113.   temp=b;
  114.   temp《《=8;
  115.   temp=temp|a;
  116.   tt=temp*0.0625;
  117.   temp=tt*10+0.5;
  118.   return temp;
  119.   }
  120.   //----------------------------------------------------------
  121.   // 函数名称:void RefreshTmp()
  122.   // 函数功能:刷新温度
  123.   //----------------------------------------------------------
  124.   void RefreshTmp()
  125.   {
  126.   TmpChange();
  127.   DisplayTmp(Tmp());
  128.   }
复制代码


温度传感器的操作.docx

22.27 KB, 下载次数: 26, 下载积分: 黑币 -5

温度

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

使用道具 举报

沙发
ID:382454 发表于 2018-11-8 07:46 来自手机 | 只看该作者
写字一个函数,写字节又一个函数。没有必要吧。
回复

使用道具 举报

板凳
ID:681726 发表于 2020-1-5 21:45 | 只看该作者
学校要求做,我认真看了楼主的帖子,抛出疑问
初始化模块呢?
读写函数也可以这么写

//读传感器8位
unsigned char duzi(void)
{unsigned char i=0,dat=0;
for (i=8;i>0;i--)
{signal=0;//拉低
dat>>=1;//二进制数字位左移的同时延时1微秒
signal=1;
if(signal)
dat|=0x80;//按位或 ,搭配dat>>=1,逐步写好8位信息
delay(4);}
return(dat);
}

另外回复1楼,读函数和写函数必须分开的,它和单片机是单线通信,不可能做到同时读写的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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