菜鸟笔记之Zigbee基础实验一
实验-ZigBee组网
实验-ZigBee组⽹实验:ZigBee基本通信实验⼀、实验⽬的1.了解ZigBee协议及其在软件上如何实现。
2.学习使⽤sniffer嗅探⽹络节点之间通信数据包并分析数据包。
3. 学习Zigbee⽹络组⽹及路由选择。
⼆、实验内容1.基于z-stack协议栈的组⽹及数据传输。
2.使⽤sniffer抓取节点之间传输的数据包并分析数据包组成。
三、实验设备1.IAR开发平台环境2.ZigBee开发套件3.Sniffer抓包⼯具(软件和硬件)实验开发套件的领取注意事项:1、每周五上午1-2节可到电信5号楼东303A房间,协同创新中⼼找蓝伟涛学长(领取FPGA开发板)或电信1号楼515室找赵曜学长(领取Zigbee开发套件)。
2、每个⼩组以组长为代表签字领取⼀套开发套件,并在三周内归还。
请爱护实验套件,归还时确保所有部件完好齐全。
3、实验中若有问题可在周五上午1-2节课时间去上述地址找两位助教答疑。
四、实验原理1,ZigBee协议概述ZigBee作为⼀种⽆线通信标准,它是以IEEE802.15.4⽆线通信技术为基础的⼀组涉及到⽹络、安全和应⽤⽅⾯的软件协议。
它是⼀种短距离、低复杂度、低功耗、地数据传输速率和低成本的双向⽆线通信技术。
该技术可以应⽤于超低功耗率损耗的⽆线⽹络中,它满⾜ISO/OSI参考模型。
其物理层和MAC层采⽤了IEEE802.15.4标准;ZigBee联盟定义了上层部分,包括⽹络层和应⽤层。
⽆线通信⽹络软件以z-stack作为ZigBee的协议栈,硬件为基于CC2530-ZigBee开发套件。
2 设备类型(Device Types)在ZigBee⽹络中存在三种逻辑设备类型:Coordinator(协调器),Router(路由器)和End-Device(终端设备)。
ZigBee⽹络由⼀个Coordinator以及多个Router和多个End_Device组成。
在ZStack-CC2530-2.3.1-1.4.0中⼀个设备的类型通常在编译的时候通过编译选项确定。
ZigBee入门指导_1-4
Zigbee入门指导(一)——基于CC2430的Zigbee开发环境的建立logiclimit 写在前面的话:临近毕业,把之前做过的一些项目的内容加以整理,和大家一起分享,请高手指教,欢迎同辈间交流,希望后来者能少走一些弯路。
Zigbee入门指导源于大三时的课程设计《无线心电采集系统》中的Zigbee网络部分。
Zigbee入门指导预定为三篇,分为:1、开发环境的建立;2、运行Zigbee例程;3、基于Zigbee的一主多从的数据采集系统,大概在一个月内整理完毕。
文章版权为原创者logiclimit所有,转载时请注明出处。
Zigbee是一种近距离低功耗低速率无线网络,使用免费的2.4GHz频段,主要用于无线传感器网络、智能家居等方面。
很多公司都推出了自己的Zigbee芯片和模块,我使用的是基于Ti 公司CC2430,由无线龙公司生产的Zigbee模块,使用的Zigbee 协议栈版本为TI_ZStack-1.4.3-1.2.1(对应标准的Zigbee 2006)。
本篇主要讲述其开发环境的建立方面的内容。
使用的开发环境为:windows7、IAR 8051 7.30B。
需要指出的是,Ti目前主推的是其CC2530模块,使用IAR 8051 7.50版本,支持Zigbee 2006 pro及Zigbee 2007,由于笔者没有CC2530及IAR 8051 7.50,故无法保证本文中的内容适用于CC2530及相关的开发环境和协议栈。
之前开发时使用的操作系统是Win XP,故本文所说的内容同样适用于win XP系统。
本文已假定读者了解IAR软件和cc2430单片机功能的使用,具有一定的C语言基础和嵌入式开发经验。
由于之前只有一个学期时间,还要完成相关模拟采集电路的设计,故Zigbee部分只完成网络的建立、数据的收发及控制的内容,稍显粗鄙,请勿见笑。
一、安装IAR 8051 7.30B使用管理员权限运行安装程序EW8051-EV-730B.exe,根据提示输入相应的注册码,完成相关的安装。
无线传感网——zigbee基础实验-点对点通信
⽆线传感⽹——zigbee基础实验-点对点通信 //头⽂件1 #include <iocc2530.h>23 #include "hal_mcu.h"4 #include "hal_assert.h"5 #include "hal_board.h"6 #include "hal_rf.h"78 #include <stdio.h>9 #include "basic_rf.h"1011#define NODE_TYPE 012#define RF_CHANNEL 251314#define PAN_ID 0x200715#define SEND_ADDR 0x253016#define RECV_ADDR 0x25201718static basicRfCfg_t basicRfConfig;先将NODE_TYPE改为1(发送),然后可找⼀个标识为Status的盒⼦编译烧写此程序(断电)再将NODE_TYPE改为0(接收),然后可找⼀个标识为Data的盒⼦编译烧写此程序RF数据发送函数void rfSendData(void){uint8 pTxData[] = {"你好,我是发送端CC2530过来的数据!\r\n\r\n"};uint8 ret;printf("send node start up...\r\n");basicRfReceiveOff();while(TRUE){ret = basicRfSendPacket(RECV_ADDR, pTxData, sizeof pTxData);if (ret == SUCCESS){hal_led_on(1);halMcuWaitMs(100);hal_led_off(1);halMcuWaitMs(900);}else{hal_led_on(1);halMcuWaitMs(1000);hal_led_off(1);}}} RF数据接收函数 1void rfRecvData(void)2 {3 uint8 pRxData[128];4int rlen;567 printf("recv node start up...\r\n");89 basicRfReceiveOn();1011while(TRUE)12 {13while(!basicRfPacketIsReady());14 rlen = basicRfReceive(pRxData, sizeof pRxData, NULL);15if(rlen > 0)16 {17 printf((char *)pRxData);18 }19 }20 }主函数void main(){halMcuInit(); //MCU初始化hal_led_init(); //LED初始化hal_uart_init(); //Uart初始化if(FAILED == halRfInit()) //CC2530-RF 初始化{HAL_ASSERT(FALSE);}basicRfConfig.panId = PAN_ID;basicRfConfig.channel = RF_CHANNEL;basicRfConfig.ackRequest = TRUE;#if NODE_TYPEbasicRfConfig.myAddr = SEND_ADDR; //(0x2530)#elsebasicRfConfig.myAddr = RECV_ADDR; //(0x2520)#endifif(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}#if NODE_TYPErfSendData();#elserfRecvData();#endif}再将刚才烧写好的发送盒⼦拼接到接收盒⼦上开串⼝调试器后(两根线都连接收盒)进⾏跟踪结果如下:(接收盒⼦不断有数据过来)"你好,我是发送端CC2530过来的数据!"。
ZIGBEE 无线单片机 基础实验教程
第6章无线单片机基础开发在进行本章实验之前,根据第3章介绍,安装所有软件与驱动。
6.1输入输出I/O控制实验基础实验1:输入输出I/O控制实验实验介绍本次实验的目的是让用户学会使用CC2530的I/0来控制外设,本例以LED灯为外设,用CC2530控制简单外设时,应将I/O设置为输出。
实验现象LED闪烁。
(打开“表演程序\CC2530单片机基础实验\实验1:输入输出IO控制实验”)实验设备仿真器1台,节点底板1块,ZigBee模块1块,USB连接线1根。
实验相关寄存器实验中操作了的寄存器有P1,P1DIR,没有设置而是取默认值的寄存器有:P1SEL,P1INP。
P1 (P1口寄存器)位号位名复位值操作性功能描述7:0 P1[7:0] 0x00 读/写P1端口普通功能寄存器,可位寻址P1DIR (P1方向寄存器)位号位名复位值操作性功能描述7 DIRP1_7 0 读/写P1_7方向0 输入,1 输出6 DIRP1_6 0 读/写P1_6方向0 输入,1 输出5 DIRP1_5 0 读/写P1_5方向0 输入,1 输出4 DIRP1_4 0 读/写P1_4方向0 输入,1 输出3 DIRP1_3 0 读/写P1_3方向0 输入,1 输出2 DIRP1_2 0 读/写P1_2方向0 输入,1 输出1 DIRP1_1 0 读/写P1_1方向0 输入,1 输出0 DIRP1_0 0 读/写P1_0方向0 输入,1 输出P1SEL (P1功能选择寄存器)位号位名复位值操作性功能描述7 SELP1_7 0 读/写P1_7功能0 普通I/O,1 外设功能6 SELP1_6 0 读/写P1_6功能0 普通I/O,1 外设功能5 SELP1_5 0 读/写P1_5功能0 普通I/O,1 外设功能4 SELP1_4 0 读/写P1_4功能0 普通I/O,1 外设功能3 SELP1_3 0 读/写P1_3功能0 普通I/O,1 外设功能2 SELP1_2 0 读/写P1_2功能0 普通I/O,1 外设功能1 SELP1_1 0 读/写P1_1功能0 普通I/O,1 外设功能0 SELP1_0 0 读/写P1_0功能0 普通I/O,1 外设功能实验相关函数void Delay(uint n);函数原型是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++);}函数功能是软件延时,执行5次0到n的空循环来实现软件延时。
实验1 ZigBee基础实验
温州大学物理与电子信息工程学院
物联网技术实验报告
实验名称:实验一:ZigBee基础实验
班级:姓名:学号:
实验地点:日期:
【实验目的】
1、掌握CC2530 数字 I/O 接口;
2、掌握CC2530通过控制 GPIO 驱动 LED的方法;
3、掌握CC2530定时器的配置、中断的产生和中断服务程序的用法。
【实验仪器】
1、G7实验箱一台、PC机
2、IAR开发套件
3、USB-Mini线一根、CC DEBUGGER烧录器一个
【实验内容】
(1)编程实现:使用CC2530定时器将绿红蓝三个 LED 灯轮流点亮与关闭(先蓝灯亮1s后关闭,再红灯亮1s后关闭,再蓝灯……)。
(2)电路原理图:
(3)代码以图片形式粘贴在下面:
(4)实验报告以“学号+姓名”命名,交给班长统一发送到cljin@。
【实验总结与分析】
【实验成绩】
教师:金才垄 2018 年月日。
zigbee实验一
实验一、基于Zigbee协议栈的数据传输实验内容:两个ZigBee节点一个作为协调器,一个作为终端节点,二者组网成功后进行数据通信。
ZigBee节点B(终端节点EndDevice,稍后,下载EndDeviceEB里的代码)发送“LED”字符,ZigBee节点A(协调器节点Coordinator,稍后,下载CoordinatorEB里的代码)接受数据后,判断接受到的数据是否为“LED”,是,则使板子上的LED灯闪烁。
实验步骤:1、将下载好的最新版本的z-stack协议栈ZStack-CC2530-2.5.1a.exe安装到默认目录或指定的的E盘目录下。
2、打开GenericApp.eww工程,并在此基础上,添加修改代码。
在App文件夹移除掉GenericApp.c,即右键单击GenericApp.c,在弹出的下拉菜单中选择Remove即可。
同理,删除GenericApp.h。
单击File,选择New,然后选择File,将文件保存为Coordinator.h。
同理,添加Coordinator.c、Enddevice.c两个文件。
然后将附录的源代码写入Coordinator.h、及Coordinator.c、Enddevice.c两个文件中。
(以上代码编写编译工作在宿舍完成)3、分别编译下载协调器及终端程序。
在下载协调器代码时,在Workspace下拉表中选CoordinatorEB,后右键单击Enddevice.c,选择Options,选择Exclude from build。
此时,Enddevice.c为灰白不可用,在编译时不参与编译。
下载终端代码方法同理可得,并将终端代码下载到另一块开发板上。
4、打开协调器电源开关,然后打开终端节点电源开关,几秒钟后,发现协调器LED灯闪烁起来说明协调器组网成功并受到终端发送的数据。
否则协调器灯一直亮,表示未受到数据。
改变协调器及终端灯闪频率观测实验结果。
5、完成后请老师验收检查6、分析终端发送函数的功能及参数。
物联网 Zigbee 网关实验
一、实验目的
1.了解物联智能家具的基本工作原理
2.Android下飞比网关的基本信息及使用,实现网关的基本操作。
二、实验设备
Window 7电脑一台(配有JDK和eclise或Android Studio)
飞比网关一个
三、实验内容
本次实验的主要内容了解无线传输的原理,掌握环境的配置,so库的装置,及本地函数的初始化,使用,和连接网关,和获取网关的基本信息等操作。
serial.connectRemoteZll(username, passWd);
结果:-大于0,连接成功,否则失败,-2
为账号或密码错误成功连接网关,获取网关中的信息。
连接网关成功后,调用:
serial.getGateWayInfo();//获取网关信息
serial.getDevices();//获取网关中的设备信息
将进入到主界面,上面是网关的具体信息,包括版本,用户名和密码,设备数量,组数量等。
4.网关入网状态,设备入网关。
public void exit() {
if (mSerial != null) {
mSerial.releaseSource();
}
}
本地连接:
调用本地的serial.connectLANZll(),该方法要走子线程中执行,来寻找本地局域网的网关,须连接wifi。结果:大于0(找个n个网关)连接成功,-3连接超时,否则其他原因连接失败。
在找到的网关中选择网关进行连接。
点击确认后,调用getGatewayIps和getBoxSnids获得查询到所有网关的ip和snid,并选择其中一个进行连接。
String[] boxip = serial.getGatewayIps(integer);
ZigBee网络设置基础实验
一、实验目的1、学习和掌握IAR软件的安装。
2、学习和掌握ZigBee协议栈在IAR软件开发环境中的应用。
二、实验设备(1)硬件设备● PC机一台;● CC2530-DEBUG仿真器一台;● ZigBee通信模块(插接在传感器模块的ZigBee通信模块);● ZigBee协调器(插接在嵌入式网关或PC机上的ZigBee通信模块)。
(2)软件工具● IAR Embedded Workbench Evaluation for 8051 8.10版;● PL2303-USB转串口驱动程序;●串口调试软件4.5。
三、实验原理及关键知识点3.1 ZigBee网络设备ZigBee网络有三种逻辑设备类型,即协调器(Coordinator)、路由器(Router)和终端设备(End-device)。
一般情况下一个ZigBee网络由一个协调器节点、若干个路由器节点和若干个终端节点组成(星形网络拓扑结构除外)。
(1)协调器(Coordinator)协调器的作用是创建和维护ZigBee网络,也是形成网络的第一个设备。
ZigBee网络中的协调器与路由器和终端的硬件电路并无区别,只是其软件设置有所不同。
协调器的设置内容包含网络拓扑结构、信道和网络标识(即网络号PAN ID),也可使用默认值而省略设置,然后开始启动这个网络(各个节点上电即为启动)。
一旦启动网络,在与协调器的有效通信距离范围内且设置为相同网络标识和信道的路由器和终端就会自动加入这个网路。
注意:协调器的主要作用是建立和设置网络。
网络一旦建立完成,该协调器的作用就与路由器节点相同,甚可以退出着这个网络(仅限于树形和网形网络)。
(2)路由器(Router)路由器是在网络中起支持关联设备的作用,实现其它节点的消息转发功能。
ZigBee的树形网络和网形网络可有多个ZigBee路由器,ZigBee的星形网络不支持路由器。
路由器功能如下:i) 使其子树中的设备(路由器或终端)加入这个网络;ii) 路由;iii)辅助其子树终端的通信。
zigbee学习记录
ZigBee实验记录。
刘佳毅编写2013/10/16现在需要弄清楚eb板,硬件资源的调用。
现在需要将eb板独立按键s1.s2加入。
首先。
打开工程,为了最少限度的造成错误。
这里不妨就用原来的generalapp首先测试。
S1.s2按键,按下。
是否会进入系统消息处理。
case KEY_CHANGE:是否会发生。
现在将此处设为断点,并且如果进入则LED3亮起。
实验结果。
S1 s2 s3 s4 都不能进入系统消息处理。
Joystic向下按可以点亮LED3.猜测。
现在开发板,按键消息仅仅响应向下按键。
验证该想法。
在消息KEY_SW_4中测试.加入LED3点亮函数。
实验证明:硬件资源,只有joystic按下响应,而且响应的消息是SW_2.按键消息响应SW——2 。
joystic center.猜想二。
如果把硬件S1 s2的中断打开。
是否能够进入硬件消息响应队列呢?OK修改代码。
先去查资料,看看按键驱动程序。
现在为原有的程序加入。
按键初始化代码。
先测试S1.步骤:为S1 加入按键初始化代码。
下载程序测试。
开始实现:实验结果。
失败。
貌似我忘记初始化了,第一次实验。
重做。
结果失败。
证明以上思路错误。
删除代码。
查资料。
百度一下。
#define HAL_KEY_SW_6 0x20 // Button S1 if available#define HAL_KEY_SW_7 0x40 // Button S2 if available看看怎么能让s1.s2有效。
吃饭。
上课。
晚上再来。
走之前,测试新的板子能不能用S1 s2测试结果。
不能。
操蛋啊。
ZigBee实验记录。
刘佳毅编写2013年10月18日星期五今天的想法。
今天的想法是,用自己的函数把对新硬件的处理添加到任务队列中去。
具体的做法是。
新建一个reZig.h和reZig.c首先。
定义硬件初始化。
(对于s1 和 s2)然后定义硬件扫描函数,在任务队列添加即可。
不去干扰底层。
ZigBee组网小实验1
ZigBee组网小实验1(实验所用程序在SampleApp基础上修改)终端经路由器入网:首先把协调器和两个终端的天线拔掉,以大幅减小传输距离,把两个终端放到稍远或障碍物多的地方,使协调器数据传输不到终端。
测试,两个终端入不了网。
然后把路由器放到协调器和终端中间某一处。
启动协调器,启动路由器,最后再启动两终端,测试,两个终端入网成功,网络地址分别为0x1430和0x1431,路由器网络地址为0x0001,协调器串口广播发送数据,路由器和两个终端成功接收到。
最后,再把路由器关闭,数据发送不成功,并且两终端的灯已经一闪一闪,与网络断开了。
各串口依次为:协调器/路由器/其中一个终端(路由器执行两次扫描入网)左那只:路由器右边两只:终端协调器:天线拔掉终端未经路由器入网:节点保持原来位置,但把协调器和两个终端的天线重新安上,以增加传输距离。
启动协调器,启动路由器,最后再启动两终端,测试,两终端入网成功,网络地址分别为0x796F和0x79 70,路由器网络地址为0x0001,协调器串口广播发送数据,路由器和两个终端成功接收到。
把路由器关闭,协调器串口广播发送数据,两终端同样成功接收。
各串口依次为:协调器/路由器/其中一个终端(路由器执行两次扫描入网)用无线龙的网络监控软件来查看拓扑图,不过因为电脑上串口的原因,监控软件只有com1~com9,而我这小电脑上经常是com10+,因此调整下相应模块的节点类型,然后下载与其配套的<C51RF-WSN无线传感器网络演示程序>的SampleApp例子再次组网,以下拓扑图不代表上面两种网络。
协调器和绿色网络线连接的那个路由器都是无线龙的两块老板子,明显很扛的!~图1:两个终端经过路由器入网(把模块的天线拔了,信号强度明显下降,网络线呈红色)图2:两个终端未经路由器入网三块蜂舞的CC2430模块,其中有一块组网入网极其慢,至少都十五秒以上,而那三块电源板,供电不稳,接触不良,最纠结的是因电源板的问题导致2430模块会乱发数据,同样程序的模块放蜂舞那扩展底板上很稳定,一换电源板上就尽情抽风,初步测试了下应该是串口引脚问题,把程序应用层中串口数据处理注释掉,很稳定。
zigbee学习笔记
要试验的:1串口查看数据2用自己的温度传感器看3串口通信,该代码,发送自己想发的数据。
如果修改数据长度看路由代码。
修改路由代码弄串口这边原理。
两头拼。
要解决的问题:1温度采集代码2zigbee传输代码3串口传输数据代码4endpoint与任务的关系。
与按键串口服务关系。
已经解决的问题:1开发的流程2如何添加新任务3osal工作原理,任务调度机制。
难点:几个关键回调函数的理解关键点(总体规划):1、数据采集,这部分的关键是I-WIRE协议的理解。
传感器与51的通信问题。
自己必须先把这部分搞定,现在要解决这个问题,即在TI提供的协议栈的基础上开发自己的应用。
要弄懂温度,湿度,PH值传感器的工作原理,一般采用I-WIRE总线的协议。
2、将数据传输到协调器(控制节点),这部分关键是zigbee通信协议,要充分利用TI的Z-STACK 协议栈来进行二次开发。
主要关注数据的收发模块,数据的格式、特点。
3、数据从协调器传到PC,这部分关键是串口通信协议。
正确的将数据传到上位机。
4、PC控制显示界面,这部分关键是找到关键的API,然后取出自己想要的数据显示。
如果需要存储数据,要操纵数据库,选择数据库。
解决这几个问题这个项目就算完成了。
现在猜想:一、开发一个新的应用应该做什么呢?1获取模板标识符,簇标识符,设备标识符的相关信息,我要进一步了解这两个关键的概念。
2在1基础上我要能注册application,taskID,endpoint,以建立自己应用与操作系统交互。
这是一个关键的点。
二、必须弄懂传感器采集的原理,代码。
三、必须弄懂串口的原理,代码。
关键的概念1、PAN标识符,PAN ID2、模板标识符,profileID3、簇标识符,clusterID 8bit4、节点,ieee地址(扩展地址)网络地址(短地址)64bit/16bit5、端点,endpoint 8bit6、设备标识符,Device Description 16bit7、应用任务ID,taskID8、属性Attribute 16bit9、Taskevents envents 16bit申请到模板标识符后,可以为模板定义设备描述符、簇标识符、服务类型(KVP或MSG)属性(Attribute)。
Zigbee实验1 CC2530 IO控制实验
Zigbee 实验一CC2530 I/O控制实验1.1.1 实验目的通过LED基本实验熟悉软件的使用;在CC2530模块以及节点底板上运行自己的程序。
1.1.2 实验设备硬件:CC2530模块,节点底板,CC2530 仿真器,PC 机;软件:Windows 7/Windows XP,IAR 集成开发环境。
1.1.3 实验内容通过CC2530 的I/O 引脚,输出高低电平来控制LED1 及LED2 的亮与灭。
1.1.4 实验原理CC2530 的I/O 控制口一共有21 个,分成3 组,分别是P0、P1 和P2;由电路原理图可以看出LED1 所对应的I/O 口为P1_0,LED2 所对应的I/O 口为P1_1。
如图为LED 灯的驱动电路,本实验选择P1_0 和P1_1 I/O 引脚,P1_0 与P1_1 分别控制LED1和LED2,因此,在软件上只要配置好P1_0 口及P1_1 口。
图1.1.1 LED驱动电路图下面我们来看一下本次实验所用到的控制寄存器中每一位的取值所对应的意义:1.1.5 实验步骤1)安装光盘提供的IAR后,打开IAR,创建新工程:点击File→New→Workspace。
2)创建一个新项目:点击Project→Create New Project。
如图,点击OK。
3)保存项目(保存在新建的名为“LED”的文件夹下,工程命名为“LED”)。
创建一个源文件:点击File->New->File,写入以下代码:#include <iocc2530.h>#define LED0 P1_0#define LED1 P1_1void GPIO_init(){P1SEL = P1SEL & ~0x03;P1DIR = P1DIR | 0x03;LED0 = 0;LED1 = 0;}void DelayMs(unsigned int msec)//大约1ms延时{for(unsigned int x = msec;x > 0;x --){for(unsigned int y = 620;y > 0;y --){asm("NOP");}}}void main(void){GPIO_init();while(1){DelayMs(500);LED0 = 1;DelayMs(500);LED0 = 0;DelayMs(500);LED1 = 1;DelayMs(500);LED1 = 0;}}保存文件,点击File->Save(或者按Ctrl+s保存)将源文件保存到source文件夹(如没有则新建)如下图,点击保存。
无线传感网——zigbee基础实验-按键控制灯光开关
{
if(SW1 == 0)
//发现有SW1按键信号
{
Delay(100);
//延时片刻,去抖动处理
if(SW1 == 0)
//确认为SW1按键信号
{
while(SW1 == 0); //等待按键松开
D3 = ~D3;
//切换D3灯的开关状态
}
}
if(SW2 == 0) {
Delay(100); if(SW2 == 0) { while(SW2 == 0); D4 = ~D4; } } } /*=========================主函数============================*/ void main() { Init_Port(); //端口初始化 while(1 }
P1SEL &= ~0x04; P1DIR &= ~0x04; P1INP &= ~0x04; P2INP &= ~0x40;
//P1_2作为通用I/O端口 //P1_2端口输入 //P1_2设置为上拉/下拉模式 //P1_2设置为上拉
P0SEL &= ~0x02; P0DIR &= ~0x02; P0INP &= ~0x02; P2INP &= ~0x20;
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
无线传感网 ——zigbee基础实验 -按键控制灯光开关
#include "ioCC2530.h" #define D3 P1_0 #define D4 P1_1 #define D5 P1_3 #define D6 P1_4 #define SW1 P1_2 #define SW2 P0_1 /*=======================简单的延时函数========================*/ void Delay(unsigned int t) {
ZIGBEE实验
JIANGSU TEACHERS UNIVERSITY OF TECHNOLOGY 通信新技术综合训练报目录实验一 Jennic-WSN开发环境 (1)实验二 GPIO及LCD使用实验 (4)实验三简单点对点无线通信实验 (9)实验四两个EndDevice之间的无线通信实验 (15)实验五 DIO中断实验 (23)实验六定时器实验 (27)实验七 UART实验 (31)实验八 ADC及数据采集实验 (36)实验九休眠和掉电保护实验 (43)心得体会 (51)附录 (51)实验一 Jennic-WSN开发环境一、实验内容1. 熟悉基于JN5139芯片所设计的WSN开发板及其部件。
2. 软件的安装于调试。
3.熟悉常用API接口函数。
二、实验原理1. 基于JN5139芯片所设计的WSN开发板,其部件如下:U1: JN5139系列Zigbee模块;U2: 板载光照度传感器;U3: 板载温湿度一体传感器;J3: 外供电(5VDC)接口;Swith: 供电开关;J7: 编程与运行状态选择,左跳并给传感器板加电,则进入可编程状态,或者在加电的情况下,按住RESET按钮,左跳J7,然后放开RESET按钮,再右跳J7,也可进入可编程状态,退出可编程状态,只需要按一下RESET按钮即可;J8: Flash写保护跳选,编程与运行都跳选到RUN(右跳);DB9: RS232编程接口;UART0: 串口0;JP6: 模块所有管脚的引出排线(引脚编号如图1-4所示,功能如表1-1所示);LCD: 液晶接口;Power: 电源指示灯;REST: 复位按键;LED3,LED2,LED1,LED0:可编程LED,分别对应DIO19、DIO18、DIO17、DIO16;SW3,SW2,SW1,SW0:可编程按键,分别对应DIO20、DIO11、DIO10、DIO9;GND: 地。
2. 软件的安装与调试(1)建立开发环境在光盘中找到software文件夹下的JN-SW-4031-SDK-Toolchain-v1.1.exe文件(或者在Jennic公司网站上获得该文件)并运行。
Zigbee实验报告
一、Zigbee简介1.1 什么是ZigBeeZigBee是基于IEEE802.15.4标准的低功耗局域网协议。
ZigBee技术是一种短距离、低功耗的无线通信技术。
其特点是近距离、低复杂度、自组织、低功耗、低数据速率。
主要适合用于自动控制和远程控制领域,可以嵌入各种设备。
简而言之,ZigBee就是一种便宜的,低功耗的近距离无线组网通讯技术。
ZigBee是一种低速短距离传输的无线网络协议。
1.2Zigbee协议栈ZigBee协议从下到上分别为物理层(PHY)、媒体访问控制层(MAC)、传输层(TL)、网络层(NWK)、应用层(APL)等。
其中物理层和媒体访问控制层遵循IEEE 802.15.4标准的规定。
1.3 Zigbee技术优势•数据传输速率低:10KB/秒~250KB /秒,专注于低传输应用•功耗低:在低功耗待机模式下,两节普通5号电池可使用6~24个月•成本低:ZigBee数据传输速率低,协议简单,所以大大降低了成本•网络容量大:网络可容纳65,000个设备•时延短:典型搜索设备时延为30ms,休眠激活时延为15ms,活动设备信道接入时延为15ms。
•网络的自组织、自愈能力强,通信可靠•数据安全:ZigBee提供了数据完整性检查和鉴权功能,采用AES-128加密算法(美国新加密算法,是目前最好的文本加密算法之一),各个应用可灵活确定其安全属性•工作频段灵活:使用频段为2.4GHz、868MHz(欧洲)和915MHz(美国),均为免执照(免费)的频段1.4 Zigbee应用条件•低功耗;•低成本;•较低的报文吞吐率;•需要支持大型网络接点的数量级;•对通信服务质量QoS要求不高(甚至无QoS);•需要可选择的安全等级(采用AES-128),•需要多方面的较复杂的网络拓扑结构应用;•要求高的网络自组织、自恢复能力。
二、CC2530实验及实验修改2.1 基础实验(1)实验要求:按键触发中断,DS18B20测外部温度,数据以一定格式传输到串口显示(2)程序代码:#include <stdio.h>#include"iocc2530.h"#include"ds18b20.h"#define uint unsigned int#define uchar unsigned char#define KEY1 P0_1 //定义按键为P01口控制//变量uchar Keyvalue=0; //定义变量记录按键动作uint KeyTouchtimes=0; //定义变量记录按键次数//函数声明void Delay(uint); //延时函数声明void Initial(void); //初始化函数声明void InitKey(void); //初始化按键函数声明uchar KeyScan(void); //按键扫描函数声明//字符串【DS18B20采集到的温度是:XXXXXXX】chardata[23]={0x44,0x53,0x31,0x38,0x42,0x32,0x30,0xB2,0xC9,0xBC,0xAF,0xB5,0xBD,0xB5,0xC4, 0xCE,0xC2,0xB6,0xC8,0xCA,0xC7,0xA3,0xBA};unsigned char temp; //定义温度缓冲//延时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++);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++);for(i=0;i<n;i++);for(i=0;i<n;i++);}//时钟初始化void InitialCLK() //系统初始化{CLKCONCMD = 0x80; //系统选择32M振荡器while(CLKCONSTA&0x40); //这里等待晶振稳定}//初始化按键为中断输入方式void InitKeyINT(void){P0INP |= 0x02; //上拉P0IEN |= 0X02; //P01设置为中断方式PICTL |= 0X01; //下降沿触发EA = 1; //使能总中断IEN1 |= 0X20; // P0设置为中断方式;P0IFG |= 0x00; //初始化中断标志位}//串口初始化设置void UartInitial(void){PERCFG = 0x00; //位置1 P0口P0SEL = 0x0c; //P0用作串口P2DIR &= ~0xc0; //P0优先作为UART0U0CSR |= 0x80; //串口设置为UART方式U0GCR |= 11;U0BAUD |= 216; //波特率设为115200U0CSR |= 0x40;UTX0IF = 0;}//串口输出字符void UartPutChar(unsigned char DataChar){U0DBUF = DataChar; //发送字符while(UTX0IF == 0); //等待发送完成UTX0IF = 0;}//串口发送字符串函数void UartPutString(char *Data,int len){int j;for(j=0;j<len;j++){U0DBUF = *Data++;//发送字符串while(UTX0IF == 0);UTX0IF = 0;}}//外部中断程序#pragma vector = P0INT_VECTOR__interrupt void P0_ISR(void){temp=ReadDs18B20(); //温度检测UartPutString(data,23); //串口输出字符串if(temp/10>0) //判断是否数据只有1位UartPutChar(temp/10+48); //十位UartPutChar(temp%10+48); //个位UartPutChar('\n'); //换行P0IFG = 0; //清中断标志P0IF = 0; //清中断标志}//主函数void main(){InitialCLK(); //初始化系统时钟UartInitial(); //串口初始化InitKeyINT(); //按键初始化P0SEL &= 0xbf; //DS18B20的io口初始化while(1){}}(3)实验效果:按键一下,串口传出一次“DS18B20采集到的温度是:xx”显示在串口调试助手软件显示屏上2.2 实验修改(1)实验要求:按键触发中断改成按键检测程序代码:#include <stdio.h>#include"iocc2530.h"#include"ds18b20.h"#define uint unsigned int#define uchar unsigned char#define KEY1 P0_1 //定义按键为P01口控制//变量uchar Keyvalue=0; //定义变量记录按键动作int Keytouchtimes=0;//定义变量记录按键次数//函数声明void Delay(uint); //延时函数声明void Initial(void); //初始化函数声明void InitKey(void); //初始化按键函数声明uchar KeyScan(void); //按键扫描函数声明//字符串【DS18B20采集到的温度是:XXXXXXX】chardata[23]={0x44,0x53,0x31,0x38,0x42,0x32,0x30,0xB2,0xC9,0xBC,0xAF,0xB5,0xBD,0xB5,0xC4,0xCE ,0xC2,0xB6,0xC8,0xCA,0xC7,0xA3,0xBA};unsigned char temp; //定义温度缓冲//延时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++);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++);for(i=0;i<n;i++);for(i=0;i<n;i++);}//时钟初始化void InitialCLK() //系统初始化{CLKCONCMD = 0x80; //系统选择32M振荡器while(CLKCONSTA&0x40); //这里等待晶振稳定}//按键初始化函数void InitKey(){P0SEL &= ~0X2; //设置P04为普通IO口P0DIR &= ~0X2; //按键在P04 口,设置为输入模式P0INP &= ~0x2; //打开P04上拉电阻,不影响}//串口初始化设置void UartInitial(void){PERCFG = 0x00; //位置1 P0口P0SEL = 0x0c; //P0用作串口P2DIR &= ~0xc0; //P0优先作为UART0U0CSR |= 0x80; //串口设置为UART方式U0GCR |= 11;U0BAUD |= 216; //波特率设为115200U0CSR |= 0x40;UTX0IF = 0;}//串口输出字符void UartPutChar(unsigned char DataChar){U0DBUF = DataChar; //发送字符while(UTX0IF == 0); //等待发送完成UTX0IF = 0;}//串口发送字符串函数void UartPutString(char *Data,int len){int j;for(j=0;j<len;j++){U0DBUF = *Data++;//发送字符串while(UTX0IF == 0);UTX0IF = 0;}}//按键检测函数uchar KeyScan(void){if(KEY1==0) //判断按键是否按下{Delayms(10); //延时很短一段时间if(KEY1==0) //再次判断按键情况{while(!KEY1); //松手检测return 1; //有按键按下}}return 0; //无按键按下}//主函数void main(){InitialCLK(); //初始化系统时钟UartInitial(); //串口初始化InitKeyINT(); //按键初始化P0SEL &= 0xbf; //DS18B20的io口初始化while(1){Keyvalue = KeyScan(); //读取按键动作if(Keyvalue==1){temp=ReadDs18B20(); //温度检测UartPutString(data,23); //串口输出字符串if(temp/10>0) //判断是否数据只有1位UartPutChar(temp/10+48); //十位UartPutChar(temp%10+48); //个位UartPutChar('\n'); //换行}Delay(100); //延时}}实验效果:按键一下,串口传出一次“DS18B20采集到的温度是:xx”显示在串口调试助手软件显示屏上(2)实验要求:去掉松手检测,观察效果程序代码:#include <stdio.h>#include"iocc2530.h"#include"ds18b20.h"#define uint unsigned int#define uchar unsigned char#define KEY1 P0_1 //定义按键为P01口控制//变量uchar Keyvalue=0; //定义变量记录按键动作int Keytouchtimes=0;//定义变量记录按键次数//函数声明void Delay(uint); //延时函数声明void Initial(void); //初始化函数声明void InitKey(void); //初始化按键函数声明uchar KeyScan(void); //按键扫描函数声明//字符串【DS18B20采集到的温度是:XXXXXXX】chardata[23]={0x44,0x53,0x31,0x38,0x42,0x32,0x30,0xB2,0xC9,0xBC,0xAF,0xB5,0xBD,0xB5,0xC4, 0xCE,0xC2,0xB6,0xC8,0xCA,0xC7,0xA3,0xBA};unsigned char temp; //定义温度缓冲//延时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++);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++);for(i=0;i<n;i++);for(i=0;i<n;i++);}//时钟初始化void InitialCLK() //系统初始化{CLKCONCMD = 0x80; //系统选择32M振荡器while(CLKCONSTA&0x40); //这里等待晶振稳定}//按键初始化函数void InitKey(){P0SEL &= ~0X2; //设置P04为普通IO口P0DIR &= ~0X2; //按键在P04 口,设置为输入模式P0INP &= ~0x2; //打开P04上拉电阻,不影响}//串口初始化设置void UartInitial(void){PERCFG = 0x00; //位置1 P0口P0SEL = 0x0c; //P0用作串口P2DIR &= ~0xc0; //P0优先作为UART0U0CSR |= 0x80; //串口设置为UART方式U0GCR |= 11;U0BAUD |= 216; //波特率设为115200U0CSR |= 0x40;UTX0IF = 0;}//串口输出字符void UartPutChar(unsigned char DataChar){U0DBUF = DataChar; //发送字符while(UTX0IF == 0); //等待发送完成UTX0IF = 0;}//串口发送字符串函数void UartPutString(char *Data,int len){int j;for(j=0;j<len;j++){U0DBUF = *Data++;//发送字符串while(UTX0IF == 0);UTX0IF = 0;}}//按键检测函数uchar KeyScan(void){if(KEY1 == 1) //高电平有效{Delay(100); //检测到按键if(KEY1 == 1){return(1);}}return(0);}//主函数void main(){InitialCLK(); //初始化系统时钟UartInitial(); //串口初始化InitKeyINT(); //按键初始化P0SEL &= 0xbf; //DS18B20的io口初始化while(1){Keyvalue = KeyScan(); //读取按键动作if(Keyvalue==1){temp=ReadDs18B20(); //温度检测UartPutString(data,23); //串口输出字符串if(temp/10>0) //判断是否数据只有1位UartPutChar(temp/10+48); //十位UartPutChar(temp%10+48); //个位UartPutChar('\n'); //换行}Delay(100); //延时}}实验效果:按键按下时,不断循环换行显示“DS18B20采集到的温度是:xx”,显示速度很快。
Zigbee基础实验-简单通信编程
Zigbee基础实验-简单通信编程Zigbee基础实验(6)—简单通信编程简单通信编程实验中两节点分别充当开关和电灯,通过在开关节点上的操作来控制电灯节点。
源代码:#include <hal_lcd.h>#include <hal_led.h>#include <hal_joystick.h>#include <hal_assert.h>#include <hal_board.h>#include <hal_int.h>#include "hal_mcu.h"#include "hal_button.h"#include "hal_rf.h"#include "util_lcd.h"#include "basic_rf.h"#define RF_CHANNEL 25 // 信道选择。
// 定义各个参数的值#define PAN_ID 0x2007 //网络ID#define SWITCH_ADDR 0x2520 //开关节点的地址#define LIGHT_ADDR 0xBEEF //电灯节点的地址#define APP_PAYLOAD_LENGTH 1 //负载字节的长度,信息的长度。
#define LIGHT_TOGGLE_CMD 0 //被传送的开关命令。
//节点状态。
0为空闲#define IDLE 0#define SEND_CMD 1// 定义该节点所承担的任务(开关或电灯)#define NONE 0#define SWITCH 1#define LIGHT 2#define APP_MODES 2static uint8 pTxData[APP_PAYLOAD_LENGTH]; //发送数组static uint8 pRxData[APP_PAYLOAD_LENGTH]; //接收数组static basicRfCfg_t basicRfConfig;// 模式选择菜单static menuItem_t pMenuItems[] ={"Switch", SWITCH,"Light", LIGHT};static menu_t pMenu ={pMenuItems,N_ITEMS(pMenuItems)};static void appLight(); //实现电灯功能static void appSwitch(); //实现远程开关功能static uint8 appSelectMode(void); //功能选择static void appLight() //实现电灯功能{halLcdWriteLine(HAL_LCD_LINE_1, "Light");halLcdWriteLine(HAL_LCD_LINE_2, "Ready");// 初始化射频模块basicRfConfig.myAddr = LIGHT_ADDR; //网络地址if(basicRfInit(&basicRfConfig)==FAILED) {HAL_ASSERT(FALSE); //初始化错误处理}basicRfReceiveOn(); //打开接收功能。
「ZigBee模块」基础实验(1)点亮LED
Pቤተ መጻሕፍቲ ባይዱSEL
地址
0xF3
0xF4
0xF5
PX[7:0]功能设置寄存器,默认普通IO口 (0:普通 IO 口 1:第二功能)(P2SEL比较特 殊,后面再提...)
PXDIR
P0DIR
P1DIR
P2DIR
地址
0xFD
0xFE
0xFF
PX[7:0] 输入输出设置寄存器 (0:输入 1:输出) (P2[4:0]是这样的...其余后面再说...)
15 P1DIR |= 0x03; 16 P1INP &= ~0x03; 17 18 LED1 = 1; 19 LED2 = 0; 20 } 21 22 void delayms(uint ms) 23 { 24 uint i,j; 25 for(i=ms; i>0; i--) 26 for(j=587; j>0; j--); 27 } 28 29 void main() 30 { 31 ledInit(); 32 while(1) 33 { 34 delayms(1000); 35 LED1 = !LED1; 36 LED2 = !LED2; 37 } 38 }
这个算法验证正确吗移植到k60里不对可不可能是发的程序有问题呢
「 ZigBee模块」基础实验( 1)点亮 LED
1.IO配置 CC2530 的 IO 口配置需要三个寄存器:PXSEL、PXDIR、PXINP 。
IO口寄存器 地址
P0 0x80
P1 0x90
P2 0xA0
PXSEL
P0SEL
P1SEL
5.完整代码
1 #include <ioCC2530.h> 2 3 #define LED1 P1_0 4 #define LED2 P1_1 5 6 #define uchar unsigned char 7 #define uint unsigned int 8 9 void ledInit(); 10 void delayms(uint ms); 11 12 void ledInit() 13 { 14 P1SEL &= ~0x03;
ZigBee学习笔记一端口号命令簇
主要解决的问题如何使用不同的命令号发送不同长度的的数据第一部分一些概念如图所示是一个节点设备上的端口号(endpoint)它是一个8位的字段,描述一个射频端所支持的不同应用。
端口0x00:用于寻址设备配置文件,这是每个ZigBee设备必须使用的端口;端点0xff:用于寻址所有活动端口;端口0xf1~0xfe:保留;端口0x01~0xf0:共支持240个应用,即一个物理信道最多支持240个虚拟链路。
图中还用另一个概念簇簇(cluster)多个属性的汇集形成了簇,簇是属性的集合,每个簇也拥有一个唯一的ID。
譬如,FS_ZStack\SimpleSwitch.cconst cId_t zb_OutCmdList[NUM_OUT_CMD_SWITCH]= //输出簇列表{TOGGLE_LIGHT_CMD_ID //簇ID, 1};FS_Zstack\SimpleController.cconst cId_tzb_InCmdList[NUM_IN_CMD_CONTROLLER] = //输入簇列表{TOGGLE_LIGHT_CMD_ID //簇ID, 1};cId_t=uint16,端口的描述第一步,定义一个结构体用来描述端口endPointDesc_t GenericApp_epDesc; //结构体类型变量第二步初始化端口参数要完整的描述一个端口,分为两部分(1)endPointDesc_t端口描述(2)简单端口描述SimpleDescriptionFormat_t其实2是包含在1里面的只是由于2比较多就单独列出来了。
下面是2的具体内容探明数据包内容1发送出去的数据是什么样子的第一步数据发送使用的是协议栈的发送函数内容包括了,目的地址目的节点上的那个端口簇里面的命令号要发送的数据长度要发送的数据地址发送的数据序列号第二步数据被接收后被解析成什么样子可以通过一个结构体看明白数据被接受过来以后到底是什么样子事件头很重要,它用来判断消息类型簇里面的命令号存储端口号链路质量数据具体位置很重要上面说到的两个很重要的成员在应用层程序里都有体现本想用两个命令号来区分不同的消息,但是好像不行!未完待续!第二部分消息队列从上面的讲解中我们了解了发送的无线数据、接收到的无线数据的样子。
zigbee基础知识笔记(注释)
1.基础知识 (1)1.1IEEE地址 (1)1.2簇 (2)1.3 Profile ID (3)1.4 网络地址与端点号、节点 (3)1.5 PANID (3)1.6 zigbee设备 (3)2.绑定机制 (5)2.1描述符绑定 (6)2.2设备绑定 (18)1.基础知识1.1IEEE地址IEEE地址是64位,在设备进入网络之前就分配好了的,应该在全球是唯一的,而网络地址是在网络建立后,设备加入网络时,它的父节点给它分配的,在设备通信时,首先由ieee地址找到设备的网络地址,然后根据网络地址实现设备之间的通信,这样可以减少帧头长度,多传有效数据通俗的说IEEE地址相当于你的手机号(11位的那个),短地址就相当于你们公司的小号(3、4)位,一个公司的互打电话就用小号噻。
假设你的手机号138xxxxx666,这个是唯一的,但你的小号,假设是666,在你的公司网中是唯一的,但是在另一个网中,可能别人的小号也是666。
1.2簇簇就是相当于端点房间里面的人,是接收最终的目标。
这东西是2个字节编号,在射频发送的时候,必须要指定接收模块的镞,发送模块不需要指定。
首先每一个端点可以看成是一个1个字节数字编号的开有一扇门的房间,数据最终的目标是进入到无线数据包指定的目标端点房间,而取无线数据这个相关的代码在任务事件处理函数里,TI协议栈有那么多的任务事件处理函数,所以必须要指定在哪个任务事件处理函数来取这个无线数据包里面的有用数据。
端点就相当于一个房间的门牌号!!!SimonApp_epDesc.endPoint = 10;//SimonApp_ENDPOINT; 此端点编号为10 SimonApp_epDesc.task_id = &SimonApp_TaskID; 和我们应用层任务挂钩完成了簇信息表的构建,因为簇信息封装在SimonApp_SimpleDesc里面,这里面却只是起到一个信息表的作用!方便数据到来的时候查询相关信息表!const cId_t SimonApp_ClusterList[SimonApp_MAX_CLUSTERS] ={SimonApp_CLUSTERID};const SimpleDescriptionFormat_t SimonApp_SimpleDesc ={SimonApp_ENDPOINT, // int Endpoint;SimonApp_PROFID, // uint16 AppProfId[2];SimonApp_DEVICEID, // uint16 AppDeviceId[2];SimonApp_DEVICE_VERSION, // int AppDevVer:4;SimonApp_FLAGS, // int AppFlags:4;SimonApp_MAX_CLUSTERS, // byte AppNumInClusters;(cId_t *)SimonApp_ClusterList, // byte *pAppInClusterList;SimonApp_MAX_CLUSTERS, // byte AppNumInClusters;(cId_t *)SimonApp_ClusterList // byte *pAppInClusterList;};接收到数据以后,判断是属于哪一个端点、属于哪一个簇1.3 Profile ID这个是由Zigbee组织来分配的应用ID号,比如无线开关用0x0001,智能电表用ox0002,万用遥控器用0x0003等等。