基于cc2530获取ds18b20温度值

@基于CC2530单片机获取温度传感器

基于CC2530单片机获取温度传感器

cc2530单片机是目前Ztack主流的一款产品,它与普通51的单片机不同于需要对各个IO口配置比如(设置io口的方向或输出还是输入),废话不多说上代码

获取温度的底层驱动代码

端口配置就不讲解,俺相信各位都是大神对于你们来说都是小意思。

ds18b20.c文件

#include "ds18b20.h" 

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

void Ds18b20Delay(unsigned int k)//对于获取温度是需要的延时是要十分准确的
{
    while (k--)
  
  {
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");   
    }
}

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 int ReadDs18B20(void) 
{
    unsigned char low,high;   //定义高低8位 缓冲
    unsigned char temp;    //定义温度缓冲寄存器
    
    Ds18b20Initial();
    Ds18b20Write(0xcc);    // 跳过读序号列号的操作
    Ds18b20Write(0x44);    // 启动温度转换
    Ds18b20Delay(10);
    
    Ds18b20Initial();
    Ds18b20Write(0xcc);    //跳过读序号列号的操作 
    Ds18b20Write(0xbe);    //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    Ds18b20Delay(10);
    
    low = Ds18b20Read();    //低位8位
    high = Ds18b20Read();    //高位8位
    //temp = high<<4;
    //temp |= low>>4;
    temp = ((low >> 4)+((high<<4))); //转换数据 
    return temp;
}

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

ds18b20.h

#ifndef __DS18B20_H__
#define __DS18B20_H__
#include <iocc2530.h>

extern unsigned char Ds18b20Initial(void);
unsigned int ReadDs18B20(void);
float ReadDs18B20_float(void);
#endif

初始化一些函数(init.c)

#include <ioCC2530.h>
#include "init.h"
#define uint unsigned int 
#define uchar unsigned char


//#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)//三个
void InitClock()//设置系统晶振32M
{
    CLKCONCMD &= ~0x40;
    while(CLKCONSTA &0X40);
    CLKCONCMD &= ~0x47;
}

/*void InitSensor(void)
{ 
  // DISABLE_ALL_INTERRUPTS();     //关闭所有中断 
   clock();                  //设置系统主时钟为 32M 
   TR0=0x01;                     //设置为1来连接温度传感器到SOC_ADC
   ATEST=0x01;                   //使能温度传感
} */

void InitUart(void)//串口的初始化函数
{
    PERCFG &= ~0x00;//外设控制寄存器 USART0 的IO位置:0为P0口位置
    P0SEL |= 0x0c;//P0_2,P0_3作为串口(外设的功能:接受和发送)
    P2DIR &= ~0xC0;//设置P0优先作为UART0
    
    U0CSR |=0X80;//设置为UART方式
    U0GCR |=11;
    U0BAUD |=216;//设置波特率为9600
    U0CSR |= 0X40;
    UTX0IF = 0;//UART0 TX中断标志初始置1;
}

void UartSendString(char *Data, int len)
{
    uint i;
    
    for(i=0;i<len;i++)
    {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
}

init.h

#include <ioCC2530.h>

void InitClock(void);
void InitSensor(void);
void InitUart(void);//串口的初始化函数
void UartSendString(char *Data, int len);

主函数(main.c)

#include <ioCC2530.h>
#include <string.h>
#include "ds18b20.h"
#include "init.h"
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define SIZE 25
#define FLAG 1//用来获取温度的类型
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr)[0])//求数组的大小

#define String "High Temperature!\r\n"
#define String1 "LOW Temperature!\r\n"
char strTemp[SIZE];

char str[SIZE] = "xxx---DS18B20:";
float AvgTemp = 0.0;
uint wendu;
void DelayMS(uint msec)//1毫米延时
{ 
 uint i,j; 
 
 for (i=0; i<msec; i++) 
 for (j=0; j<535; j++); 
}

void main()
{
  InitClock();//晶振时钟初始化
  InitUart();//串口初始化
  P0DIR &= 0x7f;
  while(1)
  {
    DelayMS(500);
    UartSendString(str,sizeof(str));//串口打印
    memset(strTemp, 0, ARRAY_SIZE(strTemp));//将数组清零
    if(FLAG)
    {
      AvgTemp = ReadDs18B20_float();//获取温度带小数
      sprintf(strTemp,"%3.1f C\n",AvgTemp);
    }
    else
    {
      wendu = ReadDs18B20();//整数
      sprintf(strTemp,"%02d C\n",wendu);
    }
    DelayMS(500);
    UartSendString(strTemp, sizeof(strTemp));
    DelayMS(500);
    if((AvgTemp>30.0)||(wendu>30))
    {
      UartSendString(String,sizeof(String));
    }
    else
    {
      UartSendString(String1,sizeof(String1));
    }
  }
}

在这里插入图片描述

代码以实测过放心使用。
下期获取DHT11温湿度传感器。

  • 18
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值