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

📄 pwm v30.c

📁 用STC单片机开发的简单脉冲发生器,用来测试步进驱动器.
💻 C
📖 第 1 页 / 共 5 页
字号:
/************************************功能描述:门开时间长报警函数组成:全局变量:输入:返回:************************************/void LongToAlarm(void){  if(RxBuffer[RXB_DATAOFFSET]==1)	  {	  	if(RxBuffer[RXB_DATAOFFSET+1]==0)			{						Door1_LongToAlarm=0;                    	  		LongToAlarm1=0;	  	}	  	else if(RxBuffer[RXB_DATAOFFSET+1]==1)		  {		  		Door1_LongToAlarm=1; 	  			LongToAlarm1=1;	  	}	  }   if(RxBuffer[RXB_DATAOFFSET]==2)    {	  	if(RxBuffer[RXB_DATAOFFSET+1]==0)			{						Door2_LongToAlarm=0;                    	  		LongToAlarm2=0;	  	}	  	else if(RxBuffer[RXB_DATAOFFSET+1]==1)		  {		  		Door2_LongToAlarm=1; 	  			LongToAlarm2=1;	  	}     }   KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);}/************************************功能描述:系统复位函数组成:全局变量:输入:返回:************************************/void ResetSystems(void){    byte i;    SaveOutOpenDoor1=0;    SaveOutOpenDoor2=0;        SaveTamper1=0;       /*Enable Tamper switch */    SaveTamper2=0;    SaveFire1=0;    SaveFire2=0;      Status=0;    BackupStatus=0;        inputStatus &=0xFF;    FunctionStatus &=0x00;   for(i=0;i< 0xA9;i++)    {     XBYTE[i]=0;     if(XBYTE[i])Hardware_Err=1;    }   i=0;   for(;i<97;i++)  /*clear timezone*/   {     XBYTE[i+OFFSET_TimeZone]=0;   }    TrigerTime1=5;  /*default open door time for 5sec. */    TrigerTime2=5;    ShuntTime1=10;    ShuntTime2=10;   /*default shunt time for 10sec.*/    //MaxCount=1000;  /*default max. entry value*/    OutData=0x00;    if(Hardware_Err) 	 	KSNET_NAK(SlaveADR,RxBuffer[RXB_CMD]);    else 	 	KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);}/************************************功能描述:设置从机地址函数组成:全局变量:输入:返回:************************************/void SetSlaveAddress(void){	if(!CompareSerialNum())	{		SlaveADR= RxBuffer[RXB_ADDR];		SlaveAddress=SlaveADR;		SlaveCheckSum=SlaveADR;  		ADR_LED = 1;		KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);	}	else if(SlaveADR == RxBuffer[RXB_ADDR]) {		SlaveAddress=0;		SlaveADR=0;		SlaveCheckSum=0;		ReceivLED=0;	/* ON THE FLAG OF TXRX LED */	}}/************************************功能描述:比较序列号函数组成:全局变量:输入:返回: 序列号正确返回0 ,错误返回1************************************/byte CompareSerialNum(void){  if(CBYTE[SerialNo] == RxBuffer[RXB_DATAOFFSET])   {    if(CBYTE[SerialNo+1] == RxBuffer[RXB_DATAOFFSET+1])    {    if(CBYTE[SerialNo+2] == RxBuffer[RXB_DATAOFFSET+2])     {     if(CBYTE[SerialNo+3] == RxBuffer[RXB_DATAOFFSET+3])      {      if(CBYTE[SerialNo+4] == RxBuffer[RXB_DATAOFFSET+4])       {       if(CBYTE[SerialNo+5] == RxBuffer[RXB_DATAOFFSET+5])return 0;       }      }     }    }   } return 1;}/************************************功能描述:增加假日函数组成:全局变量:输入:返回:************************************/   void AddHoliday(void){    RxBuffer[RXB_DATAOFFSET] = RxBuffer[RXB_DATAOFFSET] * 4 + RxBuffer[RXB_DATAOFFSET+1]/8;    RxBuffer[RXB_DATAOFFSET+1] = RxBuffer[RXB_DATAOFFSET+1] % 8;        switch (RxBuffer[RXB_DATAOFFSET+1]) {      case 0 : RxBuffer[RXB_DATAOFFSET+1] = 0x01;        break;       case 1 : RxBuffer[RXB_DATAOFFSET+1] = 0x02;        break;       case 2 : RxBuffer[RXB_DATAOFFSET+1] = 0x04;        break;       case 3 : RxBuffer[RXB_DATAOFFSET+1] = 0x08;        break;       case 4 : RxBuffer[RXB_DATAOFFSET+1] = 0x10;        break;       case 5 : RxBuffer[RXB_DATAOFFSET+1] = 0x20;        break;       case 6 : RxBuffer[RXB_DATAOFFSET+1] = 0x40;        break;       case 7 : RxBuffer[RXB_DATAOFFSET+1] = 0x80;        break;      default:        break;    }    XBYTE[RxBuffer[RXB_DATAOFFSET]+OFFSET_Holiday]=XBYTE[RxBuffer[RXB_DATAOFFSET]+OFFSET_Holiday]|RxBuffer[RXB_DATAOFFSET+1];    KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);	CheckHoliday();}/************************************功能描述:删除假日函数组成:全局变量:输入:返回:************************************/void DelHoliday(void){    RxBuffer[RXB_DATAOFFSET] = RxBuffer[RXB_DATAOFFSET] * 4 + RxBuffer[RXB_DATAOFFSET+1]/8;    RxBuffer[RXB_DATAOFFSET+1] = RxBuffer[RXB_DATAOFFSET+1] % 8;        switch (RxBuffer[RXB_DATAOFFSET+1]) {      case 0 : RxBuffer[RXB_DATAOFFSET+1] = 0x01;        break;       case 1 : RxBuffer[RXB_DATAOFFSET+1] = 0x02;        break;       case 2 : RxBuffer[RXB_DATAOFFSET+1] = 0x04;        break;       case 3 : RxBuffer[RXB_DATAOFFSET+1] = 0x08;        break;       case 4 : RxBuffer[RXB_DATAOFFSET+1] = 0x10;        break;       case 5 : RxBuffer[RXB_DATAOFFSET+1] = 0x20;        break;       case 6 : RxBuffer[RXB_DATAOFFSET+1] = 0x40;        break;       case 7 : RxBuffer[RXB_DATAOFFSET+1] = 0x80;        break;      default:        break;    }    RxBuffer[RXB_DATAOFFSET+1] = ~RxBuffer[RXB_DATAOFFSET+1];    XBYTE[OFFSET_Holiday+RxBuffer[RXB_DATAOFFSET]]=XBYTE[OFFSET_Holiday+RxBuffer[RXB_DATAOFFSET]]&RxBuffer[RXB_DATAOFFSET+1];    KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);	CheckHoliday();}/************************************功能描述:假日复位函数组成:全局变量:输入:返回:说明: 24个假期************************************/void ResetHoliday(void){ byte i; for(i=0;i<48;i++) XBYTE[OFFSET_Holiday+i]=0; KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);}/************************************功能描述:设置时区函数组成:全局变量:输入:DoorNum, TimezonNum, Timezone ,Access Status返回说明: DoorNum未使用,两门控制器中需加!************************************/void SetTimezone(void){  bit Door1_IsFreeAccess;		    bit Door2_IsFreeAccess;  byte Door2Size=96;  RxBuffer[RXB_DATAOFFSET+1] *=6;    /*一个时区6 byte*/  /*[2]=Door, [3]=TimeZone Num, [4]-[8]=Time, [9]=Access Status*/   if(RxBuffer[RXB_DATAOFFSET]==1)  {  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone]=RxBuffer[RXB_DATAOFFSET+2];   /*start hour */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+1]=RxBuffer[RXB_DATAOFFSET+3]; /*start minute*/  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+2]=RxBuffer[RXB_DATAOFFSET+4]; /*end hour */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+3]=RxBuffer[RXB_DATAOFFSET+5]; /*end minute */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+4]=RxBuffer[RXB_DATAOFFSET+6]; /*week slect status */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+5]=RxBuffer[RXB_DATAOFFSET+7]; /*access status */  KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);  }  else if(RxBuffer[RXB_DATAOFFSET]==2)  {  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+Door2Size]=RxBuffer[RXB_DATAOFFSET+2];   /*start hour */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+1+Door2Size]=RxBuffer[RXB_DATAOFFSET+3]; /*start minute*/  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+2+Door2Size]=RxBuffer[RXB_DATAOFFSET+4]; /*end hour */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+3+Door2Size]=RxBuffer[RXB_DATAOFFSET+5]; /*end minute */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+4+Door2Size]=RxBuffer[RXB_DATAOFFSET+6]; /*week slect status */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+5+Door2Size]=RxBuffer[RXB_DATAOFFSET+7]; /*access status */  KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);  }  else   KSNET_NAK(SlaveADR,RxBuffer[RXB_CMD]);  													  /*门1是否为无限制通行??*/  Door1_IsFreeAccess = Door1_FreeEgress;  Door2_IsFreeAccess = Door2_FreeEgress;  Door1CheckFreeEgress();  Door2CheckFreeEgress();    if(Door1_IsFreeAccess && !Door1_FreeEgress)  {	Door1_LOCK=0;    /*关门*/	RD0_LED=0;	RD0_BEEP=0;	Door1_CloseFlag=0;	Door1StatusTime=1;/*设置返回位置恢复时间*/  }												 /*门2是否为无限制通行*/  if(Door2_IsFreeAccess && !Door2_FreeEgress)  {	Door2_LOCK=0;   /*关门*/	RD1_LED=0;	RD1_BEEP=0;	Door2_CloseFlag=0;  Door2StatusTime=1;  }}/************************************功能描述:消除时区函数组成:全局变量:输入:返回:************************************/void ClearTimezone(void){  bit Door1_IsFreeAccess;		    bit Door2_IsFreeAccess;  byte Door2Size=96;  RxBuffer[RXB_DATAOFFSET+1] *=6;    /*一个时区6 byte*/  /*[2]=Door, [3]=TimeZone Num, [4]-[8]=Time, [9]=Access Status*/   if(RxBuffer[RXB_DATAOFFSET]==1)  {  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone]=0;   /*start hour */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+1]=0; /*start minute*/  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+2]=0; /*end hour */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+3]=0; /*end minute */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+4]=0; /*week slect status */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+5]=0; /*access status */  KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);  }  else if(RxBuffer[RXB_DATAOFFSET]==2)  {  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+Door2Size]=0;   /*start hour */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+1+Door2Size]=0; /*start minute*/  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+2+Door2Size]=0; /*end hour */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+3+Door2Size]=0; /*end minute */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+4+Door2Size]=0; /*week slect status */  XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+5+Door2Size]=0; /*access status */  KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);  }  else   KSNET_NAK(SlaveADR,RxBuffer[RXB_CMD]); 													  /*门1是否为无限制通行??*/  Door1_IsFreeAccess = Door1_FreeEgress;  Door2_IsFreeAccess = Door2_FreeEgress;  Door1CheckFreeEgress();  Door2CheckFreeEgress();    if(Door1_IsFreeAccess && !Door1_FreeEgress)  {	Door1_LOCK=0;    /*关门*/	RD0_LED=0;	RD0_BEEP=0;	Door1_CloseFlag=0;	Door1StatusTime=1;/*设置返回位置恢复时间*/  }												 /*门2是否为无限制通行*/  if(Door2_IsFreeAccess && !Door2_FreeEgress)  {	Door2_LOCK=0;   /*关门*/	RD1_LED=0;	RD1_BEEP=0;	Door2_CloseFlag=0;   Door2StatusTime=1;  }}/************************************功能描述:时区复位函数组成:全局变量:输入:返回:************************************/void ResetTimezone(void){	byte i;	bit Door1_IsFreeAccess;	bit Door2_IsFreeAccess; 	for(i=0;i<=192;i++)            /*2个门共32个时区*/ 	XBYTE[i+OFFSET_TimeZone]=0; 	KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]); 													    Door1_IsFreeAccess = Door1_FreeEgress;  Door2_IsFreeAccess = Door2_FreeEgress;  Door1CheckFreeEgress();  Door2CheckFreeEgress();  if(Door1_IsFreeAccess && !Door1_FreeEgress)  {	Door1_LOCK=0;    /*关门*/	RD0_LED=0;	RD0_BEEP=0;	Door1_CloseFlag=0;	Door1StatusTime=1;/*设置返回位置恢复时间*/  }  if(Door2_IsFreeAccess && !Door2_FreeEgress)  {	Door2_LOCK=0;   /*关门*/	RD1_LED=0;	RD1_BEEP=0;	Door2_CloseFlag=0;   Door2StatusTime=1;  }}/************************************功能描述:卡片查找功能函数组成:全局变量:输入:返回:查到卡片 返回0************************************/bit SearchCardFunc(void){  int i,j=RecordLP;  DPL=OFFSET_RecordLSB;  DPH=OFFSET_RecordMSB;  for(i=0;i<j;i++)   {   if(!SearchCard()) return 0;   }  return 1;  /* error */}/************************************功能描述:受权卡时区设置函数组成:RxBuffer[RXB_ADDR]=ADDR   RxBuffer[RXB_CMD]=Function Code	  RxBuffer[RXB_DATAOFFSET]-RxBuffer[RXB_DATAOFFSET+3]=CardID   	  RxBuffer[RXB_DATAOFFSET+4]=Door Num	  RxBuffer[RXB_DATAOFFSET+5]=Time Zone Num 全局变量:输入:返回:设置成功 =0说明: 要区分持卡人两个门的不同分区,需要修改"设持卡人时区"为      SetCardTimeZone(byte TimezoneNum,byte DoorNum)      且持卡人的结构时区改为四个字节,前两个字节记录门1时区,      后两个字节记录门2时区..      由于软件的时区是单个时区号轮下载,可通过"DoorNum" 来设置      持卡人所属时区.************************************/bit SetCardholderTZ(void)       { if(RxBuffer[RXB_DATAOFFSET+5] < 16)  {   if(!SearchCardFunc())    {    if(RxBuffer[RXB_DATAOFFSET+4]==1)    {    SetCardTimeZone(RxBuffer[RXB_DATAOFFSET+5],1);    return 0;    }    else if(RxBuffer[RXB_DATAOFFSET+4]==2)    {    SetCardTimeZone(RxBuffer[RXB_DATAOFFSET+5],2);    return 0;    }    else return 0;    }  } return 1;  }/************************************功能描述:消除受权卡时区函数组成:全局变量:输入:返回:成功则返回0************************************/bit ClearCardholderTZ(void){ if(RxBuffer[RXB_DATAOFFSET+5] < 16)  {   if(!SearchCardFunc())    {     /* ClearCardTimeZone(RxBuffer[RXB_DATAOFFSET+5]);     return 0; */     if(RxBuffer[RXB_DATAOFFSET+4]==1)    {    ClearCardTimeZone(RxBuffer[RXB_DATAOFFSET+5],1);    return 0;    }    else if(RxBuffer[RXB_DATAOFFSET+4]==2)    {    ClearCardTimeZone(RxBuffer[RXB_DATAOFFSET+5],2);    return 0;    }    else return 0;          }  }   return 1;  /*error */}/************************************功能描述:获取受权卡时区函数组成:全局变量:输入:返回:成功则返回0************************************//*bit GetCardholderValidTZ(void){   if(!SearchCardFunc())    {     GetCardTimeZone();     return 0;     } return 1;  }*//************************************功能描述:受权卡有效时区设置函数组成:全局变量:输入:返回:设置成功 =0************************************/bit SetCardholderValidTZ(void){   if(!SearchCardFunc())    {     SetCardTimeZoneValid();     return 0; /*successful */    } return 1;  /*error */}/************************************功能描述:增加受权卡

⌨️ 快捷键说明

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