现在的位置: 首页 > 综合 > 正文

自己的第一个DS18B20温度传感器驱动程序(简单)

2014年10月17日 ⁄ 综合 ⁄ 共 2323字 ⁄ 字号 评论关闭

基于msp430F149系列单片机

DQ连接到PORT6.5引脚

释放总线:即 空闲状态  因为连接上拉电阻,所以单总线在空闲状态时,一直处于高电平!

#include "430IO.h"
//-----------I/O口定义------------------
#define DS_DIR P6DIR_bit.P6DIR_5
#define DS_OUT P6OUT_bit.P6OUT_5
#define DS_IN P6IN_bit.P6IN_5
#define DQ 1
//  #define dyus(x) {                                     \            //  延迟函数很重要,因为DS18B20对时序要求很严格,第一次写时,失败就是因为延迟函数写的不够精准,
//                    unsigned int dy_i;                \           //   延迟与晶振有关,8MHZ的晶振,一周期为 1 / 8MHZ=0.125us,5us大约40个周期,即大约执行40次汇编指令的时间
//                    for(dy_i=(x*10/8);dy_i>0;dy_i--); \   //  所以在写延迟函数时一定要注意使用的时钟频率!
//                }

//延迟函数
void Delay(unsigned int x)
{
  while(x!=0)x--;
}
//DS18B20复位函数
void DS_Reset()
{
   DS_DIR=1;   //DQ输出状态
   DS_OUT=0;   //输出低电平
   dyus(500);//延迟500us
   DS_OUT=1;   //输出高电平,拉高 释放总线
   dyus(60);  //延迟60us,接收存在脉冲
   DS_DIR=0;  //D Q输入状态 zmy
   while(DS_IN);  //等待从机18应答,低电平有效
   while(!DS_IN); //等待从机释放总线
   dyus(430);
 }
//DS18B20写字节函数
void DS_Write(unsigned char Data)
{
  unsigned char i;
  DS_DIR=1;
  for(i=0;i<8;i++)
  {
    DS_OUT=0;   //拉低总线
    dyus(10);  //延迟10us ,最大15us
    if(Data & 0x01) DS_OUT=1;
    else DS_OUT=0;
    dyus(40);  //延迟40us  最大45
    DS_OUT=1;
    dyus(1);  // 稍微延迟
    Data>>=1;
  }
}
//DS18b20 读字节函数
unsigned char DS_Read()
{
  unsigned char i,Temp;
  Temp=0;
  for(i=0;i<8;i++)
  {
    Temp>>=1;
    DS_DIR=1;  //DQ输出状态
    DS_OUT=0;
    dyus(1);  //延迟1us
    DS_OUT=1;  //释放总线  即 空闲状态  因为需要连接上拉电阻,所以单总线在空闲状态时,一直处于高电平!
    DS_DIR=0;  //shuru
   
    if(DS_IN) Temp=Temp|0X80;
    dyus(45);  //延迟45us  最大45
   }
  return Temp;
}

//读取温度函数
unsigned int Read_Temperature()
{
  unsigned int Temp1,Temp2;  // 低八位 高八位
  //第一周期
  DS_Reset();  //复位
  DS_Write(0xCC);  //跳过ROM
  DS_Write(0X44);   //温度转换
  //第二周期
  DS_Reset();
  DS_Write(0xCC);
  DS_Write(0xBE);
 
  Temp1=DS_Read();  // 读低八位
  Temp2=DS_Read();  //读高八位
  DS_Reset();     //复位,表示读取结束
 
  return (((Temp2<<8) | Temp1)*0.0625);     //DS18B20的温度操作是16为,也就是说分辨率是0.0625 。0.0625=XX ,0.625=XX.X  , 6.25=XX.XX
 
}

部分main函数

while(1)
    {
        FeedDog();
    //*****************************DS18B20********************************
      temp=Read_Temperature();
   //   Display_Temp[0]=temp/1000+'0';                   // 带小数部分的
  //    Display_Temp[1]=temp%1000/100+'0';
  //    Display_Temp[2]=temp%100/10+'0';
      Display_Temp[0]=temp/10+'0';                         // 不带小数,只是整数部分。
      Display_Temp[1]=temp%10+'0';
      lcd_clear(0,8);
      DisString(3, 50, Display_Temp,0, FONTSIZE16);
      dyus(10000);
     //*********************************************************************

}

 

抱歉!评论已关闭.