ADC采集是MCU感知外界的唯一途径,将外界的模拟信号转换成MCU可识别的数字信号,进而实现感知,控制。咱们zigbee网络中,终端节点的角色就是用来采集各种模拟量,例如:光照、温湿度、可燃气体浓度、等等,然后将采集的数据通过天线发送给协调器,或路由器,进行下一步的数据处理。
/*本次实验实现:
光照采集模块:
根据不同的光照引起光敏电阻阻值的变化,
用ADC采集电压值,
然后将电压值通过串行口给上位机,
上位机在串口调试助手上显示数值*/
#include <ioCC2530.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P1_0
uint ADC_value=0;
float ADC_result=0;
char ADC_data[6]=" 0.0V ";
void Init_LED();
void Init_ADC();
void Init_UART0();
void UR0_SendString(char *str,char len);
void LED_RUN();
void Delay(uint ms);
void main(void)
{
Init_LED();
Init_ADC();
Init_UART0();
while(1)
{
if(ADCIF)
{
ADCIF = 0;
ADC_value = ADCH;
ADC_value <<= 8;
ADC_value |= ADCL;
ADC_value >>= 3;
ADC_result = ADC_value*3.3/4096;
ADC_data[1]=(char)(ADC_result)%10+'0';
ADC_data[3]=(char)(ADC_result)*10%10+'0';
UR0_SendString(ADC_data,6);
LED_RUN();
Delay(120);
Init_ADC();
}
}
}
void Delay(uint ms)
{
uint i,j;
for(i=0; i<ms; i++)
for(j=0; j<535;j++);
}
void Init_LED()
{
P1SEL &= ~0x01;
P1DIR |= 0x01;
LED = 0;
}
void LED_RUN()
{
LED ^=1;
}
void Init_ADC()
{
ADCH &= 0x00;
ADCL &= 0x00;
APCFG |= 0x02;
ADCCON3 = 0xB1;
}
void Init_UART0()
{
PERCFG = 0x00;
P0SEL |= 0x0c;
U0CSR |= 0x80;
U0BAUD = 216;
U0GCR = 11;
U0UCR |=0x80;
UTX0IF = 0;
EA = 1;
}
void UR0_SendString(char *str,char len)
{
while(len--)
{
U0DBUF = *str++;
while(!UTX0IF);
UTX0IF = 0;
}
}
如果大家觉得实验中一些寄存器的配置不是很明白,大家就拿出咱们吃饭的家伙CC2530的数据手册来把实验中出现的寄存器在手册中查找,去理解。
这也是咱们zigbee入门-CC2530的最后一个实验,接下来我会带领大家走进Z-stack协议栈的世界,感谢~那些一路看过来的小伙伴们,你们的观看和支持就是笔者最大的动力!