基于ZigBee的数据采集与无线传输实验.docx

上传人:b****1 文档编号:10596721 上传时间:2023-05-26 格式:DOCX 页数:24 大小:54.63KB
下载 相关 举报
基于ZigBee的数据采集与无线传输实验.docx_第1页
第1页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第2页
第2页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第3页
第3页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第4页
第4页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第5页
第5页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第6页
第6页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第7页
第7页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第8页
第8页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第9页
第9页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第10页
第10页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第11页
第11页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第12页
第12页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第13页
第13页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第14页
第14页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第15页
第15页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第16页
第16页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第17页
第17页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第18页
第18页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第19页
第19页 / 共24页
基于ZigBee的数据采集与无线传输实验.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于ZigBee的数据采集与无线传输实验.docx

《基于ZigBee的数据采集与无线传输实验.docx》由会员分享,可在线阅读,更多相关《基于ZigBee的数据采集与无线传输实验.docx(24页珍藏版)》请在冰点文库上搜索。

基于ZigBee的数据采集与无线传输实验.docx

基于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模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2