@基于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温湿度传感器。