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

📄 door.c

📁 采用MPS430控制的项目
💻 C
字号:
#define _door_
#include  "..\Inc\includes.h"
/*********************************************************************************************************
* 函数名称:Read_Door
*
* 功能描述:从控制读卡器读取记录
*
* 入口参数:adr:读卡器地址
*
* 说明:AA FF 08(分机地址) 01(长度) A2 FE(校验)
* 
********************************************************************************************************/
void Read_Door(Uint8 adr)
{
Uint8 i;
	if(adr==CARD_OUT)	Task &=~ Read_OutDoor;
		else	    	Task &=~ Read_InDoor;
	
	if(Com0Busy > 0 || (Task&Com1OrderToCom0) || (Task&Com0DataToCom1) || DoorOK==1)	return;
	
	STR0_Rec[0] = 0xAA;
	STR0_Rec[1] = 0xFF;
	STR0_Rec[2] = adr;
	STR0_Rec[3] = 1;
	STR0_Rec[4] = 0xA2;
	STR0_Rec[5] = 0xAA;
	for(i=1; i<5; i++)
		STR0_Rec[5] ^= STR0_Rec[i];
	SendStrlenToCom0(STR0_Rec,6);

	if(Task&DoorSpeak)	
	{
		Com0Busy=4;
		Task &=~ DoorSpeak;
	}
	else Com0Busy = COMDELAY;
}
/*********************************************************************************************************
* 函数名称:Door_Speak
*
* 功能描述:控制读卡器发音
*
* 入口参数:adr:读卡器地址 cishu:发音次数 time:发音时长 jiangge:多次发音的间隔时间
*
* 说明:AA FF 08(分机地址) 04 A3 02 02 02 F8(校验)
* 
********************************************************************************************************/
void Door_Speak(Uint8 adr,Uint8 cishu,Uint8 time,Uint8 jiange)
{
Uint8 i;
	STR0_Rec[0] = 0xAA;
	STR0_Rec[1] = 0xFF;
	STR0_Rec[2] = adr;
	STR0_Rec[3] = 4;
	STR0_Rec[4] = 0xA3;
	STR0_Rec[5] = cishu;
	STR0_Rec[6] = time;
	STR0_Rec[7] = jiange;
	STR0_Rec[8] = 0xAA;
	for(i=1; i<8; i++)
		STR0_Rec[8] ^= STR0_Rec[i];
	SendStrlenToCom0(STR0_Rec,9);
	Task |= DoorSpeak;
}
/*********************************************************************************************************
* 函数名称:Door_Led
*
* 功能描述:控制读卡器LED灯的亮灭
*
* 入口参数:adr:读卡器地址 state:0 LED灯灭 1 LED灯亮
*
* 说明:AA FF 08(分机地址) 04 A3 02 02 02 F8(校验)
* 
********************************************************************************************************/
void Door_Led(Uint8 adr,Uint8 state)
{
Uint8 i;
	STR0_Rec[0] = 0xAA;
	STR0_Rec[1] = 0xFF;
	STR0_Rec[2] = adr;
	STR0_Rec[3] = 2;
	STR0_Rec[4] = 0xA5;
	STR0_Rec[5] = state;
	STR0_Rec[6] = 0xAA;
	for(i=1; i<6; i++)
		STR0_Rec[6] ^= STR0_Rec[i];
	SendStrlenToCom0(STR0_Rec,7);
}
/*********************************************************************************************************
* 函数名称:ComparaCardNo
*
* 功能描述:对卡号进行权限鉴定,有权限返回1,后则返回0
*
* 入口参数:*p
*
* 说明:
* 
********************************************************************************************************/
Uint16 ComparaCardNo(Uint8 *p)
{
Uint16 k;
	for(k=0; k<MaxCard; k++)
	{
		if(CardNo[k][0]==1)	//该卡号已被启用
		{
			if(*p==CardNo[k][1]&&*(p+1)==CardNo[k][2]&&*(p+2)==CardNo[k][3]&&*(p+3)==CardNo[k][4])
				return 1;
		}
	}
	return 0;
}
/*********************************************************************************************************
* 函数名称:CtrlDoor
*
* 功能描述:控制开关和关门
*
* 入口参数:state Open:1 Close:0
*
* 说明:
* 
********************************************************************************************************/
void CtrlDoor(Uint16 state)
{
	Uint16 tongdao;
	tongdao = (1<<(DODOOR));
	if(state==1)	 OutStates = OutStates | tongdao;
	else OutStates = OutStates & (~tongdao);
	ctrl(OutStates);
}
/*********************************************************************************************************
* 函数名称:DealDoorAlarm
*
* 功能描述:处理门报警(有人进门,出门(告警未解除提示),非法入侵,开、关门失败,告警信息保存等。
*
* 入口参数:
*
* 说明:
* 
********************************************************************************************************/
void DealDoorAlarm(void)
{
	switch(DoorAlarm_ID)
	{
		case 0x01: DoorAlarm &=~ (0x01);break;
		case 0x02: DoorAlarm &=~ (0x02);break;
		case 0x07: DoorAlarm &=~ (0x04);break;
		case 0x12: DoorAlarm &=~ (0x10);break;
		case 0x13: DoorAlarm &=~ (0x20);break;
		default:   break;
	}
}
/*********************************************************************************************************
* 函数名称:Deal_DoorCommand
*
* 功能描述:处理上位机发给门禁的命令、响应
*
* 入口参数:
*
* 说明:
* 
********************************************************************************************************/
void Deal_DoorCommand(Uint16 cid2)
{
	switch(cid2)
	{
		case 0x43:	SendDoorState(0);	break;
		case 0x44:  SendDoorAlarm();	break;
		case 0x45:  YaoKongDoor();		break;
		case 0x47: 	SendDoorSet(0);		break;
		case 0x49:  SetDoor();			break;
		default:    ErrorDeal(0x04,ADRDOOR,0xB0,COM1);	break;
	}
}
/*********************************************************************************************************
* 函数名称:SendDoorState
*
* 功能描述:发送门状态
*
* 入口参数:k(为0 被动响应,否则主动上传)
*
* 说明:
* 
********************************************************************************************************/
void SendDoorState(Uint8 k)
{
	STR1_Rec[0] = SOI;
	STR1_Rec[1] = ASCII[VER>>4];
	STR1_Rec[2] = ASCII[VER&0x0f];
	STR1_Rec[3] = ASCII[ADRDOOR>>4];
	STR1_Rec[4] = ASCII[ADRDOOR&0x0f];
	STR1_Rec[5] = ASCII[0xB0>>4];
	STR1_Rec[6] = ASCII[0xB0&0x0f];
	STR1_Rec[7] = ASCII[k>>4];
	STR1_Rec[8] = ASCII[k&0x0f];
	GetCheckLength(STR1_Rec,6);				//数据长度校验
	STR1_Rec[13] = ASCII[DATAFLAG>>4];		//DATAFLAG
	STR1_Rec[14] = ASCII[DATAFLAG&0x0f];
	STR1_Rec[15] = ASCII[0];
	STR1_Rec[16] = ASCII[1-(DISam_Value[DIDOOR]&0x0f)];
	STR1_Rec[17] = ASCII[0];
	STR1_Rec[18] = ASCII[1-(DISam_Value[DILOCK]&0x0f)];
	GetCheckSum(STR1_Rec,18);				//数据包和校验
	STR1_Rec[23]= EOI;
	SendStrlenToCom1(STR1_Rec,24);
}

void SendDoorAlarm(void)
{
	switch(DoorAlarm_ID)
	{
		case 0x01:break;//开门失败
		case 0x02:break;//关门失败
		case 0x07:break;//无权限
		case 0x11:break;//内存已经满
	}
/*********************************************************************************************************
* 函数名称:YaoKongDoor
*
* 功能描述:远程遥控开、关门
*
* 入口参数:
*
* 说明:
* 
********************************************************************************************************/}
void YaoKongDoor(void)
{
	Uint16 i;
	i = Combine(STR1_Rec[13],STR1_Rec[14]);
	if(i==0)//基站封网
	{
		//DoorAlarm |= 0x20;
		//DoorAlarm_ID = 0x13;
		DoorOK = 1;
	}
	else if(i==0xff)
	{
		DoorOK= 0;
	}
	else if(i==0x10)
	{
		CtrlDoor(OPEN);
		HaveDoorRight = 1;
		OpenDoorDelay = OPENDOORDELAY;
	}
	else if(i==0x1f)
	{
		CtrlDoor(CLOSE);
		CloseDoorDelay = CLOSEDOORDELAY;
	}
	ErrorDeal(0,ADRDOOR,0xB0,COM1);
}
/*********************************************************************************************************
* 函数名称:SendDoorSet
*
* 功能描述:上传有权限的卡号
*
* 入口参数:
*
* 说明:
* 
********************************************************************************************************/
void SendDoorSet(Uint8 k)
{
Uint16 i;
	STR1_Rec[0] = SOI;
	STR1_Rec[1] = ASCII[VER>>4];
	STR1_Rec[2] = ASCII[VER&0x0f];
	STR1_Rec[3] = ASCII[ADRDOOR>>4];
	STR1_Rec[4] = ASCII[ADRDOOR&0x0f];
	STR1_Rec[5] = ASCII[0xB0>>4];
	STR1_Rec[6] = ASCII[0xB0&0x0f];
	STR1_Rec[7] = ASCII[k>>4];
	STR1_Rec[8] = ASCII[k&0x0f];
	k=0;
	for(i=0; i<MaxCard; i++)
	{
		if(CardNo[i][0]==1)	k += 1;
	}
	GetCheckLength(STR1_Rec,k*8+4);			//数据长度校验 12
	STR1_Rec[13] = ASCII[DoorOK>>4];		//基站是否封网
	STR1_Rec[14] = ASCII[DoorOK&0x0f];
	STR1_Rec[15] = ASCII[k>>4];				//维护卡号个数
	STR1_Rec[16] = ASCII[k&0x0f];
	k=0;
	for(i=0; i<MaxCard; i++)
	{
		if(CardNo[i][0]==1)
		{
			STR1_Rec[k*4+17] = CardNo[i][1];
			STR1_Rec[k*4+18] = CardNo[i][2];
			STR1_Rec[k*4+19] = CardNo[i][3];
			STR1_Rec[k*4+20] = CardNo[i][4];
			k += 1;
		}
	}
	i = (k-1)*4+20;
	GetCheckSum(STR1_Rec,i);				//数据包和校验
	STR1_Rec[i+4]= EOI;
	SendStrlenToCom1(STR1_Rec,i+5);
}
/*********************************************************************************************************
* 函数名称:SetDoor
*
* 功能描述:设置有权限的卡号
*
* 入口参数:
*
* 说明:
* 
********************************************************************************************************/
void SetDoor(void)
{
	Uint16 k,i;
	Uint8 *p = CardNo[0];
	DoorOK = Combine(STR1_Rec[13],STR1_Rec[14]);//门禁系统是否启用
	i = Combine(STR1_Rec[15],STR1_Rec[16]);		//维护的卡号数
	if(i > MaxCard)
	{
		ErrorDeal(0x11,ADRDOOR,0xB0,COM1);
		return;
	}
	for(k=0; k < MaxCard; k++)
	{
		if(k<i)		
		{
			CardNo[k][0]=1;
			CardNo[k][1]=Combine(STR1_Rec[17],STR1_Rec[18]);
			CardNo[k][2]=Combine(STR1_Rec[19],STR1_Rec[20]);
			CardNo[k][3]=Combine(STR1_Rec[21],STR1_Rec[22]);
			CardNo[k][4]=Combine(STR1_Rec[23],STR1_Rec[24]);
		}
		else CardNo[k][0]=0;
	}
	i = MaxCard * 5;
	for(k=0; k<i; k++)
	{
		II3WR(AT24C256,I2C_Card + k,*(p+k));
	}
	ErrorDeal(0,ADRDOOR,0xB0,COM1);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -