⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bc2018.c

📁 上海大宇指纹机软件qqqfwefgergr
💻 C
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************************
程序对象:指纹密码一体机程序(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 + -