嵌入式成长轨迹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 }

 

posted @ 2012-09-01 18:08  MooreZHENG  阅读(1185)  评论(0编辑  收藏  举报