-
1 知识介绍
-
2 PPT
-
3 学习视频
-
4 讨论
-
5 大国重器
案例介绍
通过对仓储环境监测系统进行分解,得到需要完成的四个子任务:
(1) 采用温湿度传感器模块和通信模块组成数字量采集节点A
(2) 火焰传感器模块和通信模块组成开关量采集节点B
(3) A、B两个节点实时采集传感器的数据
(4) 每隔2s将采集的传感器数据通过无线网络传给汇聚节点模块
本次课程主要实现第一个子任务采用温湿度传感器模块和通信模块组成数字量采集节点A。
案例分析
通过对案例的任务进行分析,得到需要实现的具体关键点如

采用温湿度传感器模块和 ZigBee 模块组成一个数字量传感器采集节点,实现温湿度传感器的采集,并将采集数据通过自定义协议无线传输至汇聚节点。发送节点有数据发送时,LED1 亮 100 毫秒。
知识储备
在本章节当中,我们将使用到zigbee模块,该模块使用CC2530作为主控MCU。CC2530是面向2.4G通信的一种Soc,是一种专用的单片机,它采用的是8051内核,拥有8KB的SRAM、大容量内置闪存。CC2530芯片后缀代表内置闪存的大小,如:CC2530F32/F64/F128/F256分别表示32K/64K/128K/256K的闪存;CC2530 具有不同的运行模式,使得它尤其适应超低功耗要求的系统。运行模式之间的转换时间短,进一步确保了低能源消耗。
一、CC2530的I/O引脚
CC2530总共具有 21 个数字 I/O 引脚,这些引脚可以组成 3 个 8 位端口,分别为端口 0、 端口 1 和端口 2,通常表示为 P0、P1 和 P2。其中,P0 和 P1 是完全的 8 位端口,而 P2 仅有 5 位可以使用。
(一) CC2530的I/O引脚配置
21 个 I/O 引脚具有

1. 可配置为通用 I/O 端口
通用 I/O 端口是指可以对外输出逻辑值 0(低电平)或 1(高电平),也可读取从 I/O 引脚输入的逻辑值(低电平为 0,高电平为 1)。可以通过编程来将 I/O 端口设置成输出方式或输入方式。
2. 可配置为外部设备 I/O端口
CC2530 内部除了含有 8051CPU 核心外,还具有其他功能模块,如 ADC、定时器和串行通信模块,也称这些功能模块为外设。可通过编程将 I/O 口与这些外设建立起连接关系,以便这些外设与 CC2530 芯片外界电路进行信息交换。需要注意的是,不能随意指定某个 I/O 口连接 到某个外设,它们之间有一定的对应关系,具体知识将在后续任务中学习。
二、CC2530输入口的3种输入模式
当 CC2530 的 I/O 口被配置成通用输入端口时,端口的输入模式有上拉、下拉和三态三种选择,可通过编程进行选择,能够适应多种不同的输入应用,如

三、I/O口的外部中断能力
当使用外部中断时,I/O 口引脚可以作为外部中断源的输入口,这使得电路设计变得更加灵活,如

(一) CC2530的I/O引脚相关寄存器
1. I/O端口的相关寄存器介绍
在单片机内部有一些具有特殊功能的存储单元,这些存储单元用来存放控制单片机内部器件的命令、数据或是运行过程中的一些状态信息。这些寄存器统称“特殊功能寄存器 (SFR)”,操作单片机本质上就是对这些特殊功能寄存器进行读写操作,如

2. 通用数字I/O端口的寄存器及其配置方法
P0 (0x80) – Port 0 | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:0 | P0[7:0] | 0xFF | R/W | 可用作GPIO或外设I/O,8位,可位寻址 |
P1 (0x90) – Port 1 | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:0 | P1[7:0] | 0xFF | R/W | 可用作GPIO或外设I/O,8位,可位寻址 |
P2 (0xA0) – Port 2 | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:5 | – | 000 | R0 | 高3位(P2_7—P2_5)没有使用 |
4:0 | P2[4:0] | 0x1F | R/W | 可用作GPIO或外设I/O,低5位(P2_4—P2_0),可位寻址 |
P0SEL (0xF3) – P0端口功能选择(Port 0 Function Select) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:0 | SELP0_[7:0] | 0x00 | R/W | P0.7—P0.0功能选择位:0 为GPIO,1为外设I/O |
P1SEL (0xF4) –P1端口功能选择(Port 1-Function Select) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:0 | SELP1_[7:0] | 0x00 | R/W | P1.7—P1.0功能选择位:0 为GPIO,1为外设I/O |
P2SEL (0xF5) –P2端口功能选择和P1端口外设优先级控制 (Port 2 Function Select and Port 1 peripheral priority control) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7 | – | 0 | R0 | 没有使用 |
6 | PRI3P1 | 0 | R/W | P1端口外设优先级控制位。当PERCFG同时分配USART0和USART1用到同一引脚时,该位决定其优先级顺序。0为USART0优先;1为USART1优先 |
5 | PRI2P1 | 0 | R/W | P1端口外设优先级控制位。当PERCFG同时分配USART1和Timer3用到同一引脚时,该位决定其优先级顺序。0为USART1优先;1为Timer3优先 |
4 | PRI1P1 | 0 | R/W | P1端口外设优先级控制位。当PERCFG同时分配Timer1和Timer4用到同一引脚时,该位决定其优先级顺序。0为Timer1优先;1为Timer4优先 |
3 | PRI0P1 | 0 | R/W | P1端口外设优先级控制位。当PERCFG同时分配USART0和Timer1用到同一引脚时,该位决定其优先级顺序。0为USART0优先;1为Timer1优先 |
2 | SELP2_4 | 0 | R/W | P2.4功能选择位:0 为GPIO,1为外设I/O |
1 | SELP2_3 | 0 | R/W | P2.3功能选择位:0 为GPIO,1为外设I/O |
0 | SELP2_0 | 0 | R/W | P2.0功能选择位:0 为GPIO,1为外设I/O |
P0DIR (0xFD) – P0端口方向(Port 0 Direction) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:0 | DIRP0_[7:0] | 0x00 | R/W | P0.7—P0.0方向选择位:0 为输入,1为输出 |
P1DIR (0xFE) –P1端口方向(Port 1 Direction) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:0 | DIRP1_[7:0] | 0x00 | R/W | P1.7—P1.0方向选择位:0 为输入,1为输出 |
P2DIR (0xFF) –P2端口方向和P0端口外设优先级控制 (Port 2 Direction and Port 0 peripheral priority control) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:6 | PRIP0[1:0] | 00 | R/W | P0端口外设优先级控制位。当PERCFG同时分配几个外设用到同一引脚时,该两位决定其优先级顺序。00为USART0高于USART101为USART1高于Timer110为Timer1通道0、1高于USART111为Timer1通道2高于USART0 |
5 | – | 0 | R0 | 没有使用 |
4:0 | DIRP2_[4:0] | 00000 | R/W | P2.4—P2.0方向选择位:0 为输入,1为输出 |
P0INP (0x8F) – P0端口输入模式(Port 0 Input Mode) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:0 | MDP0_[7:0] | 0x00 | R/W | P0.0—P0.7输入选择位:0 为上拉/下拉,1为三态 |
P1INP (0xF6) –P1端口输入模式(Port 1 Input Mode) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:2 | MDP1_[7:2] | 000000 | R/W | P1.7—P1.2输入选择位:0 为上拉/下拉,1为三态 |
1:0 | – | 00 | R0 | 没有使用 |
P2INP (0xF7) –P2端口输入模式(Port 2 Input Mode) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7 | PDUP2 | 0 | R/W | 对所有P2端口设置上拉/下拉输入:0 为上拉,1为下拉 |
6 | PDUP1 | 0 | R/W | 对所有P1端口设置上拉/下拉输入:0 为上拉,1为下拉 |
5 | PDUP0 | 0 | R/W | 对所有P0端口设置上拉/下拉输入:0 为上拉,1为下拉 |
4:0 | MDP2_[4:0] | 0 | 0000 | P2.4—P2.0输入选择位:0 为上拉/下拉,1为三态 |
四、CC2530的定时器相关知识介绍
(一)定时/计数器概述
定时/计数器是一种能够对时钟信号或外部输入信号进行计数,其工作流程如

定时/计数器的核心是一个计数器,其功能如

计数信号的来源可选择周期性的内部时钟信号(如定时功能)或非周期性的外界输 入信号(如计数功能)。如

(二)CC2530定时/计数器简介
CC2530 定时/计数器 CC2530 中共包含了 5 个定时/计数器,分别是定时器 1、定时器 2、定时器 3、定时器 4 和睡眠定时器,各自具ru有如下特点:
T1 为 16 位定时/计数器,其功能如

T3 和 T4 为 ru8 位定时/计数器,功能如

睡眠定时器是一个 24 位正计数定时器,功能如

(三)CC2530定时器/计数器工作模式
CC2530 的定时器 1、定时器 3 和定时器 4 虽然使用的计数器计数位数不同,但它们都具备“自由运行”、“模”和“正计数/倒计数”三种不同的工作模式。
1. 自由运行模式(Free—Running Mode)
在该模式下,如

2. 模模式(Module Mode)
在该模式下,如

3. 正计数/倒计数模式(Up/Down Mode)
在该模式下,如

(四) CC2530的T4定时器相关寄存器
定时器 T4 具有定时、输入采样、输出比较(PWM)三大功能,在这里主要介绍与定时相关的寄存器,具体描述如
T4CTL寄存器,是定时器4的控制寄存器,主要用于设置定时器的工作模式、溢出中断屏蔽、定时器的启动和分频器的划分等设置。
T4CTL (0xEB) –定时器 4 控制 | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7:5 | DIV [2:0] | 000 | R/W | 定时器时钟分频值。000:1分频。001:2分频。010:4分频。011:8分频。100:16分频。101:32分频。110:64分频。111:128分频。 |
TIMIF寄存器是定时器 1/3/4 中断屏蔽/标志寄存器,主要设置定时器溢出中断使能、定时器的通道和溢出中断标志设置。
4 | START | 0 | R/W | 启动定时器。0:定时器暂停运行。1:定时器正常运行。 |
3 | OVFIM | 1 | R/W0 | 计数器溢出中断屏蔽。0:中断禁止。1:中断使能。 |
2 | CLR | 0 | R0/W1 | 清除计数器,写1到CLR复位计数器到0x00,并初始化相关通道所有的输出引脚。 |
1:0 | MODE[1:0] | 00 | R/W | 定时器工作模式选择。00:自由运行模式。01:倒计数模式。10:模模式。11:正计数/倒计数模式。 |
TIMIF (0xD8)–定时器 1/3/4 中断屏蔽/标志(Timer 1/3/4 Interrupt Mask/Flag) | ||||
位 | 名称 | 复位 | 读/写 | 描述 |
7 | – | 0 | R0 | 没有使用 |
6 | OVFIM | 1 | R/W | 定时器1溢出中断使能(注:复位后,处于使能状态)0 中断禁止;1 中断使能 |
5 | T4CH1IF | 0 | R/W0 | 定时器4通道1中断标志。0 没有中断等待;1 中断正在等待 |
4 | T4CH0IF | 0 | R/W0 | 定时器4通道0中断标志0 没有中断等待;1 中断正在等待 |
4 | T4CH0IF | 0 | R/W0 | 定时器4通道0中断标志0 没有中断等待; 1 中断正在等待 |
3 | T4OVFIF | 0 | R/W0 | 定时器4溢出中断标志0 没有中断等待; 1 中断正在等待 |
2 | T3CH1IF | 0 | R/W0 | 定时器3通道1中断标志0 没有中断等待; 1 中断正在等待 |
1 | T3CH0IF | 0 | R/W0 | 定时器3通道0中断标志0 没有中断等待; 1 中断正在等待 |
0 | T3OVFIF | 0 | R/W0 | 定时器3溢出中断标志0 没有中断等待; 1 中断正在等待 |
任务实施
任务实施主要有4个步骤:打开工程、编写程序、建立与配置模块设备、编译和下载程序。
一、打开工程
工程打开的具体步骤在之前的任务中已经学习过了。代码的编写主要包括6个部分的内容。
二、编写程序
(1)打开sensor.c文件,在文件中增加需要使用到的头文件,具体内容如

(2)新增点对点通讯地址设置、定义消息格式宏定义、各个数组的大小及 LED 灯闪烁相关的宏定义,如


(3)定义变量和数组。定义 basicRfCfg_t 变量、无线接收和发送缓存数组、定时器超时标志的变量,如

(4)新增计算校验和函数 CheckSum,如

(5)关键函数编写。
① 定时器初始化函数,如

② 在 sensor.c 中定义 BasicRF 初始化函数,初始化函数如

(6)编写主函数
Main 函数是程序运行的起始位置,如



三、建立与配置模块设备步骤
代码编写完成以后,接下来建立与配置模块设备相关的操作。
该部分主要的内容是将 sensor.c 从 workspace 下的 app 组中移除,复制 Project 文件夹下的 sensor.c 为副本,并将这个副本重命名为 temprh_sensor.c,最后重新添加到 workspace 下的 app组中。
(1)选择菜单“Project“下的Edit Configurations”,弹出项目的配置对话框,系统会检测出项目中存在的模块设备,单击“New”按钮。如

(2)在弹出的New Configuration对话框中输入模块名称为:“temprh_sensor”,基于 Deubg 模块进行配置,然后单击“OK”按钮完成模块设备的建立。如

(3)为了给模块设备设置对应的条件编译参数,在此需要进行如下设置: 在项目工作组中选择“temprh_sensor”模块,单击右键选择“Options”,在弹出的对话框中选择“C/C++ Compile”类别,在右边的窗口中选择“Preprocessor”选项中的 “Definedsymbols:”中输入 “CC2530_DEBUG”。如

四、编译和下载程序
设备配置好以后,将插有温湿度传感器模块的 ZigBee 模块固定在 NEWLab 平台,在 Workspace 中选择 “temprh_sensor”模块,编译程序无误后,给 NEWLab 平台上电,下载程序到 ZigBee 模块中。 打开串口调试助手,设置波特率为 115200 后点击 “打开”,可以看到采集到的温湿度数据显示出来了。如

验证通过后,需要把条件编译选项中的“CC2530_DEBUG”去掉,变成 “xCC2530_DEBUG”。如


