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

📄 w26.c

📁 AVR下的WG26中断接收函数及相关资料说明
💻 C
字号:
#include <REG51.H>
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

#define time0 100  //150us
#define time1 234  //350us
#define time2 450  //675us

sbit    spek = P3^7;
uint    out_delay;

sbit    g_led = P1^7;
sbit    r_led = P1^6;


sbit  data0 = P3^4;
sbit  data1 = P3^5;

//***卡号处理的有关定义***************
uchar aux_buffer0[3],aux_buffer1[3],aux_buffer2[3];
uchar aux_point;
bit aux_flag;


//读卡头内部变量
sbit rf_data1 = P3^6;
bit inbak = 1;
uint temp;
uchar overtime;
uchar byte_buffer[5];

/*********************************************************/
//***发送位数据*******************************************/
//********************************************************/
void  send_bitdata( bit databit)
{
    //发送数据1
    if( databit )
     {
        data1 = 0;
        out_delay = 15;
        while( --out_delay );
        data1 = 1;
        out_delay = 150;
        while( --out_delay );
     }

     //发送数据0
     else
     {
        data0 = 0;
        out_delay = 15;
        while( --out_delay );
        data0 = 1;
        out_delay = 150;
        while( --out_delay );
     }
}

/*********************************************************/
//***发送数据*********************************************/
/*********************************************************/
bit senddata(void)
{
        uint H12bit;  //用于前12位的校验
        bit  H12bit_verify = 0, L12bit_verify = 1;
        uchar i;
        ulong send_24bit;  //待发送的24位卡数据

        H12bit  = byte_buffer[1];  H12bit <<= 8;
        H12bit |= byte_buffer[2];

        send_24bit |= byte_buffer[1];  send_24bit <<= 8;
        send_24bit |= byte_buffer[2];  send_24bit <<= 8;
        send_24bit |= byte_buffer[3];  send_24bit <<= 8;

        //求前12位的校验位
        for(i=0;i<12;i++)
         {
            H12bit <<= 1;
            if(CY) H12bit_verify = !H12bit_verify;
         }
         send_bitdata( H12bit_verify );

         //发送卡数据
         for(i=0;i<24;i++)
         {
             send_24bit <<= 1;
             send_bitdata( CY );
             if( i>11 && CY ) L12bit_verify = !L12bit_verify;  //求后12位的校验位
         }
         send_bitdata( L12bit_verify );
}
/*********************************************************/
/***等待电平跳变******************************************/
/*********************************************************/
void wait_change(void)
{
   overtime = 0;
   while(inbak == rf_data1)
   {
     if(++overtime == 0x0ff)
      aux_flag = 0;
   }
   temp = TH0; temp <<= 8;
   temp |= TL0;
   TH0 = 0; TL0 = 0;
   inbak = rf_data1;
}
//*****************************************************************************************/
//返回:读卡成功标记,成功读卡数据放在 byte_buffer[4]中
//*****************************************************************************************/
bit read_IDka(void)
{
   unsigned char i, j;
   unsigned char verify_byte, verify_row;
   unsigned char five_bit, bit_buffer[11];
   bit verify_bit;

        //确定起始标识
         wait_change();
         if( temp<time1 || inbak==1 )  return(0);

         for(i=0;i<16;i++)
          {
              wait_change();
              if(temp>time1 || temp<time0) return(0);
          }


         r_led = !r_led;
        //保存位数据
           for(i=0; i<11; i++)
            {
                 five_bit = 0;
                 for(j=0; j<5; j++)
                  {
                       five_bit <<= 1;
                       wait_change();
                       if(temp<=time1)
                        {
                            if(temp<time0) return(0);
                            wait_change(); //有空跳
                            if(temp<time0 || temp>time1) return(0);
                        }

                        else if(temp>time2) return(0);
                             if( inbak == 0 )  five_bit |= 0x01;
                  }
                  bit_buffer[i] = five_bit;
            }

          //行校验
            for(i=2;i<10;i++)
             {
                  verify_bit = 0;
                  verify_byte = bit_buffer[i];
                  for(j=0;j<5;j++)
                   {
                        if( verify_byte & 0x01 ) verify_bit = !verify_bit;
                        verify_byte >>= 1;
                   }

                   if( verify_bit ) return(0);
              }

          //列校验
            verify_row = 0x02;
            for(i=0;i<4;i++)
             {
                   verify_bit = 0;
                   for(j=0;j<11;j++)
                    {
                       verify_byte = bit_buffer[j];
                       if( verify_byte & verify_row )  verify_bit = !verify_bit;
                    }

                   if( verify_bit ) return(0);
                   verify_row <<= 1;
              }

           //合并成4个字节
             for(i=0,j=2;i<4;i++)
              {
                    bit_buffer[j] <<= 3;  bit_buffer[j] &= 0xf0; //高字节
                    five_bit = bit_buffer[j];   j++;
                    bit_buffer[j] >>= 1;  bit_buffer[j] &= 0x0f; //低字节
                    byte_buffer[i] = five_bit | bit_buffer[j];  j++;
              }
              return(1);
 }
//******************************************************************************************/
//主程序开始
//******************************************************************************************/
main()
{
  SCON = 0x50;
  TMOD = 0x21;
  TH0 = 0xf0;
  TL0 = 0x00;
  TR0 = 1;

 while(1)
 {


       r_led = 0;
      if( read_IDka()&& aux_flag == 0)
       {
          aux_buffer0[aux_point] = byte_buffer[1];
          aux_buffer1[aux_point] = byte_buffer[2];
          aux_buffer2[aux_point] = byte_buffer[3];
          aux_point++;
          if(aux_point == 3)
           {
                aux_point = 0;
                if(     aux_buffer0[0] == aux_buffer0[1] && aux_buffer0[1] == aux_buffer0[2]
                     && aux_buffer1[0] == aux_buffer1[1] && aux_buffer1[1] == aux_buffer1[2]
                     && aux_buffer2[0] == aux_buffer2[1] && aux_buffer2[1] == aux_buffer2[2])
                  {
                         aux_flag = 1;

                          senddata();
                          spek = 0;  g_led = 0;
                          out_delay = 0x3fff; //0x0ffff = 390ms
                          while(--out_delay);
                          spek = 1;  g_led = 1;
                  }
           }
       }
  }//***end while(1)
}//*****end main()

⌨️ 快捷键说明

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