📄 wg_dt.c
字号:
#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; //读ID卡标计
bit RcvEven;
bit RcvOdd;
bit CheckEven=0; //偶校验
bit CheckOdd=1; //奇校验
bit RCVOK=0;
uchar RcvWG[3]={0,0,0}; //给26韦根代码分配三个空间
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_() //5微秒延时
#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}; // LED显示段码——共阴
uchar code IDindex[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //ID索引
uchar ID[10]={0xE9,0xa0,0xa0,0x4f,0x00,0x00,0x00,0x00,0x00,0x00}; //初使化LED显示位
uchar code DW_CS[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfE,0xfD}; //LED显示位
bit b_ClrDog=0; //喂狗
uchar ClrDogcount=0; //清狗计数器
void initial(void)
{
EA=0; //禁止全局中断
EN138;
bell_cl=1; //止响;
COUNT_T0=0; //T0计数器清0;
IT0=1; //下降沿触发中断INT0=1,INT0=0为低电平触发;
EX0=1; //外部中断允许
TMOD = 0x11; //T0
TH0 = T0H;
TL0 = T0L;
ET0=1; //开定时器T0中断
TR0=1; //启动定时器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;
uchar temp;
uchar RWGcnt; //定义变量_读韦根计数器;
initial(); //初使化单片机
while(1)
{
v_ClrDog(); //喂狗;
if(ReadIDflag==1) //读卡标致位=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[i]) ID[0]= DM[i];
if(RcvWG[0]%16==IDindex[i]) ID[1]= DM[i];
if(RcvWG[1]/16==IDindex[i]) ID[2]= DM[i];
if(RcvWG[1]%16==IDindex[i]) ID[3]= DM[i];
if(RcvWG[2]/16==IDindex[i]) ID[4]= DM[i];
if(RcvWG[2]%16==IDindex[i]) ID[5]= DM[i];
}
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -