?? -
字號(hào):
曼碼調(diào)制的非接觸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的數(shù)據(jù)"Output"
#define SO P31 //單片機(jī)輸出數(shù)據(jù)到用戶接口
#define SCK P10 //同步時(shí)鐘輸出
#define CP P17 //卡存在信號(hào)輸出
#define MSEL P12 //數(shù)據(jù)發(fā)送方式選擇
#define WATCHDOG P21 //看門狗
#define DD P20 //蜂鳴器
/****************全局變量***********************/
uchar data Read_RF_Data[11]; //暫存從U2270B上接收的數(shù)據(jù)
uchar data ID_Data[6]; //暫存經(jīng)效驗(yàn)后的正確數(shù)據(jù)
uint data TIMER_1=0;
bit Check_Data_bit; //效驗(yàn)請(qǐng)求標(biāo)志位
/****************函數(shù)列表***********************/
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計(jì)時(shí)器
TL1=0x00;
TR1=0;
SCON=0x50; //串行口初始化
PCON=0x80; //SMOD位設(shè)置
TH0=0x00; //初始化T0計(jì)時(shí)器
TL0=0x04;
TR0=0;
ES=1; //開放串行口中斷
EA=1; //開放總中斷
}
/**********************************************/
/*主函數(shù)*/
/**********************************************/
void main(void)
{
delay1ms(100);
Data_start();
while(1)
{
WATCHDOG=~WATCHDOG;
Recive_RF_Data(); //調(diào)用接收RF數(shù)據(jù)函數(shù)
if(Check_Data_bit==1) //如果此位為1,有一組數(shù)據(jù)申請(qǐng)效驗(yàn)
{
Check_Data(); //調(diào)用數(shù)據(jù)效驗(yàn)函數(shù)
Check_Data_bit=0;
}
}
}
/*********************************************/
/*接收RF數(shù)據(jù)*/
/*********************************************/
void Recive_RF_Data(void)
{
/////////////////////定義局部變量
uchar header,pc;
uchar temp;
uchar temp1;
uint temp2;
uchar ByteCounter; //字節(jié)計(jì)數(shù)器
uchar *PData;
uchar BitCounter; //位計(jì)數(shù)器
////////////////////初始化變量值
header=0;pc=4;
PData=Read_RF_Data;
temp=0;
temp1=0;
ByteCounter=0;
BitCounter=5;
/////////////////////檢測一個(gè)穩(wěn)定的低電平
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_();
////////////////////檢測一個(gè)起始位電平
while(RF_DATA_IN==0); //當(dāng)電平由低向高跳變時(shí)啟動(dòng)計(jì)時(shí)器
TR0=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
////////////////////檢測9個(gè)"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個(gè)"header"都對(duì),開始接收卡內(nèi)數(shù)據(jù)
TH0=0xff; //time:300us
TL0=0x6a;
TR0=1;
if(header==8)
{
do
{
do
{
while(TF0==0); //等待一個(gè)位周期
TF0=0;
if(RF_DATA_IN==1) temp=1;
else temp=0;
while(RF_DATA_IN==temp) //檢測電平跳變否?
{
if(TF0==1) //如果300us計(jì)時(shí)到還未跳變,視為非法電平!!!
{
TR0=0;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -