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

📄 user.c

📁 PIC单片机的操作系统。picc18编译过
💻 C
字号:
//user.c
#include "pic18.h"
#include "os\os.h"
#include "user\user.h"
#include "user\pcb.h"

static unsigned char CommRxCnt,CommRxOld;
static union 
{
unsigned char Buff[32];
struct
	{
	unsigned int MyAddr;
	unsigned int SourceAddr;
	unsigned int FuctCode;
	unsigned char dLen;
	unsigned char Data [];
	unsigned char Sum;
	}Frame;
}Comm;

unsigned char LockState; //锁状态,0=闭锁,1=开锁
unsigned char DoorState; //门状态,0=关门,1=开门
unsigned char DoorOldState; //门上次的状态,0=关门,1=开门
unsigned char OpenSwState; //出门按钮的状态,0=按下,1=放开
unsigned char OpenSwOldState; //出门按钮上次的状态,1=按下
unsigned char DoorSw; //安装门磁的端口
unsigned char TmrUnLock[PORTS]; //开锁保持时间
unsigned char DoorOpenTime[PORTS]; //门开计时	
void userinit(void)
{

}

void WgReader(void)
{
	
}

void CommCmd(unsigned int cmd) //命令解释
{
	switch (cmd)
	{		
		case 0x0101:
		{
			break;
		}
		case 0x0102:
		{
			break;	
		}
	}	
}

void CommRxProtocol(void) // 通信接收协议解释任务
{
unsigned char rx;
  while(1)
 {
    while (!osGetCommBuff(1,&rx))
    {
    	DelayOsTicks(1);
    }
    if (rx==0x7e)
    {
	    if ((CommRxCnt>8)&&(Comm.Frame.Sum==Comm.Buff[CommRxCnt]))
	    {
			CommCmd(Comm.Frame.FuctCode); 
	    }
	    CommRxCnt=0;
	    Comm.Frame.Sum=0;
	    osQuit();
	} 
    else if (CommRxOld==0x7f)
    {
	    if (rx==0x01)
	    {
		 	rx=0x7e;
		 	CommRxOld=0x01;
		}
		else if (rx==0x02)
		{
	 		rx=0x7f;
	 		CommRxOld=0x02;
	 	}
	 	else //错误
	 	{
	    	CommRxCnt=0;
	    	Comm.Frame.Sum=0;
	    	osQuit();
		} 				
	}
	else
	{
		CommRxOld=rx;
	}
	Comm.Buff[CommRxCnt]=rx;
	CommRxCnt ++;	
	if (CommRxCnt<Comm.Frame.dLen+8)
	{
		Comm.Frame.Sum += rx;
	}
  }
}

void CardTask(void)
{
	
    osQuit();	
}

void UnLock(unsigned char port)//开锁功能
{
	// 从存储器读取开锁保持时间	
	
	LockState |= 1<<port ;// 开锁
}

void CloseLockTask(void)//闭锁任务
{
unsigned char port;

	while (1)
	{
		DelayOsTicks(100); //延时1秒

		for (port=0;port<PORTS;port++)
		{
			if (TmrUnLock[port])
			{
				TmrUnLock[port] --;
				if (TmrUnLock[port]==0)	
				{
					
					;// 如果不在禁止闭锁时间段,则闭锁
				}
			} 
		} //for ()
		
			;//刷新继电器状态		
		
	} // while (1)
}

void ChkOpenSw(void)//检测出门按钮开关
{
unsigned char port;
	while (1)
	{
		OpenSwOldState=0;
		for (port=0;port<PORTS;port++)
		{
			if (OpenSwState&1<<port)
			{
				OpenSwOldState |= 1<<port;
			}
		}
    	DelayOsTicks(10); //0.1s
		for (port=0;port<PORTS;port++)
		{
			if ((OpenSwState&1<<port)&&(OpenSwOldState&1<<port))
			{
				UnLock(port);// 开门
			}
		}
    }
}


void ChkDoorSw(void) //门状态检测
{
unsigned char port;

	while (1)
	{
		DelayOsTicks(20); //0.2s

		for (port=0;port<PORTS;port++)
		{
			if (DoorSw&1<<port) //如果安装门磁
			{
				if (DoorState & (1<<port)) //门开
				{
					if ((DoorOldState &= 1<<port)&&(LockState | !(1<<port))) // 如果不是开锁状态
					{
						;//破门报警	
					}
					DoorOldState |= 1<<port;
					
					if (DoorOpenTime[port])
					{
						 DoorOpenTime[port]--;
						 if (DoorOpenTime[port]==0)
						 {
							; //关门提醒
						 }
					}
				}
				else
				{
					DoorOpenTime[port]=200; //0.2*200=40s
					DoorOldState &= ~(1<<port);
				}
			}
		}
	}
}

void LEDTask(void)
{
	
}

void BeepTask(void)
{

}

⌨️ 快捷键说明

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