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協議棧的世界,感謝~那些一路看過來的小夥伴們,你們的觀看和支持就是筆者最大的動力!