📄 bc2018.c
字号:
/**************************************************************************************
程序对象:指纹密码一体机程序(800组开门用户及1个管理用户)
功能:管理用户能进行设置;普通用户能通过指纹或密码开门。
最后修改时间:2006.11.3
(1)继电器控制反过来,韦根输出奇检验位出错,重新起一变量JiChecksum作为奇校标志.
(2)指纹录入等待时间加长,按键及蜂鸣器粘连现象改一共用变量TimeNumCnt为NumCnt.
(3)防ID号超出范围而造成前面某用户第二枚指纹被覆盖.加if((UserId>800)||(UserId==0))限定
(4)开门方式字限定输入为0--------#或2--------#
(5)同一枚指纹不允许存放两个ID位置,添加搜索过程,
但可以重录存同一个ID位置的指纹(改共用变量MinuteCnt_LastRevDat为Good_Good).
(6)11OR22...号输出卡号出错问题的解决,改写CS256的延时.
(7)有效按键中有按键无声,改延时去抖同时按键声重置,管理员进入按键改由主程序来发声.
(8)改4次密码错误随便一键就能解警的问题.
(9)防误打卡(需解码个别ID号).2006-12-15
编者:ZSJ
版本:V0.1
***************************************************************************************/
#pragma ot(6,SIZE)
#include <W78E516.H>
#include <intrins.h>
#include <absacc.h>
/********P4口定义********/
sbit LED1 = P4^0;
sbit LED2 = P4^1;
//sbit D1_OUT = P4^0;
//sbit D0_OUT = P4^1;
sbit ALARM_1 = P4^3;
sbit EN = P4^2;
/******部分P3口定义******/
sbit DOG = P3^2;
sbit SOUND = P3^3;
sbit D1_OUT = P3^4;
sbit D0_OUT = P3^5;
//sbit LED1 = P3^4;
//sbit LED2 = P3^5;
/******部分P2口定义******/
sbit CS256_EN244 = P2^7;
/******部分P1口定义******/
sbit RELAY = P1^7;
/******P0口使用说明******/
/*P0口不仅地址数据复用,还会
P00-----RESET状态的读入;
P01-----Demolish状态的读入;
P02-----D_IN_1状态的读入;
P03-----OPEN_1状态的读入;
注:
RESET恢复出厂设置功能键检测端;
Demolish防拆按钮按键检测端;
D_IN_1门状态检测端;
OPEN_1手动开门按键检测端。
********************************************/
#define GreenLedOk LED1//LED2
#define RedLedMode LED2//LED1
#define BuzzerCtl SOUND
#define NOUSE 0
/*********返回码定义************/
#define MX_OK 0x00 //获取数据成功ok;
#define MX_NOT_MATCH 0x08 //指纹不匹配;
#define Uchar unsigned char
#define Uint unsigned int
#define Ulong unsigned long
#define RevEepPagDatLenth 16
//*************************以前的结构*******************************
/********************************************************************
头13页放开门方式字(1B),后25页存放用户开门密码(2B),
再50页放卡号(为防止同一卡号跨页存放,将3B改为4B来放),第89页放改动设置:
开门方式字存放地址由下面函数直接得出(注:x为代码号);
用户开门密码存放地址由下面函数直接得出(注:x为代码号);
卡号存放地址由下面函数直接得出(注:x为代码号);
第89页改动设置存放安排如下:
1.改动设置 5632~5638
地址5632,5633单元:放ProgramPassword管理员操作密码(0~9999);
地址5634单元: 放DoorOpenTime门开时间(0~99);
地址5635单元: 放AlarmTime报警持续时间(0~99);
地址5636单元: 放OP模式字ModeSetRecord(0x40~0xff);
地址5637,5638单元:放AlarmReleasePassword报警解除密码(0~9999);
********************************************************************
#define At28c256PageLenth 64 //at28c256页长
#define OpenDoorModePageNum 13 //头13页放开门方式字
#define OpenDoorPasswordPageNum 25 //后25页存放用户开门密码
#define OutputCardNumberPageNum 50 //再50页放卡号
//n为用户ID号,OpenDoorModeAddr(n)为开门方式字物理存储单元地址,范围在0~799
#define OpenDoorModeAddr(n) (n-1)
//n为用户ID号,OpenDoorPasswordAddr为用户开门密码低字节物理存储单元地址,范围在832~2368
#define OpenDoorPasswordAddr(n) (OpenDoorModePageNum*At28c256PageLenth-1+2*n-1)
//n为用户ID号,OutputCardNumberAddr(n)为卡号低字节物理存储单元地址,范围在2432~5568
#define OutputCardNumberAddr(n) ((OpenDoorPasswordPageNum+OpenDoorModePageNum)*At28c256PageLenth-3+4*n-1)
/*************有关AT28C256定义******************************************************************************/
//*************************现在的结构*******************************
/*******************************************************************
由0页开始算起,第200页开始放数据.头13页放开门方式字(1B),
再50页放卡号(为防止同一卡号跨页存放,将3B改为4B来放),第263页放改动设置:
开门方式字存放地址由下面函数直接得出(注:x为代码号);
用户开门密码存放地址由下面函数直接得出(注:x为代码号);
卡号存放地址由下面函数直接得出(注:x为代码号);
第263页改动设置存放安排如下:
1.改动设置 16832~16840
地址16832,16833单元:放ProgramPassword管理员操作密码(0~9999);
地址16834,16835单元:放OpenDoorPassword用户开门密码(0~9999);
地址16836,16837单元:放AlarmReleasePassword解警密码(0~9999);
地址16838单元: 放DoorOpenTime门开时间(0~99);
地址16839单元: 放AlarmTime报警持续时间(0~99);
地址16840单元: 放OP模式字ModeSetRecord(0x40~0xff);
*******************************************************************/
#define At28c256PageLenth 64 //at28c256页长 共512页
#define StartPageNumber 200 //起始页号
#define OpenDoorModePageNum 13 //头13页放开门方式字
#define OutputCardNumberPageNum 50 //再50页放卡号
//n为用户ID号,OpenDoorModeAddr(n)为开门方式字物理存储单元地址,范围在12800~13600
//#define OpenDoorModeAddr(n) (StartPageNumber*At28c256PageLenth-1+n-1)
//n为用户ID号,OutputCardNumberAddr(n)为卡号最高字节物理存储单元地址,范围在13632~16828
//#define OutputCardNumberAddr(n) ((StartPageNumber+OpenDoorModePageNum)*At28c256PageLenth-3+4*n-1)
#define AT28C256_COM1 XBYTE[0X5555]
#define AT28C256_COM2 XBYTE[0X2AAA]
//#define PAGE_ADDR(x) ((x/64)*64)
//#define INSIDEPAGE_UINTADDR(x) (x-((x/64)*64))
/*
//x为物理存储单元地址0~(4K-1),PAGE_ADDR(x)为页地址即物理存储单元地址除去页内单元地址剩下的地址部分
#define PAGE_ADDR(x) (x-(x%64))
//x为物理存储单元地址0~(4K-1),INSIDEPAGE_UINTADDR(x)为页内单元地址0~63
#define INSIDEPAGE_UINTADDR(x) (x%64)
//x为物理存储单元地址0~(4K-1),PAGE_NUMBER(x)为x单元在at28c256上的页号
*/
//#define PAGE_NUMBER(x) (x/64+1)
//ModeSetRecord<--->MS
/* MS7 MS6 MS5 MS4 MS3 MS2 MS1 MS0
| | | | | | | |_ _ _安全模式记录位.0时,关闭此功能;
| | | | | | |_ _ _ _ _1时,连续4次密码错误,死锁10分钟;2时,连续4次密码错误,启动报警.
| | | | | |_ _ _ _ _ _ _门状态监视记录位.0时,关闭此功能;1时,门非法打开启动报警.
| | | | |_ _ _ _ _ _ _ _ _卡号输出格式记录位.0时,以韦根26方式输出卡号;1时,以韦根34方式输出卡号.
| | | |_ _ _ _ _ _ _ _ _ _ _报警时间改动记录位.0时,改过;1时,为缺省的报警时间.
| | |_ _ _ _ _ _ _ _ _ _ _ _ _门开时间改动记录位.0时,改过;1时,为缺省的门开时间.
| |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _空.
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _设置种类记录位.1时,出厂设置;0时管理员设置.
*************************************************************************************************/
Uchar idata BMaybeRecord;
Uchar RevEepPageBytDatBuf[16];
Uchar *PtRevOrSendDat;
Uchar RecordInputCondit_CodingDatCnt;
Uchar MarkKeyNum_SendDatLenth;
Uchar InputPwCnt_RevDatLenth;
Uchar BuzzerCnt_DecodeDatCnt;
Uchar BuzzerEvent_RevSameDatCnt;
Uchar LedEvent_TimeBuzzerCnt;
Uchar MinuteCnt_LastRevDat;
Uchar idata Good_Good;
Uchar TempVar_TimeGlintCnt;
Uint TimeDoorOpenCnt;
Uint TimeOneMinuteCnt_PageId;
Uint EveryOneMinuteCnt_TimeCnt;
Uchar AffairDone;
Uchar LableBitVar;
//Uint idata CardNumHighWord;
//Uint idata CardNumLowWord;
Uint idata TimeNumCnt;
Uint idata NumCnt;
Uchar idata PressKeyCnt;
Uchar idata JiChecksum;
//bit BStartOneMinuteTime;
//bit BStartTenMinuteTime;
//bit BOneSetFail;
//bit BOtherAlarmEnd;
//bit BSuccessInputPassword;
//bit DatOk; ==Wg34LowWordOddVerfBit 奇校验位
//bit BStartTime; ==Wg34HighWordEvenVerfBit 偶校验位
//bit BDatRevOk; //数据接收完成标志
bit BStartBuzzerTime;
bit BStopCheckBuz;
bit BStopCheck;
bit BStartLedGlintTime;
bit BStartTimeCnt;
bit BstartDoorOpenTime;
bit BstartLawlessOpenDoorTime;
bit BEndOneMinuteTime;
bit BPressKey;
bit BWaitForSetAffairBring;
bit BOpenDoorAffairBring;
bit BLawlessOpenDoor;
bit BEndPwInput;
bit BForgetCloseDoor;
bit BBrokeDoor;
bit BAvoidBackout;
bit BOverForTimes;
bit BStartTime;
bit DatOk;
Uchar TimeCnt;
bit BForthFinger;
bit BPreventStop;
void InitSoftware();
void Delay_163us();
void DelayNuS(Uint n);
bit CmdDetectFinger();
bit CmdGetImage(/*Uchar* areaBorder*/);
bit CmdGenTemplet(Uchar iBufferID);
bit CmdLoadTemple(Uint iTimeOneMinuteCnt_PageId);
bit CmdMoveTemplet(Uchar iScrBufferID,Uchar iDstBufferID);
bit CmdMatchTwoTemplet(/*Uint* iScore*/);
bit CmdSearch(Uchar iBufferID,Uint iStartPage,Uint iPageNum/*,Uint *iMbAddress,Uchar* sUserInfo*/);
bit CmdMergeTwoTemple();
bit CmdStoreTemplet(Uchar iBufferID,Uint iTimeOneMinuteCnt_PageId);
bit CmdDeletOneTemplet(Uint iTimeOneMinuteCnt_PageId);
bit CmdEraseAllTemple();
bit CmdSetSecurLevel(Uchar iSecurLevel);
bit CmdFlashLED(Uchar iCode,Uchar iTime);
void GetDatFromFingerprintModule();
void SendNextDatToFingerprintModule();
void OpenTheDoor(void);
void AdministratorsProgramOperate(void);
Uint ReadStateofSwitch(void);
void DetectAndDealAlarm(bit BAlarmType,bit BDoorBroke);
bit ReadDataFromAt28c256(Uint PageAddr,Uint UintAddr,Uchar PageOrByteWrite,Uchar ReadType);
void Delay(Uint n);
Uint OpenDoorModeAddr(Uint n)
{
return(StartPageNumber*At28c256PageLenth+n-1);
}
Uint OutputCardNumberAddr(Uint n)
{
return((StartPageNumber+OpenDoorModePageNum)*At28c256PageLenth-3+4*n-1);
}
Uint PAGE_ADDR(Uint x)
{
return((x/64)*64);
}
Uint INSIDEPAGE_UINTADDR(Uint x)
{
return(x-((x/64)*64));
}
//////////////////////////////////////////
/**********韦根卡号输出子程序***********/
/////////////////////////////////////////
/**********将卡号转换成韦根数据*********/
//Uint TimeOneMinuteCnt_PageId 卡号高字部分
//Uint TimeDoorOpenCnt 卡号低字部分
void ConverIntoWgData(Uchar WgType)
{ /*以下为添加检验位*/
register i;
Uchar TempData;
TempData=0;
DOG=~DOG;
if(!WgType)//韦根26检验位添加
{ for(i=0;i<12;i++)//低12位
{ if((TimeDoorOpenCnt>>i)&0x0001)
{TempData+=1;}
}
//if(TempData%2)/*不被2整除,奇数个1*/
//{LableBitVar&=0xfd;}/*奇校验位补0*/
if(TempData%2)/*不被2整除,奇数个1*/
{JiChecksum=0;}/*奇校验位补0*/
else
{JiChecksum=1;}/*奇校验位补1*/
//{LableBitVar|=0x02;}/*奇校验位补1*/
TempData=0;
for(i=0;i<4;i++)
{ if((TimeDoorOpenCnt<<i)&0x8000)
{TempData+=1;}
}
for(i=0;i<8;i++)
{ if((EveryOneMinuteCnt_TimeCnt>>i)&0x0001)
{TempData+=1;}
}
if(TempData%2)/*不被2整除,奇数个1*/
{LableBitVar|=0x04;}/*偶校验位补1*/
else
{LableBitVar&=0xfb;}/*偶校验位补0*/
}
else
{ for(i=0;i<16;i++)//低16位
{ if((TimeDoorOpenCnt>>i)&0x0001)
{TempData+=1;}
}
if(TempData%2)/*不被2整除,奇数个1*/
//{LableBitVar&=0xfd;}/*奇校验位补0*/
{JiChecksum=0;}/*奇校验位补0*/
else
//{LableBitVar|=0x02;}/*奇校验位补1*/
{JiChecksum=1;}/*奇校验位补0*/
TempData=0;
for(i=0;i<16;i++)//高16位
{ if((EveryOneMinuteCnt_TimeCnt<<i)&0x8000)
{TempData+=1;}
}
if(TempData%2)/*不被2整除,奇数个1*/
{LableBitVar|=0x04;}/*偶校验位补1*/
else
{LableBitVar&=0xfb;}/*偶校验位补0*/
}
}
void OutputWgDat()
{ register i;
//先输出偶校验位
DOG=~DOG;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
if((LableBitVar&0x04)==0x00)
{ D0_OUT=0;
D1_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
}
else
{ D1_OUT=0;
D0_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
}
if(!BForthFinger)//韦根26输出
{ EveryOneMinuteCnt_TimeCnt<<=8;
for(i=0;i<8;i++)
{ if(EveryOneMinuteCnt_TimeCnt&0x8000)
{ D1_OUT=0;
D0_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
}
else
{ D0_OUT=0;
D1_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
}
EveryOneMinuteCnt_TimeCnt<<=1;
}
for(i=0;i<16;i++)
{ if(TimeDoorOpenCnt&0x8000)
{ D1_OUT=0;
D0_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -