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

2013-5-17 11:13 2492 11 11 分类: MCU/ 嵌入式
 
//希望对您有帮助,您的支持,是我的动力~
#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();
}

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条