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

📄 wg_dt.c

📁 读韦根26程序,将韦根26代码读取到单片机进行显示和处理
💻 C
字号:
 #include <reg52.h> 
 #include <intrins.h> 
 #include <absacc.h> 

/*类型声明*/ 
typedef unsigned char uchar; 
typedef unsigned int  uint; 
typedef unsigned long ulong; 

void  delay(void); 

sbit DATA1_INT0=P3^2; 
sbit DATA0=P1^6; 
uchar ReadIDflag=0;  //读ID卡标计
bit RcvEven; 
bit RcvOdd; 
bit CheckEven=0; //偶校验
bit CheckOdd=1;  //奇校验
bit RCVOK=0; 
uchar RcvWG[3]={0,0,0}; //给26韦根代码分配三个空间
uchar Rcnt=0; 


sbit bell_cl=P1^7;  //蜂鸣器 
sbit WD=P3^5;       //看门狗 
sbit OE2_138=P1^5;  //低有效 

sbit INT_1=P3^3; 	 //触发读卡
uchar COUNT_T0=0; 
ulong flashbell=0; 

#define T0H  0Xf9 
#define T0L  0X85  //1.8ms 
#define NOP5()  _nop_();_nop_();_nop_();_nop_();_nop_()   //5微秒延时
#define selDW_CS_18ADD XBYTE[0X5fff] 
#define selDW_CS_90ADD XBYTE[0X7fff] 
#define selDM_ADD      XBYTE[0X3fff] 

#define EN138          OE2_138=1 
#define DISEN138       OE2_138=0 

uchar code DM[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //     LED显示段码——共阴
uchar code IDindex[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};   //ID索引
uchar ID[10]={0xE9,0xa0,0xa0,0x4f,0x00,0x00,0x00,0x00,0x00,0x00};           //初使化LED显示位

uchar code DW_CS[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfE,0xfD};   //LED显示位
bit  b_ClrDog=0;   //喂狗
uchar ClrDogcount=0; //清狗计数器


void initial(void) 
{ 
  EA=0;                //禁止全局中断
  EN138;              
  bell_cl=1;         //止响;
  COUNT_T0=0;       //T0计数器清0;
  IT0=1;           //下降沿触发中断INT0=1,INT0=0为低电平触发; 
  EX0=1;          //外部中断允许 
  TMOD = 0x11; 	 //T0 
  TH0  = T0H; 
  TL0  = T0L; 
  ET0=1;        //开定时器T0中断
  TR0=1;        //启动定时器0
  EA=1;    //开全局中断
}
 
void  delay(void)        //延时程序;
{ 
 uint i; 
 for(i=125;i>0;i--); 
 }
  
 void v_ClrDog(void)    //喂狗程序;
{ 
    if(b_ClrDog) 
    { 
        b_ClrDog=0; 
        WD=0;NOP5(); 
        WD=1;NOP5(); 
        WD=0; 
    } 
} 

void main (void)  //主程序
{ 
 uchar i=0;
 uchar temp;
 uchar RWGcnt;       //定义变量_读韦根计数器;
 initial();         //初使化单片机
 while(1) 
    { 
      v_ClrDog();                //喂狗;
      if(ReadIDflag==1)          //读卡标致位=1则执行内嵌函数
       {  EA=0;  //禁止全局中断
           if(Rcnt<=1)//读偶校验位1 
           { 
             if(DATA0==0)RcvEven=0; 
             else RcvEven=1; 
           } 
         else if(Rcnt>=26)//读奇校验位26 
           { 
            if(DATA0==0)RcvOdd=0; 
            else RcvOdd=1; 
           } 
         else//读24位卡号数据 
         { 
           
           if(DATA0==0) 
               {if(Rcnt<=9) 
                RcvWG[0]=RcvWG[0]|0x00; 
                else if(Rcnt<=17) 
                RcvWG[1]=RcvWG[1]|0x00; 
                else RcvWG[2]=RcvWG[2]|0x00; 
               }    
           else 
             {  
                if(Rcnt<=9)                   //2~9位 用RcvWG[0]存 
                RcvWG[0]=RcvWG[0]|0x01; 
                else if(Rcnt<=17)              //10~17位 用RcvWG[1]存 
                RcvWG[1]=RcvWG[1]|0x01; 
                else RcvWG[2]=RcvWG[2]|0x01;   //18~25位 用RcvWG[2]存 
                if(Rcnt<=13)CheckEven=~CheckEven; //偶校验 
                else CheckOdd=~CheckOdd;  //奇校验 
              } 
             if(Rcnt<=9) 
            RcvWG[0]=RcvWG[0]<<1; 
            else if(Rcnt<=17) 
            RcvWG[1]=RcvWG[1]<<1; 
            else RcvWG[2]=RcvWG[2]<<1; 
          } 
        ReadIDflag=0; 
        EA=1; 
       } 
        if(Rcnt>26)//26韦根数据读完 
        { 
          if((CheckEven==RcvEven)&&(CheckOdd==RcvOdd))//检验数据是否接受正确 
            { 
               for(i=0;i<10;i++)//显示卡号 
               { 
                 if(RcvWG[0]/16==IDindex[i]) ID[0]= DM[i]; 
                 if(RcvWG[0]%16==IDindex[i]) ID[1]= DM[i]; 
                 if(RcvWG[1]/16==IDindex[i]) ID[2]= DM[i]; 
                 if(RcvWG[1]%16==IDindex[i]) ID[3]= DM[i]; 
                 if(RcvWG[2]/16==IDindex[i]) ID[4]= DM[i]; 
                 if(RcvWG[2]%16==IDindex[i]) ID[5]= DM[i]; 
               } 

               RcvWG[0]=0; 
               RcvWG[1]=0; 
               RcvWG[2]=0; 
               RcvEven=0; 
               RcvOdd=0; 
               CheckEven=0; 
               CheckOdd=1; 
               temp=0; 
               Rcnt=0; 
               RWGcnt=0; 
               RCVOK=1; 

           } 
        } 
        if (RCVOK)//读卡成功后,延时,再开始读下一次 
         { 
          EX0=0; 
          for(i=200;i>0;i--) 
           delay(); 
          EX0=1; 
         } 
        if(ClrDogcount>=20){b_ClrDog=1;ClrDogcount=0;} 
     } 
 } 
void T0_interrupt (void) interrupt 1 using 1    //动态显示3字节卡号数据 
{ 
  EA = 0; 
  TR0 = 0; 
  v_ClrDog(); 
  if(COUNT_T0>=10) COUNT_T0=0; 
  selDW_CS_18ADD=0xff; 
  selDW_CS_90ADD=0xff; 
  selDM_ADD=0x00; 
 if(RCVOK) 	//接收正确显示如下信息
   { 
    switch (COUNT_T0) 
         { 
           v_ClrDog(); 

           case 0:{ selDW_CS_18ADD= DW_CS[0] ; selDM_ADD=ID[0];break;} 
           case 1:{ selDW_CS_18ADD= DW_CS[1] ; selDM_ADD=ID[1];break;} 
           case 2:{ selDW_CS_18ADD= DW_CS[2] ; selDM_ADD=ID[2];break;} 
           case 3:{ selDW_CS_18ADD= DW_CS[3] ; selDM_ADD=ID[3];break;} 
           case 4:{ selDW_CS_18ADD= DW_CS[4] ; selDM_ADD=ID[4];break;} 
           case 5:{ selDW_CS_18ADD= DW_CS[5] ; selDM_ADD=ID[5];break;} 
           case 6:{ selDW_CS_18ADD= DW_CS[6] ; selDM_ADD=ID[6];break;} 
           case 7:{ selDW_CS_18ADD= DW_CS[7] ; selDM_ADD=ID[7];break;} 
           case 8:{ selDW_CS_90ADD= DW_CS[8] ; selDM_ADD=ID[8];break;} 
           case 9:{ selDW_CS_90ADD= DW_CS[9] ; selDM_ADD=ID[9];break;} 

        } 
     } 
  else 		  //接收错误显示如下信息
   {  switch (COUNT_T0) 
         { 
           v_ClrDog(); 

           case 0:{ selDW_CS_18ADD= DW_CS[0] ; selDM_ADD=DM[0];break;} 
           case 1:{ selDW_CS_18ADD= DW_CS[1] ; selDM_ADD=DM[1];break;} 
           case 2:{ selDW_CS_18ADD= DW_CS[2] ; selDM_ADD=DM[2];break;} 
           case 3:{ selDW_CS_18ADD= DW_CS[3] ; selDM_ADD=DM[3];break;} 
           case 4:{ selDW_CS_18ADD= DW_CS[4] ; selDM_ADD=DM[4];break;} 
           case 5:{ selDW_CS_18ADD= DW_CS[5] ; selDM_ADD=DM[5];break;} 
           case 6:{ selDW_CS_18ADD= DW_CS[6] ; selDM_ADD=DM[6];break;} 
           case 7:{ selDW_CS_18ADD= DW_CS[7] ; selDM_ADD=DM[7];break;} 
           case 8:{ selDW_CS_90ADD= DW_CS[8] ; selDM_ADD=DM[8];break;} 
           case 9:{ selDW_CS_90ADD= DW_CS[9] ; selDM_ADD=DM[9];break;} 

        } 
   } 
  v_ClrDog(); 
  ClrDogcount++; 
  COUNT_T0++; 
  TH0 = T0H; 
  TL0 = T0L; 
  TR0 = 1; 
  EA = 1; 
} 
void INT0_interrupt (void) interrupt 0 using 2 
{ 
  EA = 0; 
  ReadIDflag=1; 
  Rcnt++; 
  EA = 1; 
} 

⌨️ 快捷键说明

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