我是靠谱客的博主 美好大侠,最近开发中收集的这篇文章主要介绍Zigbee之旅(六):几个重要的CC2430基础实验——ADC单次采样 Zigbee之旅(六):几个重要的CC2430基础实验——ADC单次采样,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
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)
{
char i;
float avgTemp;
unsigned char output [] = "";
xtal_init();
led_init();
led1 = 0;
Uart0Init( 0x00 , 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString( "Hello CC2430 - TempSensor! rn ");
while( 1)
{
led1 = 0;
avgTemp = 0;
for( i = 0 ; i < 64 ; i ++)
{
avgTemp += getTemperature();
avgTemp = avgTemp / 2; //每采样1次,取1次平均值
}
output [ 0 ] = ( unsigned char)( avgTemp) / 10 + 48; //十位
output [ 1 ] = ( unsigned char)( avgTemp) % 10 + 48; //个位
output [ 2 ] = '.'; //小数点
output [ 3 ] = ( unsigned char)( avgTemp * 10) % 10 + 48; //十分位
output [ 4 ] = ( unsigned char)( avgTemp * 100) % 10 + 48; //百分位
output [5 ] = '
实验说明:片内温度采集实验,通过串口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)
{
char i;
float avgTemp;
unsigned char output [] = "";
xtal_init();
led_init();
led1 = 0;
Uart0Init( 0x00 , 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString( "Hello CC2430 - TempSensor! rn ");
while( 1)
{
led1 = 0;
avgTemp = 0;
for( i = 0 ; i < 64 ; i ++)
{
avgTemp += getTemperature();
avgTemp = avgTemp / 2; //每采样1次,取1次平均值
}
output [ 0 ] = ( unsigned char)( avgTemp) / 10 + 48; //十位
output [ 1 ] = ( unsigned char)( avgTemp) % 10 + 48; //个位
output [ 2 ] = '.'; //小数点
output [ 3 ] = ( unsigned char)( avgTemp * 10) % 10 + 48; //十分位
output [ 4 ] = ( unsigned char)( avgTemp * 100) % 10 + 48; //百分位
output [5 ] = '