多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
* 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=21) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 本小节将讲解如何使用继电器去控制强电设备。 <br/> ## **继电器简介** &emsp;&emsp;常见的LED小灯、小型电机或小型传感器的工作电压在3.3v左右,故可以让单片机直接控制其开关。但是像家用电灯泡、家用电风扇或电磁锁的工作电压是220v,故单片机无法直接控制其开关。这时候,单片机可以借助继电器来控制高电压用电器的开关。ZigBee标准板集成了继电器,如图所示。 ![](https://img.kancloud.cn/c0/6d/c06dcc5e4d08b5e422031fd151f58503_950x790.png =200x) ### 其中的绿色部分是接线端子,共有3接线口,每个接线口的上方均有一个螺丝孔。 ![](https://img.kancloud.cn/10/e8/10e88fbbe72b9503f1f8a7f8e113d8cf_1440x1440.png =150x) ### 以220v家用灯泡为例简单讲解一下继电器的接线方法,用螺丝刀拧开第1、2号口的螺丝,分别塞入零线后再拧紧螺丝,如图所示。此时,**继电器充当了一个开关**,可以控制零线的断开或者闭合,从而控制灯泡的开关。也可以把零线分别塞入到第2、3号口,区别在与如果介入第1、2号口,那么在默认状态下是断开的;如果接入第2、3号口,那么在默认状态是闭合的。 ![](https://img.kancloud.cn/b9/2e/b92e9cd3aad8c5661791c2809d177d6a_748x548.png =350x) ### 类似地,使用继电器连接12v电磁锁的示意图如图所示。图中的12v电池是用于给电磁锁供电的。 ![](https://img.kancloud.cn/cc/c4/ccc4cb537ac345031b80491bc8246d3e_646x384.png =360x) <br/> ## **使用继电器** 继电器的使用方式非常简单,控制继电器的控制引脚的电平即可控制其开合。 <br/> **引脚配置** 使用继电器前,需要先把继电器的控制引脚与CC2530的IO口配对起来。ZigBee标准板是使用CC2530的P0\_5引脚与继电器的控制引脚连接的。打开本实验代码代码,可以找到ioConfig.c文件,如图所示。 ![](https://img.kancloud.cn/c5/13/c51375cbe97684bb4fd50633097bd068_349x181.png) ### 可在本实验代码的ioConfig.c文件中找到如下配置代码: ``` #define RELAY_PORT 0 #define RELAY_PIN 5 #define RELAY P0_5 ``` P0\_5是由头文件ioCC2530.h所定义的,用于表示P0\_5引脚,因此RELAY实际上就表示P0\_5引脚。如果继电器控制引脚需要与CC2530的其他引脚连接的话,只需要在这里修改引脚映射即可,例如如果需要在P1\_2引脚外接继电器控制引脚,代码如下: ### ``` #define RELAY_PORT 1 #define RELAY_PIN 2 #define RELAY P1_2 ``` ### **控制继电器** 控制继电器的开合,本质上就是控制P0_5引脚的电平,在ioConfig.c中可找到示例代码: ``` //2. 51单片机入门/7. 外设实验/7.3 继电器开关控制/Workspace/code/ioConfig/ioConfig.c #include "cc2530_ioctl.h" #include <stdio.h> /** @brief GPIO映射定义 */ #define RELAY_PORT 0 #define RELAY_PIN 5 #define RELAY P0_5 /** @brief 继电器开关状态定义 */ #define RELAY_ON 1 #define RELAY_OFF 0 static void delayMs(uint16_t nMs); static void initRelay(void); void main() { initRelay(); while(1) { delayMs(1000);//延迟 //反转RELAY引脚的电平状态 RELAY = (RELAY == RELAY_ON)? RELAY_OFF : RELAY_ON; } /* while */ } /* * 延迟指定的时间 * * @param nMs - 时间长度,单位为微秒 */ static void delayMs(uint16_t nMs) { uint16_t i,j; for (i = 0; i < nMs; i++) for (j = 0; j < 535; j++); } /* * 初始化继电器 */ static void initRelay() { CC2530_IOCTL( RELAY_PORT, RELAY_PIN, CC2530_OUTPUT); RELAY = RELAY_OFF; } ``` &emsp;&emsp;上述代码实现了不断开关继电器的功能。可见,继电器的使用其实非常简单的。 ## **调试仿真** 可以运行本实验代码以观察运行结果,操作步骤如下: (1)编译链接配套的工程代码后,把程序烧录到配套的ZigBee开发板中。 (2)由于本实验需要用到继电器,ZigBee标准板中已经集成了继电器,并且其控制引脚默认连接着P0\_5引脚。如果使用ZigBee Mini板测试,需要在P0\_5引脚处外接继电器控制引脚,并且把该继电器的VCC和GND引脚分别接入到5v的电源和地线。 (3)通过MicroUSB线给开发板上电,即可观察到继电器不断的开合。 >[danger] 必须要使用Micro USB线给开发板供电才能使用继电器! <br/> <br/> ## **商务合作** * 如需项目定制开发,可扫码添加项目经理好友,注明“**商务合作**” * 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案 * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非商务合作**勿扰**,此处**非**技术支持