From 0a79e7a3b9c9142987f9bc4bdc6d8848e6c2a407 Mon Sep 17 00:00:00 2001 From: zouhaitao Date: Wed, 29 Jul 2026 09:40:54 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=87=8D=E6=9E=84=20EV1527=20=E5=8F=91?= =?UTF-8?q?=E5=B0=84=E6=97=B6=E5=BA=8F=EF=BC=8C=E4=BD=BF=E7=94=A8=E7=A1=AC?= =?UTF-8?q?=E4=BB=B6=20Timer0=20=E4=BF=9D=E8=AF=81=20100%=20=E7=B2=BE?= =?UTF-8?q?=E5=87=86=E7=A0=81=E5=AE=BD=E5=BB=B6=E8=BF=9F=E4=BB=A5=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E8=A7=A6=E5=8F=91=E6=8E=A5=E6=94=B6=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Drivers/rf.c | 194 ++++++++++++++++++++++++++++----------------------- 1 file changed, 107 insertions(+), 87 deletions(-) diff --git a/Drivers/rf.c b/Drivers/rf.c index cc0a6d0..e6c1f01 100644 --- a/Drivers/rf.c +++ b/Drivers/rf.c @@ -3,15 +3,15 @@ #include "../App/rgb.h" #include "intrins.h" -// ATR5179 射频前端天线开关控制引脚定义 -sbit RF_TX = P2^0; // V1 控制端 (1: 选通天线到发射 TX 路径) -sbit RF_RX = P3^7; // V2 控制端 (1: 选通天线到接收 RX 路径) +// ATR5179 灏勯鍓嶇澶╃嚎寮鍏虫帶鍒跺紩鑴氬畾涔 +sbit RF_TX = P2^0; // V1 鎺у埗绔 (1: 閫夐氬ぉ绾垮埌鍙戝皠 TX 璺緞) +sbit RF_RX = P3^7; // V2 鎺у埗绔 (1: 閫夐氬ぉ绾垮埌鎺ユ敹 RX 璺緞) -// 射频芯片数据与电源控制引脚定义 (根据新版 PCB 引脚对调修正) -sbit RF_TX_DAT = P2^1; // LR690L 发射调制数据输入引脚 (DIN) - 物理连接 Pin 22 (P2.1) -sbit RF_RX_DATA = P3^6; // LR690L 接收解调数据输出引脚 (DATA) - 物理连接 Pin 19 (P3.6) +// 灏勯鑺墖鏁版嵁涓庣數婧愭帶鍒跺紩鑴氬畾涔 (鏍规嵁鏂扮増 PCB 寮曡剼瀵硅皟淇) +sbit RF_TX_DAT = P2^1; // LR690L 鍙戝皠璋冨埗鏁版嵁杈撳叆寮曡剼 (DIN) - 鐗╃悊杩炴帴 Pin 22 (P2.1) +sbit RF_RX_DATA = P3^6; // LR690L 鎺ユ敹瑙h皟鏁版嵁杈撳嚭寮曡剼 (DATA) - 鐗╃悊杩炴帴 Pin 19 (P3.6) -// 声明外部延时及串口打印函数 (在 system.c 中定义) +// 澹版槑澶栭儴寤舵椂鍙婁覆鍙f墦鍗板嚱鏁 (鍦 system.c 涓畾涔) extern void Delay_us(u16 us); extern void Delay_ms(u16 ms); extern u16 GetTimer0_Safe(void); @@ -24,156 +24,176 @@ extern void Uart_SendHex32(u32 val); extern void Uart_SendByte(u8 dat); /** - * @brief 初始化无线射频芯片相关的 GPIO 引脚方向与状态 + * @brief 鍒濆鍖栨棤绾垮皠棰戣姱鐗囩浉鍏崇殑 GPIO 寮曡剼鏂瑰悜涓庣姸鎬 */ void RF_Init(void) { - // EAXFR = 1 允许访问扩展特殊功能寄存器 (XSFR) + // EAXFR = 1 鍏佽璁块棶鎵╁睍鐗规畩鍔熻兘瀵勫瓨鍣 (XSFR) EAXFR = 1; - // 1. 配置 P2.0 (RF_TX) 和 P2.1 (RF_TX_DAT) 为推挽输出模式 (M1=0, M0=1) + // 1. 閰嶇疆 P2.0 (RF_TX) 鍜 P2.1 (RF_TX_DAT) 涓烘帹鎸借緭鍑烘ā寮 (M1=0, M0=1) P2M1 &= ~((1 << 0) | (1 << 1)); P2M0 |= ((1 << 0) | (1 << 1)); - // 2. 配置 P3.7 (RF_RX) 和 P3.5 (SHUT) 为推挽输出模式 (M1=0, M0=1) - // 配置 P3.6 (RF_RX_DATA) 为高阻输入模式 (M1=1, M0=0)以匹配接收解调输入 + // 2. 閰嶇疆 P3.7 (RF_RX) 鍜 P3.5 (SHUT) 涓烘帹鎸借緭鍑烘ā寮 (M1=0, M0=1) + // 閰嶇疆 P3.6 (RF_RX_DATA) 涓洪珮闃昏緭鍏ユā寮 (M1=1, M0=0)浠ュ尮閰嶆帴鏀惰В璋冭緭鍏 P3M1 &= ~((1 << 5) | (1 << 7)); P3M1 |= (1 << 6); P3M0 &= ~(1 << 6); P3M0 |= ((1 << 5) | (1 << 7)); - // 3. 设置系统默认的初始电平 - RF_TX = 0; // 断开发射天线通路 - SHUT = 1; // 默认拉高 SHUT,使 LR690L 处于休眠关闭状态 - RF_RX = 0; // 断开接收天线通路 - RF_TX_DAT = 0; // 调制发送数据线置低 + // 3. 璁剧疆绯荤粺榛樿鐨勫垵濮嬬數骞 + RF_TX = 0; // 鏂紑鍙戝皠澶╃嚎閫氳矾 + SHUT = 1; // 榛樿鎷夐珮 SHUT锛屼娇 LR690L 澶勪簬浼戠湢鍏抽棴鐘舵 + RF_RX = 0; // 鏂紑鎺ユ敹澶╃嚎閫氳矾 + RF_TX_DAT = 0; // 璋冨埗鍙戦佹暟鎹嚎缃綆 } /** - * @brief 配置无线射频收发系统的运行模式与天线切换 - * @param mode 运行模式 (0-休眠隔离, 1-接收工作, 2-发射工作) + * @brief 閰嶇疆鏃犵嚎灏勯鏀跺彂绯荤粺鐨勮繍琛屾ā寮忎笌澶╃嚎鍒囨崲 + * @param mode 杩愯妯″紡 (0-浼戠湢闅旂, 1-鎺ユ敹宸ヤ綔, 2-鍙戝皠宸ヤ綔) */ void RF_SetMode(u8 mode) { - if (mode == 0) // ====== 模式 0: 休眠隔离模式 (Sleep/Idle) ====== + if (mode == 0) // ====== 妯″紡 0: 浼戠湢闅旂妯″紡 (Sleep/Idle) ====== { - SHUT = 1; // 强制拉高 SHUT 引脚,使 LR690L 彻底进入低功耗待机 - RF_RX = 0; // 关闭接收天线开关,防止外界电磁杂波串入接收电路 - RF_TX = 0; // 关闭发射天线开关 + SHUT = 1; // 寮哄埗鎷夐珮 SHUT 寮曡剼锛屼娇 LR690L 褰诲簳杩涘叆浣庡姛鑰楀緟鏈 + RF_RX = 0; // 鍏抽棴鎺ユ敹澶╃嚎寮鍏筹紝闃叉澶栫晫鐢电鏉傛尝涓插叆鎺ユ敹鐢佃矾 + RF_TX = 0; // 鍏抽棴鍙戝皠澶╃嚎寮鍏 } - else if (mode == 1) // ====== 模式 1: 接收工作模式 (RX Mode) ====== + else if (mode == 1) // ====== 妯″紡 1: 鎺ユ敹宸ヤ綔妯″紡 (RX Mode) ====== { - SHUT = 0; // 拉低 SHUT 使能 LR690L 芯片,开始解调接收 - RF_TX = 0; // 关闭发射开关 - RF_RX = 1; // 选通天线到 RX 接收路径,使能接收链路高频放大 + SHUT = 0; // 鎷変綆 SHUT 浣胯兘 LR690L 鑺墖锛屽紑濮嬭В璋冩帴鏀 + RF_TX = 0; // 鍏抽棴鍙戝皠寮鍏 + RF_RX = 1; // 閫夐氬ぉ绾垮埌 RX 鎺ユ敹璺緞锛屼娇鑳芥帴鏀堕摼璺珮棰戞斁澶 } - else if (mode == 2) // ====== 模式 2: 发发射工作模式 (TX Mode) ====== + else if (mode == 2) // ====== 妯″紡 2: 鍙戝彂灏勫伐浣滄ā寮 (TX Mode) ====== { - SHUT = 1; // 接收机停机,防止发射强信号顶坏接收前端 - RF_RX = 0; // 关闭接收开关 - RF_TX = 1; // 选通天线到 TX 发射路径,使能天线发射 + SHUT = 1; // 鎺ユ敹鏈哄仠鏈猴紝闃叉鍙戝皠寮轰俊鍙烽《鍧忔帴鏀跺墠绔 + RF_RX = 0; // 鍏抽棴鎺ユ敹寮鍏 + RF_TX = 1; // 閫夐氬ぉ绾垮埌 TX 鍙戝皠璺緞锛屼娇鑳藉ぉ绾垮彂灏 } } /** - * @brief 按照 EV1527 协议单次调制发送一帧 24 位射频数据 (Sync + 24bit Data) + * @brief 浣跨敤鍗曠墖鏈虹‖浠 Timer0 瀹炵幇楂樼簿搴﹀彂灏勭數骞虫椂寤舵帶鍒 + * @param us 寤舵椂寰鏁 + * @note STC32G 鍦 24MHz 鏅舵尟 12T 妯″紡涓嬶紝Timer0 鐨 1 tick 姝eソ绛変簬 0.5us (2MHz) + */ +void RF_Delay_us(u16 us) +{ + u16 ticks = us * 2; + TL0 = 0; + TH0 = 0; + TR0 = 1; // 鍚姩瀹氭椂鍣 0 + while (GetTimer0_Safe() < ticks); + TR0 = 0; // 鍋滄瀹氭椂鍣 0 +} + +/** + * @brief 鎸夌収 EV1527 鍗忚鍗曟璋冨埗鍙戦佷竴甯 24 浣嶅皠棰戞暟鎹 (Sync + 24bit Data) */ void EV1527_TxFrame(u32 addr, u8 dat) { u8 i; u32 tx_val; - // 合并 20 位物理地址与 4 位数据码,构建完整 24 位载波包 + // 鍚堝苟 20 浣嶅湴鍧涓 4 浣嶆暟鎹紝鎴愪负 24 浣嶅畬鏁 EV1527 甯 tx_val = (addr << 4) | (dat & 0x0F); - // 1. 同步头发送:高电平持续 1T (约 350us),低电平持续 31T (约 10850us) + // 1. 鍚屾澶磋剦鍐: 楂樼數骞 1T (350us) + 浣庣數骞 31T (10850us) RF_TX_DAT = 1; - Delay_us(350); + RF_Delay_us(350); RF_TX_DAT = 0; - Delay_us(10850); + RF_Delay_us(10850); - // 2. 依次调制发送 24 位脉宽数据位 + // 2. 渚濇鍙戦 24 涓暟鎹綅 (MSB First) for (i = 0; i < 24; i++) { if (tx_val & (0x800000UL >> i)) { - // 数据 "1":高电平持续 3T (1050us),低电平持续 1T (350us) + // 閫昏緫 "1": 楂樼數骞 3T (1050us) + 浣庣數骞 1T (350us) RF_TX_DAT = 1; - Delay_us(1050); + RF_Delay_us(1050); RF_TX_DAT = 0; - Delay_us(350); + RF_Delay_us(350); } else { - // 数据 "0":高电平持续 1T (350us),低电平持续 3T (1050us) + // 閫昏緫 "0": 楂樼數骞 1T (350us) + 浣庣數骞 3T (1050us) RF_TX_DAT = 1; - Delay_us(350); + RF_Delay_us(350); RF_TX_DAT = 0; - Delay_us(1050); + RF_Delay_us(1050); } } } /** - * @brief 连续多次发送 EV1527 射频帧,防止单帧丢失 + * @brief 璋冨埗鍙戝皠 25 甯 EV1527 灏勯鍚屾鐢靛钩淇″彿浠ョ‘淇濇帴鏀朵晶鍙潬瑙﹀彂 */ void EV1527_Transmit(u32 addr, u8 dat) { - u8 i; - RF_SetMode(2); // 切换为发射状态,接通发射开关并隔离接收端 - Delay_ms(5); // 稳定天线射频通路 + u8 r; + bit ea_bak = EA; // 澶囦唤骞跺睆钄藉叏灞涓柇锛岀‘淇濆彂灏勯珮浣庣數骞冲懆鏈熺殑缁濆绾噣涓庨槻鎶 + EA = 0; - // 循环发送 10 帧,确保接收端至少有 1 帧被无差错捕获 - for (i = 0; i < 10; i++) + RF_SetMode(2); // 鍒囨崲涓哄彂灏勭姸鎬侊紝鎺ラ氬ぉ绾夸笌灏勯妯″潡閫氶亾 + Delay_ms(5); // 绋嶄綔寤舵椂浣垮皠棰戦氳矾绋冲畾 + + // 杩炵画鍙戝皠 25 甯т互淇濊瘉鎺ユ敹璁惧椤哄埄閿佸畾骞惰В鐮 + for (r = 0; r < 25; r++) { EV1527_TxFrame(addr, dat); - Delay_ms(10); // 帧间保护延时 + // 鍘婚櫎甯т笌甯т箣闂村彲鑳藉鑷存尝褰笉杩炵画鐨 Delay_ms } - RF_TX_DAT = 0; // 归零发送数据线 - RF_SetMode(1); // 重新恢复为接收监听常态,以便监测反馈 + RF_TX_DAT = 0; // 缁撴潫鍙戝皠锛屾媺浣庢暟鎹剼 + RF_SetMode(1); // 鎭㈠涓哄父鎬佸悗鍙版帴鏀舵ā寮 + + EA = ea_bak; // 杩樺師鍏ㄥ眬涓柇寮鍏崇姸鎬 } /** - * @brief 获取特定电平引脚状态的持续微秒时间 (利用 Timer0 硬件测量) + * @brief 鑾峰彇鐗瑰畾鐢靛钩寮曡剼鐘舵佺殑鎸佺画寰鏃堕棿 (鍒╃敤 Timer0 纭欢娴嬮噺) */ u16 GetPulseDuration(u8 state, u16 timeout_us) { u16 timeout_ticks; - // 强制关闭 Timer0 计数器,并将其计数值清零复位 + // 寮哄埗鍏抽棴 Timer0 璁℃暟鍣紝骞跺皢鍏惰鏁板兼竻闆跺浣 TR0 = 0; - TMOD &= 0xF0; // 设置 Timer0 寄存器为模式 0 (16位自动重载) + TMOD &= 0xF0; // 璁剧疆 Timer0 瀵勫瓨鍣ㄤ负妯″紡 0 (16浣嶈嚜鍔ㄩ噸杞) TL0 = 0x00; TH0 = 0x00; - // 换算 16 位定时器所需的最大 ticks 超时值 (在 1T 模式 24MHz 下,1 Tick = 1 / 24M = 0.0416us) - // 但此系统 Timer0 默认配置为 12T 模式 (1 Tick = 12 / 24MHz = 0.5us) + // 鎹㈢畻 16 浣嶅畾鏃跺櫒鎵闇鐨勬渶澶 ticks 瓒呮椂鍊 (鍦 1T 妯″紡 24MHz 涓嬶紝1 Tick = 1 / 24M = 0.0416us) + // 浣嗘绯荤粺 Timer0 榛樿閰嶇疆涓 12T 妯″紡 (1 Tick = 12 / 24MHz = 0.5us) timeout_ticks = (u16)((u32)timeout_us * (MAIN_Fosc / 1000000UL) / 12UL); - TR0 = 1; // 启动 Timer0 硬件计数器 + TR0 = 1; // 鍚姩 Timer0 纭欢璁℃暟鍣 - // 根据要捕获的电平状态进行阻塞判断,直到电平发生翻转或计数超时 + // 鏍规嵁瑕佹崟鑾风殑鐢靛钩鐘舵佽繘琛岄樆濉炲垽鏂紝鐩村埌鐢靛钩鍙戠敓缈昏浆鎴栬鏁拌秴鏃 while (RF_RX_DATA == state) { if (GetTimer0_Safe() > timeout_ticks) { TR0 = 0; - return 0; // 判定超时,返回 0 + return 0; // 鍒ゅ畾瓒呮椂锛岃繑鍥 0 } } - TR0 = 0; // 关断定时器 + TR0 = 0; // 鍏虫柇瀹氭椂鍣 return (u16)((u32)GetTimer0_Safe() * 12UL / (MAIN_Fosc / 1000000UL)); } -// 模拟射频信号全局变量定义 +// 妯℃嫙灏勯淇″彿鍏ㄥ眬鍙橀噺瀹氫箟 volatile u32 mock_rx_addr = 0; volatile u8 mock_rx_data = 0; volatile bit mock_rf_ready = 0; /** - * @brief 阻塞式检测并解码一个合法的 EV1527 射频信号数据帧 + * @brief 闃诲寮忔娴嬪苟瑙g爜涓涓悎娉曠殑 EV1527 灏勯淇″彿鏁版嵁甯 */ bit EV1527_Decode(u32 *out_addr, u8 *out_data) { @@ -185,7 +205,7 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data) u16 idata raw_h[24]; u16 idata raw_l[24]; - // 检查模拟射频触发 + // 妫鏌ユā鎷熷皠棰戣Е鍙 if (mock_rf_ready) { mock_rf_ready = 0; *out_addr = mock_rx_addr; @@ -193,14 +213,14 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data) return 1; } - // ====== 1. 同步头引导脉冲捕获 ====== + // ====== 1. 鍚屾澶村紩瀵艰剦鍐叉崟鑾 ====== { u16 wait_cnt = 0; while (RF_RX_DATA == 1) { Delay_us(5); wait_cnt++; - if (wait_cnt > 2000) // 10 毫秒超时保护 + if (wait_cnt > 2000) // 10 姣瓒呮椂淇濇姢 return 0; } @@ -209,28 +229,28 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data) { Delay_us(5); wait_cnt++; - if (wait_cnt > 4000) // 20 毫秒超时保护 + if (wait_cnt > 4000) // 20 姣瓒呮椂淇濇姢 return 0; } } - // 捕获引导头高电平时间 + // 鎹曡幏寮曞澶撮珮鐢靛钩鏃堕棿 high_time = GetPulseDuration(1, 2500); if (high_time < 50 || high_time > 2500) { return 0; } - // 捕获引导头后续的 31T 低电平时间 + // 鎹曡幏寮曞澶村悗缁殑 31T 浣庣數骞虫椂闂 low_time = GetPulseDuration(0, 60000); if (low_time < 1500 || low_time > 60000) { return 0; } - // 同步引导脉冲的基准时间 T 计算 (引导脉冲高电平宽度即为 1T) + // 鍚屾寮曞鑴夊啿鐨勫熀鍑嗘椂闂 T 璁$畻 (寮曞鑴夊啿楂樼數骞冲搴﹀嵆涓 1T) T = high_time; - if (T < 100 || T > 800) return 0; // 自适应范围限幅: 100us ~ 800us + if (T < 100 || T > 800) return 0; // 鑷傚簲鑼冨洿闄愬箙: 100us ~ 800us - // ====== 2. 依次解析 24 个数据位脉宽 ====== + // ====== 2. 渚濇瑙f瀽 24 涓暟鎹綅鑴夊 ====== for (i = 0; i < 24; i++) { raw_h[i] = GetPulseDuration(1, 2000); @@ -240,15 +260,15 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data) if (raw_l[i] == 0) return 0; } - // ====== 3. 双端比值解调判定数据内容 ====== + // ====== 3. 鍙岀姣斿艰В璋冨垽瀹氭暟鎹唴瀹 ====== for (i = 0; i < 24; i++) { u16 total = raw_h[i] + raw_l[i]; - if (total < T * 3 || total > T * 6) return 0; // 单个数据位周期必须在 3T~6T 之间 + if (total < T * 3 || total > T * 6) return 0; // 鍗曚釜鏁版嵁浣嶅懆鏈熷繀椤诲湪 3T~6T 涔嬮棿 if (raw_h[i] > raw_l[i] * 2) { - // 高电平明显长于低电平,代表逻辑 "1" + // 楂樼數骞虫槑鏄鹃暱浜庝綆鐢靛钩锛屼唬琛ㄩ昏緫 "1" if (i < 20) addr = (addr << 1) | 1; else @@ -256,7 +276,7 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data) } else if (raw_l[i] > raw_h[i] * 2) { - // 低电平明显长于高电平,代表逻辑 "0" + // 浣庣數骞虫槑鏄鹃暱浜庨珮鐢靛钩锛屼唬琛ㄩ昏緫 "0" if (i < 20) addr = (addr << 1); else @@ -264,18 +284,18 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data) } else { - return 0; // 电平脉冲比值不合规,判定数据帧畸变,解码作废 + return 0; // 鐢靛钩鑴夊啿姣斿间笉鍚堣锛屽垽瀹氭暟鎹抚鐣稿彉锛岃В鐮佷綔搴 } } - // 校验无误,输出解调数据 + // 鏍¢獙鏃犺锛岃緭鍑鸿В璋冩暟鎹 *out_addr = addr; *out_data = dat; return 1; } /** - * @brief RF 收发诊断测试功能 (支持发送与接收监听打印) + * @brief RF 鏀跺彂璇婃柇娴嬭瘯鍔熻兘 (鏀寔鍙戦佷笌鎺ユ敹鐩戝惉鎵撳嵃) */ void RF_DiagnosticMode(char choice) { @@ -283,23 +303,23 @@ void RF_DiagnosticMode(char choice) { u8 i; Uart_SendString("=== RF TX Test: Transmitting 20 test frames... ===\r\n"); - // 开启发射模式并配置天线开关 + // 寮鍚彂灏勬ā寮忓苟閰嶇疆澶╃嚎寮鍏 RF_SetMode(2); Delay_ms(5); for (i = 0; i < 20; i++) { - // 连续发送测试包,每次发送伴随马达短震及指示灯闪烁 + // 杩炵画鍙戦佹祴璇曞寘锛屾瘡娆″彂閫佷即闅忛┈杈剧煭闇囧強鎸囩ず鐏棯鐑 MOTOR = 1; - RGB_Send(0, 150, 0, 0, 150, 0); // 绿光闪烁 + RGB_Send(0, 150, 0, 0, 150, 0); // 缁垮厜闂儊 EV1527_TxFrame(0x37A86UL, 0x01); MOTOR = 0; RGB_Send(0, 0, 0, 0, 0, 0); - Delay_ms(150); // 帧间隔 + Delay_ms(150); // 甯ч棿闅 } RF_TX_DAT = 0; - RF_SetMode(1); // 重新恢复接收模式 + RF_SetMode(1); // 閲嶆柊鎭㈠鎺ユ敹妯″紡 Uart_SendString("[RF] Transmit Done!\r\n"); } else if (choice == 'r') @@ -309,10 +329,10 @@ void RF_DiagnosticMode(char choice) u8 rx_data; Uart_SendString("=== RF RX Test: Listening for 5 seconds... ===\r\n"); - RF_SetMode(1); // 配置进入接收模式并使能天线 + RF_SetMode(1); // 閰嶇疆杩涘叆鎺ユ敹妯″紡骞朵娇鑳藉ぉ绾 Delay_ms(10); - // 5秒的非阻塞监听 + // 5绉掔殑闈為樆濉炵洃鍚 for (wait_ms = 0; wait_ms < 5000; wait_ms++) { if (EV1527_Decode(&rx_addr, &rx_data)) @@ -323,7 +343,7 @@ void RF_DiagnosticMode(char choice) Uart_SendHex8(rx_data); Uart_SendString("\r\n"); - // 收到信号后马达震动并亮青色灯提醒 + // 鏀跺埌淇″彿鍚庨┈杈鹃渿鍔ㄥ苟浜潚鑹茬伅鎻愰啋 MOTOR = 1; RGB_Send(0, 150, 150, 0, 150, 150); Delay_ms(100);