CC2530内部温度传感器
作者:互联网
InitUART_Timer.h
如下:
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P1_4
typedef unsigned char BYTE;
typedef unsigned char UINT8;
typedef unsigned char INT8U;
typedef unsigned short UINT16;
typedef unsigned short INT16U;
typedef unsigned long UINT32;
typedef unsigned long INT32U;
typedef signed char INT8;
typedef signed short INT16;
typedef signed long INT32;
#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)
void InitClock ( void ) {
CLKCONCMD &= ~0x40;
while ( CLKCONSTA & 0x40 );
CLKCONCMD &= ~0x47;
}
void InitLed ( void ) {
P1DIR |= 0x13;
LED1 = 0;
LED2 = 0;
LED3 = 0;
}
void InitUART0 ( void ) {
PERCFG = 0x00;
P0SEL = 0x3c;
P2DIR &= ~0XC0;
U0CSR |= 0x80;
U0GCR |= 11;
U0BAUD |= 216;
UTX0IF = 1;
U0CSR |= 0X40;
IEN0 |= 0x84;
}
void UartTX_Send_String ( char *Data, int len ) {
int j;
for ( j = 0; j < len; j++ ) {
U0DBUF = *Data++;
while ( UTX0IF == 0 );
UTX0IF = 0;
}
U0DBUF = 0x0A; /* 换行 */
while ( UTX0IF == 0 );
UTX0IF = 0;
}
/* 延时xms毫秒(16M晶振时的大约数,32M需要修改,系统不修改默认使用内部16M) */
void Delayms ( uint xms ) {
uint i, j;
for ( i = xms; i > 0; i-- )
for ( j = 587; j > 0; j-- );
}
main.c
如下:
#include <ioCC2530.h>
#include "InitUART_Timer.h" /* 注意在option里设置路径 */
#include "stdio.h"
void initTempSensor ( void ) { /* 温度传感器初始化函数 */
DISABLE_ALL_INTERRUPTS(); /* 关闭所有中断 */
InitClock(); /* 设置系统主时钟为32M */
TR0 = 0X01; /* 设置为1来连接温度传感器到SOC_ADC */
ATEST = 0X01; /* 使能温度传感器 */
}
float getTemperature ( void ) { /* 读取温度传感器AD值函数 */
uint value;
ADCCON3 = ( 0x3E ); /* 选择内部1.25V为参考电压;12位ENOB;对片内温度传感器进行采样 */
ADCCON1 |= 0x30; /* 选择ADC的启动模式为手动(启动序列转换) */
ADCCON1 |= 0x40; /* 启动AD转化(启动转换) */
while ( ! ( ADCCON1 & 0x80 ) ); /* 等待AD转换完成 */
/* ADCL寄存器低4位无效,ADC最高只能达到12位有效位 */
value = ADCL >> 4;
value |= ( ( ( UINT16 ) ADCH ) << 4 );
/* 根据AD值,计算出实际的温度。芯片手册上有错误,温度系数应该是4.5/℃。
进行温度校正,这里减去5℃(不同芯片根据具体情况校正) */
return ( value - 1367.5 ) / 4.5 - 5;
}
void main ( void ) {
char i;
char TempValue[6];
float AvgTemp;
InitUART0();
initTempSensor();
while ( 1 ) {
AvgTemp = 0;
for ( i = 0 ; i < 64 ; i++ ) {
AvgTemp += getTemperature();
AvgTemp = AvgTemp / 2; /* 每次累加后除以2 */
}
/* 将温度转换成ASCII码发送 */
TempValue[0] = ( unsigned char ) ( AvgTemp ) / 10 + 48; /* 十位 */
TempValue[1] = ( unsigned char ) ( AvgTemp ) % 10 + 48; /* 个位 */
TempValue[2] = '.'; /* 小数点 */
TempValue[3] = ( unsigned char ) ( AvgTemp * 10 ) % 10 + 48; /* 十分位 */
TempValue[4] = ( unsigned char ) ( AvgTemp * 100 ) % 10 + 48; /* 百分位 */
TempValue[5] = '\0'; /* 字符串结束符 */
UartTX_Send_String ( TempValue, 6 );
Delayms ( 2000 ); /* 使用32M晶振,故这里2000约等于1s */
}
}
标签:typedef,温度传感器,内部,void,unsigned,AvgTemp,char,TempValue,CC2530 来源: https://blog.csdn.net/fukangwei_lite/article/details/119076690