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

📄 xiugai.c

📁 此程序为非接触式IC的读写程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
#define WriteDeviceAddress 0xae    //define 21C02 Read address in IIC
#define ReadDviceAddress 0xaf       //define 21C02 Write address in IIC
#define	READ_JMY5xx	0xA1       //define IC Card Read address in IIC
#define	WRITE_JMY5xx	0xA0       //define IC Card Write address in IIC
#define SUCCESS 0
#define NO_USER	0                  //机器初始为无用户处于等待状态
#define USED	1                  //有卡且为用户卡,机器的有用户状态


//***HD7279A指令******
#define CMD_RESET 0xa4
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88




//*变量及I/O口定义*

sbit cs=P1^2;
sbit clk=P1^1;
sbit dat=P1^0;
sbit key=P3^3;
sbit SCL=P1^5;
sbit SDA=P1^6;
sbit P1_4=P1^4;               //控制继电器
sbit P3_2=P3^2;               //RF模块自动寻卡时候的选通信号

bit flag = NO_USER;           //机器初始状态标志位(无用户)
uchar code ComReadBlock2[]={0x0a,0x21,0x00,0x02,0xff,0xff,0xff,0xff,0xff,0xff}; //Read Block2;
uchar idata ComWriteBlock2[25] = {0x1a,0x22,0x00,0x02,0xff,0xff, 0xff, 0xff, 0xff,0xff,
                                                 0,2,0,5,4,6};

uchar code FengM[]  = {0x03, 0x14, 0x2F} ;
uchar idata money[5];
uchar idata water[4];
uchar idata USERID[9];		                //存储当前用户4位卡号及5位卡内余额
uchar idata moneypkh[2];
uchar idata Key[6];

uchar idata WriteBuffer[30];
uchar idata MissID[20];//掉电的卡号 //注意:MISSID[9]和MISSID[19]分别为掉电标志位
bit MissIDFlag;        //设立一个总的掉电标志位,有掉电则为真,无掉电为假
bit MissIDStop; //当五组掉电写满时,机器不能运行

uchar i,k,xian,wei;
uint g;
uint j;
ulong water_value;
uint waterperkwh;
uint moneyperkwh;
ulong b;
ulong time;                                       //三分钟延时的计数标志
ulong v;
ulong f;        //掉电写ram的时间标志
signed long money_value;                           //卡上的余额
signed long c;                                     //


void long_delay(void);                             //长延时
void short_delay(void);                            //短暂延时
void delay10ms(uchar);                             //延时十秒
void write7279(uchar,uchar);                       //写入到HD7279
void send_byte(uchar);                             //发送一个字节
void DisplayErrorCard(void);                       //display error card
void Write24c02(uchar ch,uchar address);           //write data into 24c02
uchar Read24c02(uchar address);                     //read data from 24c02
uchar receive_byte(void);                          //接收一个字节
uchar JMY_TRANS(uchar idata *cTransceiveData);     //
void DisplayCard(void);

//初始化计数器0**中断初始化
void clock0_initial() reentrant using 0  //初始化计数器0
{
     TR0=0;
     TMOD=0x05;              //设置计数器0工作在计数状态,模式1
     TCON=0x00;
     TH0=0xff;               //设置的计数初值(65506),每30个外部脉冲溢出
     TL0=0xfa;
     IE=0x82;                //打开计数器0中断允许,开启中断
     TR0=1;                  //启动计数器0
     water_value=0;          //每次用户使完后在下一个用户进入中断钱,水值清0
     PT0=1;                  //定时/计数器0高优先级
}

//初始化定时器1
void clock1_initial() reentrant using 0  //初始化定时器1
{
     TMOD=0x01;               //设置定时器1工作在定时状态,模式1
     TCON=0x00;
     TH1=0x27;                //延时60ms
     TL1=0xfc;
     IE=0x88;                 //中断允许
     TR1=1;                   //启动定时器1
     time=0;
}


//*****主函数
void main()
{
     uchar idata cTransBuffer[30];
     //uchar idata WriteBuffer[30];
     //uchar idata MissID[20];//掉电的卡号 //注意:MISSID[9]和MISSID[19]分别为掉电标志位
     //bit MissIDFlag;        //设立一个总的掉电标志位,有掉电则为真,无掉电为假
     //bit MissIDStop; //当五组掉电写满时,机器不能运行
     time=0;
     f=0;
     g=0;
     send_byte(CMD_RESET);
     water_value=0;
     P1_4=1;   //关继电器
     v=10*Read24c02(4)+Read24c02(5);   //xx度电需要扣的钱数
     for(i=0;i<=5;i++)
     {
       Key[i]=Read24c02(i+6);     //读用户卡密码
     }
     for(i=0;i<=3;i++)
      {
      water[i]=Read24c02(i);      //读水
      }
      //读掉电标志位
      MissID[10]=Read24c02(30);
      MissID[11]=Read24c02(40);
      MissID[12]=Read24c02(50);
      MissID[13]=Read24c02(60);
      MissID[14]=Read24c02(70);
      MissID[15]=Read24c02(80);
      MissID[16]=Read24c02(90);
      MissID[17]=Read24c02(100);
      MissID[18]=Read24c02(110);
      MissID[19]=Read24c02(120);
      ///
     MissIDFlag=MissID[10]||MissID[11]||MissID[12]||MissID[13]||MissID[14]||MissID[15]||MissID[16]||MissID[17]||MissID[18]||MissID[19];
     MissIDStop=MissID[10]&&MissID[11]&&MissID[12]&&MissID[13]&&MissID[14]&&MissID[15]&&MissID[16]&&MissID[17]&&MissID[18]&&MissID[19];
////////////////////////////////////////////
   while(1)
   {
/////第一组
    if(MissID[10]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)

      {
       Write24c02(USERID[i],i+21);
      }
      Write24c02(1,30); //掉电标志位有掉电则为1
     }
    }
/////第二组
    else if(MissID[11]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)
      {
       Write24c02(USERID[i],i+31);
      }
      Write24c02(1,40); //掉电标志位有掉电则为1
     }
    }
/////第三组
    else if(MissID[12]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)
      {
       Write24c02(USERID[i],i+41);
      }
      Write24c02(1,50); //掉电标志位有掉电则为1
     }
    }
//////第四组
    else if(MissID[13]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)
      {
       Write24c02(USERID[i],i+51);
      }
      Write24c02(1,60); //掉电标志位有掉电则为1
     }
    }
/////第五组
    else if(MissID[14]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)
      {
       Write24c02(USERID[i],i+61);
      }
      Write24c02(1,70); //掉电标志位有掉电则为1
     }
    }
/////第6
    else if(MissID[15]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)
      {
       Write24c02(USERID[i],i+71);
      }
      Write24c02(1,80); //掉电标志位有掉电则为1
     }
    }
/////第7
    else if(MissID[16]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)
      {
       Write24c02(USERID[i],i+81);
      }
      Write24c02(1,90); //掉电标志位有掉电则为1
     }
    }
/////第8
    else if(MissID[17]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)
      {
       Write24c02(USERID[i],i+91);
      }
      Write24c02(1,100); //掉电标志位有掉电则为1
     }
    }
/////第9
    else if(MissID[18]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)
      {
       Write24c02(USERID[i],i+101);
      }
      Write24c02(1,110); //掉电标志位有掉电则为1
     }
    }
/////第10
    else if(MissID[19]==0)
    {
     if(f==2||g==1)
     {
      f=0;
      g=0;
      for(i=0;i<=8;i++)
      {
       Write24c02(USERID[i],i+111);
      }
      Write24c02(1,120); //掉电标志位有掉电则为1
     }
    }
///////////////////////////////////////////////

    if(flag==NO_USER&&time>18000)
    {
    ET1=0;            //关闭定时器1中断
    time=0;
    memcpy(cTransBuffer,FengM,sizeof(FengM)); //设置蜂鸣器
    JMY_TRANS(cTransBuffer);
    P1_4=1;   //关继电器
    }
    if(flag==USED)
    {
        if(money_value<0)
        {
          P1_4=1;   //关继电器
          IE=0x00;  //关所有中断
          flag=NO_USER;
         send_byte(CMD_RESET);
         for(i=0;i<3;i++)
         {
          write7279(DECODE0+i,0);
          write7279(SEGON,23);
         }
         delay10ms(60);
         send_byte(CMD_RESET);
         memcpy(cTransBuffer,FengM,sizeof(FengM)); //设置蜂鸣器
         JMY_TRANS(cTransBuffer);
         if(MissID[10]==0)
         Write24c02(0,30); //复位掉电标志位
         else if(MissID[11]==0)
         Write24c02(0,40); //复位掉电标志位
         else if(MissID[12]==0)
         Write24c02(0,50); //复位掉电标志位
         else if(MissID[13]==0)
         Write24c02(0,60); //复位掉电标志位
         else if(MissID[14]==0)
         Write24c02(0,70); //复位掉电标志位
         else if(MissID[15]==0)
         Write24c02(0,80); //复位掉电标志位
         else if(MissID[16]==0)
         Write24c02(0,90); //复位掉电标志位
         else if(MissID[17]==0)
         Write24c02(0,100); //复位掉电标志位
         else if(MissID[18]==0)
         Write24c02(0,110); //复位掉电标志位
         else if(MissID[19]==0)
         Write24c02(0,120); //复位掉电标志位
        }
    }
   while(P3_2==0)   //不断的检测是否有卡,有卡则执行以下程序
     {
       ET1=0;            //关闭定时器1中断
       time=0;
       memcpy(cTransBuffer,ComReadBlock2,sizeof(ComReadBlock2)); //Read block2
       JMY_TRANS(cTransBuffer);
        //在这里需要添加加密解密程序
        //if(cStatus==0&&cTransBuffer[1]==ComReadBlock2[1])
        if(flag == NO_USER)     //判断标志位确定机器状态
        {

        if(cTransBuffer[2]==0x01&& cTransBuffer[3]==0x02&&cTransBuffer[4]==0x03&&cTransBuffer[5]==0x04)
            {
             P1_4=1;   //关继电器
             for(i=0;i<=11;i++)
               {
               Write24c02(cTransBuffer[i+6],i);  //write cTransBuffer into 24c02 0-11 adress
               }
             for(i=0;i<=5;i++)
                {
                  Key[i]=Read24c02(i+6);
                }
                /*
                Write24c02(0,30);
                Write24c02(0,40);
                Write24c02(0,50);
                Write24c02(0,60);
                Write24c02(0,70);
                Write24c02(0,80);
                Write24c02(0,90);
                Write24c02(0,100);
                Write24c02(0,110);
                Write24c02(0,120);*/
              continue;
            }


        else if(cTransBuffer[2]==Key[0]&&cTransBuffer[3]==Key[1]&&cTransBuffer[4]==Key[2]&&cTransBuffer[5]==Key[3]&&cTransBuffer[6]==Key[4]&&cTransBuffer[7]==Key[5])
            {

////////////////掉电回刷部分
                if(MissIDFlag==1)   //先判断总掉电标志位
                {
///////////////////第一组
                if(MissID[10]==1)
                {
                 for(i=0;i<=8;i++)
                 {
                  MissID[i]=Read24c02(i+21);
                 }
                 if(MissID[0]==cTransBuffer[8]&&MissID[1]==cTransBuffer[9]&&MissID[2]==cTransBuffer[10]&&MissID[3]==cTransBuffer[11])
                 {
                 for(i=0;i<=8;i++)
                 {
                  ComWriteBlock2[i+16]=MissID[i];
                 }
                 memcpy(WriteBuffer,ComWriteBlock2,sizeof(ComWriteBlock2)); //写卡的块2
                 JMY_TRANS(WriteBuffer);
                 MissID[10]=0;
                 Write24c02(0,30); //复位掉电标志位
                 DisplayCard();  //回刷显示子函数
                 delay10ms(1000);
                 send_byte(CMD_RESET);
                 break;
                 }
                }
///////////////////第2组
                if(MissID[11]==1)
                {
                 for(i=0;i<=8;i++)
                 {
                  MissID[i]=Read24c02(i+31);
                 }
                 if(MissID[0]==cTransBuffer[8]&&MissID[1]==cTransBuffer[9]&&MissID[2]==cTransBuffer[10]&&MissID[3]==cTransBuffer[11])
                 {
                 for(i=0;i<=8;i++)
                 {
                  ComWriteBlock2[i+16]=MissID[i];
                 }
                 memcpy(WriteBuffer,ComWriteBlock2,sizeof(ComWriteBlock2)); //写卡的块2
                 JMY_TRANS(WriteBuffer);
                 MissID[11]=0;
                 Write24c02(0,40); //复位掉电标志位
                 DisplayCard();
                 delay10ms(1000);
                 send_byte(CMD_RESET);
                 break;
                 }
                }
///////////////////第3
                if(MissID[12]==1)
                {
                 for(i=0;i<=8;i++)
                 {
                  MissID[i]=Read24c02(i+41);
                 }
                 if(MissID[0]==cTransBuffer[8]&&MissID[1]==cTransBuffer[9]&&MissID[2]==cTransBuffer[10]&&MissID[3]==cTransBuffer[11])

⌨️ 快捷键说明

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