/** * ZhaTianRX - STC8H1K08 接收机固件 * 主程序: NRF24L01 接收 + 4路舵机PWM + SBUS输出 + 串口命令 * * MCU: STC8H1K08 (SOP16/SOP20) * 编译: SDCC -mmcs51 --model-small * * 引脚分配: * CH1(P3.7) CH2(P3.6) CH3(P3.5) CH4(P3.4) - 舵机PWM输出 50Hz * BAT_ADC(P3.3/ADC11) - 电池电压分压输入 * LED(P3.2) - 状态指示灯 (低电平亮) * TX(P3.1) - UART1 TX / SBUS 输出 (经板上三极管反相) * RX(P3.0) - UART1 RX / 命令输入 * * NRF24L01 (硬件SPI): * SCK(P1.5) CE(P1.6) IRQ(P1.7) CSN(P5.4) MISO(P1.3) MOSI(P1.4) */ # ifndef CONFIG # define CONFIG # include "config.h" # endif #include "nrf24.h" #include "uart.h" void EEPROM_LoadConfig(); void Init(); void main(void) { /* 系统初始化 */ System_Init(); GPIO_Init(); Timer0_Init(); UART1_Init(); ADC_Init(); IAP_Init(); /* 初始化NRF24L01 */ NRF24L01_Init(); /* 初始PWM: 中位 */ PWM_SetAllFailsafe(); // 从EEPROM加载配置 */ EEPROM_LoadConfig(); /* 检测NRF模块 */ if (!NRF24L01_Check()) { /* NRF模块未检测到, 设置硬件错误标志, LED双闪 */ nrf_hw_error = 1; } while (1) { /* 处理串口命令 */ UART1_ProcessCmd(); if (NRF_IRQ == 1) { // 处理NRF24L01接收数据 NRF24L01_ProcessRX(); // 更新输出数据 outputFun(); } /* LED状态指示 */ LED_Update(); } } void Init() { // System_Init() /* 切换到内部24MHz IRC */ P_SW2 |= EAXFR; /* 使能访问扩展SFR */ CLKDIV = 0x00; /* 主时钟不分频 */ CKSEL = 0x00; /* 选择内部高速IRC */ P_SW2 &= ~EAXFR; /* 设置内部IRC为24MHz */ IRC24MCR = 0x80; /* 使能内部24MHz IRC */ while (!(IRC24MCR & 0x01)); /* 等待IRC稳定 */ // GPIO_Init() /* P3.4-P3.7: 推挽输出 (PWM通道) */ P3M0 |= 0xF0; P3M1 &= ~0xF0; /* P3.2: 推挽输出 (LED) */ P3M0 |= 0x04; P3M1 &= ~0x04; /* P3.1: 推挽输出 (UART TX) */ P3M0 |= 0x02; P3M1 &= ~0x02; /* P3.0: 高阻输入 (UART RX) */ P3M0 &= ~0x01; P3M1 |= 0x01; /* P3.3: 高阻输入 (ADC) */ P3M0 &= ~0x08; P3M1 |= 0x08; /* NRF24L01 SPI 引脚 */ /* P1.5(SCK), P1.4(MOSI), P1.6(CE): 推挽输出 */ P1M0 |= 0x70; P1M1 &= ~0x70; /* P1.3(MISO): 高阻输入 */ P1M0 &= ~0x08; P1M1 |= 0x08; /* P1.7(IRQ): 高阻输入 (轮询) */ P1M0 &= ~0x80; P1M1 |= 0x80; /* P5.4(CSN): 推挽输出 */ P5M0 |= 0x10; P5M1 &= ~0x10; /* 初始电平 */ P34 = 0; P35 = 0; P36 = 0; P37 = 0; /* PWM 初始低 */ P32 = 1; /* LED 初始灭 (低电平亮) */ P31 = 1; /* TX 空闲高 */ /* NRF 引脚初始 */ NRF_CE = 0; NRF_CSN = 1; NRF_SCK = 0; NRF_MOSI = 0; // Timer_Init() /* 16位自动重载模式, 1T */ TMOD &= ~0x0F; TMOD |= 0x01; /* T0: 16位定时器 */ AUXR |= T0x12; /* T0: 1T模式 */ /* 4us @ 24MHz: 96 ticks */ TH0 = 0xFF; TL0 = 0xA0; /* 65536 - 96 = 0xFFA0 */ ET0 = 1; /* 使能T0中断 */ TR0 = 1; /* 启动T0 */ }