第1页/共16页2016-2017学年第二学期课程实验报告课程名称:无线传感网络实验名称:基于ZigBee的数据采集与无线传输实验姓名班级学号同组同学实验课表现出勤、表现得分25%25实验报告得分50%实验总分操作结果得分25%25实验目的了解ZigBee的工作原理和技术特点,利用CC2530芯片开发一个简单的ZigBee组网通信实验。实验内容以小组为单位,利用CC2530芯片部署无线传感网络实验,分别设计采集节点、汇聚节点的程序,采集节点采集温度信息,并通过无线信道传输给汇聚节点。汇聚节点再将温度数据通过串口传输给上位机(PC机)。要求自己设计通信协议,实现上位机对监控区域的定时和实时温度数据采集。实验过程中遇到的问题以及如何解决的?(可以写多条,是否认真填写将影响实验成绩)在实验过程中我遇到了1、能接收后遇到很多的噪声干扰并且不能接收自己发送的信息2、接收到自己的信息后仍然有很多的噪声干扰出现了很多的乱码3、接收自己的信息也被转换成乱码4、遇到了选择性接收上的技术问题第2页/共16页5、温度的acsii码转换错误通过.......的方式,我解决了这个问题。1、修改了接收代码并确认发送代码没毛病2、尝试修改信道3、检查到接收子程序有问题并修改了4、老师建议我们使用选择性接收5、通过组员合作研究讨论并上网查找解决没有问题的情况下,是否有创新思路(或多做哪些工作)。好像并没有实验代码如下:发送代码:/*****************************************************************************文件名:main.c*作者:Andy*修订:2013-01-08*版本:1.0*描述:设置串口调试助手波特率:115200bps8N1*串口调试助手给CC2530发字符串时,开发板会返回接收到的字符串****************************************************************************/#includeioCC2530.h#includestring.h#includestdio.h#includestdlib.h//#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#defineSIZE51charRxBuf;charUartState;ucharcount;charRxData[SIZE];//存储发送字符串voidInitClock(void){CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振第3页/共16页while(CLKCONSTA&0x40);//等待晶振稳定CLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZ}/*****************************************************************************名称:InitSensor()*功能:温度传感器初始化函数*入口参数:无*出口参数:无****************************************************************************/voidInitSensor(void){//DISABLE_ALL_INTERRUPTS();//关闭所有中断InitClock();//设置系统主时钟为32MTR0=0x01;//设置为1来连接温度传感器到SOC_ADCATEST=0x01;//使能温度传感}/*****************************************************************************名称:GetTemperature()*功能:获取温度传感器AD值*入口参数:无*出口参数:通过计算返回实际的温度值****************************************************************************/floatGetTemperature(void){uintvalue;ADCCON3=(0x3E);//选择1.25V为参考电压;14位分辨率;对片内温度传感器采样ADCCON1|=0x30;//选择ADC的启动模式为手动ADCCON1|=0x40;//启动AD转化while(!(ADCCON1&0x80));//等待AD转换完成value=ADCL4;//ADCL寄存器低2位无效value|=(((uint)ADCH)4);return(value-1367.5)/4.5-5;//根据AD值,计算出实际的温度,芯片手册有错,温度系数应该是4.5/℃//进行温度校正,这里减去5℃(不同芯片根据具体情况校正)}/*****************************************************************************名称:DelayMS()*功能:以毫秒为单位延时*入口参数:msec延时参数,值越大,延时越久*出口参数:无****************************************************************************/第4页/共16页voidDelayMS(uintmsec){uinti,j;for(i=0;imsec;i++)for(j=0;j1070;j++);}/*****************************************************************************名称:InitUart()*功能:串口初始化函数*入口参数:无*出口参数:无****************************************************************************/voidInitUart(void){PERCFG=0x00;//外设控制寄存器USART0的IO位置:0为P0口位置1P0SEL=0x0c;//P0_2,P0_3用作串口(外设功能)P2DIR&=~0xC0;//P0优先作为UART0U0CSR|=0x80;//设置为UART方式U0GCR|=11;U0BAUD|=216;//波特率设为115200UTX0IF=0;//UART0TX中断标志初始置位0U0CSR|=0x40;//允许接收IEN0|=0x84;//开总中断允许接收中断}/*****************************************************************************名称:UartSendString()*功能:串口发送函数*入口参数:Data:发送缓冲区len:发送长度*出口参数:无****************************************************************************/voidUartSendString(char*Data,intlen){uinti;for(i=0;ilen;i++){U0DBUF=*Data++;while(UTX0IF==0);UTX0IF=0;}}第5页/共16页//以下是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;//选择通道11RFIRQM0|=(16);//使能RF数据包接收中断IEN2|=(10);//使能RF中断RFST=0xED;//清除RF接收缓冲区ISFLUSHRXRFST=0xE3;//RF接收使能ISRXON}voidrf_send(char*pbuf,intlen){RFST=0xE3;//RF接收使能ISRXONwhile(FSMSTAT1&((11)|(15)));//等待发送状态不活跃并且没有接收到SFDRFIRQM0&=~(16);//禁止接收数据包中断IEN2&=~(10);//清除RF全局中断RFST=0xEE;//清除发送缓冲区ISFLUSHTXRFIRQF1=~(11);//清除发送完成标志//填充缓冲区填充过程需要增加2字节,CRC校验自动填充RFD=len+2;for(inti=0;ilen;i++){RFD=*pbuf++;}RFST=0xE9;//发送数据包ISTXON第6页/共16页while(!(RFIRQF1&(11)));//等待发送完成P0_0=~P0_0;RFIRQF1=~(11);//清除发送完成标志位RFIRQM0|=(16);//RX接收中断IEN2|=(10);}/*****************************************************************************程序入口函数****************************************************************************/voidmain(void){//chari;//floatAvgTemp;//charstrTemp[6];CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振while(CLKCONSTA&0x40);//等待晶振稳定为32MCLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZInitUart();//调用串口初始化函数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;//禁止接收第7页/共16页AvgTemp=0;for(i=0;i64;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;//计数清0memset(RxData,0,SIZE);//清空