⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intermit.c

📁 一体化锁主程序
💻 C
字号:
#include "KKZQ.H"

//
//=====================================================================================
//                  RAM资源
//   占用 17 个字节
//                       rcard_buf[6]      6个字节        卡号接收缓冲区
//                       time_100ms_count  1个字节        100ms计数器
//                       time_500ms_count  1个字节        500ms计数器
//                       time_2s_count     1个字节        2s计数器
//                       byte_num          1个字节        韦根通讯用
//                       length            1个字节        接收到韦根通讯计数器
//                       watch_car_time    1个字节        韦根监视器计数器
//uchar idata oplock_on_time;               //程序使用的开锁继电器持续导通时间
//uchar idata slock_on_time;                //开锁继电器持续导通时间
//uchar idata sopen_wait_time;              //开门后等待时间 (即延迟关门时间)
//idata uchar opopen_wait_time;             //程序使用的开门等待进入时间
//idata uchar set_input_reg;                //设置的信号采集方式及监控方式寄存器
//===================================================================================
//               EEPROM    地址分配
//   0x0000  -  0x1000        256 x 16字节  用户信息存储区 最大250个用户信息  占用64页 EEPROM
//   0x1000  -  0x3000        512 x 16字节  事件存储区 (最多存储512事件)      占用128页EEPROM
//   0x3000  -  0x3040        4   x 16字节  工作日准进时段  (4张表格 每个表格对应4个准进时段,一张表格占用16个字节)
//   0x3040  -  0x3050        1   x 16字节  非工作日准进时段(1张表格     表格对应4个准进时段,一张表格占用16个字节)
//   0x3080  -  0x3e80        16 x 7 x 32   星期准进时段-->对应16张表格   每个表格包含7天(星期一 --- 星期日)
//                                                                        每天包含6个准进时段 每个时段4个字节
//                                                                        (每天的时段24个字节,占用EEPROM半页)
//   0x3e80  -  0x3f80        2 x  128     节假日时间存储区(最多保存128个假日)  每个节日占用2个字节 xx:yy   xx 月  yy 日

//
//   0x3fc0  -  0x3fc1        刷卡器用户数量
//   0x3fc2  -  0x3fc3        休息日设定存储区    每星期2天
//   0x3fc4                   门锁继电器执行时间  最大25.6秒
//   0x3fc5                   开门后延迟时间  最大25.6秒
//   0x3fc6  -  0x3fca        历史事件计数器,当前历史纪录序号存储区 5个字节
//   0x3fcb                   节假日天数计数器
//===========================================================================================


bit time_10ms_flag=0;
bit time_100ms_flag=0;

bit buz_flag=0;      //=1,蜂鸣器当前处于工作状态
bit buz_on_flag=0;   //=1,蜂鸣器当前处于通电状态

bit wait_hopflag=0;       //=1,手动开门动作已发出,等待开门标志
bit time_1s_flag=0;       //1秒时间到
bit w1s_flag=0;           //上电时间超过1秒

uchar buz_on=10;     //蜂鸣器鸣叫时通电时间
uchar buz_num=0;     //蜂鸣器鸣叫次数

uchar time_1s=10;

uchar idata rcard_buf[12];             //卡号接收缓冲区
uchar idata time_100ms_count=0;
uchar idata door_state_shake;

uchar idata addr_shake=0;
uchar idata addr_reg=0;
uchar idata handshake;



void state_din();               //读钥匙开门,手动开门及门磁状态
void read_addr(void);           //读本机地址
void init(void);                //初始化函数
void read_wdata();
void clr_card_buf();
void proc_10ms();

void init(void)
{
    P0 = 0xff;
    P1 = 0xdf;
    P2 = 0xff;
    P3 = 0xfb;

    TMOD= 0x01;
    SCON= 0X50;
    TH0 = 0xdc;
    TL0 = 0x30;

  //--------------------------------------------------
  //  通讯初始化
    RCAP2H=0XFF;         //9600波特率
    RCAP2L=0Xdc;
    TH2=0XFF;
    TL2=0Xdc;
    T2CON=0X34;

    com_step=0;
    com_num=0;             //清接收计数器
    com_acc=0;             //累加和
    time_100ms_count=0;
    clr_card_buf();

    read128buf(1,index_addr);       //用户卡数量
    card_index=eeprom_buf[0];

    TR0 = 1;
    IE=0X92;
}
//==============================================================================
//filename : time_0
//功    能 : 定时器0中断处理程序,定时时间 10ms
//           1.  监视读卡完毕时刻, 如果读卡器在30MS时间内不再有新脉冲出现
//               认为读卡结束
//           2.  监视通讯是否中断, CPU 与上位机链路接通处于接收数据状态,
//               如果 30MS 时间内不再有新脉冲出现,认为掉线,停止接收
//           3.  同步键盘去抖
//==============================================================================
//
void time_0(void) interrupt 1
{   TL0=0xb0; TH0=0xdc;
    time_10ms_flag=1;
    if(buz_flag)     //蜂鸣器当前处于工作状态
    {   if(--buz_on==0)
        {   if(buz_on_flag) //上一个周期蜂鸣器处于通电状态
            {   buz_on_flag=0; buzzer=1;//关蜂鸣器
                if(--buz_num==0)buz_flag=0;
                else buz_on=40;
            }
            else{buz_on_flag=1; buzzer=0; buz_on=10;}//开蜂鸣器
        }
    }
    if(++time_100ms_count>=10)
    {   time_100ms_count=0; time_100ms_flag=1;
        time_10ms_flag=0; w1s_flag=1;           //上电时间超过1秒
        if(--time_1s==0)
        {   time_1s=10;  time_1s_flag=1;       //1秒时间到
            time_100ms_flag=0;
            if(link_flag){if(--link_time==0)link_flag=0;}
        }
    }
}

//
//==========================================================================================
//
// filename : state_din()
// 功    能 : 读钥匙开门,手动开门及门磁状态
//            wait_hopflag=1;   手动开门动作已发出,等待开门标志
//            mon_open_flag=1;  正在监视开门过程
//            door_open_flag=1; 当前门处于开状态
// 返 回 值 :
//
//==========================================================================================
//uchar sys_state2;       //远程监控用系统状态信息
// D7      紧急驱动输入
// D6      联动输入2
// D5      联动输入1
// D4 = 0, 联动输出继电器关闭     =1 加电驱动
// D3 = 0, 门关闭,                =1 门开启
// D2 = 0, 红外输入正常           =1 报警
// D1 = 0, 手动按键松开           =1 按下
// D0 = 0, 门控电磁继电器关闭     =1 加电驱动
//
//uchar sys_state1;       //远程监控用系统状态信息
// D7 = 0, 实时时钟芯片工作正常
// D6 = 0, 数据存储器工作正常
// D5 = 0, 系统共电电源工作正常
// D4      保留
// D3 = 0, 不监视门磁,            =1 监视门磁
// D2 = 0, 不监视红外,            =1 监视红外
// D1 = 0, 门控电磁继电器关闭,    =1 门控电磁继电器处于加电状态
// D0 = 0, 正常工作,              =1 处于报警状态
//
void state_din()
{
    P2=0XFF;
    handshake<<=1;
    if((!hand_open)||(!key_open))handshake|=1;
    if(handshake==0xff)           //检测到手动开门
    {   sys_state2|=0x02;
        if((!wait_hopflag)&&(!mon_open_flag))
        {   wait_hopflag=1;       //手动开门延时标志时间
            hand_step=1;
            door_aralm_flag=0;    //清开门告警标志
            hwait_time=50;        //手动开门延时时间=5秒
            if(door_open_flag)mark023_status|=0x40; //设置门原来是处于打开状态
            else mark023_status&=0x30;
        }
    }
    else if(handshake==0)sys_state2&=0xfd;
//--------------------------------------------------------------------------
//读门磁状态
    door_state_shake<<=1;
    if(door_pin)door_state_shake|=1;
    if(door_state_shake==0xff){sys_state2|=0x08;door_open_flag=1;}  //开门状态
    else if(door_state_shake==0){sys_state2&=0xf7;door_open_flag=0;}//关门状态

}
//==============================================================================
//filename : read_addr
//功    能 : 读本机地址和通讯波特率
//           D7 = 0    波特率 = 19200dps   ON
//           D7 = 1    波特率 =  9600dps   OFF
//           D6 - D0   本机通讯地址
//==============================================================================
void read_addr()
{   uchar i,j,s;
    P0=0XFF; s=P0;
    j=0;
    for(i=0;i<6;i++)
    {   j>>=1;
        if(s&0x80)j|=0x20;
        s<<=1; 
    }
    addr_shake<<=1;
    if(j!=addr_reg)addr_reg=j;
    else
    {   addr_shake|=1; //上次读取的本机地址
        if(addr_shake==0xff)
        {   i=j/16;
            if(i>9)txd_buf[2]=i+0x37;else txd_buf[2]=i+0x30;
            i=j&0x0f;
            if(i>9)txd_buf[3]=i+0x37;else txd_buf[3]=i+0x30;
        }
    }
    txd_buf[0]=0x31; txd_buf[1]=0x30;
    txd_buf[4]=0x38; txd_buf[5]=0x30;

   
}

//==============================================================================
//filename : read_wdata()
//功    能 : 与读头通讯, 采用串行移位寄存器方式发送数据,dt1传送数据
//           dt0 传送同步时钟,在 dt0=0时数据有效,dt0=1时改变数据
//
//==============================================================================
void read_wdata()
{

    uchar i,j,k,s;
    next_card_flag=0;
    i=0;j=0;
    while(i<12)
    {   if(ready){clr_card_buf();next_card_flag=1;return;}
        dt0=0; rcard_buf[i]<<=1;
        if(dt1)rcard_buf[i]|=1;
        if(++j>7){j=0;++i;}
        dt0=1; k=5;
        while(k)--k;
    }
    dt0=1;
    if(rcard_buf[11]!=0x12){clr_card_buf();next_card_flag=1;return;}

//------------------------------------------------------------------------------
//判断程序接收到的数据是否正确
    if(rcard_buf[10]&0x01){clr_card_buf();next_card_flag=1;return;} //最后1位=1 则错误
    k=0; s=1;
    for(i=0;i<10;i++)         //列校验,偶校验; 行校验,异或校验;
    {   j=rcard_buf[i];
        if(j&0xe0){clr_card_buf();next_card_flag=1;return;}
        ACC=j; if(P){clr_card_buf();next_card_flag=1;return;}
        k^=j;
        if(i>1)
        {   j>>=1;                  //计算列校验值
            if((i&0x01)==0)rcard_buf[s]=j*16;
            else {rcard_buf[s]+=j;++s;}
        }
    }
    k^=rcard_buf[10]; k&=0x1e;
    if(k){clr_card_buf();next_card_flag=1;return;}
    rcard_buf[0]=0;
    for(i=0;i<5;i++)set_user_buf[i]=rcard_buf[i];
    for(i=0;i<12;i++)rcard_buf[i]=0;

    open_order=card_open();
    if(open_order!=0){next_card_flag=1;buz_num=3;}
    else buz_num=1;
    buzzer=0; buz_flag=1; buz_on_flag=1; buz_on=10;
    save_open_record();

}


void clr_card_buf()
{
    uchar i;
    for(i=0;i<12;i++)rcard_buf[i]=0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -