📄 -
字号:
曼码调制的非接触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 + -