zigbee cc2530基础 17.温度传感器 DS18B20

传感器介绍:
DS18B20 数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,主要根据应用场合的不同而改变其外观。封装后的 DS18B20 可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
2.实验设备
硬件: PC 机一台 ZB2530(底板、核心板、仿真器、 USB 线、 OLCD) 一套DS18B20 一个
软件: 2000/XP/win7 系统, IAR 8.10 集成开发环境、串口助手

4.实验相关寄存器
实验中用到了串口和 P0_7,前面已详细讲解了串口相关寄存器的配置与使用,此实验就不再重
复讲串口配置了。 DS18B20 程序采用模块化编程思想,只需调用温度读取函数即可,相当方便,
移植到其它平台也非常容易。

重点讲 P0_7 的配置和 DS18B20 使用 P0_7 的方法:
P0SEL &= 0x7f; //DS18B20 的 io 口初始化
#define Ds18b20IO P0_7 //温度传感器引脚,在 ds18b20.c 修改,不同 IO 修改
/****************************************************************************
* 描 述: 设置串口调试助手波特率: 115200bps 8N1
* DS18B20 采集的温度通过串口传给电脑显示
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include "ds18b20.h"
#include "LCD.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr)[0])
#define FLOAT_TEMP 1 //输出更高精度时打开此注释
extern void Delay_ms(unsigned int k);//外部函数 ms 的声明
/****************************************************************************
* 名 称: InitCLK()
* 功 能: 设置系统时钟源
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitCLK()
{
CLKCONCMD &= ~0x40; //设置系统时钟源为 32MHZ 晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为 32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为 32MHZ
}
/****************************************************************************
* 名 称: InitUart()
* 功 能: 串口初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitUart()
{
PERCFG = 0x00; //位置 1 P0 口
P0SEL = 0x0c; //P0 用作串口
P2DIR &= ~0xc0; //P0 优先作为 UART0
U0CSR |= 0x80; //串口设置为 UART 方式
U0GCR |= 8;
U0BAUD |= 59; //波特率设为 115200
U0CSR |= 0x40; //UART 接收器使能
UTX0IF = 0; //UART0 TX 中断标志初始置位 0
}
/****************************************************************************
* 名 称: UartSendString()
* 功 能: 串口发送函数
* 入口参数: Data:发送缓冲区 len:发送长度
* 出口参数: 无
****************************************************************************/
void UartSendString(char *Data, int len)
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
/****************************************************************************
* 程序入口函数
****************************************************************************/
void main()
{
char str[9]="DS18B20:";
char strTemp[30];
float fTemp;
InitCLK(); //设置系统时钟源
InitUart(); //串口初始化
P0SEL &= 0x7f; //DS18B20 的 io 口初始化
LCD_Init(); //oled 初始化
LCD_CLS(); //屏全亮
LCD_welcome();
while(1)
{
memset(strTemp, 0, ARRAY_SIZE(strTemp));
//厂家提供的程序温度值不带小数, Ds18B20 本身是支持 1 位小数位的,修改后使其支持,精度更
#if defined(FLOAT_TEMP)
fTemp = floatReadDs18B20(); //温度读取函数 带 1 位小数位
sprintf(strTemp, "%s%.01f", str, fTemp); //将浮点数转成字符串
UartSendString(strTemp, strlen(strTemp)); //通过串口发送温度值到电脑显示
#else
ucTemp = ReadDs18B20(); //温度读取函数
// strTemp[0] = ucTemp/10+48; //取出十位数
// strTemp[1] = ucTemp%10+48; //取出个位数
sprintf(strTemp, "%s%d%d", str, ucTemp/10, ucTemp%10);
UartSendString(strTemp, strlen(strTemp)); //通过串口发送温度值到电脑显示
#endif
LCD_P8x16Str(0, 5, (unsigned char*)strTemp);
UartSendString("\r\n", 2); // 回车换行
Delay_ms(1000); //延时函数使用定时器方式
}
}

温度测试.c

#include "ds18b20.h" 

#define Ds18b20IO P0_7       //温度传感器引脚

void Delay_us(unsigned int k)//us延时函数
{
    T1CC0L = 0x06; 
    T1CC0H = 0x00; 
    T1CTL = 0x02; 
    while(k)
    { 
        while(!(T1CNTL >= 0x04));
        k--;
    }
    T1CTL = 0x00;  //关闭定时器
}

void Delay_ms(unsigned int k)
{
    T1CC0L = 0xe8;
    T1CC0H = 0x03;
    T1CTL = 0x0a; //模模式 32分频
    while(k)
    {
        while(!((T1CNTL >= 0xe8)&&(T1CNTH >= 0x03)));
        k--;
    }
    T1CTL = 0x00; //关闭定时器
}

void Delay_s(unsigned int k)
{
    while(k)
    {
        Delay_ms(1000);
        k--;
    }
}

//时钟频率为32M
void Ds18b20Delay(unsigned int k)
{
    unsigned int i,j;
    for(i=0;i<k;i++)
        for(j=0;j<2;j++);
}

void Ds18b20InputInitial(void)//设置端口为输入
{
    P0DIR &= 0x7f;
}

void Ds18b20OutputInitial(void)//设置端口为输出
{
    P0DIR |= 0x80;
}

//ds18b20初始化  初始化成功返回0x00,失败返回0x01
unsigned char Ds18b20Initial(void)
{
    unsigned char Status = 0x00;
    unsigned int CONT_1 = 0;
    unsigned char Flag_1 = 1;
    Ds18b20OutputInitial();
    Ds18b20IO = 1;      //DQ复位
    Ds18b20Delay(260);  //稍做延时
    Ds18b20IO = 0;      //单片机将DQ拉低
    Ds18b20Delay(750);  //精确延时 大于 480us 小于960us
    Ds18b20IO = 1;      //拉高总线
    Ds18b20InputInitial();//设置IO输入
    while((Ds18b20IO != 0)&&(Flag_1 == 1))//等待ds18b20响应,具有防止超时功能
    {                                      //等待约60ms左右
        CONT_1++;
        Ds18b20Delay(10);
        if(CONT_1 > 8000)Flag_1 = 0;
        Status = Ds18b20IO;
    }
    Ds18b20OutputInitial();
    Ds18b20IO = 1;
    Ds18b20Delay(100);
    return Status;       //返回初始化状态
}

void Ds18b20Write(unsigned char infor)
{
    unsigned int i;
    Ds18b20OutputInitial();
    for(i=0;i<8;i++)
    {
        if((infor & 0x01))
        {
            Ds18b20IO = 0;
            Ds18b20Delay(6);
            Ds18b20IO = 1;
            Ds18b20Delay(50);
        }
        else
        {
            Ds18b20IO = 0;
            Ds18b20Delay(50);
            Ds18b20IO = 1;
            Ds18b20Delay(6);
        }
        infor >>= 1;
    }
}

unsigned char Ds18b20Read(void)
{
    unsigned char Value = 0x00;
    unsigned int i;
    Ds18b20OutputInitial();
    Ds18b20IO = 1;
    Ds18b20Delay(10);
    for(i=0;i<8;i++)
    {
        Value >>= 1; 
        Ds18b20OutputInitial();
        Ds18b20IO = 0;// 给脉冲信号
        Ds18b20Delay(3);
        Ds18b20IO = 1;// 给脉冲信号
        Ds18b20Delay(3);
        Ds18b20InputInitial();
        if(Ds18b20IO == 1) Value |= 0x80;
        Ds18b20Delay(15);
    } 
    return Value;
}

//温度读取函数
unsigned char ReadDs18B20(void) 
{
    unsigned char V1,V2;   //定义高低8位 缓冲
    unsigned char temp;    //定义温度缓冲寄存器
    
    Ds18b20Initial();
    Ds18b20Write(0xcc);    // 跳过读序号列号的操作
    Ds18b20Write(0x44);    // 启动温度转换
    
    Ds18b20Initial();
    Ds18b20Write(0xcc);    //跳过读序号列号的操作 
    Ds18b20Write(0xbe);    //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    
    V1 = Ds18b20Read();    //低位
    V2 = Ds18b20Read();    //高位
    temp = ((V1 >> 4)+((V2 & 0x07)*16)); //转换数据 

    return temp;
}

//温度读取函数 带1位小数位
float floatReadDs18B20(void) 
{
    unsigned char V1,V2;   //定义高低8位 缓冲
    unsigned int temp;     //定义温度缓冲寄存器
    float fValue;
    Ds18b20Initial();
    Ds18b20Write(0xcc);    // 跳过读序号列号的操作
    Ds18b20Write(0x44);    // 启动温度转换
    
    Ds18b20Initial();
    Ds18b20Write(0xcc);    //跳过读序号列号的操作 
    Ds18b20Write(0xbe);    //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    
    V1 = Ds18b20Read();    //低位
    V2 = Ds18b20Read();    //高位
    //temp = ((V1 >> 4)+((V2 & 0x07)*16)); //转换数据 
    temp=V2*0xFF+V1;
    fValue = temp*0.0625;
    
    return fValue;
}

温度测试.h

#ifndef __DS18B20_H__
#define __DS18B20_H__
#include"iocc2530.h"

extern unsigned char Ds18b20Initial(void);
unsigned char ReadDs18B20(void);
float floatReadDs18B20(void);
#endif
posted @   L707  阅读(902)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
主题色彩