|
源程序
#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;
bit RcvEven;
bit RcvOdd;
bit CheckEven=0;
bit CheckOdd=1;
bit RCVOK=0;
uchar RcvWG[3]={0,0,0};
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_()
#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};
uchar code IDindex[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
uchar ID[10]={0xE9,0xa0,0xa0,0x4f,0x00,0x00,0x00,0x00,0x00,0x00};
uchar code DW_CS[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfE,0xfD};
bit b_ClrDog=0;
uchar ClrDogcount=0;
void initial(void)
{
EA=0;
EN138;
bell_cl=1;
COUNT_T0=0;
//INT0=0;
IT0=0;//低电平触发中断
EX0=1;//外部中断允许
//T0
TMOD = 0x11;
TH0 = T0H;
TL0 = T0L;
//T1
TH1 = T1H;
TL1 = T1L;
ET0=1;
TR0=1;
ET1=1;
TR1=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;
initial();
while(1)
{
v_ClrDog();
if(ReadIDflag==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) ID[0]= DM;
if(RcvWG[0]%16==IDindex) ID[1]= DM;
if(RcvWG[1]/16==IDindex) ID[2]= DM;
if(RcvWG[1]%16==IDindex) ID[3]= DM;
if(RcvWG[2]/16==IDindex) ID[4]= DM;
if(RcvWG[2]%16==IDindex) ID[5]= DM;
}
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;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|