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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步