@基于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溫濕度傳感器。