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

📄 main.c

📁 c8051f310xmodembootloader.rar
💻 C
字号:
/******************************************************************************
** copyright(c) skee ltd,.co. 1996-2009
** c8051f310  256+1024 bytes ram    osc:24.5M
** RFchip  si4421(433M)   Anti-collision
** Last Modify 2009-12-9
** by jerkoh
** V2.0
******************************************************************************/

#include "global.h"

unsigned char code  system_date[]="\r\n[msg:]Compiler_date:"   __DATE__;
unsigned char code  system_time[]="\r\n[msg:]Compiler_date:"   __TIME__;
/******************************************************************************
** MAIN Routine
******************************************************************************/

void main (void)
{
  
   unsigned char nr;
   unsigned int  event_word_copy;
   
                                                 // Disable Watchdog timer
   PCA0MD &= ~0x40;                              // WDTE = 0 (clear watchdog timer 
                                                 // enable)
   PORT_Init();                                  // Initialize Port I/O
   SYSCLK_Init ();  
                                                 // Initialize Oscillator
   
   event_word=0;

   delayms(200);
   Timer0_Init();
   Timer2_Init(SYSCLK/TIMER2_RATE);              // Init Timer 2 

   PCA_Init ();
   InitSysTimer();                               // 初始化计数器
   
   Beef(2,RED);                                  // 上电2闪2滴
   delayms(500);
   BeefL(1,RED);
   delayms(500);
   
   LEDR_ON;
   LEDG_OFF;
   flash_boot();                                 //AT25参数启动检验提取



   UART0_Init();
   EA=1;
   ES0=1;
   delay(400);
   nres=0;
   delayms(100);
   nres=1;
   ia442xinit();
   spirevtwobyte();
   spisendcommand(0x8288);			             //电源管理 whole receive crystal on
   spisendcommand(0xca83);				         //FIFO COMMAND
   
  
   
   if(DEBUG) Printf_String("\r\n[msg:]Copyright(c) SKEE LTD,.CO. 1996-2009");
   if(DEBUG) Printf_String("\r\n[msg:]EZradio SI4421(433Mhz) Running on C8051F310");


   for(nr=0;nr<sizeof(system_date);nr++)
   {
      if(DEBUG) Printf_Char(system_date[nr]);
   }
   delayms(300);
   for(nr=0;nr<sizeof(system_time);nr++)
   {
      if(DEBUG) Printf_Char(system_time[nr]);
   }

   delayms(100);

   memset(tagnr, 0, sizeof(tagnr));              //清空登记标签结构体
   memset(wiebuf_cout, 0, sizeof(wiebuf_cout));
   
   Init_AT25XXX(0x00);	                         //初始化AT25xxx SPI eeprom
  
   PCA0L    = 0x00;
   PCA0CPL4 = 255;                               //32.1ms
   PCA0MD  |= 0x40;		                         //开启看门狗 

 
    	 
  while(1)
  {  

  
/**********@task00@**********/ 					    		  
/**倒计时数组片管理LED+BELL**/

		 if(GetSysTimer(0))					     //0=LEDR  
         {
            LEDR^=1;
            SetSysTimer(0,500);                  //500MS LEDR闪  
         } 
		 		   
		 if(GetSysTimer(1))						 //1=LEDG
		 {										 //关闭闪过的绿灯
		  	LEDG_OFF;
		 }

		 if(GetSysTimer(2))						 //2=BELL
		 {
		  	BELL_OFF;							 //关闭响过的蜂鸣器
		 }




/**********@task01@**********/  
/*****处理无线接收的信息*****/                 		 	

		 if(receive()) 
		 { 
		    Process_Frame();
		 }


/**********@task02@**********/
/********串口数据处理********/                   

		  event_word_copy=event_word;	         //搜集时间片

          if(event_word_copy&event_uart_arrived)
		  {
			  EA=0;
			  event_word&= ~(event_uart_arrived);//消毁完成任务标记
			  EA=1;
			  process_uart();
		  }

		  	  
		   		
		 
/**********@task03@**********/	
/****每100ms轮询无线标签*****/	                
		  if(event_word_copy&event_time_100ms)
		  {   
			  EA=0;
			  event_word&= ~(event_time_100ms);
			  EA=1;

			  if(((TRIG==0)&&(TRIG_STATE==1)) ||(TRIG==1))	  
			  {								  	 //触发状态加触发或者非触发才询卡
			  			    					
			     SeekFrame(WCMD_NOR);            //普通寻卡
                 txregframe(FRAME_LEN);
			  }	       
		  }
	
/**********@task04@**********/ 
/*****1s基准处理时间事件*****/                  
		  if(event_word_copy&event_time_1000ms)  
		  {
			   EA=0;
			   event_word&= ~(event_time_1000ms);
			   EA=1;
			  
			   for(nr=0;nr<10;nr++)				 //查询登记是否需要老化
			   {
                    if((tagnr[nr].save_inactivity)&&(tagnr[nr].save_state!=0))
			        {
			            tagnr[nr].save_inactivity--;
				        if(tagnr[nr].save_inactivity==0)
				        {
					       tagnr[nr].save_state=0;	 
					    }
			        }

					if(tagnr[nr].save_inactivity==0)
					{
					    tagnr[nr].save_state=0;	
					}
			   }

			   if(event_relay!=0)
			   { 
			     event_relay--;
				   if(event_relay==0)
				   {
				     if(ONLY_READER)
					 {
					    RELAY_IN =ON_1;                //继电器
					    RELAY_OUT=ON_1;
					 }
					 else
					 {
					    RELAY_IN =OFF_0;                
					    RELAY_OUT=OFF_0;
					 }

				   }
			   } 
		  }

		

/**********@task05@**********/
/**处理接收的wiegand数据包***/					 

		  if(event_word_copy&event_wie_arrived)
		  {
			  EA=0;
			  event_word&= ~(event_wie_arrived);
			  EA=1;

			  wie_str=0;	                     //清wiegand脉冲标记
						                         //注意wie_cout半字节当一次处理
			  if(wie_cout==0)
			  {wie_cout++;}
			  for(nr=0;nr<wie_cout;nr++)
			  {   
			    Printf_Char(wiebuf_cout[nr]);
			  }		
		      CLR_WIEBUF_COUT;
		  }

/**********@task06@**********/	
/****处理进出2路触发信号*****/				 
          if(TRIG_IN==0)
		  {
		    RELAY_TRIG_STATE=1;				     //当前进门
			TRIG_STATE=1;
			flg_io=0x01;
		  }
		  else if(TRIG_OUT==0)
		  {
		    RELAY_TRIG_STATE=0;					 //当前出门
			TRIG_STATE=1;
			flg_io=0x00;
		  }
		  else
		  {
		   ;
		  }
/**********@task07@**********/	
/**********@task08@**********/	
/**********@task09@**********/	
/**********@task0A@**********/	
/**********@task0B@**********/	
/**********@task0C@**********/
/**********@task0D@**********/
/**********@task0E@**********/
/**********@task0F@**********/					    
  }
}



/******************************************************************************
** 函数: PORT_Init ()
** 入参: 
** 返回: 
** 说明:
** PORT_Init
** Configure the Crossbar and GPIO ports.
** P0.4 - UART TX
** P0.5 - UART RX
** P3.3 - LED
******************************************************************************/
void PORT_Init (void)
{
   
   P0SKIP    = 0xcf;					         //注意SPI没有配置成硬件,只是脚放在对应位置
   P1SKIP    = 0x03;				  	         //配置P1.2 P1.3 两端块脉冲捕获
   XBR0      = 0x01;                             //使能 UART on P0.4(TX) and P0.5                    
   XBR1      = 0x42;
   P0MDOUT   = 0x1C;                             //使能 UTX 为推挽输出  p0.2 p0.3
  
   P3MDOUT  |= 0x06;				   	         //P3.1 P3.2 继电器


   if(ONLY_READER)								 //只做读卡器时jdq不动作
   {
      RELAY_IN  =1;
      RELAY_OUT =1;
   }
   else
   {
      RELAY_IN  =0;
      RELAY_OUT =0;
   }
    
   
   P0MDOUT   = 0xfd;                             // sdo非推挽
   P1MDOUT  |= 0xf3;					         // nsel p1.0 p1.1推挽  p1.4 p1.5 P1.6 P1.7 
   P2MDOUT  |= 0xb0;					         // P2.7 P2.4 P2.5	 

   
  
   D0IN      = 0;
   D1IN      = 0;
   D0OUT     = 0;
   D1OUT     = 0;
  
   BELL      = 0;					             //蜂鸣器关闭
   LEDR      = 1;					             //LED关闭

   sck       = 0;
   nsel      = 0;
   sdi       = 1;
   sdo       = 1;

   X_CS      = 1;                                //不选中AT25128 

	
}

/******************************************************************************
** 函数:beef(unchar be)
** 入参:be, rg 
** 返回: 
** 说明:

******************************************************************************/
void Beef(UCHAR be,UCHAR RG)
{
 UCHAR i;

  if(be==1)
  {
      BELL_ON;
	  if(RG==RED) {LEDR_ON;}
	  else
      {LEDG_ON;}
      delayms(100);
      BELL_OFF;			                         //单次蜂鸣
      if(RG==RED) {LEDR_OFF;}
	  else
      {LEDG_OFF;}
  }

  else
  {
    for(i=0;i<be;i++)
    {
	  BELL_ON;
      if(RG==RED) {LEDR_ON;}
	  else
      {LEDG_ON;}
      delayms(100);
      BELL_OFF;
      if(RG==RED) {LEDR_OFF;}
	  else
      {LEDG_OFF;}
	  delayms(200);	                             //多次蜂鸣需要间隔延时
	}
  }
}

 void BeefL(UCHAR be,UCHAR RG)
{
 UCHAR i;

  if(be==1)
  {
      BELL_ON;
      if(RG==RED) {LEDR_ON;}
	  else
      {LEDG_ON;}
      delayms(500);
      BELL_OFF;			                         //单次蜂鸣
      if(RG==RED) {LEDR_OFF;}
	  else
      {LEDG_OFF;}
  }

  else
  {
   for(i=0;i<be;i++)
   {
	  BELL_ON;
      if(RG==RED) {LEDR_ON;}
	  else
      {LEDG_ON;}
      delayms(300);
      BELL_OFF;
      if(RG==RED) {LEDR_OFF;}
	  else
      {LEDG_OFF;}
	  delayms(200);	                             //多次蜂鸣需要间隔延时
    }
  }
}


/******************************************************************************
** 函数: SYSCLK_Init ()
** 入参: 
** 返回: 
** 说明:
** SYSCLK_Init
** This routine initializes the system clock to use the internal oscillator
** at its maximum frequency.
** Also enables the Missing Clock Detector.
******************************************************************************/

void SYSCLK_Init (void)
{
   OSCICN |= 0x03;                               // Configure internal oscillator for
                                                 // its maximum frequency
   RSTSRC = 0x04;                                // Enable missing clock detector
     								     
}

/******************************************************************************
** 函数: delay()
** 入参: unsigned int m
** 返回: 
** 说明:
******************************************************************************/

void delay(unsigned int m)
{
   unsigned int n;
   n=0;
   while(n<m)
   {n++;}
   return;
}


/******************************************************************************
** 函数:  PCA_Init
** 入参:  无
** 返回:  误
** 说明:  脉冲捕获初始化
******************************************************************************/

void PCA_Init (void)
{
	EIE1     = 0x10;		                     //允许PCA0中断请求		
   
	PCA0L	 = 0x00;
	PCA0H	 = 0x00;

	PCA0CPM0 = 0x11;	
	PCA0CPL0 = 0x00;
	PCA0CPH0 = 0x20;


    PCA0CPM1 = 0x11;	
	PCA0CPL1 = 0x00;
	PCA0CPH1 = 0x20;

	PCA0CN   = 0x40;		                     //允许PCA定时器/计数器

}
/******************************************************************************
** 函数:  PCA_ISR
** 入参:  无
** 返回:  无
** 说明:  脉冲捕获中断服务程序
******************************************************************************/

void PCA_ISR (void) interrupt 11
{


	CF   = 0;			                         //脉冲中断清标记

	wie_str=1;				                     //设置标记提供TIME0检测
    RE_LOAD_TIME0;
				                                 //重载定时器0
	

  if(CCF0==1)				                     //查看d0 or d1
  {
	CCF0 = 0;		                             //清匹配中断标志
	
	wiebuf_cout[wie_cout]<<=1;	
	wiebuf_cout[wie_cout] |=0;
	wie_8bit--;

  }


  if(CCF1==1)
  {
	CCF1 = 0;
	wiebuf_cout[wie_cout]<<=1;
    wiebuf_cout[wie_cout] |=1;	
	wie_8bit--;
  }


   if(!wie_8bit)				                 //8bit 1字节溢出归0,数组指针+1
   {
    wie_cout++;
    wie_8bit=8;
   }

   				   
   if(wie_cout>=32)			                     //最多接收32字节wiegand信号
   {
	CLR_WIEBUF_COUT;
   }
   		
}
/******************************************************************************
** 函数:  relay_work
** 入参:  无
** 返回:  无
** 说明:  继电器动作
******************************************************************************/
void relay_work()
{

  if(ONLY_READER)
  {
     if(TRIG==1)	                                 //非外部触发信号
     {
	    if(WIE_CK==0)                              //既进又出
	    {
	       RELAY_IN=OFF_0;
	       RELAY_OUT=OFF_0;
	    }

	    else
	    {
	       if(IN_OUT==1)                          //根据卡标记动作
		   {
		      RELAY_IN=OFF_0;
		   }
		   else
		   {
		      RELAY_OUT=OFF_0;
		   }
	    }

     }
     else	                                     //外部触发信号
     {
	    if(RELAY_TRIG_STATE==1)
	    {
	       RELAY_IN=OFF_0;                              //如果触发的是进门,开进门继电器
	    }
	    else
	    {
	       RELAY_OUT=OFF_0;
	    }
		
	 }
  }	
  else
  {
   return;  //继电器不动作
  }  
}


/****************************@end@*************************************/

⌨️ 快捷键说明

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