• 嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】



    AD
    CC2430/CC2431 的ADC支持14位的模数转换,这跟一般的单片机 8 位ADC不同。这个 ADC包括一个参考电压发生器,8 个独立可配置通道,电压发生器和通过 DMA模式把转换结果写入内存控制器。

    CC2430/CC2431 的ADC具有以下特征:
       ADC 转换位数可选,从8 位至14 位;
       8 个独立可配置输入通道;
    参考电压发生器可作为内、外部单一参考电路,外部差分电路或AV D D _ S O C; 产生中断; 转换完成触发DMA; 温度传感输入; 电池电压检测。
         当使用ADC时,P0口必须配置成ADC输入作为8 个ADC输入。把P0相应的个引脚当作ADC输入使用时,寄存器ADCCFG相应的位设置为‘1’。寄存器ADCCFG的各位初始值是’0’,没用当作ADC输入使用。
        ADC完成顺序模数转以及把结果送至内存(使用DMA模式)而不需要CPU 的干涉。
        ADC寄存器包括ADCL(ADC数据低位)、ADCH(ADC数据高位)、ADCCON1(ADC控制寄存器1) 、ADCCON2(ADC控制寄存器 2) 、ADCCON3(ADC控制寄存器3) 。

    取片内温度传感器为AD源,并将转换得到温度通过串口送至电脑

    //串口uart0初始化步骤
    //1.配置IO,即配置发送和接收引脚,设置PERCFG与P0SEL(用的是P0_2与P0_3)
    //2.选择USART位UART方式,若需要接收的话就允许接收,设置U0CSR
    //3.设置波特率(若设置位115200,则令U0GCR = 11,U0BAUD = 216)
    //波特率    U0BAUD        U0GCR    误差
    //2400          59                    6         0.14
    //4800          59                    7         0.14
    //9600          59                    8         0.14
    //14400        216                  8         0.03
    //19200        59                    9         0.14
    //28800        216                  9         0.03
    //38400        59                    10       0.14
    //57600        216                  10       0.03
    //76800        59                    11       0.14
    //115200      216                 11        0.03
    //230400      216                  12       0.03

    //3.设置数据位、停止位,奇偶校验(默认是8位数据位,1位停止位,无校验)
    //4.允许中断(EA=1,URX0IE=1) (发生中断时,URX0IF=1)

    CLKCON (0xC6) - Clock control 
    0X38:0011 1000
    7  OSC32K 32 kHz clock oscillator select:
      0 – 32 kHz crystal oscillator
      1 – 32 kHz RC oscillator
    6  OSC  1  R/W  Main clock oscillator select. This setting will only take effect  when the selected oscillator is powered up and stable. If the selected oscillator is not powered up, then writing this bit will power it up.
      0 – 32 MHz crystal oscillator
      1 – 16 MHz HF RC oscillator
    5:3  TICKSPD[2:0]   Timer ticks output setting, can not be higher than system clock setting given by OSC bit setting
      000 – 32 MHz ticks
      001 – 16 MHz ticks
      010 – 8 MHz ticks
      011 – 4 MHz ticks
      100 – 2 MHz ticks
      101 – 1 MHz ticks
      110 – 0.5 MHz ticks
      111 – 0.25 MHz ticks
    2:0   Reserved. Always set to 000.

    SLEEP (0xBE) - Sleep mode control
    0X40:0100 0000
    bit7 -  Unused
    bit6  XOSC_STB  XOSC stable status:
     0 – XOSC is not powered up or not yet stable
     1 – XOSC is powered up and stable
    bit5  HFRC_STB  RCOSC stable status:
     0 – HF RCOSC is not powered up or not yet stable
     1 – HF RCOSC is powered up and stable
    bit4:3  RST[1:0]   Status bit indicating the cause of the last reset. If there are multiple resets, the register will only contain the last event.
     00 – Power-on reset
     01 – External reset 
     10 – Watchdog timer reset
    bit2  OSC_PD  XOSC and HF RCOSC power down setting. The bit shall be cleared if the OSC bit is toggled. Also, if there is a calibration in progress and the CPU attempts to set the bit the module shall update the bit only at the end of calibration:
     0 – Both oscillators powered up
     1 – Oscillator not selected by OSC bit powered down
    bit1:0  MODE[1:0]   Sleep mode setting:
     00 – Power mode 0
     01 – Power mode 1
     10 – Power mode 2
     11 – Power mode 3


    PERCFG (外设控制寄存器)
    7  - 0  R0 未用
    6 T1CFG  0  R/W T1 I/O 位置选择
    0  位置1
    1  位置2
    5 T3CFG  0  R/W T3 I/O 位置选择
    0  位置1
    1  位置2
    4 T4CFG  0  R/W T4 I/O 位置选择
    0  位置1
    1  位置2
    3:2  - 00  R0 未用
    1 U1CFG  0  R/W  串口1 位置选择
    0  位置1
    1  位置2
    0 U0CFG  0  R/W  串口0 位置选择
    0  位置1
    1  位置2
     
    U0CSR(串口0 控制&状态寄存器)
    U0CSR |= 0x80;    //UART方式
    7 MODE  0  R/W  串口模式选择
    0 SPI模式
    1 UART 模式
    6 RE  0  R/W  接收使能
    0  关闭接收
    1  允许接收
    5 SLAVE  0  R/W SPI主从选择
    0 SPI主
    1 SPI从
    4 FE  0  R/W0  串口帧错误状态
    0  没有帧错误
    1  出现帧错误
    3 ERR  0  R/W0  串口校验结果
    0  没有校验错误
    1  字节校验出错
    2 RX_BYTE  0  R/W0  接收状态
    0  没有接收到数据
    1  接收到一字节数据
    1 TX_BYTE  0  R/W0  发送状态
    0  没有发送
    1  最后一次写入 U0BUF的数据已经发送
    0 ACTIVE  0  R  串口忙标志
    0  串口闲
    1  串口忙
     
    U0GCR  (串口 0 常规控制寄存器) 
    U0GCR |= 10;    //baud_e = 10
    7 CPOL  0  R/W SPI时钟极性
    0  低电平空闲
    1  高电平空闲
    6 CPHA  0  R/W SPI时钟相位
    0  由CPOL 跳向非CPOL 时采样,由非 CPOL 跳向CPOL 时输出
    1 由非CPOL 跳向CPOL 时采样,由 CPOL 跳向非CPOL 时输出
    5 ORDER  0  R/W  传输位序
    0  低位在先
    1  高位在先
    4:0 BAUD_E[4:0]  0x00  R/W  波特率指数值,与BAUD_F决定波特率
     U0BAUD (串口0 波特率控制寄存器)
    7:0 BAUD_M[7:0]  0X00  R/W  波特率尾数,与BAUD_E决定波特率
     
    U0BUF(串口0 收发缓冲器)
    7:0 DATA[7:0]  0X00  R/W  UART0收发寄存器
     
    U0BAUD (0xC2) – USART 0 Baud Rate Control
    Bit  Name  Reset  R/W  Description
    7:0  BAUD_M[7:0]  0x00  R/W  Baud rate mantissa value.  BAUD_E along with BAUD_M decidesthe UART baud rate and the SPI master SCK clock frequency

    UTX1IF  0 R/W
    UTX0IF = 1;
    UTX1IF – USART1 TX interrupt flag. 
    0 Interrupt not pending
    1 Interrupt pending

    IEN0 (0xA8) – Interrupt Enable 0
    Bit  Name  Reset  R/W  Description
    7  EAL  0 R/W Disables all interrupts.
     0 No interrupt will be acknowledged
     1 Each interrupt source is individually enabled or disabled by setting its corresponding enable bit
    6  -  0  R0  Not used. Read as 0
    5  STIE  0 R/W STIE – Sleep Timer interrupt enable 
     0 Interrupt disabled
     1 Interrupt enabled
    4  ENCIE  0 R/W ENCIE – AES encryption/decryption interrupt enable
     0 Interrupt disabled
     1 Interrupt enabled
    3  URX1IE  0 R/W URX1IE – USART1 RX interrupt enable 
     0 Interrupt disabled
     1 Interrupt enabled
    2  URX0IE  0 R/W URX0IE - USART0 RX interrupt enable 
     0 Interrupt disabled
     1 Interrupt enabled
    1  ADCIE  0 R/W ADCIE – ADC interrupt enable 
     0 Interrupt disabled
     1 Interrupt enabled
    0  RFERRIE  0 R/W RFERRIE – RF TX/RX FIFO interrupt enable
     0 Interrupt disabled
     1 Interrupt enabled

    ADCCON1 
    7 EOC  0  R H0 ADC 结束标志位
    0   ADC进行中
    1  ADC 转换结束
    6 ST  0  R W1  手动启动AD转换(读1 表示当前正在进行AD转换)
    0  没有转换
    1  启动 AD 转换
    (STSEL=11)
    5:4 STSEL[1:0]  11  R/W  AD 转换启动方式选择
    00 外部触发
    01 全速转换,不需要触发
    10 T1 通道 0 比较触发
    11  手工触发
    3:2 RCTRL[1:0]  00  R/W  16 位随机数发生器控制位
    (写01,10会在执行后返回00)
    00 普通模式(13x  打开)
    01 开启LFSR 时钟一次
    10 生成调节器种子
    11  信用随机数发生器
    1:0 -  11  R/W  保留,总是写设置为1
     
    ADCCON3
    7:6 SREF[1:0]  00  读/ 写
    选择单次AD 转换参考电压
    00   内部1.25V 电压
    01   外部参考电压 AIN7输入
    10   模拟电源电压
    11   外部参考电压
    AIN6-AIN7 输入
    5:4 SDIV[1:0]  01  读/ 写
    选择单次A/D 转换分辨率
    00  8 位 (64dec)
    01  10 位 (128dec)
    10  12 位 (256dec)
    11  14 位 (512dec)
    3:0 SCH[3:0]  00  读/ 写
    单次A/D 转换选择,如果写入时ADC正在运行,则在完成序列A/D 转换后立刻开始,否则写入后立即开始A/D 转换,转换完成后自动清0 
    0000  AIN0
    0001  AIN1
    0010  AIN2
    0011  AIN3
    0100  AIN4
    0101  AIN5
    0110  AIN6
    0111  AIN7
    1000  AIN0- AIN1
    1001  AIN2- AIN3
    1010  AIN4- AIN5
    1011  AIN6- AIN7
    1100  GND
    1101   正电源参考电压
    1110   温度传感器
    1111  1/3模拟电压

    void initUARTtest(void) ;
    函数原型:
    void initUARTtest(void)
    {
        CLKCON &= ~0x40;              //晶振
        while(!(SLEEP & 0x40));      // 等待晶振稳定
        CLKCON &= ~0x47;             //TICHSPD128 分频,CLKSPD 不分频
        SLEEP |= 0x04;         //关闭不用的RC振荡器
     
        PERCFG = 0x00;       // 位置1 P0 口
        P0SEL = 0x3c;        //P0 用作串口
     
        U0CSR |= 0x80;        //UART 方式
        U0GCR |= 10;        //baud_e = 10;
        U0BAUD |= 216;       // 波特率设为57600
        UTX0IF = 1;
     
        U0CSR |= 0X40;       // 允许接收
        IEN0 |= 0x84;        // 开总中断,接收中断
    }
    函数功能:将 I/0 P10,P11 设置为输出去控制 LED ,  将系统时钟设为高速晶振,将 P0口设置为串口0 功能引脚,串口 0 使用UART 模式,波特率设为 57600,允许接收。在使用串口之前调用。
     
    void UartTX_Send_String(char *Data,int len)
    函数原型:
    void UartTX_Send_String(char *Data,int len)
    {
      int j;
      for(j=0;j<len;j++)
      {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
      }
    }
    函数功能:串口发送数据, *data 为发送缓冲的指针,len 为发送数据的长度,在初始化串口后才可以正常调用。
     
    void initTempSensor(void) ;
    函数原型:
    void initTempSensor(void){
       DISABLE_ALL_INTERRUPTS();
     
       SET_MAIN_CLOCK_SOURCE(0);
     
          *((BYTE __xdata*) 0xDF26) = 0x80;
    }
    函数功能:将系统时钟设为晶振,设AD目标为片机温度传感器。
     
    INT8 getTemperature(void);
    函数原型:
    INT8 getTemperature(void){
      UINT8   i;
      UINT16  accValue;
      UINT16  value;
     
      accValue = 0;
        for( i = 0; i < 4; i++ )
      {
        ADC_SINGLE_CONVERSION(ADC_REF_1_25_V | ADC_14_BIT | ADC_TEMP_SENS);
        ADC_SAMPLE_SINGLE();
        while(!ADC_SAMPLE_READY());
     
        value =  ADCL >> 2;
        value |= (((UINT16)ADCH) << 6);
     
        accValue += value;
      }
        value = accValue >> 2; // devide by 4
     
      return ADC14_TO_CELSIUS(value);
    }

     
    重要的宏定义
    将片内温度传感器AD转换的结果转换成温度。
    #define ADC14_TO_CELSIUS(ADC_VALUE)        ( ((ADC_VALUE) >> 4) - 315)

    View Code
     1 /*                      - SYSMAC.H -
     2 
     3    Defines system macros to maintain source compatibility
     4    with different IAR compilers.
     5 
     6    $Revision: 1.5 $
     7 
     8    Copyright 1986 - 1999 IAR Systems. All rights reserved.
     9 */
    10 
    11 #ifndef _SYSMAC_H_
    12 #define _SYSMAC_H_
    13 
    14 #ifndef _SYSTEM_BUILD
    15    #pragma system_include
    16 #endif
    17 
    18 #if defined(__IAR_SYSTEMS_ICC) && !defined(__IAR_SYSTEMS_ICC__)
    19 #define __IAR_SYSTEMS_ICC__ 1
    20 #endif
    21 
    22 #if __IAR_SYSTEMS_ICC__ > 6
    23 #error __IAR_SYSTEMS_ICC__ > 6 not available yet!
    24 #endif
    25 
    26 #ifndef __CHAR_SIZE__
    27 #define __CHAR_SIZE__ sizeof(char)
    28 #endif
    29 
    30 #ifndef __SHORT_SIZE__
    31 #define __SHORT_SIZE__ sizeof(short)
    32 #endif
    33 
    34 #ifndef __INT_SIZE__
    35 #define __INT_SIZE__ sizeof(int)
    36 #endif
    37 
    38 #ifndef __LONG_SIZE__
    39 #define __LONG_SIZE__ sizeof(long)
    40 #endif
    41 
    42 #ifndef __FLOAT_SIZE__
    43 #define __FLOAT_SIZE__ sizeof(float)
    44 #endif
    45 
    46 #ifndef __DOUBLE_SIZE__
    47 #define __DOUBLE_SIZE__ sizeof(double)
    48 #endif
    49 
    50 #ifndef __LONG_DOUBLE_SIZE__
    51 #define __LONG_DOUBLE_SIZE__ sizeof(long double)
    52 #endif
    53 
    54 #ifndef __SIZE_T_TYPE__
    55 #if     sizeof((char*)0 - (char*)0) <= sizeof(int)
    56 #define __SIZE_T_TYPE__ unsigned int
    57 #else
    58 #define __SIZE_T_TYPE__ unsigned long 
    59 #endif
    60 #endif
    61 
    62 #ifndef __PTRDIFF_T_TYPE__
    63 #if     sizeof((char*)0 - (char*)0) <= sizeof(int)
    64 #define __PTRDIFF_T_TYPE__ unsigned int
    65 #else
    66 #define __PTRDIFF_T_TYPE__ unsigned long 
    67 #endif
    68 #endif
    69 
    70 #define __INTRINSIC
    71 #if __IAR_SYSTEMS_ICC__ >= 2
    72 #undef  __INTRINSIC
    73 #define __INTRINSIC __intrinsic
    74 #endif
    75 
    76 /* Macro for frmwri and frmrd */
    77 #define VAPTR(T) (va_arg(ap, T *))
    78 
    79 /* Typedefs put here to appear only once */
    80 typedef __SIZE_T_TYPE__    size_t;
    81 typedef __PTRDIFF_T_TYPE__ ptrdiff_t;
    82 
    83 #endif /* _SYSMAC_H_ */
    View Code
      1 /*                      - STDARG.H -
      2    The ANSI macros for reading variable argument lists (...).
      3 
      4    $Name: $    
      5 
      6    Copyright 1986 - 1999 IAR Systems. All rights reserved.
      7 */
      8 
      9 #ifndef _STDARG_H_
     10 #define _STDARG_H_
     11 
     12 #ifndef _SYSTEM_BUILD
     13   #pragma system_include
     14 #endif
     15 
     16 #include "sysmac.h"
     17 
     18 
     19 #if __IAR_SYSTEMS_ICC__ >= 2
     20 
     21 typedef void *va_list[1];
     22 
     23 __INTRINSIC void __va_start(va_list);
     24 
     25 #define va_start(ap, parmN) __va_start(ap)
     26 #define va_end(ap)            ((void) 0)
     27 
     28 /*=====================================*/
     29 /*  These targets has char pushed as   */
     30 /*  word on stack.                     */
     31 /*  Stack grows in negativ direction.  */
     32 /*  (New type of code-generators)      */
     33 /* - - - - - - - - - - - - - - - - - - */
     34 /*     ICC78000 version 4.xx           */
     35 /*     M32C version 3.xx               */
     36 /*=====================================*/
     37 #if defined(__ICC78K__) || defined(__ICCM32C__)
     38 
     39 #define _NOT_DEFAULT_BEHAVIOR
     40 
     41 #define va_arg(ap,mode) \
     42   (sizeof(mode) < sizeof(int) ? (*(mode *)(*(int **)ap)++) : \
     43                        *(*(mode **) ap)++) 
     44 
     45 #else
     46 
     47 #ifdef __VA_STACK_DECREASING__
     48 #if __VA_STACK_DECREASING__
     49 #define va_arg(ap,type) (*(*(type **)ap)++)
     50 #else
     51 #define va_arg(ap,type) (*--(*(type **)ap))
     52 #endif
     53 #endif
     54 
     55 #endif
     56 
     57 #else /* __IAR_SYSTEMS_ICC__ >= 2 */
     58 
     59 
     60 /*=====================================*/
     61 /*     ICCZ80 version 1.00 - 3.xx      */
     62 /*=====================================*/
     63 #if ((__TID__ >> 8) & 0x7f) == 4                
     64 
     65 #define _NOT_DEFAULT_BEHAVIOR
     66 
     67 typedef struct
     68 {
     69   char        *parm;
     70   char        *addr;
     71   char        argc;
     72 } va_list[1];
     73 
     74 #if __IAR_SYSTEMS_ICC__ < 2
     75 #if __TID__ & 0x8000
     76 #pragma function=intrinsic(0)
     77 #endif
     78 #endif
     79 
     80 #ifndef MEMORY_ATTRIBUTE
     81 #define MEMORY_ATTRIBUTE
     82 #endif
     83 
     84 __INTRINSIC MEMORY_ATTRIBUTE char *_get_varg(va_list ap, char type, char size);
     85 
     86 #if __IAR_SYSTEMS_ICC__ < 2
     87 #if __TID__ & 0x8000
     88 #pragma function=default
     89 #endif
     90 #endif
     91 
     92 #define va_start(ap,parmN) ((ap[0].addr = ((char *) &parmN) + sizeof(parmN)),\
     93                                         (ap[0].parm = _args$))
     94 #define va_arg(ap,mode) *(mode *) _get_varg (ap, _argt$(mode), sizeof(mode))
     95 
     96 #define va_end(ap)      ((void)0) 
     97 #endif
     98 
     99 
    100 /*=====================================*/
    101 /*  Stack grows in positiv direction.  */
    102 /*  CG-driver designed ICC only!       */
    103 /* - - - - - - - - - - - - - - - - - - */
    104 /*     ICC251  version 1.00 -          */
    105 /*=====================================*/
    106 #if ((__TID__ >> 8) & 0x7f) == 36  
    107 
    108 #define _NOT_DEFAULT_BEHAVIOR
    109 
    110 typedef void *va_list[1];
    111 
    112 #define va_start(ap,parmN) (ap[0] = ((char *) &parmN) - 1)
    113 #define va_arg(ap,mode) (*--(*(mode **)ap))
    114 
    115 #define va_end(ap)      ((void)0) 
    116 #endif
    117 
    118 
    119 /*=====================================*/
    120 /*  Stack grows in positiv direction.  */
    121 /* - - - - - - - - - - - - - - - - - - */
    122 /*     ICC8051 version 1.00 - 3.10     */
    123 /*     Single chip memory model        */
    124 /*                                     */
    125 /*     ICC7700 version 1.00 -          */
    126 /*=====================================*/
    127 #if ((__TID__ >> 8) == 1 && (__TID__ & 15) == 0) ||             \
    128     ((__TID__ >> 8) & 0x7f) == 19
    129 
    130 #define _NOT_DEFAULT_BEHAVIOR
    131 
    132 typedef void *va_list[1];
    133 
    134 #define va_start(ap,parmN) (ap[0] = (void*)&parmN)
    135 #define va_arg(ap,mode) (*--(*(mode **)ap))
    136 
    137 #define va_end(ap)      ((void)0) 
    138 #endif
    139 
    140 
    141 /*=====================================*/
    142 /*  These targets has char pushed as   */
    143 /*  word on stack.                     */
    144 /*  Stack grows in negativ direction.  */
    145 /*  (Old type of code-generators)      */
    146 /* - - - - - - - - - - - - - - - - - - */
    147 /*     ICCH8500 version 1.xx -         */
    148 /*     ICCH83   version 3.xx -         */
    149 /*     ICC78000 version 1.xx           */
    150 /*     ICC78300 version 1.xx           */
    151 /*     ICC78300 version 2.00 -         */
    152 /*     ICC78000 version 2.xx           */
    153 /*     ICCZ80   version 4.00 -         */
    154 /*=====================================*/
    155 #if ((__TID__ >> 8) & 0x7f) == 9  || /* IANB 97.06.26 */        \
    156     ((__TID__ >> 8) & 0x7f) == 10 || /* IANB 97.06.26 */        \
    157     ((__TID__ >> 8) & 0x7f) == 15 ||                            \
    158     ((__TID__ >> 8) & 0x7f) == 16 ||                            \
    159     ((__TID__ >> 8) & 0x7f) == 20 ||                            \
    160     ((__TID__ >> 8) & 0x7f) == 21 || /* IERA 94.01.16 */        \
    161     ((__TID__ >> 8) & 0x7f) == 23    /* IHAT 94.04.18 */ 
    162 
    163 #define _NOT_DEFAULT_BEHAVIOR
    164 
    165 typedef void *va_list[1];
    166 
    167 #define va_start(ap,parmN) \
    168   ap[0] = ((char *) &parmN) + (sizeof(parmN) > 1 ? sizeof(parmN) : 2)
    169 #define va_arg(ap,mode) \
    170   (sizeof(mode) == 1 ? (*(mode *)(*(int **)ap)++) : \
    171                        *(*(mode **) ap)++) 
    172 
    173 #define va_end(ap)      ((void)0) 
    174 #endif
    175 
    176 
    177 /*=====================================*/
    178 /*  These targets has char pushed as   */
    179 /*  word on stack.                     */
    180 /*  Stack grows in negativ direction.  */
    181 /*  (New type of code-generators)      */
    182 /* - - - - - - - - - - - - - - - - - - */
    183 /*     ICC78400 version 1.00 -         */
    184 /*     ICC78000 version 3.xx           */
    185 /*     ICCCR16  -                      */
    186 /*     ICCCR32  -                      */
    187 /*=====================================*/
    188 #if ((__TID__ >> 8) & 0x7f) == 29 ||                          \
    189     ((__TID__ >> 8) & 0x7f) == 30 || /* IBEV 97.07.14 */      \
    190     ((__TID__ >> 8) & 0x7f) == 41 || /* IASL 97.06.09 */      \
    191     ((__TID__ >> 8) & 0x7f) == 42    /* IBEV 97.12.18 */
    192 
    193 #define _NOT_DEFAULT_BEHAVIOR
    194 
    195 typedef void *va_list[1];
    196 
    197 #define va_start(ap,parmN) ap[0] = ((char *) &parmN) + sizeof(parmN)
    198 #define va_arg(ap,mode) \
    199   (sizeof(mode) < sizeof(int) ? (*(mode *)(*(int **)ap)++) : \
    200                        *(*(mode **) ap)++) 
    201 
    202 #define va_end(ap)      ((void)0) 
    203 #endif
    204 
    205 
    206 /*=====================================*/
    207 /*  8096 has char packed as low byte   */
    208 /*  in word on the stack.              */
    209 /* - - - - - - - - - - - - - - - - - - */
    210 /*     ICC8096 version 1.00 -          */
    211 /*=====================================*/
    212 #if ((__TID__ >> 8) & 0x7f) == 6   /* ICLM 93.11.01 */
    213 
    214 #define _NOT_DEFAULT_BEHAVIOR
    215 
    216 typedef void *va_list[1];
    217 
    218 #define va_start(ap,parmN) ap[0] = ((char *) &parmN) + (sizeof(parmN) > 1 ? sizeof(parmN) : 2)
    219 
    220 #define va_arg(ap,mode) (*(*(mode **) ap)++)
    221 
    222 #define va_end(ap)      ((void)0) 
    223 #endif
    224 
    225 
    226 /*=====================================*/
    227 /*    All ICC compilers except those   */
    228 /*    listed above.                    */
    229 /*=====================================*/
    230 #ifndef _NOT_DEFAULT_BEHAVIOR
    231 
    232 typedef void *va_list[1];
    233 
    234 #define va_start(ap,parmN) ap[0] = ((char *) &parmN) + sizeof(parmN)
    235 #define va_arg(ap,mode) (*(*(mode **) ap)++)
    236 
    237 #define va_end(ap)      ((void)0) 
    238 #endif
    239 
    240 #endif /* __IAR_SYSTEMS_ICC__ >= 2 */
    241 #endif /* _STDARG_H_ */
    View Code
     1 /*                      - STDIO.H -
     2 
     3    Subset of ANSI standard I/O function declarations.
     4 
     5    $Name: Tyrone3b $    
     6 
     7    Copyright 1986 - 1999 IAR Systems. All rights reserved.
     8 */
     9 
    10 #ifndef _STDIO_INCLUDED
    11 #define _STDIO_INCLUDED
    12 
    13 #ifndef _SYSTEM_BUILD
    14   #pragma system_include
    15 #endif
    16 
    17 #include "stdarg.h"
    18 
    19 #ifndef NULL
    20 #define NULL    ((void *) 0)
    21 #endif
    22 
    23 #ifndef EOF
    24 #define EOF     (-1)
    25 #endif
    26 
    27 #ifndef MEMORY_ATTRIBUTE
    28 #define MEMORY_ATTRIBUTE
    29 #endif
    30 
    31 MEMORY_ATTRIBUTE int  puts(const char *);
    32 MEMORY_ATTRIBUTE int  putchar(int);
    33 MEMORY_ATTRIBUTE int  getchar(void);
    34 MEMORY_ATTRIBUTE int  sprintf(char *,const char *,...);
    35 MEMORY_ATTRIBUTE int  vsprintf(char *,const char *,va_list);
    36 MEMORY_ATTRIBUTE int  printf(const char *,...);
    37 MEMORY_ATTRIBUTE int  vprintf(const char *,va_list);
    38 MEMORY_ATTRIBUTE int  scanf(const char *,...);
    39 MEMORY_ATTRIBUTE int  sscanf(const char *, const char *,...);
    40 MEMORY_ATTRIBUTE char *gets(char *);
    41 
    42 
    43 #endif /* _STDIO_INCLUDED */
      1 //temp.h
      2 #ifndef TEMP_H
      3 #define TEMP_H
      4 #include "ioCC2430.h"
      5 
      6 typedef unsigned char       BOOL;
      7 
      8 // Data
      9 typedef unsigned char       BYTE;
     10 typedef unsigned short      WORD;
     11 typedef unsigned long       DWORD;
     12 
     13 // Unsigned numbers
     14 typedef unsigned char       UINT8;
     15 typedef unsigned char       INT8U;
     16 typedef unsigned short      UINT16;
     17 typedef unsigned short       INT16U;
     18 typedef unsigned long       UINT32;
     19 typedef unsigned long       INT32U;
     20 
     21 // Signed numbers
     22 typedef signed char         INT8;
     23 typedef signed short        INT16;
     24 typedef signed long         INT32;
     25 
     26 #define ADC_REF_1_25_V      0x00
     27 #define ADC_14_BIT          0x30
     28 #define ADC_TEMP_SENS       0x0E
     29 
     30 #define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)
     31 
     32 #define ADC_SINGLE_CONVERSION(settings) \
     33    do{ ADCCON3 = (settings); }while(0)
     34 
     35 #define ADC_SAMPLE_SINGLE() \
     36   do { ADC_STOP(); ADCCON1 |= 0x40;  } while (0)
     37 
     38 #define ADC_SAMPLE_READY()  (ADCCON1 & 0x80)
     39 
     40 #define ADC_STOP() \
     41   do { ADCCON1 |= 0x30; } while (0)
     42 
     43 #define ADC14_TO_CELSIUS(ADC_VALUE)    ( ((ADC_VALUE) >> 4) - 315)
     44 
     45 /******************************************************************************
     46 *******************      Power and clock management        ********************
     47 *******************************************************************************
     48 
     49 These macros are used to set power-mode, clock source and clock speed.
     50 
     51 ******************************************************************************/
     52 
     53 // Macro for getting the clock division factor
     54 #define CLKSPD  (CLKCON & 0x07)
     55 
     56 // Macro for getting the timer tick division factor.
     57 #define TICKSPD ((CLKCON & 0x38) >> 3)
     58 
     59 // Macro for checking status of the crystal oscillator
     60 #define XOSC_STABLE (SLEEP & 0x40)
     61 
     62 // Macro for checking status of the high frequency RC oscillator.
     63 #define HIGH_FREQUENCY_RC_OSC_STABLE    (SLEEP & 0x20)
     64 
     65 
     66 // Macro for setting power mode
     67 #define SET_POWER_MODE(mode)                   \
     68    do {                                        \
     69       if(mode == 0)        { SLEEP &= ~0x03; } \
     70       else if (mode == 3)  { SLEEP |= 0x03;  } \
     71       else { SLEEP &= ~0x03; SLEEP |= mode;  } \
     72       PCON |= 0x01;                            \
     73       asm("NOP");                              \
     74    }while (0)
     75 
     76 
     77 // Where _mode_ is one of
     78 #define POWER_MODE_0  0x00  // Clock oscillators on, voltage regulator on
     79 #define POWER_MODE_1  0x01  // 32.768 KHz oscillator on, voltage regulator on
     80 #define POWER_MODE_2  0x02  // 32.768 KHz oscillator on, voltage regulator off
     81 #define POWER_MODE_3  0x03  // All clock oscillators off, voltage regulator off
     82 
     83 // Macro for setting the 32 KHz clock source
     84 #define SET_32KHZ_CLOCK_SOURCE(source) \
     85    do {                                \
     86       if( source ) {                   \
     87          CLKCON |= 0x80;               \
     88       } else {                         \
     89          CLKCON &= ~0x80;              \
     90       }                                \
     91    } while (0)
     92 
     93 // Where _source_ is one of
     94 #define CRYSTAL 0x00
     95 #define RC      0x01
     96 
     97 // Macro for setting the main clock oscillator source,
     98 //turns off the clock source not used
     99 //changing to XOSC will take approx 150 us
    100 #define SET_MAIN_CLOCK_SOURCE(source) \
    101    do {                               \
    102       if(source) {                    \
    103         CLKCON |= 0x40;               \
    104         while(!HIGH_FREQUENCY_RC_OSC_STABLE); \
    105         SLEEP |= 0x04;                \
    106       }                               \
    107       else {                          \
    108         SLEEP &= ~0x04;               \
    109         while(!XOSC_STABLE);          \
    110         asm("NOP");                   \
    111         CLKCON &= ~0x47;              \
    112         SLEEP |= 0x04;                \
    113       }                               \
    114    }while (0)
    115 
    116 void initTempSensor(void);
    117 INT8 getTemperature(void);
    118 
    119 #endif
     1 //temp.c
     2 #include "temp.h"
     3 
     4 void initTempSensor(void){
     5    DISABLE_ALL_INTERRUPTS();
     6 
     7    SET_MAIN_CLOCK_SOURCE(0);
     8 
     9    *((BYTE __xdata*) 0xDF26) = 0x80;
    10 }
    11 INT8 getTemperature(void){
    12   UINT8   i;
    13   UINT16  accValue;
    14   UINT16  value;
    15 
    16   accValue = 0;
    17   for( i = 0; i < 4; i++ )
    18   {
    19     ADC_SINGLE_CONVERSION(ADC_REF_1_25_V | ADC_14_BIT | ADC_TEMP_SENS);
    20     ADC_SAMPLE_SINGLE();
    21     while(!ADC_SAMPLE_READY());
    22 
    23     value =  ADCL >> 2;
    24     value |= (((UINT16)ADCH) << 6);
    25 
    26     accValue += value;
    27   }
    28   value = accValue >> 2; // devide by 4
    29 
    30   return ADC14_TO_CELSIUS(value);
    31 }
      1 //main.c
      2 #include "ioCC2430.h"
      3 #include "temp.h"
      4 #include "stdio.h"
      5 #define uint unsigned int
      6 
      7 #define ConversionNum 20
      8 //定义控制灯的端口
      9 #define led1 P1_0
     10 #define led2 P1_1
     11 
     12 void Delay(uint);
     13 void initUARTtest(void);
     14 void UartTX_Send_String(char *Data,int len);
     15 
     16 char adcdata[]=" 0.0C ";
     17 
     18 /****************************************************************
     19 *函数功能 :延时                        *
     20 *入口参数 :定性延时                        *
     21 *返 回 值 :无                            *
     22 *说    明 :                            *
     23 ****************************************************************/
     24 void Delay(uint n)
     25 {
     26     uint i;
     27     for(i=0;i<n;i++);
     28     for(i=0;i<n;i++);
     29     for(i=0;i<n;i++);
     30     for(i=0;i<n;i++);
     31     for(i=0;i<n;i++);
     32 }
     33 
     34 /****************************************************************
     35 *函数功能 :初始化串口1                        *
     36 *入口参数 :无                            *
     37 *返 回 值 :无                            *
     38 *说    明 :57600-8-n-1                        *
     39 ****************************************************************/
     40 void initUARTtest(void)
     41 {
     42     CLKCON &= ~0x40;              //晶振
     43     while(!(SLEEP & 0x40));      //等待晶振稳定
     44     CLKCON &= ~0x47;             //TICHSPD128分频,CLKSPD不分频
     45     SLEEP |= 0x04;                  //关闭不用的RC振荡器
     46 
     47     PERCFG = 0x00;                //位置1 P0口
     48     P0SEL = 0x3c;                //P0用作串口、按钮
     49 
     50     U0CSR |= 0x80;                //UART方式
     51     U0GCR |= 10;                //baud_e = 10;
     52     U0BAUD |= 216;                //波特率设为57600
     53     UTX0IF = 1;
     54 
     55     U0CSR |= 0X40;                //允许接收
     56     IEN0 |= 0x84;                //开总中断,接收中断
     57 }
     58     
     59 /****************************************************************
     60 *函数功能 :串口发送字符串函数                    *
     61 *入口参数 : data:数据                        *
     62 *        len :数据长度                        *
     63 *返 回 值 :无                                *
     64 *说    明 :                            *
     65 ****************************************************************/
     66 void UartTX_Send_String(char *Data,int len)
     67 {
     68   int j;
     69   for(j=0;j<len;j++)
     70   {
     71     U0DBUF = *Data++;
     72     while(UTX0IF == 0);
     73     UTX0IF = 0;
     74   }
     75 }
     76 
     77 void UartTX_Send_word(char word)
     78 {
     79     U0DBUF = word;
     80     while(UTX0IF == 0);
     81     UTX0IF = 0;
     82 }
     83 
     84 /****************************************************************
     85 *函数功能 :主函数                        *
     86 *入口参数 :无                            *
     87 *返 回 值 :无                            *
     88 *说    明 :无                            *
     89 ****************************************************************/
     90 void main(void)
     91 {    
     92     char i;
     93         char temperature[10];
     94         INT16 avgTemp;
     95     initUARTtest();                                 //初始化串口
     96     initTempSensor();                               //初始化ADC
     97         while(1)
     98         {
     99           avgTemp = 0;
    100           for(i = 0 ; i < 64 ; i++)
    101           {
    102             avgTemp += getTemperature();
    103             avgTemp >>= 1;
    104           }
    105             // avgTemp /= 64;
    106              sprintf(temperature, (char *)"%dC", (INT8)avgTemp);
    107              UartTX_Send_String(temperature,4);
    108              UartTX_Send_word(0x0A);
    109              Delay(20000);
    110         }
    111 }
  • 相关阅读:
    layui 自定义表单验证的几个实例
    elementUI vue upload完整示例
    视频图片--多线程下载工具
    获取邮箱的DNS和MX 工具类
    10大经典排序算法动图演示
    nginx 转将http跳转到https
    Java 导出 Excel 列号数字与字母互相转换工具
    linux 下查看文件个数及大小
    文字不换行的解决办法
    溢出 省略号 ...
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2666920.html
Copyright © 2020-2023  润新知