本帖最后由 xhd1099924128 于 2018-11-26 13:44 编辑
输出数据595Dat是由单片机控制的八个开关。反馈数据OPDat则是单片机接收到的数据,两者8位一一对应。595Dat高电平代表闭合,低电平代表断开。OPDat高电平代表受控器正常打开,低电平代表受控器未打开不正常。
一、比较输出数据595Dat和反馈数据OPDat从而判断是否有报警产生。 例:595Dat为0x80表示最高位开关闭合,若此时OPDat的最高位也为高电平则正常不报警,若OPDat最高位为低电平则产生报警。
通过对char类型数据595Dat与OPDat进行异或处理,Alarm_New=595Dat^OPDat;若Alarm_New不等于0x00则说明595Dat和OPDat其中至少有一位不相同产生报警。
二、若产生报警,按下消音按钮S15,报警消失。此时有两种情况重新触发报警: //S15是低电平触发
1、先断开报警的那路开关再闭合,产生报警。
2、直接闭合一路确定会产生报警的未用开关。
if(S15==0) //消音按钮 30ms扫描
{
if(++Key_Delay>1)
{
Key_Delay=-1000;
S15_fg=1;
}
}
if(S15_fg) //消音
{
Alarm_Old=Alarm_New; //消音时将异或值保存
Alarm_Mode=0; //0:消音 1:报警
XxS15_fg=1;
S15_fg=0;
}
void Alarm(void)
{
Alarm_New=595Dat^OPDat;
if(Alarm_New!=0x00) //595数据与OP输出数据异或结果不为0x00,其中至少一路为1产生报警
{
if(S15_fg) //按下消音键
{
if(Alarm_Old | Alarm_New != Alarm_Old){Alarm_Mode=1;} //此处将新的异或值Alarm_New 与之前保存的Alarm_Old进行或运算,结果等于Alarm_Old说明无报警产生,否则产生报警
else{Alarm_Mode=0;}
}
else //未按下消音键
{
Alarm_Mode=1;
}
}
else //异或结果为0x00,不报警
{
Alarm_Mode=0;
}
}
这个程序在第一次循环时正常,但是之后一直运行S15_fg=0;时的代码,即一直鸣叫,这样消音根本没起作用,望大佬们提供下思路谢谢 |