完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
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 } 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协议栈的世界,感谢~那些一路看过来的小伙伴们,你们的观看和支持就是笔者最大的动力! |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:29 , Processed in 1.261521 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号