output.c
来自「电表解决方案概要power_meter_r8c2g_source_code」· C语言 代码 · 共 1,132 行 · 第 1/2 页
C
1,132 行
#include "sfr_r82b.h"
#include "disp_definel.h"
#include "main_define.h"
#include "Iic.h"
//#pragma SECTION program pro_4
/******************************************************************************************
******************************************************************************************/
void water_detect(void); /* Debugging Mode 下水位检测,当J1 状态为"ON"时,表示水位到达设定水位 */
void wash_detect(void); /* Debugging Mode 洗涤时间检测,当J2 状态为"ON"时,修改洗涤和浸泡的时间 */
void ac_freqcy_detect(void); /* AC 电源频率检测 */
void lid_detect(void); /* 门开关检测 */
void unbalance_detect(void); /* 不平衡检测 */
/******************************************************************************************
void alarm(void): 留水和错误报警处理程序,当留水或错误释放后程序继续运行
******************************************************************************************/
void alarm(void)
{
if (err_buff)
{
run_err_flag = 1;
switch (err_buff)
{
case PRESET_LID_ERR: /* 预约开盖处理 */
if (lid_open == 0)
{
lid_open_close_flag = 0;
err_buff = 0;
status_buff = RUN;
program_start_flag = 1;
program_pause_flag = 0;
buzz_flag = 0;
run_err_flag = 0;
Pflash = 0;
Tflash = 0;
Pflash_switch_flag = 0x00;
run_page3_flag = 0;
}
break;
case DRAIN_ERR: /* 排水错误处理 */
if (lid_open_close_flag == 1)
{
lid_open_close_flag = 0;
err_buff = 0;
status_buff = RUN;
program_start_flag = 1;
program_pause_flag = 0;
buzz_flag = 0;
run_err_flag = 0;
Pflash = 0;
Tflash = 0;
Pflash_switch_flag = 0x00;
run_page3_flag = 0;
}
break;
case OPEN_LID_ERR: /* 开盖异常处理 */
if (lid_open == 0)
{
lid_open_close_flag = 0;
err_buff = 0;
status_buff = RUN;
program_start_flag = 1;
program_pause_flag = 0;
buzz_flag = 0;
run_err_flag = 0;
Pflash = 0;
Tflash = 0;
Pflash_switch_flag = 0x00;
run_page3_flag = 0;
}
break;
case SPIN_UNBALAN_ERR: /* 脱水撞桶处理 */
if (lid_open_close_flag == 1)
{
lid_open_close_flag = 0;
err_buff = 0;
status_buff = RUN;
program_start_flag = 1;
program_pause_flag = 0;
buzz_flag = 0;
run_err_flag = 0;
Pflash = 0;
Tflash = 0;
Pflash_switch_flag = 0x00;
run_page3_flag = 0;
}
break;
case INLET_ERR: /* 进水异常处理 */
if (lid_open_close_flag == 1)
{
lid_open_close_flag = 0;
err_buff = 0;
status_buff = RUN;
program_start_flag = 1;
program_pause_flag = 0;
buzz_flag = 0;
run_err_flag = 0;
Pflash = 0;
Tflash = 0;
Pflash_switch_flag = 0x00;
run_page3_flag = 0;
}
break;
case INLET_OVTIME_ERR: /* 进水超时处理 */
if (lid_open_close_flag == 1)
{
lid_open_close_flag = 0;
err_buff = 0;
status_buff = RUN;
program_start_flag = 1;
program_pause_flag = 0;
buzz_flag = 0;
run_err_flag = 0;
Pflash = 0;
Tflash = 0;
Pflash_switch_flag = 0x00;
run_page3_flag = 0;
}
break;
};
}
if (run_save_water_flag == 1)
{
status_buff = STOP;
buzz_flag = 1; /* 置蜂鸣标志 */
}
if (run_err_flag == 1)
{
status_buff = STOP;
buzz_flag = 1; /* 置蜂鸣标志 */
}
}
/****************************************************************
void input(void),外部输入处理含函数
****************************************************************/
void input(void)
{
water_detect(); /* 调用水位检测 */
wash_detect(); /* 调用洗涤时间检测 */
ac_freqcy_detect(); /* 调用AC 电源频率检测 */
lid_detect(); /* 调用门开关检测 */
unbalance_detect(); /* 调用不平衡检测 */
}
/****************************************************************
void output(void),输出处理含函数
****************************************************************/
void output(void)
{
unsigned char i;
unsigned char j;
unsigned char k;
// buzz();
i = output_buff;
if (i == 0) /* 输出存储变量为0,清零 AC 端口输出 */
{
CW_OPT = 0;
CW_OPT_1 =0;
Drain_OPT = 0;
Drain_OPT_1 = 0;
Inlet_OPT = 0;
Inlet_OPT_1 = 0;
SOF_Inlet_OPT = 0;
SOF_Inlet_OPT_1 = 0;
CCW_OPT = 0;
CCW_OPT_1 = 0;
Break_OPT = 0;
Break_OPT_1 = 0;
ACOFF_OPT = 0;
ACOFF_OPT_1 = 0;
}
else if (i != 0)
{
for (j = 0; j < 8; j++)
{
k = (OPT_Table[j] & i);
if (k)
continue;
switch (OPT_Table[j]) /* 输出存储变量不为0,先清零输出为0的端口 */
{
case CW:
CW_OPT = 0;
CW_OPT_1 =0;
break;
case DRAIN:
Drain_OPT = 0;
Drain_OPT_1 = 0;
break;
case INLET:
Inlet_OPT = 0;
Inlet_OPT_1 = 0;
break;
case SOFNER:
SOF_Inlet_OPT = 0;
SOF_Inlet_OPT_1 = 0;
break;
case CCW:
CCW_OPT = 0;
CCW_OPT_1 = 0;
break;
case BREAK:
Break_OPT = 0;
Break_OPT_1 = 0;
break;
case ACOFF:
ACOFF_OPT = 0;
ACOFF_OPT_1 = 0;
break;
}
}
for (j = 0; j < 8; j++)
{
k = (OPT_Table[j] & i);
if (!k)
continue;
switch (OPT_Table[j]) /* 输出存储变量不为0,清零输出为0的端口后置位输出不为0的端口 */
{
case CW:
CW_OPT = 1;
CW_OPT_1 = 1;
break;
case DRAIN:
Drain_OPT = 1;
Drain_OPT_1 = 1;
break;
case INLET:
Inlet_OPT = 1;
Inlet_OPT_1 = 1;
break;
case SOFNER:
SOF_Inlet_OPT = 1;
SOF_Inlet_OPT_1 = 1;
break;
case CCW:
CCW_OPT = 1;
CCW_OPT_1 = 1;
break;
case BREAK:
Break_OPT = 1;
Break_OPT_1 = 1;
break;
case ACOFF:
ACOFF_OPT = 1;
ACOFF_OPT_1 = 1;
break;
}
}
}
return;
}
/*************************************************************************
void water_detect(void),J1输入判定处理函数,当J3=1时,J1为水位检测
*************************************************************************/
void water_detect(void)
{
unsigned char i;
machine_type = J3;
if (machine_type == 0) /* 检测到J3输入为0 */
{
if ((output_buff & INLET) != 0); /* 检测进水是否运行 */
{
if (inlet_2m_buff <= 30) /* 进水运行 90s 时,修改水位暂存器为达到设定值 */
{
water_buff = water_level_buff;
water_full_flag = 1;
drain_empty_flag = 0;
}
}
if ((output_buff & DRAIN) != 0); /* 检测排水是否运行 */
{
if (drain_2m_buff <= 30) /* 排水运行 90s 时,修改水位暂存器为水排空 */
{
water_buff = 0;
water_full_flag = 0;
}
}
return; /* 返回 */
}
i = J1; /* 当检测到J3输入为1,检测J1判定水位是否达设定水位 */
if (i != 0) /* J1输入为1,置水位状态为达到设定水位 */
water_buff = water_level_buff;
else if (i == 0) /* J1输入为0,置水位状态为水排空 */
water_buff = 0;
if (water_buff == water_level_buff)
{
water_full_flag = 1; /* 置水位标志 */
drain_empty_flag = 0;
}
else if ((water_buff < water_level_buff)||(water_buff == 0))
water_full_flag = 0; /* 清水位标志 */
return;
}
/*********************************************************************************
void wash_detect(void),J2输入判定处理函数,当J3=1时,J2浸泡洗涤时间修改判定检测
*********************************************************************************/
void wash_detect(void)
{
unsigned char j;
machine_type = J3;
if (machine_type == 0) /* 检测到J3输入为0,返回 */
return;
j = J2; /* 检测到J3输入为1,检测J2 */
if (j != 0) /* 检测到J2输入为1,修改浸泡,洗涤时间 */
{
run_stream_time = 30;
soak_1m_buff = 30;
soak_2m_buff = 30;
soak_3m_buff = 30;
soak_4m_buff = 30;
soak_9m_buff = 30;
process_left_time = 30;
}
return;
}
/*********************************************************************************
void lid_detect(void),J1输入判定处理函数,当J3=0时,J1为门开关检测
*********************************************************************************/
void lid_detect(void)
{
unsigned char j;
machine_type = J3;
if (machine_type == 0) /* 检测到J3输入为0 */
{
j = J1; /* 检测到J2 */
if (j != save_lid_status)
{
if (save_lid_status == 0)
{
if((run_err_flag == 1)||(run_save_water_flag == 1))
lid_open_close_flag = 1;
}
save_lid_status = j;
}
if (j == 1) /* J1 = 1, 门关 */
{
lid_open = 0;
}
if (j == 0) /* J1 = 0, 门开 */
{
lid_open = 1;
}
}
}
/*********************************************************************************
void unbalance_detect(void),J2输入判定处理函数,当J3=0时,J2为不平衡检测
*********************************************************************************/
void unbalance_detect(void)
{
unsigned char j;
machine_type = J3;
if (machine_type == 0) /* 检测到J3输入为0 */
{
j = J2; /* 检测到J2 */
if (j == 0)
{
if ((program_buff == Special_PGM)&&(status_buff == RUN))
err_buff = SPIN_UNBALAN_ERR;
else
{
if (((output_buff & CW) != 0)||((output_buff & CCW) != 0))
unbalance_count ++;
if (unbalance_count == 3)
{
unbalance_count = 0;
unbalance_flag = 1;
err_buff = SPIN_UNBALAN_ERR;
}
}
}
}
}
/*********************************************************************************
void ac_freqcy_detect(void),AC电源频率检测,通过INT2计数变量确定频率值
*********************************************************************************/
void ac_freqcy_detect(void)
{
if ((ac_frequency >= 49)&&(ac_frequency <= 51))
ac_frequency = 50;
else if ((ac_frequency >= 59)&&(ac_frequency <= 61))
ac_frequency = 60;
}
/*********************************************************************************
void demo_judge(void),通过检测J3,判断是否运行demo程序
*********************************************************************************/
void demo_judge(void)
{
machine_type = J3;
if (machine_type == 0) /* 运行demo程序,初始化环境变量 0 */
{
run_demo_flag = 1;
menu_level_buff = Menu_Level_4;
program_buff = Memo_PGM;
}
else
run_demo_flag = 0;
}
/***************************************************************************************
unsigned char program_time(unsigned char far * table_adr, unsigned char table_colum),
计算所选程序运行所需要的时间和已运行时间,返回剩余时间;计算方法为根据程序时间表计算总
时间,然后根据操作计数器和过程剩余时间计算已运行时间,最后得出程序运行剩余时间
***************************************************************************************/
unsigned char program_time(unsigned char far * table_adr, unsigned char table_colum)
{
unsigned char i;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?