打印

关于按键消音后二次报警的程序设计

[复制链接]
699|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xhd1099924128|  楼主 | 2018-11-26 14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
输出数据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;时的代码,即一直鸣叫,这样消音根本没起作用,望大佬们提供下思路谢谢

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

15

帖子

1

粉丝