收藏 分销(赏)

无线传感器网络实验报告模板.doc

上传人:仙人****88 文档编号:9280683 上传时间:2025-03-19 格式:DOC 页数:47 大小:13.13MB 下载积分:10 金币
下载 相关 举报
无线传感器网络实验报告模板.doc_第1页
第1页 / 共47页
无线传感器网络实验报告模板.doc_第2页
第2页 / 共47页


点击查看更多>>
资源描述
无线传感器网络实验报告 专业 计算机科学与技术 班级 13级计科1班 学号 姓名 目 录 实验一 CC2530 I/O基础实验 实验二 CC2530按键中断 实验三 CC2530定时器的使用 实验四 串行通信接口发送与接收 实验五 Zigbee点到点无线通信 实验六 Zigbee串口实验 实验七 无线温度检测实验 实验八 Zigbee组网实验 实验一 CC2530 I/O基础实验 一、 实验目的 1.掌握IAR编译软件界面的功能; 2.掌握配置通用IO寄存器的方法; 3.掌握如何编写代码及程序下载。 二、 实验内容 1.使用CC2530的IO来控制LED灯循环闪烁; 2.判断按键是否被按下,如果按下,改变LED灯的状态,原先亮的灯灭,原先灭的亮,如此循环下去。 三、 相关知识点 cc2530有21个可编程的I/O引脚,P0、P1口是完全的8位口, P2口只有5个可使用的位。通过软件设定一组SFR寄存器的位和字节,可使这些引脚作为通常的I/O口或作为连接ADC、计时器或USART部件的外围设备I/O口使用。 2.I/O口特性: (1)可设置为通常的I/O口,也可设置为外围I/O口使用; (2)在输入时有上拉和下拉能力; (3)全部21个数字I/O口引脚都具有影响外部的中断事件也能被用来唤醒休眠模式。 3.I/O端口的寄存器如下: P0:端口0 P1:端口1 P2:端口2 PERCFG:外设控制寄存器 APCFG:模拟外设I/O配置 P0SEL:端口0功能选择寄存器 P1SEL:端口1功能选择寄存器 P2SEL:端口2功能选择寄存器 P0DIR:端口0方向寄存器 P1DIR:端口1方向寄存器 P2DIR:端口2方向寄存器 P0INP:端口0输入模式寄存器 P1INP:端口1输入模式寄存器 P2INP:端口2输入模式寄存器 P0IFG:端口0中断状态标志寄存器 P1IFG:端口1中断状态标志寄存器 P2IFG:端口2中断状态标志寄存器 PICTL:中断边缘寄存器 P0IEN:端口0中断掩码寄存器 P1IEN:端口1中断掩码寄存器 P2IEN:端口2中断掩码寄存器 PMUX:掉信号Mux寄存器 OBSSEL0:观察输出控制寄存器0 OBSSEL1:观察输出控制寄存器1 OBSSEL2:观察输出控制寄存器2 OBSSEL3:观察输出控制寄存器3 OBSSEL4:观察输出控制寄存器4 OBSSEL5:观察输出控制寄存器5 四、 实验步骤 1.启动IAR; 2.新建一个IAR工作区,或者打开一个IAR工作区; 3.连接CC Debugger调试器和ZigBee模块、连接CC Debugger到计算机,安装驱动; 4.设置项目参数; 5.编写、编译、下载程序。 五、 实验源程序 //******************************* //I/O口轮流控制2个LED循环点亮 //******************************* #include <ioCC2530.h> #define uint unsigned int #define uchar unsigned char //定义控制灯的端口 #define RLED P1_0 //定义LED1为P10口控制 #define YLED P1_1 //定义LED2为P11口控制 #define K1 P2_0 //函数声明 void Delay(uint); //延时函数 void InitialLed(void); //初始化P1口 void InitialKey(void); /**************************** //延时 *****************************/ void Delay(uint n) { uint tt; for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); } /**************************** //初始化程序 *****************************/ void InitialLed(void) { P1DIR |= 0x03; //P10、P11定义为输出 RLED = 1; YLED = 1; //LED } void InitialKey(void) { P2SEL&=~0X01; P2DIR &=~0X01; P2INP |= 0X00; } /*************************** //主函数 ***************************/ void main(void) { InitialLed();//调用初始化函数 InitialKey(); RLED = 0; //LED1 YLED = 0; //LED2 while(1) { if (k1 == 0) { delay(100); if (k1==0) { while (k1==0); YLED = !YLED; Delay(10000); YLED = !YLED; RLED = !RLED; Delay(50000); Delay(50000); } } } } 六、 实验结果和过程截图 七、 实验小结 1.cc2530通用IO使用需要配置相关寄存器; 2.cc2530通用IO寄存器的类型以及每个类型如何配置; 3.I/O端口具备如下特性: (1)21个数字I/O引脚; (2)可以配置为通用I/O或外部设备I/O; (3)输入口具备上拉或下拉能力; (4)具有外部中断能力。 实验二 CC2530按键中断 一、 实验目的 1.理解中断处理机制; 2.掌握通用I/O端口中断处理方法。 二、 实验内容 用中断方式来判断按键是否被按下,如果按下,改变LED灯的状态,原先亮的灯灭,原先灭的灯亮,如此循环下去。 三、 相关知识点 1.中断概述:cc2530有18个中断源,每个中断源都有它自己的位于一系列寄存器中的中断请求标志,每个中断可以分别使能或禁用; 2.中断屏蔽:每个中断请求可以通过设置中断使能寄存器IEN0,IEN1或者IEN2的中断使能位使能或禁止。注意某些外部设备有若干事件,可以产生与外设相关的中断请求。这些中断请求可以作用在端口0、端口1、端口2、定时器1、定时器2、定时器3、定时器4和无线电上。对于每个内部中断源对应的SFR寄存器,这些外部设备都有中断屏蔽位; 3.中断使能的步骤:总中断使能;端口中断使能;位中断使能;触发沿设置。 中断处理程序格式: #pragama vector=中断向量 ——interrupt void 任意函数名 { //中断处理,处理完成后通常需要清除中断; } 四、 实验步骤 1. 启动IAR; 2. 新建一个IAR工作区,或者打开一个IAR工作区,新建project; 3. 根据预备知识编写程序,编译程序; 4. 设置项目参数; 5. 连接CC Debugger调试器和ZigBee模块,下载程序,测试其运行效果; 6. 分析总结代码。 五、 实验源程序 //头文件的包含和宏定义 #include <ioCC2530.h> #define uint unsigned int #define uchar unsigned char //定义控制灯的端口 #define RLED P1_0 //定义LED1为P10口控制 #define YLED P1_1 //定义LED2为P11口控制 #define KEY1 P2_0 //定义按键为P20口控制 //函数声明 void Delay(uint); //延时函数声明 void InitialLed(void); //初始化函数声明 void InitKey(void); //初始化按键函数声明 /**************************** //延时 *****************************/ void Delay(uint n) { uint i; for(i = 0;i<n;i++); for(i = 0;i<n;i++); for(i = 0;i<n;i++); for(i = 0;i<n;i++); for(i = 0;i<n;i++); } /**************************** //初始化按键,并设置其为中断输入方式 *****************************/ void InitKeyINT(void) { P2SEL &= ~0X01; //引脚为通用IO口; P2DIR &= ~0X01; //按键在P20口,设置为输入模式 P2INP &= ~0x81; //上拉,下拉 EA = 1; //开全局中断 IEN2 |= 0X02; //开端口2中断 P2IEN |= 0X01; //P20设置为中断方式,开端口2零号引脚中断 PICTL |= 0X08; //设置中断触发方式 P2IFG |= 0X00; //清端口2零号引脚的中断标志 } /**************************** //初始化LED,将P10、P11定义为输出口,并将LED灯初始化为灭 *****************************/ void InitialLed(void) { P1SEL &= ~0X03; P1DIR |= 0x03; //P10、P11定义为输出 RLED = 1; YLED = 0; } /**************************** //中断处理函数 *****************************/ #pragma vector = P2INT_VECTOR __interrupt void P2_ISR(void) { if(P2IFG>0) //按键中断 { RLED =!RLED; YLED =!YLED; P2IFG = 0; Delay(100); P2IF = 0; //清中断标志 } } /*************************** //主函数 ***************************/ void main(void) { InitalLed(); InitKeyINT(); //调用初始化函数 while(1) { } } 六、 实验结果和过程截图 七、 实验小结 1. 当按键KEY按下时,因为KEY所对应的I/O口为P2_0,所以P2端口将会发出一个中断请求,并自动将P2IFG寄存器对应位(即D0位)置1,等待CPU响应; 2. CPU在执行完一条指令之后就会检测是否有中断请求,如果检测到中断请求并且IEN2的D1位为1和P2IEN的D0为1时,对应的中断使能位中断使能,则根据中断类型号获得中断向量,根据中断向量得到中断服务子程序的地址,执行终端服务子程序。当中断服务子程序执行完毕后返回执行原来的程序。 实验三 CC2530定时器的使用 一、 实验目的 1. 熟悉cc2530单片机定时器基本功能; 2.掌握cc2530单片机定时器1的配置方法。 二、 实验内容 以查询方式查看Timer1是否有溢出,让它来控制LED1、LED2灯以1s的时间间隔轮流闪烁。 三、 相关知识点 1.cc2530定时器的基本功能:实质是实现计数,在每个活动时钟边沿递增或者递减。活动时钟边沿由寄存器位CLKCON.TICKSPD定义,它设置全球系统始终的划分,提供了从0.25MHz到32MHz的不同的时钟标签频率(可以使用32MHz XOSC作为时钟源); 2.cc2530定时器T1的基本功能:定时器T1是一个独立的16位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和PWM功能。定时器有五个独立的捕获/比较通道。每个通道定时器使用一个I/O引脚。定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数/倒计数模式将允许诸如电机控制应用的实现; 3.定时器T1的寄存器,由以下几个组成: T1CTL-定时器1控制 T1STAT-定时器1状态 T1CNTH-定时器1计数高位 T1CNTL-定时器1计数地位 T1CCTLn-定时器1通道n捕获/比较控制 T1CCnH-定时器1通道n捕获/比较高位值 T1CCnL-定时器1通道n捕获/比较低位值 四、 实验步骤 1. 启动IAR; 2. 新建一个IAR工作区,或者打开一个IAR工作区,新建project; 3. 根据预备知识编写程序,编译程序; 4. 设置项目参数; 5. 连接CC Debugger调试器和ZigBee模块,下载程序,测试其运行效果; 6. 分析总结代码。 五、 实验源程序 //******************************************* 定时器T1控制闪灯实验(T1 计数溢出两次小灯轮闪一次) //******************************************* #include <ioCC2530.h> #define uint unsigned int #define uchar unsigned char #define YLED P1_0 #define RLED P1_1 uint counter=0; //统计溢出次数 uint TempFlag=0; //用来标志是否要闪灯 void Initial(void); void Delay(uint); /**************************** //初始化程序 ***************************/ void Initial(void) { //初始化P1 P1DIR = 0x03; //P10 P11为输出 RLED = 1; YLED = 1; //灭LED //用T1来做实验 T1CTL = 0x0d; //通道0,中断有效,128分频;自动重装模式(0x0000->0xffff); // T1CTL = 0x39; //通道0,中断有效,32分频;自动重装模式(0x0000->0xffff); //T1STAT = 0x21; T1CCTL0 = 0X02;// } /*************************** //主函数 ***************************/ void main() { Initial(); //调用初始化函数 RLED = 0; //点亮红色LED while(1) //查询溢出 { if(IRCON > 0) { IRCON = 0;//清溢出标志 counter++; if (counter ==2) { TempFlag = !TempFlag;//闪灯标志取反 } } if(TempFlag) //如果有闪灯标志,闪灯!同时红灯和上周期不同 { YLED = RLED; counter =0; Delay(6000); Delay(6000); RLED = !RLED; Delay(6000); } } } /**************************** //普通延时程序 ***************************/ void Delay(uint n) { uint i; for(i=0;i<n;i++); for(i=0;i<n;i++); for(i=0;i<n;i++); for(i=0;i<n;i++); for(i=0;i<n;i++); } 六、 实验结果和过程截图 七、 实验小结 1.cc2530定时器的使用需要配置相关寄存器; 2.cc2530定时器的寄存器类型以及每个类型如何配置; 3.定时器1的功能如下: (1) 五个捕获/比较通道; (2) 上升沿、下降沿或任何边沿的输入捕获; (3) 设置、清除或切换输出比较; (4) 自由运行、模或正计数/倒计数操作; (5) 可被1,8,32,或128整除的时钟分频器; (6) 在每个捕获/比较和最终计数上生成中断请; (7) DMA触发功能。 实验四 串行通信接口发送与接收 一、 实验目的 1. 了解cc2530串口的功能; 2. 掌握cc2530通过串口往电脑发送数据。 二、 实验内容 由cc2530单片机串口发送hello,在pc机用串口工具观察数据接收。 三、 相关知识点 实验程序编写: (1) 配置串行通信接口usart0的位置(可采用默认值),并设置优先级为最高; (2) 配置串行通信接口usart0的工作模式,一般工作模式为uart; (3) 配置串行通信接口连接引脚的IO功能,设置其为连接外设; (4) 配置串行通信接口的波特率。 四、 实验步骤 1. JLINK8和传感器节点相连,下载串口控制程序; 2. 运行串口调试助手,进行相应设置; 3. 启动IAR,编写实验程序,连接CCDEBUG和CC2530,编写实验程序; 4. 观察实验结果。 五、 实验源程序 #include <iocc2530.h> #include <string.h> #include <stdio.h> #define uint unsigned int #define uchar unsigned char #define led1 P1_0 #define led2 P1_1 //#define key P2_0 char TXData[25]; //延时函数; void delay(uint n) { uint i; for (i =0;i < n;i++); for (i =0;i < n;i++); for (i =0;i < n;i++); for (i =0;i < n;i++); for (i =0;i < n;i++); } //串口初始化函数 void inituartsend(void) { //设置系统的主时钟源; CLKCONCMD &=~0x40; //等待时钟稳定; while(CLKCONSTA &0x40); //设置系统时钟的主频率; CLKCONCMD &=~0x47; //设置串口的位置为0,即使用P0口的2345引脚; PERCFG &=~0x01; //将P0口的2345引脚功能设置为连接外设; P0SEL |= 0x3C; //设置串口的通信模式为异步通信; U0CSR |= 0x80; //设置串口的波特率为57600; U0GCR |= 10; U0BAUD |= 216; //开中断,将串口发送使能;并清零串口发送中断标志位; EA =1; IEN2 |=0x04; UTX0IF = 0; //初始化与LED灯相关的寄存器; P1DIR |= 0x03; } //发送函数; void uarttx_send_string(char *data, int len) { int j; for(j=0;j<len;j++) { U0DBUF = *data++; // while(UTX0IF == 0); //UTX0IF =0; // printf("%d",UTX0IF); while (UTX0IF == 0); UTX0IF = 0; led1 = !led1; delay(50000); led2 = !led2; } } main () { //初始时关闭LED灯; led1 =1; led2 =1; //调用此函数对串口0进行初始化; inituartsend(); strcpy(TXData,"hello"); while(1) { uarttx_send_string(TXData,sizeof("hello")); delay(5000); } } 六、 实验结果和过程截图 七、 实验小结 1. cc2530配置串口的一般步骤: (1) 配置IO,使用外部设备功能; (2) 配置串口的控制和状态寄存器; (3) 配置串口工作的波特率。 2. 注意以下三点: (1) 由于使用异步Uart模式,数据传输速度是比较慢的; (2) CC2530有4个时钟,分别为:内部32KHz RC Oscillator和外部32.768KHz晶振,还有内部自带的16MHz RC oscillator和32MHz crystal oscillator。CC2530的系统时钟system clock可选择外部32MHz crystal oscillator,或者内部自带的16MHz RC oscillator,但是RF工作时必须选择32MHz crystal oscillator。另外,CC2530的32KHz Clock可以选择外部的32.768KHz,或者内部32KHz RC Oscillator,32KHz时钟最主要使用在Sleep Timer和Watchdog Timer上。上电运行的时候先用的是内部自带的16MHz RC oscillator,因为RC的起振时间短,正常运行后再换成32MHz,用于RF; (3) 为了提高通信的效率,我们需要提高系统的时钟,所以,本实验配置系统时钟为32MHz。 实验五 Zigbee点到点无线通信 一、 实验目的 1.掌握zigbee协议栈的安装、编译与下载; 2.了解数据传输的基本过程。 二、 实验内容 两个Zigbee节点进行点对点通信,Zigbee节点2发送LED三个字符,Zigbee节点1收到数据后,对接收到的数据进行判断,如果收到的数据是LED,使得开发板上的LED灯闪烁。 三、 相关知识点 1. Z-Stack协议栈的简介 (1) Z-Stack是TI公司开发的Zigbee协议栈,其实际上是帮助程序员方便开发Zigbee的一套系统; (2) 使用IAR Embedded Workbench for 8051作为它的集成开发环境; (3) 提供了操作系统抽象层OSAL,用户在进行具体的应用开发时只能够通过调用API来进行; (4) 用户对Zigbee无线网络的开发简化为应用层的C语言程序开发,用户不需要深入研究复杂的Zigbee协议栈。 2. Z-Stack协议栈基本概念 (1) 设备类型—协调器,路由器,终端设备 (2) 信道 (3) PANID (4) 地址 (5) 数据传输方式 (6) 端点 (7) 拓扑结构 (8) 簇 (9) 路由 3. Z-Stack的下载与安装 TI公司官方网站上下载和安装,下载完成之后,解压得到.exe文件,进行安装,路径选择默认。 四、 实验步骤 1. 编写协调器的代码; 2. 编写终端节点的代码; 3. 打开工程程序,选择EndDeviceEB-Pro编译后将程序下载到zigbee节点2; 4. 打开协调器电源开关,后打开终端节点电源开关,观察试验现象。 五、 实验源程序 Coordinator.h #ifndef COORDINATOR_H #define COORDINATOR_H #include "ZComDef.h" #define GENERICAPP_ENDPOINT 10 #define GENERICAPP_PROFID 0X0F04 #define GENERICAPP_DEVICEID 0X0001 #define GENERICAPP_DEVICE_VERSION 0 #define GENERICAPP_FLAGS 0 #define GENERICAPP_MAX_CLUSTERS 1 #define GENERICAPP_CLUSTERID 1 extern void GenericApp_Init(byte task_id); extern UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events); #endif Coordinator.c #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include <string.h> #include "coordinator.h" #include "DebugTrace.h" #if !defined(WIN32) #include "OnBoard.h" #endif #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h" const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]={ GENERICAPP_CLUSTERID}; const SimpleDescriptionFormat_t GenericApp_SimpleDesc={ GENERICAPP_ENDPOINT, GENERICAPP_PROFID, GENERICAPP_DEVICEID, GENERICAPP_DEVICE_VERSION, GENERICAPP_FLAGS, GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList, 0, (cId_t *)NULL }; endPointDesc_t GenericApp_epDesc; byte GenericApp_TaskID; byte GenericApp_TransID; void GenericApp_MessageMSGCE(afIncomingMAGPacket_t *pckt); void GenericApp_SendTheMessage(void); void GenericApp_Init(byte task_id) { GenericApp_TaskID= task_id; GenericApp_TransID= 0; GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT; GenericApp_epDesc.task_id = &GenericApp_TaskID; GenericApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc; GenericApp_epDesc.latercyReq = noLatencyReqs; afRegister(&GenericApp_epDesc); } UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events) { afIncomingMSGPacket_t *MSGpkt; if(events &SYS_EVENT_MSG) { MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(GenericAPP_TaskID); while(MSGpkt) { switch(MSGpkt->hdr.event) { case AF_INCOMING_MSG_CMD: GenericApp_MessageMSGCB(MSGpkt); break; default: break; } osal_msg_deallocate((uint8 *)MSGpkt); MSGpkt= (afIncomingMSGPacket_t *)osal_msg_receive(GenericApp_TaskID); } return (events ^ SYS_EVENT_MSG); } return 0; } void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pkt) { unsigned char buffer[4]=" "; switch(pkt->clusterId) { case GENERICAPP_CLUSTERID: osal_memcpy(buffer,pkt->cmd.Data,3); if((buffer[0] == 'L')&&(buffer[1]=='E')&&(buffer[2]=='D')) { HalLedBlink(HAL_LED_2,0,50,500); } else { HalLedSet(HAL_LED_2,HAL_LED_MODE_ON); } break; } } Enddevice.c #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include <string.h> #include "coordinator.h" #include "DebugTrace.h" #if !defined(WIN32) #include "OnBoard.h" #endif #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h" const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]= { GENERICAPP_CLUSTERID }; const SimpleDescriptionFormat_t GenericApp_SimpleDesc= { GENERICAPP_ENDPOINT, GENERICAPP_PROFID, GENERICAPP_DEVICEID, GENERICAPP_DEVICE_VERSION, GENERICAPP_FLAGS, 0, (cId_t *)NULL, GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList }; endPointDesc_t GenericApp_epDesc; byte GenericApp_TaskID; byte GenericApp_TransID; devStates_t GenericApp_NwkState; void GenericApp_MessageMSGCE(afIncomingMAGPacket_t *pckt); void GenericApp_SendTheMessage(void); void GenericApp_Init(byte task_id) { GenericApp_TaskID= task_id; GenericApp_NwkState= DEV_INIT; GenericApp_TransID= 0; GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT; GenericApp_epDesc.task_id = &GenericApp_TaskID; GenericApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc; GenericApp_epDesc.latercyReq = noLatencyReq
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服