使用CC2530的ADC对内部温度传感器进行采样,并计算采样结果所对应的真实值,温度值通过串口发送,CC2530的温度传感器并不精准,请勿在精度要求在5度以内的场合使用。外界温度变化不会立刻体现的采样结果上,如果使用打开的电烙铁靠近CC2530,采样结果会快速发生变化,请尽量不要用手直接接触CC2530来验证内部温度传感器。静电可能会导致芯片损坏。每1000毫秒对温度进行一次更新。
#include "iocc2530.h"
#include "stdio.h"
void UART()
{
PERCFG &=~0X01;
P0SEL |=0X0C;
U0BAUD=59;
U0GCR=8;
U0UCR |=0X80;
U0CSR |=0Xc0;
UTX0IF =0;
URX0IF =0;
URX0IE =1;
EA=1;
}
void clock()
{
CLKCONCMD &=~0X40;
while(CLKCONSTA & 0X40);
CLKCONCMD &=~0X07;
}
void byte(unsigned char dat)
{
U0DBUF=dat;
while(UTX0IF==0);
UTX0IF=0;
}
void string(unsigned char *str)
{
while(*str != '\0')
{
byte(*str++);
}
}
void ADC_init()
{
TR0=0X01; //设置最低位为1,连接到片内温度传感器到SOC_ADC
ATEST=0X01; //使能温度传感器
}
float cai_temp(void)
{
unsigned int value=0;
float data=0;
ADCCON3=0X3E; //内部参考电压1.25V,12位ENOB,温度传感器
ADCCON1=0X30; //选择ADCCON1.ST=1时启动
ADCCON1=0X40; //开始ADC转换
while(!(ADCCON1 & 0X80)); //等待转换完成
value=ADCL>>4;
value |=((unsigned int)ADCH<<4); //ADC只有12位有效,所以ADCL低4位无效,所以要右移4位
data=(value-(1480-4.5*25))/4.5; //计算误差值
return data;
}
void wdt_init()
{
WDCTL=0X0C;
}
char buf[10];
unsigned int i=0;
float value;
void main()
{
clock();
UART();
wdt_init();
ADC_init();
while(1)
{
if(WDTIF==1)
{
WDTIF=0;
value=0;
for(i=0;i<64;i++) //追求精度
{
value+= cai_temp(); //取得温度,加上原数值
value/=2; //求取平均值
}
sprintf(buf,"%.2f",value);
string((unsigned char*)buf);
}
}
}