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

📄 -

📁 转载 曼码调制的非接触ID卡通用读卡程序编制 C语言代码程序如下: . /*H4001只读卡读码程序*/
💻
📖 第 1 页 / 共 2 页
字号:


                                                 TF0=0;


                                                 goto str;


                                          }


                                   }


                                   TH0=0xff;                                          //time:300us


                                   TL0=0x6a;


                                   temp=~RF_DATA_IN;


                                   temp1=(temp1<<1)|temp;


                                   BitCounter--;                   


                            }while(BitCounter);                               //一个字节完否


                            *(PData+ByteCounter)=temp1;                 //将一字节数据存入缓存数组


                            temp1=0;


                            BitCounter=5;


                            ByteCounter++;


                            WATCHDOG=~WATCHDOG;


                     }while(ByteCounter<10);


                     do


                     {                     


                            WATCHDOG=~WATCHDOG;


                            while(TF0==0);                                    //等待一个位周期


                            TF0=0;


                            if(RF_DATA_IN==1) temp=1;


                            else temp=0;


                            while(RF_DATA_IN==temp)                         //检测电平跳变否?


                            {


                                   if(TF0==1)                     //如果300us计时到还未跳变,视为非法电平!!!


                                   {


                                          TR0=0;


                                          TF0=0;


                                          goto str;


                                   }


                            }


                            TH0=0xff;                                          //time:300us


                            TL0=0x6a;


                            temp=~RF_DATA_IN;


                            temp1=(temp1<<1)|temp;


                            pc--;                     


                     }while(pc);                                                        //一个字节完否


                     Read_RF_Data[10]=temp1;                                   //将一字节数据存入缓存数组


///////////////////检测最后一个停止位


                     while(TF0==0);


                     TR0=0;


                     TF0=0;


                     if(RF_DATA_IN==1) temp=1;


                     else temp=0;


                     while(RF_DATA_IN==temp)                  //检测电平跳变否?


                     {


                            if(TF0==1)                            //如果300us计时到还未跳变,视为非法电平!!!


                            {


                                   TR0=0;


                                   TF0=0;


                                   goto str;


                            }


                     }


                     temp=~RF_DATA_IN;


                     if(temp==0)                                   //如果停止位正确


                     {


                            Check_Data_bit=1;          //置效验请求标志


                     }


                     else                                     //如果停止位不正确


                     {


                            Clern_Number();                    //清除


                     }


              }


       }


}


/*********************************************/


                            /*效验数据*/


/*********************************************/


void Check_Data(void)


{


/////////////////////定义局部变量


       uchar  temp;


       uchar  temp1;


       uchar  ByteCounter;                                      //数组计数器


       uchar  ByteCounter1;


       uchar  *PData;


       uchar  *PData1;


////////////////////初如化变量值


       PData=Read_RF_Data;


       PData1=ID_Data;


       temp=0;


       temp1=0;


       ByteCounter=0;


       ByteCounter1=0;


/////////////////////循环效验       


       WATCHDOG=~WATCHDOG;


/////////////////////行校验


       for(ByteCounter1=0;ByteCounter1<5;ByteCounter1++)//有5个字节数据


       {


              temp=(((*(PData+ByteCounter))&0x10)>>4)+(((*(PData+ByteCounter))&0x08)>>3)+(((*(PData+ByteCounter))&0x04)>>2)+(((*(PData+ByteCounter))&0x02)>>1);     


              if((temp&0x01)==((*(PData+ByteCounter))&0x01))//效验高4位


              {


                     temp1=(*(PData+ByteCounter)&0xfe)<<3;


                     ByteCounter++;


                     temp=(((*(PData+ByteCounter))&0x10)>>4)+(((*(PData+ByteCounter))&0x08)>>3)+(((*(PData+ByteCounter))&0x04)>>2)+(((*(PData+ByteCounter))&0x02)>>1);     


                     if((temp&0x01)==((*(PData+ByteCounter))&0x01))//效验高4位


                     {


                            *(PData1+ByteCounter1)=temp1|((*(PData+ByteCounter)&0xfe)>>1);//高低位生成一个字节存入数组


                            ByteCounter++;


                     }


                     else


                     {


                            ByteCounter1=5;//只要有一组不对则退出效验


                            Clern_Number();//并清所有数据


                     }


              }


              else


              {


                     ByteCounter1=5;//只要有一组不对则退出效验


                     Clern_Number();//并清所有数据


              }


              WATCHDOG=~WATCHDOG;


       }


/////////////////////列校验


//......因没有必要所以先省略此处.........//


/////////////////////生成校验和,并发送出去


       if(ByteCounter==10)


       {


              ID_Data[5]=ID_Data[0]+ID_Data[1]+ID_Data[2]+ID_Data[3]+ID_Data[4];//生成校验和


              if(MSEL==0)    //此脚如果为低电位,为异步通信方式发送数据


              {


                     CP=0;


                     delay0_2ms(1);


                     Send_RS232net(ID_Data,6);       //调用串口发送函数


                     delay0_2ms(1);


                     CP=1;


              }


              Clern_Number();


              dida(1);


              delay0_2ms(1000);//*****(正确读取一张卡号后要等待约一秒后再重新扫描)*****


       }


}


//************************************************************


                                   /*清暂存器*/


//************************************************************


void Clern_Number(void)


{


       WATCHDOG=~WATCHDOG;


       Read_RF_Data[0]=0;


       Read_RF_Data[1]=0;             


       Read_RF_Data[2]=0;      


       Read_RF_Data[3]=0;             


       Read_RF_Data[4]=0;      


       Read_RF_Data[5]=0;             


       Read_RF_Data[6]=0;      


       Read_RF_Data[7]=0;             


       Read_RF_Data[8]=0;      


       Read_RF_Data[9]=0;             


       Read_RF_Data[10]=0;    


                                                                      


       ID_Data[0]=0;


       ID_Data[1]=0;


       ID_Data[2]=0;


       ID_Data[3]=0;


       ID_Data[4]=0;


       ID_Data[5]=0;


}


//**********************************************************


                                   /*串行口发送,接收程序*/


//**********************************************************


void Send_RS232net(uchar Data[],uchar Num)             //串行口数据发送


{


       uchar i=0;


       uchar *PData;


       PData=Data;


       WATCHDOG=~WATCHDOG;


       TH1=0xf3;                     //串行口波特率2400b/s


       TL1=0xf3;


       TR1=1;


       for(i=0;i<Num;i++)//有Num组号码要发送


       {


              SBUF=*(PData+i);


              while(TI==0);TI=0;//等待数据发送出去


              delay0_2ms(1);//等待后再发送


       }


       TR1=0;


}


//*****************************************************


                            /*延时0.2ms*count*/


//*****************************************************


void delay0_2ms(uint count)


{


    uint k;


       while(count--!=0)


       {


        for(k=0;k<50;k++)


                {


                      WATCHDOG=~WATCHDOG;


                }


       }


}


void delay1ms(uint count)


{


    uint k;


       while(count--!=0)


       {


        for(k=0;k<250;k++)


                {


                      WATCHDOG=~WATCHDOG;


                }


       }


}


//*****************************************************


                                   /*鸣叫声*/


//*****************************************************


void dida(uchar j)


{


    uchar i;   


    for(i=0;i<j;i++)


    {


        DD=~DD;


        delay1ms(30);


        DD=~DD;


              delay1ms(30);        


    }


}


/////////////////////////////////////////////////////// 

⌨️ 快捷键说明

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