智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1799|回复: 8
打印 上一主题 下一主题

【DS18B20】想实时检测电机驱动芯片和CPU附近温度

[复制链接]

10

主题

1514

帖子

0

精华

金牌会员

智能车,首选泰庆

Rank: 6Rank: 6

积分
1715

活跃会员奖章在线王奖章

QQ
威望
427
贡献
400
兑换币
497
注册时间
2014-11-4
在线时间
444 小时
跳转到指定楼层
1#
发表于 2014-12-4 10:59:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想实时检测电机驱动芯片和CPU附近温度高温报警。

想用DS18B20,有调成功过的朋友吗 或者有这方面好的资料供参考吗。贡献一份网上找的资料。基于51单片机的。分享给大家学习与参考哈。



一.概述
DS18B20是一种单总线数字温度传感器。测试温度范围-55℃-125℃,温度数据位可配置为9、10、11、12位,对应的刻度值分别为0.5℃0.25℃0.125℃0.0625℃,对应的最长转换时间分别为93.75ms、187.5ms、375ms、750ms。出厂默认配置为12位数据,刻度值为0.0625℃,最长转换时间为750ms。从以上数据可以看出,DS18B20数据位越低、转换时间越短、反应越快、精度越低。
单总线,意味着没有时钟线,只有一根通信线。单总线读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格,这也是DS18B20驱动编程的难点。
需要注意的是,DS18B20和同一系列的DS18S20,在读写上,时序、命令一致,但因温度值存放的位置不一样,对温度数据的处理也不一样,所以程序不能直接套用。
二.电路设计
在WSF-51DB开发板上,利用AT89S52单片机的P1.1脚来驱动DS18B20,上拉电阻阻值为4.7K欧姆。DS18B20的上拉电阻的阻值是一个需要注意的参数,如果DS18B20放置的位置离电路板较远,需要用较长的电缆来连接时,上拉电阻要相应减小,以弥补线路损耗,而且连接电缆要选用优质的三芯带屏蔽层的电缆,否则不能正常读写数据。
                     
                  
三.软件设计
/*****************************************************************
*程序名称:DS18B20驱动
*程序功能:读写DS18B20,数码管显示温度值,温度值精度为0.1度。
*开发工具:WSF-51DB开发板
* MCU型号:AT89S52-24PU
*时钟频率:11.0592-12MHZ
*程序作者:吴师傅
*版权说明:吴师傅版权所有,转载请注明来源和作者。
*****************************************************************/
i nclude <reg52.h>
i nclude <intrins.h>
unsigned char tempflag,fraction,tempr;
unsigned char code segmcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴极数码管段码0-9
unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//8位共阴极数码管位码
unsigned char code fractioncode[]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};
//将DS18B20的小数部分的0-f刻度转换为0-9刻度的查找表,将精度化为0.1度
sbit ser=P2^0;//74HC595串行数据输入
sbit oe=P2^1;//74HC595使能
sbit rclk=P2^2; //74HC595数据锁存
sbit srclk=P2^3;// 74HC595串行时钟
sbit DQ=P1^1; //温度总线
//延时函数(12MHZ晶振):
void Delayus(unsigned char t)
{  //此函数精确计算:18+6*(t-1)=延时时间(us)
    while(t--);
}
//延时ms延时函数:
void Delayms(unsigned int t)
{
       unsigned int i,j;
       for(i=t;i>0;i--)
               for(j=0;j<120;j++);
}
//任意位数码管显示一个字符函数:
void DTDisplayChar(unsigned char segmd,unsigned char bitd )//数码管段码和数码管位码
{
        unsigned char i;
        unsigned int dat;
        oe=1;//输出为高阻
        dat=bitd;
        dat=dat<<8|segmd; //位码段码合并为一个int型数据
        for(i=0;i<16;i++)//16位数据从高位依次移入74HC595
        {
                 ser=(dat&0x8000)?1:0; //判断最高位,为真取1,为假取0
                 srclk=1;    //上升沿送数据
                 srclk=0;
                 dat<<=1;   //左移取下一位
        }
        rclk=1;//74HC595锁存数据
        rclk=0;
        oe=0;//输出数据
}
//DS18B20复位函数:
void Reset18B20(void)
{
        DQ=0;//拉低,开始复位操作
        Delayus(100);//延时至少480us
        DQ=1;//拉高,释放总线控制权
        while(DQ);//等待器件应答(器件拉低),约15-60us
        while(!DQ);//应答脉冲出现后,等待器件拉高,约60-240us
}
//DS18B20写命令函数:
void Write18B20(unsigned char com)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {   
               DQ=0;//开始写操作
               _nop_(); _nop_();//至少延时1us
               DQ=com&0x01;//写数据
               Delayus(2);//延时,器件在45us内采样
               DQ=1;//释放总线控制权
               com>>=1; //右移1位,写下一位
        }
}
//DS18B20读数据函数:
unsigned char Read18B20()
{
          unsigned char i,rdata=0;
          for(i=0;i<8;i++)
          {
                   DQ=0;//开始读操作
                   _nop_();_nop_();//至少延时1us
                   DQ=1;//释放总线控制权,15us内要读取数据
                   if(DQ==1) rdata|=0x01<<i;
                   Delayus(10);//延时要大于45us.读0,45us后器件才拉高总线
           }
           return rdata;
}
//读出温度函数:
void Read18B20Temperature()
{
        unsigned char templ,temph,temp;
        unsigned int tempv;
        Reset18B20();//复位
        Write18B20(0xcc);//写命令,跳过ROM编码命令
        Write18B20(0x44);//转换命令
     while(!DQ);//等待转换完成
        Reset18B20();//复位
        Write18B20(0xcc);//写命令,跳过ROM编码命令
        Write18B20(0xbe);//读取暂存器字节命令
        templ=Read18B20();//读低字节
        temph=Read18B20();//读高字节
        Reset18B20();//复位
        tempv=temph;
        tempv=tempv<<8|templ;//两个字节合并为一个int型数据
        temp=(unsigned char)(tempv>>4);//去掉小数部分,化成char型数据
        if((temph&0x80)==0x80)//如果是负温度
        {
              tempflag=1; //负号显示
              tempr=~temp+1; //实际温度值为读取值的补码
              fraction=fractioncode[(~templ+1)&0x0f];
//取小数部分补码,将16刻度转换为10刻度,精度为0.1度
         }
         else//如果是正温度
         {
                tempflag=0;//正温度,负号不显示
                tempr=temp;//
                fraction=fractioncode[templ&0x0f];
//取小数部分,将16刻度转换为10刻度,精度为0.1度
          }     
}
   
//主函数:
int main(void)
{
      tempflag=0;
      while(1)
      {
              Read18B20Temperature();//读取温度值
              DTDisplayChar(segmcode[fraction],0x7f);//显示小数部分
              Delayms(1);
              DTDisplayChar(segmcode[tempr%10]|0x80,0xbf);//显示个位和小数点
              Delayms(1);
              DTDisplayChar(segmcode[tempr%100/10],0xdf);//显示十位
              Delayms(1);
              if(tempflag==1) DTDisplayChar(0x40,0xef);//如果是负温度就显示-”
              else DTDisplayChar(segmcode[tempr/100],0xef);//显示百位
              Delayms(1);
              DTDisplayChar(0xff,0xff);//均衡数码管亮度
      }
      return 0;
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

25

主题

1451

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7523

活跃会员奖章优秀会员奖章论坛元老奖章在线王奖章

威望
4527
贡献
1518
兑换币
2167
注册时间
2013-11-22
在线时间
739 小时
2#
发表于 2014-12-4 11:33:49 | 只看该作者
:lol搞飞思卡尔预选赛用过
回复 支持 反对

使用道具 举报

30

主题

538

帖子

0

精华

会长

Rank: 8Rank: 8

积分
8033

优秀会员奖章活跃会员奖章在线王奖章

威望
5004
贡献
2179
兑换币
1386
注册时间
2012-3-29
在线时间
425 小时
3#
发表于 2014-12-4 11:36:51 | 只看该作者
挺好的,赞!
回复 支持 反对

使用道具 举报

10

主题

1514

帖子

0

精华

金牌会员

智能车,首选泰庆

Rank: 6Rank: 6

积分
1715

活跃会员奖章在线王奖章

QQ
威望
427
贡献
400
兑换币
497
注册时间
2014-11-4
在线时间
444 小时
4#
 楼主| 发表于 2014-12-4 11:58:49 | 只看该作者
lions 发表于 2014-12-4 11:33
搞飞思卡尔预选赛用过

帅气,请问DS18B20 复位那个函数 最后两句等待为什么程序执行不过去,卡在那里了。
回复 支持 反对

使用道具 举报

5

主题

833

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6207

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

威望
3103
贡献
1968
兑换币
1747
注册时间
2014-5-8
在线时间
568 小时
5#
发表于 2014-12-4 13:14:19 | 只看该作者
Nice
回复 支持 反对

使用道具 举报

2

主题

55

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1133
威望
549
贡献
356
兑换币
346
注册时间
2014-8-6
在线时间
114 小时
6#
发表于 2014-12-4 16:30:57 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

68

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1112
威望
509
贡献
403
兑换币
341
注册时间
2014-3-5
在线时间
100 小时
毕业学校
哈尔滨工业大学(威海)
7#
发表于 2014-12-4 18:01:19 | 只看该作者
回复 支持 反对

使用道具 举报

61

主题

545

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3810

优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章论坛元老奖章

威望
1747
贡献
995
兑换币
1052
注册时间
2013-9-7
在线时间
534 小时
8#
发表于 2014-12-5 13:51:13 | 只看该作者
泰庆电子 发表于 2014-12-4 11:58
帅气,请问DS18B20 复位那个函数 最后两句等待为什么程序执行不过去,卡在那里了。

DQ=1那行注掉
回复 支持 反对

使用道具 举报

10

主题

1514

帖子

0

精华

金牌会员

智能车,首选泰庆

Rank: 6Rank: 6

积分
1715

活跃会员奖章在线王奖章

QQ
威望
427
贡献
400
兑换币
497
注册时间
2014-11-4
在线时间
444 小时
9#
 楼主| 发表于 2014-12-8 09:29:49 | 只看该作者
925901184 发表于 2014-12-5 13:51
DQ=1那行注掉

问题解决了,谢谢了。是单片机的问题。STC12C5A60S2系列的时钟是STC89C52的12倍。
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 23:30 , Processed in 0.081723 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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