* 導師視頻講解:[**去聽課**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=7)
>[success] **技術支持說明:**
>**1**.一般以自主學習為主
> **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/zigbee)
> **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解!
<br/>
接著上節課的內容,切換到LED工程,如圖所示。

<br/>
## **LED控制原理**
#### **計算機的邏輯層與電路層**
  在計算機邏輯層中,一般是使用二進制數字0或1來控制對象或表示對象的狀態。在計算機電路層中,一般是用高電平(3.3 v)來表示邏輯上的1,用低電平(0 v)來表示邏輯上的0。
###
#### **CPU的IO口**
  CPU的GPIO口,通常簡稱為IO口或引腳,可以理解為從CPU芯片里引出的一根導線,用于連接外部的設備。通俗地講,一個CPU會有多個IO口,每個IO口有兩種工作模式,分別是輸出信號模式和接收信號模式。
###
在輸出信號模式時,開發者可以通過代碼來控制這個IO口輸出的電平,這個電平狀態有高電平(3.3v)和低電平(0v)兩種。在輸入信號模式時,開發者可以通過代碼來檢測這個IO口是處于高電平還是低電平的狀態。
#### **LED的原理分析**
ZigBee開發板的LED原理圖如圖所示。

其中的D2表示LED,其右端接地(GND),因此右端的電壓為0v。LED的左端依次連接著R12和IO\_LED。IO\_LED是CC2530的一個IO口,能夠輸出高電平(3.3v)或低電平(0v)。R12是一個穩壓電阻,用于防止電路的電壓過大而燒壞LED。當IO\_LED輸出高電平時,LED左端電壓為3.3v,右端電壓為0v,左端和右端形成了3.3v的電壓差,因此LED被點亮;反之,當IO\_LED輸出低電平時,LED左端和右端電壓均為0v,因此LED被熄滅。
>[danger] 如您因缺少硬件原理相關知識導致未能看懂電路圖,需先補充相關知識。
<br/>
## **CC2530的引腳簡介**
CC2530 配備了40個IO口,如圖所示。

其中的P0\_0~P0\_7屬于P0端口,P1\_0~P1\_7屬于P1端口,P2\_0~P2\_5屬于P2端口,這些IO口都可以通過編程的方式使用,接下來將會結合示例來講解其使用方法。
<br/>
## **\* 查閱TI官方數據手冊**
我們可以在本課程配套資源中找到CC2530數據手冊,如圖所示。

* 下載地址:https://gitee.com/study-j/zigbee/tree/master/%E8%AF%BE%E5%A4%96%E8%B5%84%E6%96%99%E5%8F%82%E8%80%83/CC2530%E6%95%B0%E6%8D%AE%E6%89%8B%E5%86%8C
###
該數據手冊的目錄如下。

###
展開《I/O端口》章節,其目錄如下。

###
此數據手冊可以用作查閱工具書,供我們隨時查閱CC2530的各個細節,例如使用GPIO時就可以找到《I/O 端口》這一小節,使用定時器時就可以找到定時器章節。
<br/>
## **IO口的使用方法**
**相關寄存器簡介**
可以通過配置相關寄存器的方式來使用IO口,例如配置指定的IO口為輸出信號模式并控制其輸出高/低電平。CC2530中與IO口配置相關的寄存器如下。
* 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
<br/>
#### **使用P0_4 IO口**
在ZigBee開發板中,CC2530的 P0\_4與LED連接,因此可以通過CC2530的 P0\_4來控制LED的亮滅。可以對P0\_4相關的寄存器進行配置來控制P0\_4 的狀態和行為。P0_4相關的寄存器及相應說明見表4-。
###
| 寄存器 | 說明 |
| --- | --- |
| P0 | 8位寄存器,8個位分別與P0\_0~P0\_7一一對應,分別用于設置或讀取這8個IO口的電平狀態 |
| P0SEL | 8位寄存器,8個位分別與P0\_0~P0\_7一一對應,分別配置這8個IO口的功能。如果IO口對應的位為0,表示該IO口用于通用輸入/輸出;如果為1,表示用于特定的功能 |
| P0DIR | 8位寄存器,8個位分別與P0\_0~P0\_7一一對應,分別配置這8個IO口的通信方向。如果IO口對應的位為0,表示該IO口處于輸入信號模式;如果為1,表示處于輸出信號模式 |
<br/>
根據表格說明,可以按如下方式配置P0\_4的相關寄存器和控制其輸出電平,代碼如下:
```
//?把P0_4配置為通用輸出IO口
P0SEL &= ~(1<<4); // 把P0SEL寄存器的第4位設置為0,表示把P0_4配置為通用IO口
P0DIR |= (1<<4); // 把P0DIR寄存器的第4位設置為1,表示把P0_4配置為輸出信號模式
P0_4=0;//輸出低電平
P0_4=1;//輸出高電平
```
其中的P0_4是在頭文件ioCC2530.h中定義的,在配置好相關寄存器后,給其賦0或1即可控制其輸出電平狀態。這里簡單講解一下向左位移運算符<<、取反運算符~、按位與運算符&和按位或運算符|,以便加深讀者對代碼的理解。
(1)向左位移運算符 <<
把所有二進制數字向左移動指定的位數,高位的數字移出(舍棄),低位的空位補0。例如“1<<4”表示把0000 0001中的所有數字向左移動4位,并且高位的0移出舍棄,低位的空位補0,所以運算結果為0001 0000。
(2)取返運算符 ~
把所有二進制數字取反,例如對0001 0000進行取反運算后的結果為1110 1111。
(3)按位與運算符&
按位與運算規則是把兩邊的數轉換為二進值數,然后把兩個數的對應位逐位進行與運算,與運算的規則為1&1=1、1&0=0、0&1=0和0&0=0,例如1101 1101和1110 1111進行按位與運算后的結果為1100 1101。
(4)按位或運算符|
按位或運算規則是把兩邊的數轉換為二進值數,然后把兩個數的對應位逐位進行或運算,或運算的規則為1&1=1、1&0=1、0&1=1和0&0=0,例如1101 1101和0001 0000進行按位與運算后的結果為1101 1101。
<br/>
## **編寫LED控制代碼**
學習了相關原理后,可以編寫代碼來控制LED,示例代碼如下:
```
//51單片機入門/2.GPIO實驗/Workspace/code/led/led.c
#include "ioCC2530.h"
#include <stdio.h>
#include <stdint.h>
//P0_4由頭文件ioCC2530.h定義
#define LED P0_4
//定義LED的開關狀態和對應的值
#define LED_ON 1
#define LED_OFF 0
static void delayMs(uint16_t nMs);
static void initLed(void);
void main()
{
initLed();//初始化LED
while(1) {
printf("Set led to on!\r\n");
LED = LED_ON;//開啟LED
delayMs(500);//延時0.5s后才繼續往下執行程序
printf("Set led to off!\r\n");
LED = LED_OFF;//關閉LED
delayMs(500);//延時0.5s后才繼續往下執行程序
} /* while */
}
/**
* @fn delayMs
*
* @brief 讓程序延后指定的時間才接著運行
*
* @param nMs - 時間長度,以毫秒為單位,值范圍:165535
*
* @return none
*/
static void delayMs(uint16_t nMs)
{
uint16_t i,j;
for (i = 0; i < nMs; i++)
//經由實際測試可以得出執行535次循環耗時最接近1ms
for (j = 0; j < 535; j++);
}
/**
* @fn initLed
*
* @brief 初始化LED,完成P0_4相關寄存器的配置
*/
static void initLed()
{
P0SEL &= ~(1<<4);
P0DIR |= (1<<4);
}
```
  以上代碼實現了閃爍LED的功能。程序首先通過
initLed對寄存器P0SEL和P0DIR進行初始化,然后對LED值進行定時反轉,從而實現了閃爍LED的效果。
<br/>
## **仿真調試**
>[danger] 在學習本節課前,需要先掌握基本的程序下載及仿真操作,參考:[程序下載及仿真](2482302)
1. 把開發板通過仿真器連接到電腦上。
2. 按一下仿真器的復位按鍵。

###
3. 打開本實驗代碼,編譯鏈接通過后,點擊“下載仿真”按鈕,如圖所示。

###
4. 點擊Go按鈕,全速運行程序,可以觀察到LED閃爍的效果,并且Terminal I/O不斷輸出對應的狀態信息,如圖所示。

###
5. 點擊如圖所示按鈕可以停止運行程序。

<br/>
<br/>
## **商務合作**
如有以下需求,可掃碼添加管理員好友,注明“**商務合作**”
* 項目定制開發,技術范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等;
* 入駐平臺,成為講師;
* 接項目賺外快;
* 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/)

* 非合作**勿擾**,此處**非**技術支持
- 課程簡介
- 配套資源下載
- 配套開發套件簡介
- 簡介
- 技術參數
- 電路原理圖 & PCB圖——標準板
- 電路原理圖 & PCB圖——MiNi板
- CC2530F256 核心模組
- MCU簡介
- 模組尺寸 & 引腳定義
- 模組技術參數
- 電路原理圖 & PCB設計圖
- 封裝及生產指導
- 第一部分:準備
- 1.1 小白也能讀懂的 ZigBee 3.0 簡介
- 1.2 IAR EW for 8051 簡介與安裝
- 1.3 TI Z-Stack 3.0 簡介與安裝
- 1.4 SmartRF Flash Programmer 下載與安裝
- 1.5 串口助手簡介與安裝
- 1.6 SmartRF04EB 驅動程序
- 1.7 USB轉串口驅動程序
- 其他軟件安裝(非必須)
- 1.7.1 Xshell 7 簡介與安裝指南
- 1.7.2 PuTTY 簡介與安裝
- 第二部分:51單片機入門——基于CC2530
- 第1章:CC2530 開發基礎實驗
- 1.1 新建工作空間及工程
- 1.2 源代碼編寫及編譯
- 1.3 程序下載及仿真
- 1.4 固件燒錄
- 第2章:GPIO實驗
- 2.1 多工程管理基礎
- 2.2 GPIO輸出實驗——LED控制
- 2.3 GPIO輸入實驗——機械按鍵
- 2.4 GPIO輸入輸出通用配置實驗
- 2.5 GPIO外部中斷實驗
- 第3章:定時器實驗
- 3.1 工程概述
- 3.2 定時器T1實驗——查詢觸發
- 3.3 定時器T3實驗——中斷觸發
- 3.4 看門狗定時器實驗
- 3.5 低功耗定時器實驗
- 第4章:串口通信實驗
- 第5章:ADC實驗——使用光照傳感器
- 第6章:OLED 顯示器實驗
- 第7章:外設實驗
- 7.1 DHT11溫濕度傳感器
- 7.2 NorFLASH讀寫實驗
- 7.3 繼電器控制實驗
- 第三部分:Z-Stack 3.0 詳解
- 第1章:Z-Stack 3.0 架構詳解
- 1.1 Z-Stack 3.0.1 文件組織
- 2.2 Z-Stack 3.0.1 工程框架
- 第2章:操作系統的任務調度原理
- 第3章:OSAL 詳解
- 3.1 OSAL的任務調度原理
- 3.2 任務初池始化與事件處理
- 3.3 Z-Stack 事件的應用
- 3.4 使用動態內存
- 第4章:硬件適配層應用——LED
- 4.1 HAL的文件結構和工程結構
- 4.2 HAL的架構簡介
- 4.2 LED API簡介
- 4.3 LED 實驗
- 第5章:硬件適配層應用——按鍵
- 5.1 按鍵實驗
- 5.2 HAL 按鍵框架詳解(選修)
- 第6章:硬件適配層應用——串口
- 第7章:硬件適配層應用——顯示屏
- 第8章:硬件適配層應用——ADC
- 第四部分:ZigBee 3.0 網絡編程
- 第1章:ZigBee 3.0 網絡原理
- 1.1 協議層次結構
- 1.2 IEEE 802.15.4協議
- 1.3 網絡層
- 第2章:ZigBee 3.0 BDB
- 2.1 BDB 簡介
- 2.2 BDB Commissioning Modes
- 2.3 ZigBee 3.0 組網實驗
- 第3章:基于AF的數據通信
- 3.1 簡單描述符
- 3.2 通信原理
- 3.3 數據發送API簡介
- 3.4 ZigBee 3.0 通信實驗
- 第4章:ZCL 基本原理
- 4.1 ZCL 簡介
- 4.2 ZCL 內容詳解
- 第5章:基于ZCL的開關命令收發
- 5.1 應用層對 ZCL API 的調用
- 5.2 ZCL 開關命令收發 API
- 5.3 ZCL 開關命令收發實驗
- 第6章:基于ZCL的屬性讀寫
- 6.1 ZCL 屬性讀寫 API
- 6.2 ZCL 屬性讀寫實驗
- 第7章:基于ZCL的屬性上報實驗
- 7.1 概述
- 7.2 終端設備開發
- 7.3 協調器設備開發
- 7.4 仿真調試
- 課外篇:項目實戰
- ZigBee 3.0 環境信息采集
- 基于ZigBee的農業環境信息采集
- 基于ZigBee的文件傳輸系統
- 基于ZigBee的光照自動開關窗簾
- 基于ZigBee的溫濕度 & 光照強度采集系統
- 其他項目
- 基于ZigBee的溫度和有害氣體短信報警系統
- 基于ZigBee的多傳感器探測與亮燈報警系統
- 基于ZigBee的溫濕度、人體紅外與聲光報警系統
- ZigBee 3.0 多節點組網實戰
- 基于ZigBee的溫濕度 & 信號強度探測系統
- 課外篇:進階選修
- 《課外篇:進階選修》的說明
- 第1章:串口通信協議設計
- 1.1 設計基礎
- 1.2 協議格式
- 第2章:優化協調器工程結構
- 2.1 工程結構
- 2.2 應用框架詳解
- 2.2.1 框架說明
- 2.2.2 zbmsg
- 2.2.3 zbcategory
- 第3章:協調器上位機調試
- 3.1上位機說明
- 3.2 調試說明
- 第4章:信道及PanId的動態修改
- 4.1 串口協議
- 4.2 重要接口說明
- 4.2.1 NIB
- 4.2.2 NLME_UpdateNV
- 4.3 架構調整
- 4.4 應用
- 4.4.1 zbnwk接口實現
- 4.4.2 串口通信解析
- 4.4.3 燒錄調試
- 第5章:網絡短地址及MAC地址的獲取
- 5.1 接口說明
- 5.1.1 描述
- 5.1.2 調用流程
- 5.1.3 異步數據
- 5.2 調試
- 第6章:入網控制及白名單
- 6.1 基本內容
- 6.1.1 入網控制
- 6.1.2 白名單
- 6.2 函數封裝
- 6.3 程序調試
- 第7章:協調器分區存儲管理
- 7.1 軟件框架
- 7.2 應用
- 7.3 調試
- ZigBee 2 WiFi —— 基于ESP8266
- 1.使用云端服務器
- 2.源碼說明與測試
- 3.ESP8266模塊參考資料
- ZigBee 無線報文的抓取與分析
- 接入小米Aqara智能插座和溫濕度傳感器
- Z-Stack的NV應用
- 1. NV 簡介
- 2. NV的讀寫
- 基于HAL的外部FLASH應用
- TFT顯示器實驗(選修)
- Lighting工程源碼分析
- 9.1 ZHA Lighting工程
- 9.2 ZHA Lighting源碼分析
- 9.3 Lighting亮度調節實驗
- TemperatureSensor工程源碼分析
- 10.1 ZHA TemperatureSensor工程
- 10.2 ZHA TemperatureSensor源碼分析
- 版權聲明與免責聲明