资源描述
无线传感器网络实验报告
专业 计算机科学与技术
班级 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
展开阅读全文