搜索
bottom↓
回复: 7

18B20显示455.5 急啊

[复制链接]

出0入0汤圆

发表于 2010-12-26 11:35:33 | 显示全部楼层 |阅读模式
#include "msp430x14x.h"

//DS18B2O控制引脚定义
#define   DQ_OUT  P2DIR|=BIT6
#define   DQ_IN   P2DIR&=~BIT6
#define   DQ_H    P2OUT|=BIT6
#define   DQ_L    P2OUT&=~BIT6
#define   DQ_DATE (P2IN & BIT6)


void delay_us(unsigned int i);//delay 2.5us at 8M
unsigned char rest_ds18b20(void);//DS18B20复位程序
void ReadTemp1820(void);//读取温度
void WriteOneChar(unsigned char value);//写一个字节
unsigned char ReadOneChar(void);



//****************************************************

//读一个字节
unsigned char ReadOneChar(void)
{
  unsigned char i=0;
  unsigned char value = 0;
  for (i=0;i<8;i++)
  {
  value>>=1;
  DQ_OUT;
  DQ_L;
  delay_us(1);
  DQ_H; //DQ = 1
  
  DQ_IN;
  if(DQ_DATE) value|=0x80;
  delay_us(16); //延时40us
  DQ_OUT;
  DQ_H; //DQ = 1
  delay_us(1);
}
return value;
}

//写一个字节
void WriteOneChar(unsigned char value)
{
   unsigned char i=0;
   for(i=0;i<8;i++)
   {
    DQ_OUT;
    DQ_L;
   
    if (value&0x01) DQ_H; //DQ = 1
    delay_us(30); //延时50us 以上
    DQ_H; //DQ = 1
    value>>=1;
   }

}

//;**************************************************
//ds18b20复位子程序
unsigned char rest_ds18b20(void)
{
  unsigned char ds18b20_rest_flag;
  delay_us(4); //稍做延时
  DQ_OUT;
  DQ_L;
  delay_us(200); //480us<T<960us
  DQ_IN; //拉高总线
  delay_us(36); //延时90us
  ds18b20_rest_flag=DQ_DATE;
  delay_us(40); //延时100us
  return ds18b20_rest_flag; //如果stDQ=0则初始化成功 stDQ=1则初始化失败
}
        
//***************************************************
//2.5us延时程序        
void delay_us(unsigned int i)//delay 2.5us at 8M
{  
   unsigned int ii;
   for(ii =i;ii > 0;ii--)
   {
      _NOP();_NOP();_NOP();_NOP();   
      _NOP();_NOP();_NOP();_NOP();
      _NOP();_NOP();_NOP();_NOP();
      _NOP();_NOP();_NOP();_NOP();   
   }   
}


//******************************************************
//352微秒延时程序
void delay_352us(unsigned int i)//352us延时程序,延时时间的计算在前面已经讲过
{
  unsigned char j;
  
  while(i--)
  {
   for(j=0;j<255;j++)
   {  
    _NOP();
    _NOP();
    _NOP();
    _NOP();   
    }
  }
}  


//读取温度
unsigned long temp32;
void ReadTemp18B20(void)
{
     unsigned char templ,temph;
     while(rest_ds18b20());   
     WriteOneChar(0xcc); //跳过读序列号的操作
     WriteOneChar(0x44); //启动温度转换
     delay_us(10);

     while(rest_ds18b20());
     WriteOneChar(0xcc); //跳过读序列号的操作
     WriteOneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
     templ=ReadOneChar();
     temph=ReadOneChar();  
     temp32=temph*256+templ;//执行这句程序后,temp32/16就是温度
//     return temp32;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

 楼主| 发表于 2010-12-27 15:05:10 | 显示全部楼层
没人吗

出0入0汤圆

发表于 2010-12-27 15:47:01 | 显示全部楼层
看不明白呀

出0入0汤圆

发表于 2010-12-27 16:45:45 | 显示全部楼层
没看你的程序,改程序比写程序费劲
坛里有范例程序,18B20或2401大都是延时问题,看看说明书里时序图,还有晶振多大,时间误差多大。

出0入0汤圆

 楼主| 发表于 2010-12-29 08:08:45 | 显示全部楼层
晶振8M

出0入0汤圆

发表于 2010-12-29 08:15:51 | 显示全部楼层
"急啊"

you deserve it.

maybe next time, you will learn to plan ahead.

出0入0汤圆

发表于 2010-12-29 08:41:49 | 显示全部楼层
回复【5楼】millwood0
-----------------------------------------------------------------------

millwood0 还是这么酷。

出0入0汤圆

 楼主| 发表于 2010-12-29 14:10:16 | 显示全部楼层
我加上个按键中断,位什么显示一切OK,那应该证明时序没问题吧,但是不加按键的话,数值现在在10.5每次仿真变一个数,为什么啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-2 13:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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