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