#include "bsp_relay.h" #include "../msp/pwm.h" #include "../app/app_paraid.h" #if 0 //可惜sbit不能作为参数值 U8 g_relay_data[RELAY_NUM][2] = { RELAY_PRINTER, ULN1B, RELAY_PC, ULN2B, RELAY_LED, ULN3B, RELAY_LED_FUYIN, ULN4B, RELAY_LED_RENXIANG, ULN5B, RELAY_12V_RESV, 5ULN6B, }; #endif void _ULN1B_HANDLER(U8 oper) { ULN1B = oper; } void _ULN2B_HANDLER(U8 oper) { ULN2B = oper; } void _ULN3B_HANDLER(U8 oper) { ULN3B = oper; } void _ULN4B_HANDLER(U8 oper) { ULN4B = oper; } void _ULN5B_HANDLER(U8 oper) { ULN5B = oper; } void _ULN6B_HANDLER(U8 oper) { ULN6B = oper; } void _ULN8B_HANDLER(U8 oper) { ULN8B = oper; } void _ULN7B_HANDLER(U8 oper) { ULN7B = oper; } void _CBC_HANDLER(U8 oper) { switch(oper) { case RELAY_KAI: D_pwer12_off(); break; case RELAY_BI: D_pwer12_on(); break; default: break; } } struct _s_relay_oper s_relay_oper[RELAY_NUM] = { //status这里全部为RELAY_BI,如果系统看门狗重启,值会保存在flash_page0,从而读取设定 //oper_max_time这里全部为0,真实值由flash->page1设定 //relay_name, relay_handler, initital, status, oper_max_time, oper_stmp {RELAY_PRINTER, _ULN1B_HANDLER, RELAY_BI, RELAY_BI, 0, 0}, //常闭 {RELAY_PC, _ULN2B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开 {RELAY_LED, _ULN3B_HANDLER, RELAY_BI, RELAY_BI, 0, 0}, //常闭 {RELAY_LED_FUYIN, _ULN4B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开 {RELAY_LED_RENXIANG,_ULN5B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开 {RELAY_12V_RESV, _ULN6B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开 {RELAY_PRINTER_1, _ULN8B_HANDLER, RELAY_BI, RELAY_BI, 0, 0}, //常闭 {RELAY_12V_RESV_1, _ULN7B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开 //{RELAY_CBC, _CBC_HANDLER, RELAY_NONE, RELAY_NONE, 0, 0}, //无常闭常开特性,不控制磁保持继电器,发送0xFF代表控制所有,会触发磁保持 }; U8 L2_relay_convert_and_do(int i,int val) { U8 oper = val; if(s_relay_oper[i].relay_initial == RELAY_BI) //常闭 { oper = val; } else if(s_relay_oper[i].relay_initial == RELAY_KAI) //常开 { oper = !val; } return oper; } #if 1 void L1_relay_on(vU8 n,vU8 val) { U8 i = 0; for(i=0;i> i) & 0x1) { // L1_relay_on(i,((val >> i) & 0x1 == PROTO_RELAY_KAI ? RELAY_KAI : RELAY_BI)); L1_relay_on(i, val >> i & 0x1); } } } } void L2_relay_init(void) { //继电器上电初始化 继电器 1响应,0恢复默认状态(常开 or 常闭) ULN1B = 0; ULN2B = 0; ULN3B = 0; ULN4B = 0; ULN5B = 0; ULN6B = 0; ULN8B = 0; ULN7B = 0; _CBC_HANDLER(RELAY_BI); //闭合 //set output D_HighI_P1(BITN5); D_HighI_P6(BITN2); D_HighI_P6(BITN1); D_HighI_P6(BITN0); D_HighI_P1(BITN3); D_HighI_P1(BITN4); D_HighI_P4(BITN4); D_HighI_P6(BITN3); D_HighI_P6(BITN4); //CBC_P64 D_HighI_P6(BITN5); //CBC_P65 D_HighI_P3(BITN5); //P35 D_HighI_P0(BITN7); //P07 //初始化2遍 ULN1B = 0; ULN2B = 0; ULN3B = 0; ULN4B = 0; ULN5B = 0; ULN6B = 0; ULN8B = 0; ULN7B = 0; _CBC_HANDLER(RELAY_BI); //闭合 } //全关(断开) void L2_relay_poweroff_all(void) { _CBC_HANDLER(RELAY_KAI); L1_relay_on(RELAY_PC, RELAY_KAI); L1_relay_on(RELAY_PRINTER, RELAY_KAI); L1_relay_on(RELAY_PRINTER_1, RELAY_KAI); //两路扩展 L1_relay_on(RELAY_12V_RESV, RELAY_KAI); L1_relay_on(RELAY_12V_RESV_1, RELAY_KAI); } void L2_relay_poweron_all(void) { U8 i = 0; _CBC_HANDLER(RELAY_BI); for(i=0;i