牛人Zigbee学习经验(六)之ADC单次采集
上一篇,我们学习了CC2430 与PC之间的串口通信。CC2430内部已嵌入一个温度传感器,而将传感的模拟值转换成数字量用于传输和处理数据是无线网路里面很重要的一项。这一节我们将本节将做一个片内温度监测的小实验:利用 ADC将片内温度传感器的电压值转换成数字量,利用公式计算出温度值,然后通过串口将温度值传送到PC上并显示出来。二、ADC单次采样 (1)实验简介 利用ADC转换CC2430片内温度传感器的温度值,通过串口将温度值发送到PC并显示出来。 (2)程序流程图 (3)实验源码及剖析 /*
实验说明:片内温度采集实验,通过串口0将数据发送到PC机
*/
#include
#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
for(i=0;i
for(i=0;i
for(i=0;i
for(i=0;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] = ' |