天天看點

基于cc2530擷取ds18b20溫度值基于CC2530單片機擷取溫度傳感器

@基于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));
    }
  }
}
           
基于cc2530擷取ds18b20溫度值基于CC2530單片機擷取溫度傳感器

代碼以實測過放心使用。

下期擷取DHT11溫濕度傳感器。