资讯详情

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 */
    }
}

标签: 温度传感器40度901030温度传感器902040温度传感器2线数字温度传感器s5851a10路温度传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台