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

📄 -

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

 曼码调制的非接触ID卡通用读卡程序编制
C语言代码程序如下:



. 



                                          /*H4001只读卡读码程序*/


/******************头文件********************/


#include <AT89X52.h>


#include <absacc.h>


#include <intrins.h>


/******************宏定义*********************/


sbit P17  = P1^7;      sbit P37   = P3^7;


sbit P16  = P1^6;      sbit P36   = P3^6;


sbit P15  = P1^5;      sbit P35   = P3^5;


sbit P14  = P1^4;      sbit P34   = P3^4;


sbit P13  = P1^3;      sbit P33   = P3^3;


sbit P12  = P1^2;      sbit P32   = P3^2;


sbit P11  = P1^1;      sbit P31   = P3^1;


sbit P10  = P1^0;      sbit P30   = P3^0;


sbit P27  = P2^7;      sbit P07   = P0^7;


sbit P26  = P2^6;      sbit P06   = P0^6;


sbit P25  = P2^5;      sbit P05   = P0^5;


sbit P24  = P2^4;      sbit P04   = P0^4;


sbit P23  = P2^3;      sbit P03   = P0^3;


sbit P22  = P2^2;      sbit P02   = P0^2;


sbit P21  = P2^1;      sbit P01   = P0^1;


sbit P20  = P2^0;      sbit P00   = P0^0;






#define uchar unsigned char


#define uint  unsigned int






#define RF_DATA_IN        P34         //接收来至U2270B的数据"Output"


#define SO                          P31         //单片机输出数据到用户接口


#define SCK                        P10         //同步时钟输出


#define CP                           P17         //卡存在信号输出


#define MSEL               P12         //数据发送方式选择


#define WATCHDOG         P21         //看门狗


#define DD                          P20         //蜂鸣器


/****************全局变量***********************/






uchar data Read_RF_Data[11];   //暂存从U2270B上接收的数据


uchar data ID_Data[6];                  //暂存经效验后的正确数据


uint  data TIMER_1=0;






bit Check_Data_bit;              //效验请求标志位






/****************函数列表***********************/


void Recive_RF_Data(void);     


void Check_Data(void);


void Clern_Number(void);


void Send_RS232net(uchar Data[],uchar Num);


void delay0_2ms(uint count);


void delay1ms(uint count);


void dida(uchar j);


void Data_start(void)


{


       TMOD=0x21;                                                    //T0方式1,T1工作于方式2






       TH1=0x00;                                                        //初始化T1计时器


       TL1=0x00;


       TR1=0;






       SCON=0x50;                                                     //串行口初始化


       PCON=0x80;                                                     //SMOD位设置






       TH0=0x00;                                                        //初始化T0计时器


       TL0=0x04;


       TR0=0;






       ES=1;                                                             //开放串行口中断


       EA=1;                                                             //开放总中断


}


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


                             /*主函数*/


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


void main(void)


{


       delay1ms(100);


       Data_start();


       while(1)


       {


              WATCHDOG=~WATCHDOG;


              Recive_RF_Data();         //调用接收RF数据函数


              if(Check_Data_bit==1)     //如果此位为1,有一组数据申请效验


              {


                     Check_Data();         //调用数据效验函数


                     Check_Data_bit=0;


              }


       }


}


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


                            /*接收RF数据*/


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


void Recive_RF_Data(void)      


{


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


       uchar  header,pc;


       uchar  temp;


       uchar  temp1;


       uint   temp2;


       uchar  ByteCounter;                                      //字节计数器


       uchar  *PData;


       uchar  BitCounter;                                        //位计数器


////////////////////初始化变量值


       header=0;pc=4;


       PData=Read_RF_Data;


       temp=0;


       temp1=0;


       ByteCounter=0;


       BitCounter=5;    


/////////////////////检测一个稳定的低电平


str:


       WATCHDOG=~WATCHDOG;


       if(RF_DATA_IN==0)      


       if(RF_DATA_IN==0)      


       if(RF_DATA_IN==0)      


       if(RF_DATA_IN==0)      


       if(RF_DATA_IN==0)      


       {


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


////////////////////检测一个起始位电平


              while(RF_DATA_IN==0);                            //当电平由低向高跳变时启动计时器


              TR0=1;


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


              _nop_();


////////////////////检测9个"header"


              while(RF_DATA_IN==1);


              TR0=0;


              TF0=0;


              TIMER_1=TH0;


              TIMER_1=(TIMER_1<<8)+TL0;


              TH0=0x00;


              TL0=0x04;


              temp2=0x108;


              if(TIMER_1>temp2)       // >520us


              {


                     goto str;


              }


              temp2=0xf9;


              if(TIMER_1<temp2)       // <490us


              {


                     goto str;


              }


              do


              {


                     TIMER_1=0;


                     WATCHDOG=~WATCHDOG;


                     while(RF_DATA_IN==0);


                     TR0=1;


                     _nop_();


                     _nop_();


                     _nop_();


                     _nop_();


                     _nop_();


                     _nop_();


                     _nop_();


                     _nop_();


                     _nop_();


                     _nop_();


                     while(RF_DATA_IN==1);


                     TR0=0;


                     TF0=0;


                     TIMER_1=TH0;


                     TIMER_1=(TIMER_1<<8)+TL0;


                     TH0=0x00;


                     TL0=0x04;


                     temp2=0x90;


                     if(TIMER_1>temp2)// >280us


                     {


                            header=0;


                            goto str;


                     }


                     temp2=0x77;


                     if(TIMER_1<temp2)// <230us


                     {


                            header=0;


                            goto str;


                     }


                     header++;


              }while(header<8);


              TR0=0;


              TF0=0;


///////////////////如果9个"header"都对,开始接收卡内数据


              TH0=0xff;                            //time:300us


              TL0=0x6a;


              TR0=1;


              if(header==8)


              {


                     do


                     {


                            do


                            {                   


                                   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;

⌨️ 快捷键说明

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