ADC采集是MCU感知外界的唯一途径,将外界的模拟信号转换成MCU可识别的数字信号,进而实现感知,控制。咱们zigbee网络中,终端节点的角色就是用来采集各种模拟量,例如:光照、温湿度、可燃气体浓度、等等,然后将采集的数据通过天线发送给协调器,或路由器,进行下一步的数据处理。
/*本次实验实现:
光照采集模块:
根据不同的光照引起光敏电阻阻值的变化,
用ADC采集电压值,
然后将电压值通过串行口给上位机,
上位机在串口调试助手上显示数值*/
// 话不多说~直接上代码
#include
#define uchar unsigned char //宏定义uchar为unsigned char
#define uint unsigned int //宏定义uint为unsigned int
#define LED P1_0 //宏定义LED为P1_0脚
uint ADC_value=0; //定义ADC转换值
float ADC_result=0; //定义ADC最终值
char ADC_data[6]=" 0.0V "; //定义串口数组
void Init_LED(); //声明LED 初始化函数
void Init_ADC(); //声明ADC初始化函数
void Init_UART0(); //声明串口0初始化函数
void UR0_SendString(char *str,char len);//声明字符串发送函数
void LED_RUN(); //声明LED闪烁函数
void Delay(uint ms); //声明延时函数
/*======================主程序入口==================*/
void main(void)
{
Init_LED(); //LED 初始化
Init_ADC(); //ADC初始化
Init_UART0(); //串口0初始化
while(1) //死循环
{
if(ADCIF) //是否转换完毕
{
ADCIF = 0; //采样标志位清零
//读取adc数值
ADC_value = ADCH; //读取高8位
ADC_value <<= 8; //将ADCH移到高位
ADC_value |= ADCL; //读取低8位
ADC_value >>= 3; //去掉空位
// 0 表示 0V ,3.3V--4096
// 电压值 = (ADC_value*3.3)/4096 (V)
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();//发送完一次LED状态改变一次
Delay(120);//延时一段时间
Init_ADC();//继续开启ADC采集
}
}
}
/*==================声明函数的具体实现===============*/
void Delay(uint ms) //ms级延时函数
{
uint i,j;
for(i=0; i
for(j=0; j<535;j++);
}
void Init_LED() //初始化LED
{
P1SEL &= ~0x01; //LED P1.0为普通IO口
P1DIR |= 0x01; //LED P1.0为输出
LED = 0; //LED P1.0 置低
}
void LED_RUN()
{
LED ^=1;//LED状态改变
}
void Init_ADC()
{
ADCH &= 0x00;
ADCL &= 0x00; //清空ADC数据寄存器
APCFG |= 0x02; //P0.1配置为模拟I/O口
ADCCON3 = 0xB1; //参考电压:VDD5 引脚;512 抽取率(12 位 );通道1
}
void Init_UART0()
{
PERCFG = 0x00; //选串口0的备用位置1;即(P0.2和P0.3)
P0SEL |= 0x0c; //将P0_2和P0_3管脚设置成外设功能
U0CSR |= 0x80; //1: UART模式
//查手册,配置为115200波特率
U0BAUD = 216;
U0GCR = 11;
U0UCR |=0x80; //禁止流控,无校验,8位数据,1位停止位,清除缓冲器
UTX0IF = 0; //串口0发送中断标志位清零
EA = 1; //开总中断
}
void UR0_SendString(char *str,char len)
{
while(len--)
{
U0DBUF = *str++;//将要发送的1字节数据写入U0DBUF数据缓冲区
while(!UTX0IF); //等待数据发送完成
UTX0IF = 0; //TX中断标志位清零,以便下一次发送
}
}
如果大家觉得实验中一些寄存器的配置不是很明白,大家就拿出咱们吃饭的家伙CC2530的数据手册来把实验中出现的寄存器在手册中查找,去理解。
这也是咱们zigbee入门-CC2530的最后一个实验,接下来我会带领大家走进Z-stack协议栈的世界,感谢~那些一路看过来的小伙伴们,你们的观看和支持就是笔者最大的动力!
ADC采集是MCU感知外界的唯一途径,将外界的模拟信号转换成MCU可识别的数字信号,进而实现感知,控制。咱们zigbee网络中,终端节点的角色就是用来采集各种模拟量,例如:光照、温湿度、可燃气体浓度、等等,然后将采集的数据通过天线发送给协调器,或路由器,进行下一步的数据处理。
/*本次实验实现:
光照采集模块:
根据不同的光照引起光敏电阻阻值的变化,
用ADC采集电压值,
然后将电压值通过串行口给上位机,
上位机在串口调试助手上显示数值*/
// 话不多说~直接上代码
#include
#define uchar unsigned char //宏定义uchar为unsigned char
#define uint unsigned int //宏定义uint为unsigned int
#define LED P1_0 //宏定义LED为P1_0脚
uint ADC_value=0; //定义ADC转换值
float ADC_result=0; //定义ADC最终值
char ADC_data[6]=" 0.0V "; //定义串口数组
void Init_LED(); //声明LED 初始化函数
void Init_ADC(); //声明ADC初始化函数
void Init_UART0(); //声明串口0初始化函数
void UR0_SendString(char *str,char len);//声明字符串发送函数
void LED_RUN(); //声明LED闪烁函数
void Delay(uint ms); //声明延时函数
/*======================主程序入口==================*/
void main(void)
{
Init_LED(); //LED 初始化
Init_ADC(); //ADC初始化
Init_UART0(); //串口0初始化
while(1) //死循环
{
if(ADCIF) //是否转换完毕
{
ADCIF = 0; //采样标志位清零
//读取adc数值
ADC_value = ADCH; //读取高8位
ADC_value <<= 8; //将ADCH移到高位
ADC_value |= ADCL; //读取低8位
ADC_value >>= 3; //去掉空位
// 0 表示 0V ,3.3V--4096
// 电压值 = (ADC_value*3.3)/4096 (V)
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();//发送完一次LED状态改变一次
Delay(120);//延时一段时间
Init_ADC();//继续开启ADC采集
}
}
}
/*==================声明函数的具体实现===============*/
void Delay(uint ms) //ms级延时函数
{
uint i,j;
for(i=0; i
for(j=0; j<535;j++);
}
void Init_LED() //初始化LED
{
P1SEL &= ~0x01; //LED P1.0为普通IO口
P1DIR |= 0x01; //LED P1.0为输出
LED = 0; //LED P1.0 置低
}
void LED_RUN()
{
LED ^=1;//LED状态改变
}
void Init_ADC()
{
ADCH &= 0x00;
ADCL &= 0x00; //清空ADC数据寄存器
APCFG |= 0x02; //P0.1配置为模拟I/O口
ADCCON3 = 0xB1; //参考电压:VDD5 引脚;512 抽取率(12 位 );通道1
}
void Init_UART0()
{
PERCFG = 0x00; //选串口0的备用位置1;即(P0.2和P0.3)
P0SEL |= 0x0c; //将P0_2和P0_3管脚设置成外设功能
U0CSR |= 0x80; //1: UART模式
//查手册,配置为115200波特率
U0BAUD = 216;
U0GCR = 11;
U0UCR |=0x80; //禁止流控,无校验,8位数据,1位停止位,清除缓冲器
UTX0IF = 0; //串口0发送中断标志位清零
EA = 1; //开总中断
}
void UR0_SendString(char *str,char len)
{
while(len--)
{
U0DBUF = *str++;//将要发送的1字节数据写入U0DBUF数据缓冲区
while(!UTX0IF); //等待数据发送完成
UTX0IF = 0; //TX中断标志位清零,以便下一次发送
}
}
如果大家觉得实验中一些寄存器的配置不是很明白,大家就拿出咱们吃饭的家伙CC2530的数据手册来把实验中出现的寄存器在手册中查找,去理解。
这也是咱们zigbee入门-CC2530的最后一个实验,接下来我会带领大家走进Z-stack协议栈的世界,感谢~那些一路看过来的小伙伴们,你们的观看和支持就是笔者最大的动力!
举报