发生下面这种情况应该怎么做。

img

代码如下:

#include<reg52.h>            //头文件
#include <intrins.h>       //头文件
#include <string.h>            //头文件
#include <stdio.h>            //头文件
#define uchar unsigned char     //宏定义
#define uint unsigned int
#define nop() _nop_()
#define INBUF_LEN 4 //数据长度 
#define  _Nop()  _nop_()        //定义空指令

#define LCD1602_dat P0          //LCD 1602 数据传输IO口

unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};     //IC卡校验地址

sbit LCD1602_rs=P2^5;    //LCD1602控制IO口                 //I/O 定义
sbit LCD1602_rw=P2^6;                     //I/O 定义
sbit LCD1602_e=P2^7;

sbit key_1=P3^5;    //按键控制IO口
sbit key_2=P3^6;    //按键控制IO口
sbit beep=P2^0;    //蜂鸣器控制IO口
sbit men=P1^5;        //门控制IO口



uchar shu[16];        //IC卡 输入输出暂存数组
uchar  RevBuffer[4];  //IC卡序列号暂存数组


uchar state,i;    //系统状态标志位,循环变量
uchar data ms,time,time1;   //50ms定时计数变量,模式倒计时,报警时间计时
bit ka_flag,js,bj,ok;        //检测IC卡标志位,模式操作完成标志位,报警标志位,完成标志位




#include"rc522.c" //RC522标准控制程序


/********************************************************************
* 名称 : delay()
* 功能 : 小延时。                                                     
* 输入 : 无
* 输出 : 无
***********************************************************************/ 
void delay(uint T)
{
    while(T--);
}



/********************************************************************
* 名称 : LCD1602_write(uchar order,dat)
* 功能 : 1602写如数据函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_write(uchar order,dat)                  //1602 一个字节  处理
{
    LCD1602_e=0;
    LCD1602_rs=order;
    LCD1602_dat=dat;
    LCD1602_rw=0;
    LCD1602_e=1;
    delay(1);
    LCD1602_e=0;                                                                                                     
}
/********************************************************************
* 名称 : LCD1602_writebye(uchar *prointer)
* 功能 : 1602写入数据函数  指针式
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_writebyte(uchar *prointer)                   //1602 字符串    处理
{
    while(*prointer!='\0')
    {
        LCD1602_write(1,*prointer);
        prointer++;
    }
}
/********************************************************************
* 名称 : LCD1602_cls()
* 功能 : 初始化1602液晶 
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_cls()                                     //1602 初始化
{
    LCD1602_write(0,0x01);     //1602 清屏 指令
    delay(1500);
    LCD1602_write(0,0x38);     // 功能设置 8位、5*7点阵
    delay(1500);
    LCD1602_write(0,0x0c);     //设置 光标   不显示开关、不显示光标、字符不闪烁
    LCD1602_write(0,0x06);
    LCD1602_write(0,0xd0);
    delay(1500);
}

/********************************************************************
* 名称 : zuce()
* 功能 : 系统注册模式控制程序 
* 输入 : 无
* 输出 : 无
***********************************************************************/
void zuce(void)                                //注册
{
      char  status;
      PcdReset();                                        //复位
      status=PcdRequest(Picc_Reqidl,&RevBuffer[0]);//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
      if(status!=MI_OK)
      { 
        bj=0;
        ka_flag=0;
          return;
     }                          // http://find.qq.com/index.html?version=1&im_version=5389&width=910&height=610&search_target=0#                         
      status=PcdAnticoll(&RevBuffer[0]);//防冲撞,返回卡的序列号 4字节
    if(status!=MI_OK)
    {
        ka_flag=0;
        return;
    }
    status=PcdSelect(&RevBuffer[0]);      //选卡部分
    if(status!=MI_OK)
    {
        ka_flag=0;
        return;
    }
    status = PcdAuthState(0x61,63,DefaultKey,&RevBuffer[0]);// 校验卡密码B  
    if(status!=MI_OK)
    {
        ka_flag=0;
        return;
    }
    ka_flag=1;
    status=PcdRead(60,&shu[0]);      //读取IC卡中的数
    shu[0]=66;
    status=PcdWrite(60,&shu[0]);  //写入IC卡中的数
//    time1=0;
    if(bj==0)
    {
        bj=1;
        beep=0;
        delay(20000);//检测报警
        beep=1;
    }
    ok=1;
                 
}

/********************************************************************
* 名称 : qingchu()
* 功能 : 系统注销模式控制程序 
* 输入 : 无
* 输出 : 无
***********************************************************************/
void qingchu(void)                    //清楚卡号            
{
      char  status;
      PcdReset();                                        //复位
      status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
      if(status!=MI_OK)
      { 
        bj=0;
        ka_flag=0;
          return;
     }                          // http://find.qq.com/index.html?version=1&im_version=5389&width=910&height=610&search_target=0#                         
      status=PcdAnticoll(&RevBuffer[0]);//防冲撞,返回卡的序列号 4字节
    if(status!=MI_OK)
    {
        ka_flag=0;
        return;
    }
    status=PcdSelect(&RevBuffer[0]);      //选卡部分
    if(status!=MI_OK)
    {
        ka_flag=0;
        return;
    }
    status = PcdAuthState(0x61,63,DefaultKey,&RevBuffer[0]);// 校验卡密码B  
    if(status!=MI_OK)
    {
        ka_flag=0;
        return;
    }

    ka_flag=1;
    status=PcdRead(60,&shu[0]);      //读取IC卡中的数
    shu[0]=0;
    status=PcdWrite(60,&shu[0]);  //写入IC卡中的数
//    time1=0;
    if(bj==0)
    {
        bj=1;
        beep=0;
        delay(20000);
        beep=1;
    }
    ok=1;
                 
}

/********************************************************************
* 名称 : jiance()
* 功能 : 系统检测IC卡模式控制程序 
* 输入 : 无
* 输出 : 无
***********************************************************************/
void jiance(void)                                //判断是否开门
{
      char  status;
      PcdReset();                                        //复位
      status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
      if(status!=MI_OK)
      { 
        ok=0;
        bj=0;
        ka_flag=0;
          return;
     }                          // http://find.qq.com/index.html?version=1&im_version=5389&width=910&height=610&search_target=0#                         
      status=PcdAnticoll(&RevBuffer[0]);//防冲撞,返回卡的序列号 4字节
    if(status!=MI_OK)
    {
        ka_flag=0;
        return;
    }
    status=PcdSelect(&RevBuffer[0]);      //选卡部分
    if(status!=MI_OK)
    {
        ka_flag=0;
        return;
    }
    status = PcdAuthState(0x61,63,DefaultKey,&RevBuffer[0]);// 校验卡密码B  
    if(status!=MI_OK)
    {
        ka_flag=0;
        return;
    }

    ka_flag=1;
    status=PcdRead(60,&shu[0]);      //读取IC卡中的数
    if(ok==0)
    {
        if(shu[0]==66)
        {
            men=0;
            js=1;
            ms=0;
            time1=5;

        }else
        {
            men=1;
            js=0;
            ms=0;
            time1=2;    
        }
    }
    if(bj==0)
    {
        bj=1;
        beep=0;
        delay(20000);
        beep=1;
    }
                 
}
/********************************************************************
* 名称 : key()
* 功能 : 按键控制程序                                                     
* 输入 : 无
* 输出 : 无
***********************************************************************/
void key()
{
    if(!key_1)  //判断按键是否按下
    {
        delay(888); //按键延时去抖
        if(!key_1) //在次判断按键是否按下
        {
            while(!key_1);        //按键判断释放
            ms=0;
            time=2;      //执行按键对应的控制内容    切换模式
            state=1;    
        }
    }
    
    if(!key_2) //判断按键是否按下
    {
        delay(888);  //按键延时去抖
        if(!key_2) //在次判断按键是否按下
        {
            while(!key_2);        //按键判断释放
            ms=0;
            time=2;        //执行按键对应的控制内容    切换模式
            state=2;
        }
    }
}

/********************************************************************
* 名称 : show()
* 功能 : LCD1602 液晶显示函数 
* 输入 : 无
* 输出 : 无
***********************************************************************/
void show()
{
    if(state==0)     //模式判断
    {
        if(time1==0)
        {
            LCD1602_write(0,0x80);  //没有检测到IC卡模式显示内容
            LCD1602_writebyte("Please Bush Card");
            LCD1602_write(0,0xC0);
            LCD1602_writebyte("       ()       ");
        }else
        {
            LCD1602_write(0,0x80);    
            if(ka_flag)            //
            {
                LCD1602_writebyte("    ");
                for(i=0;i<4;i++)           //显示IC卡序列号
                {
                    if(RevBuffer[i]/16<10)
                    LCD1602_write(1,0x30+RevBuffer[i]/16);
                    else LCD1602_write(1,0x41+RevBuffer[i]/16-10);
                    if(RevBuffer[i]%16<10)
                    LCD1602_write(1,0x30+RevBuffer[i]%16);
                    else LCD1602_write(1,0x41+RevBuffer[i]%16-10);
                }
                LCD1602_writebyte("    ");
            }
            

            LCD1602_write(0,0xc0);       //显示检测到IC卡的状态
            if(js==1)
            {
                LCD1602_writebyte("   Door Open    ");    
            }else
            {
                LCD1602_writebyte("   Door Close   ");
            }
        }
                
    }else if(state==1)          //注册模式LCD1602液晶显示内容
    {
        LCD1602_write(0,0x80);
        LCD1602_writebyte(" Register Mode  ");
        LCD1602_write(0,0xC0);
        LCD1602_writebyte("      (())      ");

    }else
    {
        LCD1602_write(0,0x80);    //注销模式LCD1602液晶显示内容
        LCD1602_writebyte("   Clear Mode   ");
        LCD1602_write(0,0xC0);
        LCD1602_writebyte("  Bush IC Card  ");
    }
}


/********************************************************************
* 名称 : main()
* 功能 : 主程序                                                     
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
    flag=0;      //标志位初始化
    TMOD=0x01;  //定时器0配置   方式0 定时模式
    TH0=0x3c;       //定时50ms   赋初值
    TL0=0xb0;
    EA=1;       //打开总中断
    TR0=1;       //定时器0启动定时
    ET0=1;       //定时器0中断
    LCD1602_cls();    //LCD1602初始化
    while(1)
    {    
        show();      //调用显示函数
        key();       //调用按键控制程序
        switch(state)    //根据当前模式选择对应的控制程序
        {
            case 0: 
                jiance();      //检测模式
            break;

            case 1:
                zuce();       //注册模式
                if(ok==1) state=0;
            break;

            case 2: 
                qingchu();   //注销模式
                if(ok==1) state=0;
            break;


        }
    }
}

    
void timer() interrupt 1              /*中断*/
{
    TH0=0x3c;        //重新赋值
    TL0=0xb0;
    ms++;        //计时变量计时
    if(ms==20)      //1S定时
    {
        ms=0;        //倒计时
        if(time!=0) time--;
        else state=0;
        if(time1!=0) time1--;
        else men=1;
    }

}


变量未定义,找找这两个变量在哪