嵌入式成长轨迹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)
文章图片
文章图片
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_ */
文章图片
文章图片
View Code1 /*- 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_ */
文章图片
文章图片
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
【嵌入式成长轨迹46|嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】】转载于:https://www.cnblogs.com/zeedmood/archive/2012/09/01/2666920.html
推荐阅读
- 人生感悟记#环境仪器宋庆国成长记#072
- “成长”读书社群招募
- 星耀小学二年三班姜婉莹成长曰记第8天
- 中国MES系统软件随工业化成长
- 【剽悍读书营成长记录】2018年我收获了什么|【剽悍读书营成长记录】2018年我收获了什么 3357-小松
- SG平滑轨迹算法的原理和实现
- 4.23世界阅读日,樊登读书狂欢放送,听书中成长
- 言情成长小说《后来》|目录
- 佳兴妈妈成长记~
- [成长]“青椒”给我打开了一扇窗——我的青椒学习之旅