原创 【TI博客大赛】基于MSP430单片机与DS18B20的温度采集程序

2012-10-17 19:59 1731 10 14 分类: MCU/ 嵌入式

关于DS18B20的应用相信大家都曾经看过或者实践过吧,这个小程序是原来大一时参考资料改的,当时用的是实验室发的开发板所以液晶程序我就省略了只留下了框架,感兴趣的朋友可以看看,程序的显示部分我省略了,根据自己需要往里面添加一些显示程序,就当做一个练习的小程序吧。

希望对您有帮助,您的支持,是我的动力~笑脸

#include"msp430x16x.h"

#include "lcd.h"

void init_port(void);

void Clock_Init();

void jiemian(void);

void menu();

颜色的宏定义 blue_green; red ; black ; green ; white ; blue ; yellow ; purple */

 

/=================变量定义======================*/

static unsigned int temp=0 ,wd=0;

static float wendu;

/*===============温度有关的函数声明及定义==============*/

uchar Init_18B20(void);

void Write_18B20(unsigned char wdata);

uchar Read_18B20(void);

void Skip(void);

void Convert(void);

void Read_SP(void);

uint ReadTemp(void);

uint Do1Convert(void);

 

#define DQ1      P6OUT |= BIT7            //高电平

#define DQ0      P6OUT &= ~BIT7         //低电平       

#define DQ_in    P6DIR &= ~BIT7       //设置为输入  

#define DQ_out   P6DIR |= BIT7       //设置为输出

#define DQ_val   (P6IN & BIT7)        //判断读取的值是否为低电平

                    

/*=======主函数======*/

void main()

{

      

    WDTCTL = WDTPW + WDTHOLD;     //关看门狗

    Clock_Init();                //单片机时钟初始化

    init_port();                //单片机端口初始化              

    LCD_Init();                //液晶初始化   

    delay_ms(100);

    menu();

   

    _EINT();             //开总中断允许

       

    while(1);

   {

     

        temp = Do1Convert();      // temp=temp/16; //温度值

        wendu=temp*0.0625;       //得到真实十进制温度值,因为DS18B20

                   //可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度

        wd=(int)(wendu*100);

             

        Put_Char(11,6,0,67,green,black);

        Put_Char(10,6,0,39,green,black);

             

        Put_Char(9,6,1,wd%10,green,blue);

        wd=wd/10;

        Put_Char(8,6,1,wd%10,green,blue);

        wd=wd/10;

        Put_Char(7,6,0,46,green,red);   //点

        Put_Char(6,6,1,wd%10,green,blue);

        wd=wd/10;      

        Put_Char(5,6,1,wd%10,green,blue);

                   

    }        

              

       

}

 

/*=========================================

函数名称: init_port(void)

函数功能: 430单片机IO口初始化

函数参数:

==================================================*/

void init_port(void)

{

  P4DIR=0XFF;           //(P3/P4控制液晶的锁存器??)

  P3DIR = 0XFF;

 

}

/*============时钟模块====================

函数功能: 初始化XT2时钟函数

 

===========================================*/

void Clock_Init()

{

   uint iq0;

  

   BCSCTL1 &= ~XT2OFF;                  //打开XT2振荡器

  

   do

   {

      IFG1 &= ~OFIFG;                  //清除振荡器失效标志

      for (iq0 = 0xFF; iq0 > 0; iq0--); //延时,等待XT2起振

   }

  

   while ((IFG1 & OFIFG) != 0);              //判断XT2是否起振

  

   BCSCTL2 = SELM_2 + SELS;              //选择MCLK、SMCLK为XT2

                                        //为高速时钟 不分频,均为8M

}

 

 

 

 

void jiemian(void)

{

 ;

}

 

void menu()

{

     ;

 

}

 

 

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

以下为DS18B20的预处理函数

 

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

 

 

 

 

//以下是对18B20的操作

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

函数名称:Init_18B20

功   能 :对ds18b20进行复位操作

参   数:无

返回值:初始化状态标志:1--失败, 0--成功

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

uchar Init_18B20(void)

{

  uchar Error;

 

  _DINT();  //关中断

  DQ0;         //拉低

  delay_us(500);

  DQ1;       //拉高

  delay_us(55);

  P6DIR &=~ BIT7;       //方向设为输入,用于接收信号

  _NOP();        //空指令,让CPU等待一个周期

  if (P6IN & BIT7)   //  ?  有疑问  (如果不是低电平)

  {

    Error = 1;  //初始化失败

    P6DIR |= BIT7;

  }

  else

  {

   Error = 0; //初始化成功

   P6DIR |= BIT7;

   DQ1;

  }

  _EINT();   // 全局中断使能

   

  delay_us(400);

 

  return Error;

}

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

函数名称:Write_18B20

功  能:向DS18B20写一个字节的数据

参 数:wdata--写入的数据

返回值:无

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

void Write_18B20(uchar wdata)

{

  uchar i;

 

  _DINT();

  for(i = 0; i < 8;i++)

  {

    DQ0;

    delay_us(6); //延时6us

    if(wdata & 0X01) DQ1;

    else DQ0;

    wdata >>= 1;

    delay_us(50); //延时50us

    DQ1;

    delay_us(10); //延时10us

  }

    _EINT();

}

 

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

函数名称:Read_18B20

功    能:从DS18B20读取一个字节的数据

参数:无

返回值:读出的一个字节数据

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

uchar Read_18B20(void)

{

  uchar i;

  uchar temp = 0;

  _DINT();

  for (i = 0; i < 8; i++)

  {

    temp >>= 1;

    DQ0;

    delay_us(6);

    DQ1;

    delay_us(8);

    P6DIR &= ~BIT7;

    _NOP();

    if (P6IN & BIT7) temp |= 0x80;

    delay_us(45);

    P6DIR |= BIT7;

    DQ1;

    delay_us(10);

   

  }

  _EINT();

  return temp;

 

}

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

函数名称:Skip

功能:发送跳过读取ID号命令

参数:无

返回值:无

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

void Skip(void)

{

  Write_18B20(0XCC);

 

}

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

函数名称:Convert(void)

功能:发送温度转换命令

参数: 无

返回值:无;

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

void Convert(void)

{

  Write_18B20(0x44);

}

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

函数名称:Read_SP

功能:发送读Scratchad命令

参数:无

返回值:无

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

void Read_SP(void)

{

  Write_18B20(0xbe);

 

}

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

函数名称:ReadTemp

功能:从DS18B20的ScratchPad读取温度转换结果

参数:无

返回值:读取的温度值

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

uint ReadTemp(void)

{

  uchar temp_low;

  uint temp;

 

  temp_low = Read_18B20(); //读低位

  temp = Read_18B20(); //读高位

  temp = (temp<<8) | temp_low;

 

 

  return temp;

}

 

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

函数名称:ReadTemp

功能:控制DS18B20完成一次温度转换

参数: 无

返回值:测量的温度

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

uint Do1Convert(void)

{

  uchar i;

 

  do

  {

    i = Init_18B20();

  }

    while(i);

    Skip();

    Convert();

    for(i = 20;i > 0;i--)

   delay_ms(45); //延时800ms以上   //GAIDONG

    do

      {

        i = Init_18B20();

      }

      while(i);

      Skip();

      Read_SP();

      return ReadTemp();

}

 

文章评论4条评论)

登录后参与讨论

用户377235 2014-4-4 12:55

你好!没用完的TI样片,我们可以回收:联系QQ:371322882

用户447311 2013-5-14 18:10

不错

用户377235 2012-10-30 18:06

还不错~

用户377235 2012-10-18 18:31

学习了~

用户377235 2012-10-18 13:46

挺不错的 顶楼主

13510179723_912348475 2012-8-12 22:10

两次收到TI的样片了。的确很给力!

Alwin 2012-8-7 13:05

相信在校很多网友,都已经申请过了。。

wxg1988 2012-8-7 09:02

嗯,是的,TI这方面做得不错,支持大学生竞赛,免费提供样片,给工程师们最贴心的服务
相关推荐阅读
用户380727 2013-03-07 12:08
闭关学习
又是一个转折点,压力很大,需要很多准备,多学习。...
用户380727 2012-12-30 23:57
值得一读的高精度 TI 正峰值检测英文原版文档
  这个是英文原版的正峰值检测文档,非常值得大家细细的品味,我按照文档中的电路验证过精度非常高,误差只有20mv.虽然是英文的但是还是能读懂的,还是可以好好阅读一下,对电路的原理的理解有一定帮...
用户380727 2012-12-29 12:42
DIY style- U盘MP3制作
《好声音》--STM32 U盘MP3 有想法就大胆的去实现吧! 大三的时候做的一个小制作,实验室手工打造,主控芯片采用 STM32,在一块开发板上做了转接板 引出来外扩的,解码芯片是采用V...
用户380727 2012-12-28 12:32
即将过去的2012
玛雅人没有预言到2012世界末日,生活依旧,即将过去的2012,几多欢喜,回顾过往的日子,几许唏嘘,向前看,还有几天时间,合理安排,希望2013的第一件大事是过去的这半年应该得到的结果!加油!...
用户380727 2012-12-01 19:09
加油!
12月新的征程!新的开始!不要迟疑!不要等待! 坚持你的梦想走下去!加油!...
用户380727 2012-11-27 09:51
【TI博客大赛】430也疯狂--MSP430单片机产生SPWM波
MSP430在功率电子方面的一个应用,由MSP430产生SPWM波的主程序,由于程序较多所以完整的程序在附件里。这个程序是原来做比赛的时候用的,单片机出来的波形经过整形再经过光耦以及其他变换后用来...
我要评论
4
10
关闭 站长推荐上一条 /2 下一条