Zigbee之旅(六):幾個重要的CC2430基礎實驗——ADC單次採樣 一、承上啟下
在無線感應器網路中,很重要的一項就是將感應器的類比值轉換成數字量,以便於傳輸和處理。而ADC(Analog-to-Digital Converter)正是用來完成這種轉換的。
上一節,我們介紹了CC2430與PC之間的串口通訊。CC2430內部已嵌入一個溫度感應器,本節將在上一節的基礎上,實現一個簡單的關於片內溫度監測的小實驗:利用ADC將片內溫度感應器的電壓值轉換成數字量,利用公式計算出溫度值,然後通過串口將溫度值傳送到PC上並顯示出來。 二、ADC單次採樣 (1)實驗簡介
利用ADC轉換CC2430片內溫度感應器的溫度值,通過串口將溫度值發送到PC並顯示出來。 (2)程式流程圖
(3)實驗源碼及剖析 /*
實驗說明:片內溫度採集實驗,通過串口0將資料發送到PC機
*/
#include <ioCC2430.h>
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
void xtal_init( void)
{
SLEEP &= ~ 0x04; //都上電
while( !( SLEEP & 0x40)); //晶體振蕩器開啟且穩定
CLKCON &= ~ 0x47; //選擇32MHz 晶體振蕩器
SLEEP |= 0x04;
}
/*LED燈初始化
-------------------------------------------------------*/
void led_init( void)
{
P1SEL = 0x00; //P1為普通 I/O 口
P1DIR |= 0x0F; //P1.0 P1.1 P1.2 P1.3 輸出
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
}
/*UART0初始化
-------------------------------------------------------*/
void Uart0Init( unsigned char StopBits , unsigned char Parity)
{
P0SEL |= 0x0C; //初始化UART0連接埠
PERCFG &= ~ 0x01; //選擇UART0為可選位置一
U0CSR = 0xC0; //設定為UART模式,而且使能接受器
U0GCR = 11;
U0BAUD = 216; //設定UART0傳輸速率為115200bps
U0UCR |= StopBits| Parity; //設定停止位與同位
}
/*UART0發送字元
-------------------------------------------------------*/
void Uart0Send( unsigned char data)
{
while( U0CSR & 0x01); //等待UART空閑時發送資料
U0DBUF = data;
}
/*UART0發送字串
-------------------------------------------------------*/
void Uart0SendString( unsigned char *s)
{
while( *s != 0)
Uart0Send( *s ++);
}
/*UART0接收資料
-------------------------------------------------------*/
unsigned char Uart0Receive( void)
{
unsigned char data;
while( !( U0CSR & 0x04)); //查詢是否收到資料,否則繼續等待
data = U0DBUF;
return data;
}
/*延時函數
-------------------------------------------------------*/
void Delay( unsigned int n)
{
unsigned int i;
for( i = 0; i <n; i ++);
for( i = 0; i <n; i ++);
for( i = 0; i <n; i ++);
for( i = 0; i <n; i ++);
for( i = 0; i <n; i ++);
}
/*得到實際溫度值
-------------------------------------------------------*/
float getTemperature( void)
{
unsigned int value;
ADCCON3 = ( 0x3E); //選擇1.25V為參考電壓;14位解析度;對片內溫度感應器採樣
ADCCON1 |= 0x30; //選擇ADC的啟動模式為手動
ADCCON1 |= 0x40; //啟動AD轉化
while( !( ADCCON1 & 0x80)); //等待ADC轉化結束
value = ADCL >> 2;
value |= ( ADCH << 6); //取得最終轉化結果,存入value中
return value * 0.06229 - 311.43; //根據公式計算出溫度值
}
/*主函數
-------------------------------------------------------*/
void main( void)
{