基于ZigBee的数据采集与无线传输实验.docx
- 文档编号:29124576
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:24
- 大小:54.63KB
基于ZigBee的数据采集与无线传输实验.docx
《基于ZigBee的数据采集与无线传输实验.docx》由会员分享,可在线阅读,更多相关《基于ZigBee的数据采集与无线传输实验.docx(24页珍藏版)》请在冰豆网上搜索。
基于ZigBee的数据采集与无线传输实验
2016-2017学年第二学期
课程实验报告
课程名称:
无线传感网络
实验名称:
基于ZigBee的数据采集与无线传输实验
XX
班级
学号
同组同学
实验课表现
出勤、表现得分25%
25
实验报告
得分50%
实验总分
操作结果得分25%
25
实验目的
了解ZigBee的工作原理和技术特点,利用CC2530芯片开发一个简单的ZigBee组网通信实验。
实验内容
以小组为单位,利用CC2530芯片部署无线传感网络实验,分别设计采集节点、汇聚节点的程序,采集节点采集温度信息,并通过无线信道传输给汇聚节点。
汇聚节点再将温度数据通过串口传输给上位机(PC机)。
要求自己设计通信协议,实现上位机对监控区域的定时和实时温度数据采集。
实验过程中遇到的问题以与如何解决的?
(可以写多条,是否认真填写将影响实验成绩)
在实验过程中我遇到了
1、能接收后遇到很多的噪声干扰并且不能接收自己发送的信息
2、接收到自己的信息后仍然有很多的噪声干扰出现了很多的乱码
3、接收自己的信息也被转换成乱码
4、遇到了选择性接收上的技术问题
5、温度的acsii码转换错误
通过.......的方式,我解决了这个问题。
1、修改了接收代码并确认发送代码没毛病
2、尝试修改信道
3、检查到接收子程序有问题并修改了
4、老师建议我们使用选择性接收
5、通过组员合作研究讨论并上网查找解决
没有问题的情况下,是否有创新思路(或多做哪些工作)。
好像并没有
实验代码如下:
发送代码:
/****************************************************************************
*文件名:
main.c
*作者:
Andy
*修订:
2013-01-08
*版本:
1.0
*描述:
设置串口调试助手波特率:
115200bps8N1
*串口调试助手给CC2530发字符串时,开发板会返回接收到的字符串
****************************************************************************/
#include
#include
#include
#include
//#defineDISABLE_ALL_INTERRUPTS()(IEN0=IEN1=IEN2=0x00)//三个
charrf_rx_buf[128];
voidrf_send(char*pbuf,intlen);
voidrf_receive_isr();
typedefunsignedcharuchar;
typedefunsignedintuint;
#defineUART0_RX1
#defineUART0_TX2
#defineSIZE51
charRxBuf;
charUartState;
ucharcount;
charRxData[SIZE];//存储发送字符串
voidInitClock(void)
{
CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振
while(CLKCONSTA&0x40);//等待晶振稳定
CLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZ
}
/****************************************************************************
*名称:
InitSensor()
*功能:
温度传感器初始化函数
*入口参数:
无
*出口参数:
无
****************************************************************************/
voidInitSensor(void)
{
//DISABLE_ALL_INTERRUPTS();//关闭所有中断
InitClock();//设置系统主时钟为32M
TR0=0x01;//设置为1来连接温度传感器到SOC_ADC
ATEST=0x01;//使能温度传感
}
/****************************************************************************
*名称:
GetTemperature()
*功能:
获取温度传感器AD值
*入口参数:
无
*出口参数:
通过计算返回实际的温度值
****************************************************************************/
floatGetTemperature(void)
{
uintvalue;
ADCCON3=(0x3E);//选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1|=0x30;//选择ADC的启动模式为手动
ADCCON1|=0x40;//启动AD转化
while(!
(ADCCON1&0x80));//等待AD转换完成
value=ADCL>>4;//ADCL寄存器低2位无效
value|=(((uint)ADCH)<<4);
return(value-1367.5)/4.5-5;//根据AD值,计算出实际的温度,芯片手册有错,温度系数应该是4.5/℃
//进行温度校正,这里减去5℃(不同芯片根据具体情况校正)
}
/****************************************************************************
*名称:
DelayMS()
*功能:
以毫秒为单位延时
*入口参数:
msec延时参数,值越大,延时越久
*出口参数:
无
****************************************************************************/
voidDelayMS(uintmsec)
{
uinti,j;
for(i=0;i for(j=0;j<1070;j++); } /**************************************************************************** *名称: InitUart() *功能: 串口初始化函数 *入口参数: 无 *出口参数: 无 ****************************************************************************/ voidInitUart(void) { PERCFG=0x00;//外设控制寄存器USART0的IO位置: 0为P0口位置1 P0SEL=0x0c;//P0_2,P0_3用作串口(外设功能) P2DIR&=~0xC0;//P0优先作为UART0 U0CSR|=0x80;//设置为UART方式 U0GCR|=11; U0BAUD|=216;//波特率设为115200 UTX0IF=0;//UART0TX中断标志初始置位0 U0CSR|=0x40;//允许接收 IEN0|=0x84;//开总中断允许接收中断 } /**************************************************************************** *名称: UartSendString() *功能: 串口发送函数 *入口参数: Data: 发送缓冲区len: 发送长度 *出口参数: 无 ****************************************************************************/ voidUartSendString(char*Data,intlen) { uinti; for(i=0;i { U0DBUF=*Data++; while(UTX0IF==0); UTX0IF=0; } } //以下是RF初始化和发送与接收 voidrf_init() { TXPOWER=0xD5;//发射功率为1dBm //FRMCTRL0|=(0x20|0x40);/*AUTO_ACK|AUTO_CRC*/ CCACTRL0=0xF8;//推荐值smartRF软件生成 FRMFILT0=0x0c;//静止接收过滤,即接收所有数据包 FSCAL1=0x00;//推荐值smartRF软件生成 TXFILTCFG=0x09; AGCCTRL1=0x15; //AGCCTRL2=0xFE; //TXFILTCFG=0x09;//推荐值smartRF软件生成 FREQCTRL=0x09;//选择通道11 RFIRQM0|=(1<<6);//使能RF数据包接收中断 IEN2|=(1<<0);//使能RF中断 RFST=0xED;//清除RF接收缓冲区ISFLUSHRX RFST=0xE3;//RF接收使能ISRXON } voidrf_send(char*pbuf,intlen) { RFST=0xE3;//RF接收使能ISRXON while(FSMSTAT1&((1<<1)|(1<<5)));//等待发送状态不活跃并且没有接收到SFD RFIRQM0&=~(1<<6);//禁止接收数据包中断 IEN2&=~(1<<0);//清除RF全局中断 RFST=0xEE;//清除发送缓冲区ISFLUSHTX RFIRQF1=~(1<<1);//清除发送完成标志 //填充缓冲区填充过程需要增加2字节,CRC校验自动填充 RFD=len+2; for(inti=0;i { RFD=*pbuf++; } RFST=0xE9;//发送数据包ISTXON while(! (RFIRQF1&(1<<1)));//等待发送完成 P0_0=~P0_0; RFIRQF1=~(1<<1);//清除发送完成标志位 RFIRQM0|=(1<<6);//RX接收中断 IEN2|=(1<<0); } /**************************************************************************** *程序入口函数 ****************************************************************************/ voidmain(void) { //chari; //floatAvgTemp; //charstrTemp[6]; CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振 while(CLKCONSTA&0x40);//等待晶振稳定为32M CLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZ InitUart();//调用串口初始化函数 UartState=UART0_RX;//串口0默认处于接收模式 memset(RxData,0,SIZE); InitSensor(); rf_init(); floatx=GetTemperature(); chara[10]; sprintf(a,"%g",x); charb[15]="AC1: "; strcat(b,a); while (1) { rf_send(b,20); DelayMS(20); } /*if(UartState==UART0_TX)//发送状态 { U0CSR&=~0x40;//禁止接收 AvgTemp=0; for(i=0;i<64;i++) { AvgTemp+=GetTemperature(); AvgTemp=AvgTemp/2;//每次累加后除2 } memset(strTemp,0,6); sprintf(strTemp,"%.02f\n",AvgTemp);//将浮点数转成字符串 UartSendString(strTemp,6); rf_send(strTemp,5); DelayMS(1000);//延时 //UartSendString(RxData,count);//发送已记录的字符串。 U0CSR|=0x40;//允许接收 UartState=UART0_RX;//恢复到接收状态 count=0;//计数清0 memset(RxData,0,SIZE);//清空接收缓冲区 } } */ } 接收代码: /******************************************************************************* *文件名称: UART(ReceiveINT)_Ex.c *功能: CC253x系列片上系统基础实验---UART(接收数据中断方式) *描述: 本实验使用CC253x系列片上系统的片内USART控制器,工作在UART模式下,通 *过UART0接收数据,采用中断方式。 *实验硬件: *用USB电缆连接SK-SmartRF05EB上的USB接口与用户PC的USB接口。 * *作者: POWER *日期: 2010-04-18 ******************************************************************************/ /*包含头文件*/ /********************************************************************/ #include"ioCC2530.h"//CC2530的头文件,包含对CC2530的寄存器、中断向量等的定义 #include"LCD.h"//lcd驱动头文件 #include"stdio.h"//C语言标准输入/输出库头文件 /********************************************************************/ /*定义枚举类型*/ /********************************************************************/ enumSYSCLK_SRC{XOSC_32MHz,RC_16MHz};//定义系统时钟源(主时钟源)枚举类型 /********************************************************************/ /********************************************************************* *函数名称: SystemClockSourceSelect *功能: 选择系统时钟源(主时钟源) *入口参数: source *XOSC_32MHz32MHz晶体振荡器 *RC_16MHz16MHzRC振荡器 *出口参数: 无 *返回值: 无 ********************************************************************/ voidSystemClockSourceSelect(enumSYSCLK_SRCsource) { unsignedcharosc32k_bm=CLKCONCMD&0x80; unsignedchar__clkconcmd,__clkconsta; /* 系统时钟源(主时钟源)选择16MHzRC振荡器,定时器tick设置为16MHz,时钟速度设置为16MHz CLKCONCMD.OSC32K[b7]不改变32KHz时钟源选择保持先前设置 CLKCONCMD.OSC[b6]=1系统时钟源(主时钟源)选择16MHzRC振荡器 CLKCONCMD.TICKSPD[b5..b3]=001定时器tick设置为16MHz CLKCONCMD.CLKSPD[b2..b0]=001时钟速度设置为16MHz */ if(source==RC_16MHz) {/*CLKCONCMD.OSC32K[b7]*/ CLKCONCMD=((osc32k_bm)|\ /*CLKCONCMD.OSC[b6]=1*/ (0x01<<6)|\ /*CLKCONCMD.TICKSPD[b5..b3]=001*/ (0x01<<3)|\ /*CLKCONCMD.CLKSPD[b2..b0]=001*/ (0x01<<0)); } /* 系统时钟源(主时钟源)选择32MHz晶体振荡器,定时器tick设置为32MHz,时钟速度设置为32MHz CLKCONCMD.OSC32K[b7]不改变32KHz时钟源选择保持先前设置 CLKCONCMD.OSC[b6]=0系统时钟源(主时钟源)选择32MHz晶体振荡器 CLKCONCMD.TICKSPD[b5..b3]=000定时器tick设置为32MHz CLKCONCMD.CLKSPD[b2..b0]=000时钟速度设置为32MHz */ elseif(source==XOSC_32MHz) { CLKCONCMD=(osc32k_bm/*|(0x00<<6)|(0x00<<3)|(0x00<<0)*/); } /*等待所选择的系统时钟源(主时钟源)稳定*/ __clkconcmd=CLKCONCMD;//读取时钟控制寄存器CLKCONCMD do { __clkconsta=CLKCONSTA;//读取时钟状态寄存器CLKCONSTA }while(__clkconsta! =__clkconcmd);//直到CLKCONSTA寄存器的值与CLKCONCMD寄存 //器的值一致,说明所选择的系统时钟源(主 //时钟源)已经稳定 } /********************************************************************* *函数名称: InitUART0 *功能: UART0初始化 *P0.2RX *P0.3TX *波特率: 57600 *数据位: 8 *停止位: 1 *奇偶校验: 无 *入口参数: 无 *出口参数: 无 *返回值: 无 ********************************************************************/ voidInitUART0(void) { /*片内外设引脚位置采用上电复位默认值,即PERCFG寄存器采用默认值*/ /* P0.2RX P0.3TX P0.4CT P0.5RT */ /*UART0相关引脚初始化*/ P0SEL|=((0x01<<2)|(0x01<<3));//P0.2和P0.3作为片内外设I/O /*P0口外设优先级采用上电复位默认值,即P2DIR寄存器采用默认值*/ /* 第一优先级: USART0 第二优先级: USART1 第三优先级: Timer1 */ /*UART0波特率设置*/ /*波特率: 57600 当使用32MHz晶体振荡器作为系统时钟时,要获得57600波特率需要如下设置: UxBAUD.BAUD_M=216 UxGCR.BAUD_E=10 该设置误差为0.03% */ U0BAUD=216; U0GCR=10; /*USART模式选择*/ U0CSR|=0x80;//UART模式 /*UART0配置*/ U0UCR|=0x80;//进行USART清除 /* 以下配置参数采用上电复位默认值: 硬件流控: 无 奇偶校验位(第9位): 奇校验 第9位数据使能: 否 奇偶校验使能: 否 停止位: 1个 停止位电平: 高电平 起始位电平: 低电平 */ /*用於发送的位顺序采用上电复位默认值,即U0GCR寄存器采用上电复位默认值*/ /*LSB先发送*/ URX0IF=0;//清零UART0RX中断标志 U0CSR|=(0x01<<6);//使能接收器 URX0IE=1;//使能UART0RX中断 } charrf_rx_buf[16]; charpbuf[16]; /********************************************************************* *函数名称: UART0SendByte *功能: UART0发送一个字节 *入口参数: c *出口参数: 无 *返回值: 无 ********************************************************************/ voidUA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ZigBee 数据 采集 无线 传输 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)