其他分享
首页 > 其他分享> > CC2530内部温度传感器

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