嵌入式成长轨迹46|嵌入式成长轨迹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)
//波特率U0BAUDU0GCR误差
//24005960.14
//48005970.14
//96005980.14
//1440021680.03
//192005990.14
//2880021690.03
//3840059100.14
//57600216100.03
//7680059110.14
//115200216110.03
//230400216120.03
//3.设置数据位、停止位,奇偶校验(默认是8位数据位,1位停止位,无校验)
//4.允许中断(EA=1,URX0IE=1) (发生中断时,URX0IF=1)

CLKCON (0xC6) - Clock control
0X38:0011 1000
7OSC32K 32 kHz clock oscillator select:
0 – 32 kHz crystal oscillator
1 – 32 kHz RC oscillator
6OSC1R/WMain clock oscillator select. This setting will only take effectwhen 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:3TICKSPD[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:0Reserved. Always set to 000.
SLEEP (0xBE) - Sleep mode control
0X40:0100 0000
bit7 -Unused
bit6XOSC_STBXOSC stable status:
0 – XOSC is not powered up or not yet stable
1 – XOSC is powered up and stable
bit5HFRC_STBRCOSC stable status:
0 – HF RCOSC is not powered up or not yet stable
1 – HF RCOSC is powered up and stable
bit4:3RST[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
bit2OSC_PDXOSC 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:0MODE[1:0]Sleep mode setting:
00 – Power mode 0
01 – Power mode 1
10 – Power mode 2
11 – Power mode 3

PERCFG (外设控制寄存器)
7- 0R0 未用
6 T1CFG0R/W T1 I/O 位置选择
0位置1
1位置2
5 T3CFG0R/W T3 I/O 位置选择
0位置1
1位置2
4 T4CFG0R/W T4 I/O 位置选择
0位置1
1位置2
3:2- 00R0 未用
1 U1CFG0R/W串口1 位置选择
0位置1
1位置2
0 U0CFG0R/W串口0 位置选择
0位置1
1位置2

U0CSR(串口0 控制&状态寄存器)
U0CSR |= 0x80; //UART方式
7 MODE0R/W串口模式选择
0 SPI模式
1 UART 模式
6 RE0R/W接收使能
0关闭接收
1允许接收
5 SLAVE0R/W SPI主从选择
0 SPI主
1 SPI从
4 FE0R/W0串口帧错误状态
0没有帧错误
1出现帧错误
3 ERR0R/W0串口校验结果
0没有校验错误
1字节校验出错
2 RX_BYTE0R/W0接收状态
0没有接收到数据
1接收到一字节数据
1 TX_BYTE0R/W0发送状态
0没有发送
1最后一次写入 U0BUF的数据已经发送
0 ACTIVE0R串口忙标志
0串口闲
1串口忙

U0GCR(串口 0 常规控制寄存器)
U0GCR |= 10; //baud_e = 10
7 CPOL0R/W SPI时钟极性
0低电平空闲
1高电平空闲
6 CPHA0R/W SPI时钟相位
0由CPOL 跳向非CPOL 时采样,由非 CPOL 跳向CPOL 时输出
1 由非CPOL 跳向CPOL 时采样,由 CPOL 跳向非CPOL 时输出
5 ORDER0R/W传输位序
0低位在先
1高位在先
4:0 BAUD_E[4:0]0x00R/W波特率指数值,与BAUD_F决定波特率
U0BAUD (串口0 波特率控制寄存器)
7:0 BAUD_M[7:0]0X00R/W波特率尾数,与BAUD_E决定波特率

U0BUF(串口0 收发缓冲器)
7:0 DATA[7:0]0X00R/WUART0收发寄存器

U0BAUD (0xC2) – USART 0 Baud Rate Control
BitNameResetR/WDescription
7:0BAUD_M[7:0]0x00R/WBaud rate mantissa value.BAUD_E along with BAUD_M decidesthe UART baud rate and the SPI master SCK clock frequency
UTX1IF0 R/W
UTX0IF = 1;
UTX1IF – USART1 TX interrupt flag.
0 Interrupt not pending
1 Interrupt pending
IEN0 (0xA8) – Interrupt Enable 0
BitNameResetR/WDescription
7EAL0 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-0R0Not used. Read as 0
5STIE0 R/W STIE – Sleep Timer interrupt enable
0 Interrupt disabled
1 Interrupt enabled
4ENCIE0 R/W ENCIE – AES encryption/decryption interrupt enable
0 Interrupt disabled
1 Interrupt enabled
3URX1IE0 R/W URX1IE – USART1 RX interrupt enable
0 Interrupt disabled
1 Interrupt enabled
2URX0IE0 R/W URX0IE - USART0 RX interrupt enable
0 Interrupt disabled
1 Interrupt enabled
1ADCIE0 R/W ADCIE – ADC interrupt enable
0 Interrupt disabled
1 Interrupt enabled
0RFERRIE0 R/W RFERRIE – RF TX/RX FIFO interrupt enable
0 Interrupt disabled
1 Interrupt enabled
ADCCON1
7 EOC0R H0 ADC 结束标志位
0ADC进行中
1ADC 转换结束
6 ST0R W1手动启动AD转换(读1 表示当前正在进行AD转换)
0没有转换
1启动 AD 转换
(STSEL=11)
5:4 STSEL[1:0]11R/WAD 转换启动方式选择
00 外部触发
01 全速转换,不需要触发
10 T1 通道 0 比较触发
11手工触发
3:2 RCTRL[1:0]00R/W16 位随机数发生器控制位
(写01,10会在执行后返回00)
00 普通模式(13x打开)
01 开启LFSR 时钟一次
10 生成调节器种子
11信用随机数发生器
1:0 -11R/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 转换分辨率
008 位 (64dec)
0110 位 (128dec)
1012 位 (256dec)
1114 位 (512dec)
3:0 SCH[3:0]00读/ 写
单次A/D 转换选择,如果写入时ADC正在运行,则在完成序列A/D 转换后立刻开始,否则写入后立即开始A/D 转换,转换完成后自动清0
0000AIN0
0001AIN1
0010AIN2
0011AIN3
0100AIN4
0101AIN5
0110AIN6
0111AIN7
1000AIN0- AIN1
1001AIN2- AIN3
1010AIN4- AIN5
1011AIN6- AIN7
1100GND
1101正电源参考电压
1110温度传感器
11111/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{
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){
UINT8i;
UINT16accValue;
UINT16value;

accValue = https://www.it610.com/article/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 =https://www.it610.com/article/ADCL>> 2;
value |= (((UINT16)ADCH) << 6);

accValue += value;
}
value = https://www.it610.com/article/accValue>> 2; // devide by 4

return ADC14_TO_CELSIUS(value);
}

重要的宏定义
将片内温度传感器AD转换的结果转换成温度。
#define ADC14_TO_CELSIUS(ADC_VALUE)( ((ADC_VALUE) >> 4) - 315)
嵌入式成长轨迹46|嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】
文章图片
嵌入式成长轨迹46|嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】
文章图片
View Code

1 /*- SYSMAC.H - 2 3Defines system macros to maintain source compatibility 4with different IAR compilers. 5 6$Revision: 1.5 $ 7 8Copyright 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 #ifsizeof((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 #ifsizeof((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_ */

嵌入式成长轨迹46|嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】
文章图片
嵌入式成长轨迹46|嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】
文章图片
View Code
1 /*- STDARG.H - 2The ANSI macros for reading variable argument lists (...). 3 4$Name: $ 5 6Copyright 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 { 69char*parm; 70char*addr; 71charargc; 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 /*ICC251version 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 /*ICCH83version 3.xx -*/ 149 /*ICC78000 version 1.xx*/ 150 /*ICC78300 version 1.xx*/ 151 /*ICC78300 version 2.00 -*/ 152 /*ICC78000 version 2.xx*/ 153 /*ICCZ80version 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) \ 168ap[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_ */

嵌入式成长轨迹46|嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】
文章图片
嵌入式成长轨迹46|嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】
文章图片
View Code
1 /*- STDIO.H - 2 3Subset of ANSI standard I/O function declarations. 4 5$Name: Tyrone3b $ 6 7Copyright 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 intputs(const char *); 32 MEMORY_ATTRIBUTE intputchar(int); 33 MEMORY_ATTRIBUTE intgetchar(void); 34 MEMORY_ATTRIBUTE intsprintf(char *,const char *,...); 35 MEMORY_ATTRIBUTE intvsprintf(char *,const char *,va_list); 36 MEMORY_ATTRIBUTE intprintf(const char *,...); 37 MEMORY_ATTRIBUTE intvprintf(const char *,va_list); 38 MEMORY_ATTRIBUTE intscanf(const char *,...); 39 MEMORY_ATTRIBUTE intsscanf(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 charBOOL; 7 8 // Data 9 typedef unsigned charBYTE; 10 typedef unsigned shortWORD; 11 typedef unsigned longDWORD; 12 13 // Unsigned numbers 14 typedef unsigned charUINT8; 15 typedef unsigned charINT8U; 16 typedef unsigned shortUINT16; 17 typedef unsigned shortINT16U; 18 typedef unsigned longUINT32; 19 typedef unsigned longINT32U; 20 21 // Signed numbers 22 typedef signed charINT8; 23 typedef signed shortINT16; 24 typedef signed longINT32; 25 26 #define ADC_REF_1_25_V0x00 27 #define ADC_14_BIT0x30 28 #define ADC_TEMP_SENS0x0E 29 30 #define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00) 31 32 #define ADC_SINGLE_CONVERSION(settings) \ 33do{ ADCCON3 = (settings); }while(0) 34 35 #define ADC_SAMPLE_SINGLE() \ 36do { ADC_STOP(); ADCCON1 |= 0x40; } while (0) 37 38 #define ADC_SAMPLE_READY()(ADCCON1 & 0x80) 39 40 #define ADC_STOP() \ 41do { 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)\ 68do {\ 69if(mode == 0){ SLEEP &= ~0x03; } \ 70else if (mode == 3){ SLEEP |= 0x03; } \ 71else { SLEEP &= ~0x03; SLEEP |= mode; } \ 72PCON |= 0x01; \ 73asm("NOP"); \ 74}while (0) 75 76 77 // Where _mode_ is one of 78 #define POWER_MODE_00x00// Clock oscillators on, voltage regulator on 79 #define POWER_MODE_10x01// 32.768 KHz oscillator on, voltage regulator on 80 #define POWER_MODE_20x02// 32.768 KHz oscillator on, voltage regulator off 81 #define POWER_MODE_30x03// All clock oscillators off, voltage regulator off 82 83 // Macro for setting the 32 KHz clock source 84 #define SET_32KHZ_CLOCK_SOURCE(source) \ 85do {\ 86if( source ) {\ 87CLKCON |= 0x80; \ 88} else {\ 89CLKCON &= ~0x80; \ 90}\ 91} while (0) 92 93 // Where _source_ is one of 94 #define CRYSTAL 0x00 95 #define RC0x01 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) \ 101do {\ 102if(source) {\ 103CLKCON |= 0x40; \ 104while(!HIGH_FREQUENCY_RC_OSC_STABLE); \ 105SLEEP |= 0x04; \ 106}\ 107else {\ 108SLEEP &= ~0x04; \ 109while(!XOSC_STABLE); \ 110asm("NOP"); \ 111CLKCON &= ~0x47; \ 112SLEEP |= 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){ 5DISABLE_ALL_INTERRUPTS(); 6 7SET_MAIN_CLOCK_SOURCE(0); 8 9*((BYTE __xdata*) 0xDF26) = 0x80; 10 } 11 INT8 getTemperature(void){ 12UINT8i; 13UINT16accValue; 14UINT16value; 15 16accValue = 0; 17for( i = 0; i < 4; i++ ) 18{ 19ADC_SINGLE_CONVERSION(ADC_REF_1_25_V | ADC_14_BIT | ADC_TEMP_SENS); 20ADC_SAMPLE_SINGLE(); 21while(!ADC_SAMPLE_READY()); 22 23value =https://www.it610.com/article/ADCL>> 2; 24value |= (((UINT16)ADCH) << 6); 25 26accValue += value; 27} 28value = https://www.it610.com/article/accValue>> 2; // devide by 4 29 30return 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 { 26uint i; 27for(i=0; i>= 1; 104} 105// avgTemp /= 64; 106sprintf(temperature, (char *)"%dC", (INT8)avgTemp); 107UartTX_Send_String(temperature,4); 108UartTX_Send_word(0x0A); 109Delay(20000); 110} 111 }


【嵌入式成长轨迹46|嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】】转载于:https://www.cnblogs.com/zeedmood/archive/2012/09/01/2666920.html

    推荐阅读