// 定义供电类型 #include "guangshi.h" #define POWER_NONE 0 // 无供电 #define POWER_AC 1 // 市电供电 #define POWER_SOLAR 2 // 太阳能供电 // 市电检测相关变量 uint8_t bizohi = 0; #define AC_SAMPLE_TIME 100 // 采样时间窗口 #define AC_CHANGE_THRESHOLD 5 // 最小变化次数阈值 static uint8_t last_ac_status = 0; static uint8_t change_count = 0; static uint32_t sample_timer = 0; // 市电检测函数 void Check_Power_Source(void) { uint8_t current_ac = Read_MainPower(); // 读取市电检测端口 // 检测电平变化 if(current_ac != last_ac_status) { change_count++; last_ac_status = current_ac; } sample_timer++; // 采样时间窗口到达后判断 if(sample_timer >= AC_SAMPLE_TIME) { // 如果在采样窗口内检测到足够的变化次数,说明交流电存在 if(change_count >= AC_CHANGE_THRESHOLD) { bizohi = 1; // 市电正常 } else { bizohi = 2; // 市电断开 } // 重置计数器 change_count = 0; sample_timer = 0; } } // 太阳能检测函数 uint8_t Check_Solar_Power(void) { // 通过ADC值判断太阳能状态 // data1[1]是太阳能电压ADC值,data1[2]是市电电压ADC值 if(data1[1] > data1[2]) { return 1; // 太阳能电压足够 } return 0; // 太阳能电压不足 } // 获取当前供电类型 uint8_t Get_Power_Type(void) { // 先检查市电状态 if(bizohi == 1) // 市电正常 { printf("当前使用市电供电\r\n"); return POWER_AC; } // 检查太阳能状态 else if(Check_Solar_Power()) { printf("当前使用太阳能供电\r\n"); return POWER_SOLAR; } else { printf("当前无供电\r\n"); return POWER_NONE; } }