搜索
bottom↓
回复: 1

msp4301232 +ds18B20的程序

[复制链接]

出0入0汤圆

发表于 2010-8-5 22:52:40 | 显示全部楼层 |阅读模式
#include "msp430x12x2.h"

typedef unsigned char uchar;
typedef unsigned int  uint;
uchar TMPL,TMPH;
uint  jk=0;   

/**************函数的声明*************************/
void delay_us();                 //延时1.25
uchar rest_ds18b20(void);        //复位函数
uchar read_bit();                //读一位
void  write_bit(char bitval) ;   //写一位
uchar  read_byte();             //读一个字节
void write_byte(uchar val);     //写一个字节
uint  get_temp();               //获得温度

/************DS18B20控制引脚定义****************/
#define   DQ_OUT     P3DIR|=BIT5
#define   DQ_IN      P3DIR&=~BIT5
#define   DQ_H       P3OUT|=BIT5
#define   DQ_L       P3OUT&=~BIT5
#define   DQ_DATE    (P3IN&BIT5)     //读出P2.7口数据 1  OR  0
//延时函数
void delay_us(unsigned long time)
{
  //while(time--);
  _NOP();//一个周期
}

//ds18b20复位子程序
uchar rest_ds18b20(void)
{
  uchar ds18b20_rest_flag;
// delay_us(5);//稍做延时
  DQ_OUT;//输出
  DQ_L; //输出0
  delay_us(480);  //480uS               
  DQ_H; //输出1
  delay_us(48);
  DQ_IN;   //输入                                       
  ds18b20_rest_flag=DQ_DATE;
  delay_us(400);    //400uS               
  return ds18b20_rest_flag;      //如果stDQ=0则初始化成功 stDQ=1则初始化失败
}

//读一个位
uchar read_bit()
{  
        DQ_OUT;//输出
        DQ_L;//输出0
        DQ_H;//输出1
        delay_us(15);//15uS                 
        return  DQ_DATE;                    //读出的一个位值返回
}
//写一个位
void  write_bit(char bitval)
{
   DQ_OUT;//输出
   DQ_L;   //输出0
   delay_us(16);//16us
   if(bitval==1)
   DQ_H;
   delay_us(80); //在其余的时间隙保持值。
   DQ_H;

}
//读一个字节
uchar  read_byte()
{
        uchar i;
        uchar  value=0;
        for(i=0;i<8;i++)
        {
             if(read_bit())                  //当read_bit()=0时,value=0。
                 {                        //当 read_bit()=1时,执行 value|=0x01<<i;,value=1。
                    value|=0x01<<i;           //按位或|。  有一个为1则为1
                  }
                  delay_us(36) ;          //等待剩下时间隙。
       
        }

        return  value;

}

//写一个字节
void write_byte(uchar val)
{
        uchar i,temp;
        for(i=0;i<8;i++)
        {  
           temp=val>>i;
           temp=temp&0x01;
           write_bit(temp);
         }
          delay_us(80);//80uS

}

//获得温度的值
uint  get_temp()
{
   float  f_temp;
   uint temp;
   rest_ds18b20();                       //通过单总线的所有执行(处理 )都从一个初始化程序开始。其包括总线发出的复位脉冲和{ 从机发出的脉冲。(单机)}
   write_byte(0xCC);                      // 写跳过读ROM指令。因为只对一个DB18B20操作。
   write_byte(0xBE);                      //read_EEROM =0xBE    ,读暂存器,读内部RAM中9字节的温度
   TMPL = read_byte();                //读取低字节的8位数据
   TMPH = read_byte();                //读取低字节的8位数据
   temp = TMPH;                       //把高位的8字节数据 付给temp。
   temp <<= 8;                        //两个字节为一个字
   temp = temp | TMPL;
   f_temp=temp*0.0625;                //温度在寄存器里面是12位,分辨率为:0.0625。
   temp=f_temp*10+0.5;                //扩大10倍为了保存以为小数点。加0.5是为了四舍五入。
   f_temp=f_temp+0.05;
   return   temp;
}

uchar flag;
//*****************温度转换函数****************************
void tempchange()
{
      
        flag=rest_ds18b20();
        //delay_us(20);
        write_byte(0xCC);      // 写跳过读ROM指令。因为只对一个DB18B20操作。
        write_byte(0x44 );    //  写温度转换指令。

}
void main( void )
{
      WDTCTL = WDTPW + WDTHOLD;         // Stop watchdog timer to prevent time out reset
      //DCOCTL=DCO0+DCO1+DCO2;
      //BCSCTL1=RSEL2;
      //BCSCTL2 = DIVS_0 + DIVM_0;       //MCLK   SMCLK不分频
      
      DCOCTL=DCO0+DCO1+DCO2;
      BCSCTL1=RSEL0+RSEL1+RSEL2;
      //BCSCTL2 = DIVM_1 + DIVM_0;
      
   while(1)
   {
          tempchange();              //温度转换函数。
          jk=get_temp();
   }
}

为什么得不到温度呢?

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-8-6 08:44:32 | 显示全部楼层
我手头有个调试通过的,你试试吧

点击此处下载 ourdev_573186.rar(文件大小:2K) <font color=green>(原文件名:ds18b20.rar)</font

------------------------------------------------------
MSP430F41X开发板

http://shop61810118.taobao.com

QQ:892364156
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 07:00

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

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