打印

ds18b20源码~

[复制链接]
1747|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baigame|  楼主 | 2014-4-17 14:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
代码如下:
ds18b20.c
#include"ds18b20.h"
/*********************************************************************************************************
** 全局变量
********************************************************************************************************/
unsigned char Temperature;
/*********************************************************************************************************
** 函数名称:Delay_us(unsigned char us)
** 函数功能:延时uS
** 入口参数:unsigned char us
** 出口参数:void
** 说    明:u,延时精度2us
********************************************************************************************************/
void Delay_us (unsigned char us)                 
{

   while(--us);
}
/*********************************************************************************************************
** 函数名称:unsigned char OWTouchReset(void)
** 函数功能:复位温度传感器,并返回是否检测到信号
** 入口参数:void
** 出口参数:unsigned char,返回是否检测到信号
** 说    明:  返回值为1代表没有检测到,否则检测到
********************************************************************************************************/
unsigned char OWTouchReset (void)
{
    unsigned char result;

    DQ = 0;                                        //低电平驱动
    Delay_us(TRSTL/2);          //600us复位低电平
    Delay_us(TRSTL/2);
    DQ = 1;                                        //高电平驱动
    Delay_us(TPDHIGH);          //40us高电平存在检测            
    _nop_();           
    result = DQ;                                   // 检测信号
    Delay_us(TPDLOW);                             //160us低电平存在检测
    DQ = 1;
    Delay_us(TTSTH );                             //160us低电平存在检测

    return result;                                 
}
/*********************************************************************************************************
** 函数名称:void OWWriteBit (unsigned char BitData)
** 函数功能:往总线上写1位数据
** 入口参数:unsigned char BitData
** 出口参数:void
** 说    明:分为数据0和数据1
********************************************************************************************************/
void OWWriteBit (unsigned char BitData)
{
    if (BitData)            //数据位为1
    {
        DQ = 0;                                    //低电平驱动
        Delay_us( TLOW1 );         //单线写1低电平时间7us
        DQ = 1;                                    // 高电平驱动
        Delay_us(TSOLT );                          //时间间隙80us
        DQ = 1;      
    }
    else            //数据位为0
    {
        DQ = 0;                                    // 低电平驱动
        Delay_us(TLOW0);       //单线写0低电平时间80us
        DQ = 1;          //高电平驱动
    }
}
/*********************************************************************************************************
** 函数名称:unsigned char OWReadBit (void)
** 函数功能:从总线读取一个数据位
** 入口参数:void
** 出口参数:unsigned char
** 说    明:
********************************************************************************************************/
unsigned char OWReadBit (void)
{
    unsigned char result;

    DQ = 0;                                    // 低电平驱动
    Delay_us(TRDV);          //获得信号时间7us
    DQ = 1;                                    //高电平驱动
    _nop_();
    result = DQ;                               // 获取信号
    Delay_us(TSOLT);                           //时间间隙80us
    DQ = 1;

    return result;
}
/*********************************************************************************************************
** 函数名称:void OWWriteByte (unsigned char Data)
** 函数功能:往总线写一字节
** 入口参数:unsigned char Data
** 出口参数:void
** 说    明:
********************************************************************************************************/
void OWWriteByte (unsigned char Data)
{
    unsigned char i;

   //发送8位数据
    for (i=8;i!=0;i--)
    {
        OWWriteBit(Data & 0x01);
        Data = (Data >> 1);
    }
}
/*********************************************************************************************************
** 函数名称:unsigned char OWReadByte (void)
** 函数功能:从总线读取一个字节
** 入口参数:void
** 出口参数:unsigned char
** 说    明:
********************************************************************************************************/
unsigned char OWReadByte (void)
{
    unsigned char i,result=0;

    for (i=8;i!=0;i--)
    {
        //从高位开始存取
        result = (result >> 1);
        if (OWReadBit()) result |= 0x80;
    }
    return result;
}
/*********************************************************************************************************
** 函数名称:unsigned char DS18B20_Init (void)
** 函数功能:初始化温度传感器
** 入口参数:void
** 出口参数:unsigned char
** 说    明:
********************************************************************************************************/
unsigned char DS18B20_Init (void)
{
    EA = 0;                                     //关中断

    if (OWTouchReset())           
    {
        EA = 1;                                 //如果没有检测到,开中断
        return 0xE0;
    }


    OWWriteByte(OW_SkipROM);                     //跳过ROM
    OWWriteByte(OW_WriteScratchpad);             //写暂存器
    OWWriteByte(0x3D);                          // TH=60  设置最高温度
    OWWriteByte(0x00);                          // TL=0     设置最低温度
    //精度设置为12-BIT
OWWriteByte(0x7F);                          // DS18B20配置寄存器R1,R0=11

    if (OWTouchReset())
    {
        EA = 1;                               //开中断
        return 0xE0;
    }

    OWWriteByte(OW_SkipROM);     //跳过ROM
    OWWriteByte(OW_CopyScratchpad);             //复制暂存器


    EA = 1;                                     //关中断

    return 0;
}
/*********************************************************************************************************
** 函数名称:unsigned char ReadDS18B20 (void)
** 函数功能:读取传感器温度
** 入口参数:void
** 出口参数:unsigned char
** 说    明:
********************************************************************************************************/
unsigned char ReadDS18B20 (void)
{
    unsigned char i,result=0;

    EA = 0;                                     //关中断

    if (OWTouchReset())
    {
        EA = 1;                                 //开中断
        return 0xE0;
               
    }

    OWWriteByte(OW_SkipROM);                 //跳过ROM
    OWWriteByte(OW_ReadScratchpad);          //读取暂存器的值,9字节
   
    for (i=0;i <9;i++)
    {
        result = OWReadByte();
        if (0 == i)                        //温度低字节
        {
            Temperature = result >> 4;   // 温度不保留小数
        }
        else if (1 == i)    //温度高字节
        {
                 if (result & 0xF8)
                 {
                     Temperature = 0;           // 负温度归零
                 }
    else
    {
                Temperature |= (( result&0x07)<<4 ); // 温度保留8bit整数
    }
        }
    }
   
    EA = 1;                                     ////////////////

    return 0;
}
/*********************************************************************************************************
** 函数名称:void DS18B20ConvT (void)
** 函数功能:转换温度
** 入口参数:void
** 出口参数:void
** 说    明:
********************************************************************************************************/
void DS18B20ConvT (void)
{
    EA = 0;                                     //关中断
   
    if (OWTouchReset())
    {
        EA = 1;                                 //开中断
        return;
    }

    OWWriteByte(OW_SkipROM);     //跳过ROM
    OWWriteByte(OW_ConvertT);                  //温度转换

    EA = 1;                                     //开中断
}
ds18b20.h

#ifndef ds18b20_H 
#define ds18b20_H
/*********************************************************************************************************
** 基本环境
********************************************************************************************************/
#include <intrins.h>
#include<reg52.h>     
/*********************************************************************************************************
** 1-Wire参数定义
********************************************************************************************************/
//1-Wire Standard Speed
#define TLOW0 40   //单线写0低电平时间80us
#define TLOW1 1      //单线写1低电平时间7us
#define TSOLT 40        //时间间隙80us
#define TRDV 1          //获得信号时间7us
#define TRSTL 300       //复为低电平时间 600us延时
#define TPDHIGH 20      //40us高电平存在检测
#define TPDLOW 80       //160us低电平存在检测
#define TTSTH 200       //400us复位电平延时
/*********************************************************************************************************
** 1-Wire命令定义
********************************************************************************************************/
/*ROM操作命令*/
#define OW_SearchROM       0xF0      //搜索ROM   
#define OW_ReadROM         0x33     //读取ROM
#define OW_MatchROM        0x55     //匹配ROM
#define OW_SkipROM         0xCC     //跳过ROM
#define OW_AlarmSearch     0xEC     //告警搜索
/*存取器操作与温度变换命令*/
#define OW_ConvertT        0x44     //温度转换
#define OW_WriteScratchpad 0x4E     //写暂存器命令
#define OW_ReadScratchpad  0xBE     //读暂存器命令
#define OW_CopyScratchpad  0x48     // 复制寄存器
#define OW_RecallE2        0xB8     //从新调用E2
#define OW_ReadPower       0xB4     //读电源模式
/*********************************************************************************************************
** 信号线声明
********************************************************************************************************/
sbit DQ =P2^7;
/*********************************************************************************************************
** 变量全局声明
********************************************************************************************************/
extern unsigned char Temperature;   
/*********************************************************************************************************
** 函数声明
********************************************************************************************************/
static void          Delay_us     (unsigned char us);
static unsigned char OWTouchReset (void);
static void          OWWriteBit   (unsigned char BitData);
static unsigned char OWReadBit    (void);
static void          OWWriteByte  (unsigned char Data);
static unsigned char OWReadByte   (void);
extern unsigned char DS18B20_Init (void);
extern unsigned char ReadDS18B20  (void);
extern void          DS18B20ConvT (void);

/**********************end****************************************/
#endif

display.c

//程序:display.c键盘显示子程序
//功能:显示所需要显示的数字
//函数返回值:unsigned char                     
#include"display.h"
//sbit LED1=P2^0;
// 数码管0~1, A,B所对应的数码管键值
uchar code disp_save_num[12]={0X88, 0XBE, 0XC4, 0X94, 0XB2, 0X91,
                                       0X81, 0XBC, 0X80,0X90,0XA0,0XFF};

//读取所需显示的数字,并显示                                          
void Display(uchar *disp_num)
{
     uchar move_number,move_bit;
     uchar disp_number;
  
                              
   SS_CLK  = 0;
  
     for(move_number=0;move_number<4;move_number++)
     {
       disp_number=disp_save_num[*(disp_num+move_number)];//读取所需显示的数字
                                                        //并从所对应的键值里
                                                        //选择对应的键值                     

        for(move_bit=0; move_bit<8; move_bit++)
            {//显示对应键值
//                        P0=disp_save_num[3];
  //                                               LED1=0;
            SS_DATA = disp_number&0x80;
      
             SS_CLK = 1;
             SS_CLK = 0;
             disp_number<<=1;
              }
     }
}
  

display.h
//程序:display.h数码管显示子程序头文件
//功能:显示数码管所需数字
//函数说明:
//      void Display(uchar *disp_num)
//      读取四个数码管所需显示的数值,并显示
//////////////////////////////////////////////////////////////////////////////            
#ifndef _DISPLAY_H
#define _DISPLAY_H

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void Display(uchar *disp_num);
sbit  SS_DATA =P0^0;
sbit  SS_CLK =P2^0;

#endif

main.c
/*文件名:测试DS18B20.C
/功能:使用数码管测试温度传感器
*/
/****************************************************************************************
*包含文件声明
***************************************************************************************/
#include<reg52.h>
#include"display.h"
#include"ds18b20.h"
#include <intrins.h>

/**********************************************************************************
*函数声明
********************************************************************************/
void delay_50ms(unsigned int )  ;    //延时精度50ms
void  hextobcd( void) ;      //将十六进制转换为BCD

/************************************************************************************
*全局变量声明
***********************************************************************************/
extern unsigned char Temperature;
uchar disp_data[4] = {0,0,0,0};                 //数码管显示数据



/**********************************************************************************
*主程序
********************************************************************************/

/*******************************************************************************
** 函数名称:void main ()
** 函数功能:使用数码管测试温度传感器
** 入口参数:void
** 出口参数:void
** 说    明:
**************************************************************************************/
void main(void)
{
    Display(disp_data);
delay_50ms(10);   

    DS18B20_Init();                   //温度传感器初始化
    while (1)
    {
      
        delay_50ms(1);            
  DS18B20ConvT();          //转换温度
  delay_50ms(16);         //800ms转换时间等待
        ReadDS18B20();          //读取温度
  hextobcd();                                 //将温度转换为BCD
  _nop_();
  Display(disp_data);
    }
}

/***************************************************************************************
** 函数名称:void delay_50ms(unsigned int t)
** 函数功能:延时程序
** 入口参数:unsigned int t
** 出口参数:void
** 说    明:延时精度50ms
****************************************************************************************/

void delay_50ms(unsigned int t)
{
unsigned int j;
for(;t>0;t--)
  for(j = 6245;j>0;j--)
;
}
/***************************************************************************************
** 函数名称:void  hextobcd( void)
** 函数功能:将十六进制转换为BCD
** 入口参数:void
** 出口参数:void
** 说    明:使用了全局变量
***************************************************************************************/
void  hextobcd( void)
{
unsigned int high = 0,low = 0, temp =0, high_temp = 0, low_temp =0;
high_temp = (Temperature>>4) *0x16;  
low_temp = Temperature&0x0F;
if(low_temp > 9)
{
  low_temp = low_temp -10 + 0x10;
}
temp = high_temp + low_temp;
high = temp>>4;
low = temp & 0x0F;
if(low>9)
{
  high +=1;
  low -=10;
}

disp_data[1]= high;
disp_data[0] = low;

}
代码在keil中编译错误,错误代码如下
..\BAI\DS18B20.C(30): error C202: 'TRSTL': undefined identifier
..\BAI\DS18B20.C(31): error C202: 'TRSTL': undefined identifier
..\BAI\DS18B20.C(33): error C202: 'TPDHIGH': undefined identifier
..\BAI\DS18B20.C(36): error C202: 'TPDLOW': undefined identifier
..\BAI\DS18B20.C(38): error C202: 'TTSTH': undefined identifier
..\BAI\DS18B20.C(54): error C202: 'TLOW1': undefined identifier
..\BAI\DS18B20.C(56): error C202: 'TSOLT': undefined identifier
..\BAI\DS18B20.C(62): error C202: 'TLOW0': undefined identifier
..\BAI\DS18B20.C(78): error C202: 'TRDV': undefined identifier
..\BAI\DS18B20.C(82): error C202: 'TSOLT': undefined identifier
..\BAI\DS18B20.C(142): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(143): error C202: 'OW_WriteScratchpad': undefined identifier
..\BAI\DS18B20.C(155): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(156): error C202: 'OW_CopyScratchpad': undefined identifier
..\BAI\DS18B20.C(183): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(184): error C202: 'OW_ReadScratchpad': undefined identifier
..\BAI\DS18B20.C(227): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(228): error C202: 'OW_ConvertT': undefined identifier
compiling main.c...
..\BAI\MAIN.C(42): warning C206: 'DS18B20_Init': missing function-prototype
..\BAI\MAIN.C(47): warning C206: 'DS18B20ConvT': missing function-prototype
..\BAI\MAIN.C(49): warning C206: 'ReadDS18B20': missing function-prototype
..\BAI\MAIN.C(80): error C141: syntax error near '1'
..\BAI\MAIN.C(80): error C202: 'temp': undefined identifier
..\BAI\MAIN.C(81): error C202: 'high_temp': undefined identifier
..\BAI\MAIN.C(82): error C202: 'low_temp': undefined identifier
..\BAI\MAIN.C(83): error C202: 'low_temp': undefined identifier
..\BAI\MAIN.C(85): error C202: 'low_temp': undefined identifier
..\BAI\MAIN.C(87): error C202: 'temp': undefined identifier
..\BAI\MAIN.C(88): error C202: 'temp': undefined identifier
..\BAI\MAIN.C(89): error C202: 'temp': undefined identifier


仿真图如下:

有时间的坛友帮看下,程序那里有问题,应该怎么改。非常感谢~~


相关帖子

沙发
dirtwillfly| | 2014-4-17 16:46 | 只看该作者
外部函数,要先声明再使用

使用特权

评论回复
板凳
uconny720| | 2014-4-22 14:47 | 只看该作者
ds18b20购买可以参考一下这里http://www.86yuanjian.com/1417.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

82

帖子

0

粉丝