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

📄 people-counter.c

📁 基于16f877的单片机人数统计系统源码
💻 C
字号:
#include<pic.h>
#define DIN  RB5
#define LOAD RB6
#define CLK  RB7
#define P1_1  RA0
#define P1_2  RA3
#define P1_3  RC0
#define P1_4  RC3
#define P1_5  RD0
#define P1_6  RD3
#define P2_1  RA1
#define P2_2  RA4
#define P2_3  RC1
#define P2_4  RC4
#define P2_5  RD1
#define P2_6  RD4
#define P3_1  RA2
#define P3_2  RA5
#define P3_3  RC2
#define P3_4  RC5
#define P3_5  RD2
#define P3_6  RD5
#define key1  RB0
#define key2  RB1
#define key3  RB2
#define key4  RB3
#define alarm RB4
#define on    0
#define off   1
#define uchar  unsigned char 
#define try_in     1
#define in_middle  2
#define in_room    3
#define try_out    4
#define out_middle 5
#define out_room   6
void display(int n);
void translate();
void ADD(uchar k);
void Writeword(uchar addr,uchar num);
void Sendchar(uchar ch);
void send();
void sciint();
int sum=0;
int max=0;
bank2 unsigned char max_low;
bank2 unsigned char max_hig;
uchar state[6]={0,0,0,0,0,0};
uchar Disbuf[8]={0,0,0,0,0,0,0,0};
uchar Tran_Disbuf[8]={0,0,0,0,0,0,0,0};
uchar D[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
uchar flag1=0;
uchar flag2=0;
uchar flag3=0;
uchar flag4=0;
uchar psend[2]={0,0};
uchar receive;
uchar s;
main()
{ 
	TRISA=0Xff;
	TRISB=0X0f;
	TRISC=0Xff;
	TRISD=0Xff;
	alarm=0;
	LOAD=1;
	CLK=0;
	Writeword(0x0b,0x07);//设置扫描界限
	Writeword(0x09,0x00);//设置译码模式
	Writeword(0x0a,0x0a);//设置亮度
	Writeword(0x0c,0x01);//设置为正常工作模式
	Writeword(D[0],0x7e);
	Writeword(D[1],0x7e);
	Writeword(D[2],0x7e);
	Writeword(D[3],0x7e);
	max_low=eeprom_read(0x01);
	max_hig=eeprom_read(0x02);
	max=max_hig*100+max_low;
	if(max>9999)
	   max=0;
	Disbuf[4]=max%10;
	Disbuf[5]=(max/10)%10;
	Disbuf[6]=(max/100)%10;
	Disbuf[7]=max/1000;
	while(1)
	{ 
     //---------------------------第一个门-------------------------------
     //------------------进门-------------------------------------------
		
	  if(P1_1==off&&P2_1==off&&P3_1==off&&(state[0]==try_in||state[0]==in_middle||state[0]==try_out||state[0]==out_middle))
          state[0]=0;
      if(P1_1==on&&P2_1==off&&P3_1==off&&state[0]==0)
          state[0]=try_in;
      if(P2_1==on&&state[0]==try_in)
          state[0]=in_middle;
      if(P3_1==on&&state[0]==in_middle)
          state[0]=in_room;
      if(P3_1==off&&P2_1==on&&state[0]==in_room)
          state[0]=in_middle;  //-----------回马枪,虚进----------
      if(state[0]==in_room&&P2_1==off&&P3_1==off)
          {
	        sum++;
	        display(sum);
	        state[0]=0;
	      }
	  
	  //------------------出门-------------------------------------------
	  
      if(P3_1==on&&P2_1==off&&P1_1==off&&state[0]==0)
          state[0]=try_out;
      if(P2_1==on&&state[0]==try_out)
          state[0]=out_middle;
      if(P1_1==on&&state[0]==out_middle)
          state[0]=out_room;
      if(P1_1==off&&P2_1==on&&state[0]==out_room)
          state[0]=out_middle;  //-----------回马枪,虚出----------
      if(state[0]==out_room&&P2_1==off&&P1_1==off)
          {
	        sum--;
	        display(sum);
	        state[0]=0;
	      }
	   
      //---------------------------第二个门-------------------------------
     //------------------进门-------------------------------------------
		
	  if(P1_2==off&&P2_2==off&&P3_2==off&&(state[1]==try_in||state[1]==in_middle||state[1]==try_out||state[1]==out_middle))
          state[1]=0;
      if(P1_2==on&&P2_2==off&&P3_2==off&&state[1]==0)
          state[1]=try_in;
      if(P2_2==on&&state[1]==try_in)
          state[1]=in_middle;
      if(P3_2==on&&state[1]==in_middle)
          state[1]=in_room;
      if(P3_2==off&&P2_2==on&&state[1]==in_room)
          state[1]=in_middle;  //-----------回马枪,虚进----------
      if(state[1]==in_room&&P2_2==off&&P3_2==off)
          {
	        sum++;
	        display(sum);
	        state[1]=0;
	      }
	  
	  //------------------出门-------------------------------------------
	  
      if(P3_2==on&&P2_2==off&&P1_2==off&&state[1]==0)
          state[1]=try_out;
      if(P2_2==on&&state[1]==try_out)
          state[1]=out_middle;
      if(P1_2==on&&state[1]==out_middle)
          state[1]=out_room;
      if(P1_2==off&&P2_2==on&&state[1]==out_room)
          state[1]=out_middle;  //-----------回马枪,虚出----------
      if(state[1]==out_room&&P2_2==off&&P1_2==off)
          {
	        sum--;
	        display(sum);
	        state[1]=0;
	      }
  //---------------------------第三个门-------------------------------
     //------------------进门-------------------------------------------
		
	  if(P1_3==off&&P2_3==off&&P3_3==off&&(state[2]==try_in||state[2]==in_middle||state[2]==try_out||state[2]==out_middle))
          state[2]=0;
      if(P1_3==on&&P2_3==off&&P3_3==off&&state[2]==0)
          state[2]=try_in;
      if(P2_3==on&&state[2]==try_in)
          state[2]=in_middle;
      if(P3_3==on&&state[2]==in_middle)
          state[2]=in_room;
      if(P3_3==off&&P2_3==on&&state[2]==in_room)
          state[2]=in_middle;  //-----------回马枪,虚进----------
      if(state[2]==in_room&&P2_3==off&&P3_3==off)
          {
	        sum++;
	        display(sum);
	        state[2]=0;
	      }
	  
	  //------------------出门-------------------------------------------
	  
      if(P3_3==on&&P2_3==off&&P1_3==off&&state[2]==0)
          state[2]=try_out;
      if(P2_3==on&&state[2]==try_out)
          state[2]=out_middle;
      if(P1_3==on&&state[2]==out_middle)
          state[2]=out_room;
      if(P1_3==off&&P2_3==on&&state[2]==out_room)
          state[2]=out_middle;  //-----------回马枪,虚出----------
      if(state[2]==out_room&&P2_3==off&&P1_3==off)
          {
	        sum--;
	        display(sum);
	        state[2]=0;
	      }
	 //---------------------------第四个门-------------------------------
     //------------------进门-------------------------------------------
		
	  if(P1_4==off&&P2_4==off&&P3_4==off&&(state[3]==try_in||state[3]==in_middle||state[3]==try_out||state[3]==out_middle))
          state[3]=0;
      if(P1_4==on&&P2_4==off&&P3_4==off&&state[3]==0)
          state[3]=try_in;
      if(P2_4==on&&state[3]==try_in)
          state[3]=in_middle;
      if(P3_4==on&&state[3]==in_middle)
          state[3]=in_room;
      if(P3_4==off&&P2_4==on&&state[3]==in_room)
          state[3]=in_middle;  //-----------回马枪,虚进----------
      if(state[3]==in_room&&P2_4==off&&P3_4==off)
          {
	        sum++;
	        display(sum);
	        state[3]=0;
	      }
	  
	  //------------------出门-------------------------------------------
	  
      if(P3_4==on&&P2_4==off&&P1_4==off&&state[3]==0)
          state[3]=try_out;
      if(P2_4==on&&state[3]==try_out)
          state[3]=out_middle;
      if(P1_4==on&&state[3]==out_middle)
          state[3]=out_room;
      if(P1_4==off&&P2_4==on&&state[3]==out_room)
          state[3]=out_middle;  //-----------回马枪,虚出----------
      if(state[3]==out_room&&P2_4==off&&P1_4==off)
          {
	        sum--;
	        display(sum);
	        state[3]=0;
	      }
	  //---------------------------第五个门-------------------------------
     //------------------进门-------------------------------------------
		
	  if(P1_5==off&&P2_5==off&&P3_5==off&&(state[4]==try_in||state[4]==in_middle||state[4]==try_out||state[4]==out_middle))
          state[4]=0;
      if(P1_5==on&&P2_5==off&&P3_5==off&&state[4]==0)
          state[4]=try_in;
      if(P2_5==on&&state[4]==try_in)
          state[4]=in_middle;
      if(P3_5==on&&state[4]==in_middle)
          state[4]=in_room;
      if(P3_5==off&&P2_5==on&&state[4]==in_room)
          state[4]=in_middle;  //-----------回马枪,虚进----------
      if(state[4]==in_room&&P2_5==off&&P3_5==off)
          {
	        sum++;
	        display(sum);
	        state[4]=0;
	      }
	  
	  //------------------出门-------------------------------------------
	  
      if(P3_5==on&&P2_5==off&&P1_5==off&&state[4]==0)
          state[4]=try_out;
      if(P2_5==on&&state[4]==try_out)
          state[4]=out_middle;
      if(P1_5==on&&state[4]==out_middle)
          state[4]=out_room;
      if(P1_5==off&&P2_5==on&&state[4]==out_room)
          state[4]=out_middle;  //-----------回马枪,虚出----------
      if(state[4]==out_room&&P2_5==off&&P1_5==off)
          {
	        sum--;
	        display(sum);
	        state[4]=0;
	      }
	  //---------------------------第六个门-------------------------------
     //------------------进门-------------------------------------------
		
	  if(P1_6==off&&P2_6==off&&P3_6==off&&(state[5]==try_in||state[5]==in_middle||state[5]==try_out||state[5]==out_middle))
          state[5]=0;
      if(P1_6==on&&P2_6==off&&P3_6==off&&state[5]==0)
          state[5]=try_in;
      if(P2_6==on&&state[5]==try_in)
          state[5]=in_middle;
      if(P3_6==on&&state[5]==in_middle)
          state[5]=in_room;
      if(P3_6==off&&P2_6==on&&state[5]==in_room)
          state[5]=in_middle;  //-----------回马枪,虚进----------
      if(state[5]==in_room&&P2_6==off&&P3_6==off)
          {
	        sum++;
	        display(sum);
	        state[5]=0;
	      }
	  
	  //------------------出门-------------------------------------------
	  
      if(P3_6==on&&P2_6==off&&P1_6==off&&state[5]==0)
          state[5]=try_out;
      if(P2_6==on&&state[5]==try_out)
          state[5]=out_middle;
      if(P1_6==on&&state[5]==out_middle)
          state[5]=out_room;
      if(P1_6==off&&P2_6==on&&state[5]==out_room)
          state[5]=out_middle;  //-----------回马枪,虚出----------
      if(state[5]==out_room&&P2_6==off&&P1_6==off)
          {
	        sum--;
	        display(sum);
	        state[5]=0;
	      }
	      
	  //------------------按键扫描-------------------------------------------    
	      
	  if(flag1==0&&key1==1)
	      {ADD(4);
		   flag1=1;
		  } 
	  if(flag1==1&&key1==0)
		   flag1=0;
	
	 if(flag2==0&&key2==1)
	      {ADD(5);
		   flag2=1;
		  } 
	  if(flag2==1&&key2==0)
		   flag2=0;	  
	  
	  if(flag3==0&&key3==1)
	      {ADD(6);
		   flag3=1;
		  } 
	  if(flag3==1&&key3==0)
		   flag3=0;	
		   
      if(flag4==0&&key4==1)
	      {ADD(7);
		   flag4=1;
		  } 
	  if(flag4==1&&key4==0)
		   flag4=0;	

      //--------------------警报-------------------------------------	  
	    max=Disbuf[7]*1000+Disbuf[6]*100+Disbuf[5]*10+Disbuf[4];
	    max_hig=max/100;
	    max_low=max%100;
	    eeprom_write(0x01,max_low);
	    eeprom_write(0x02,max_hig);
	  if(sum>=max) 
	    alarm=1;
	  else
	    alarm=0;
	}
} 


//-------------------显示子程序-------------------------------------

void display(int n)
{
  if(n>=10000)
     n=9999;
  Disbuf[0]=n%10;
  Disbuf[1]=(n/10)%10;
  Disbuf[2]=(n/100)%10;
  Disbuf[3]=(n/1000)%10;
  translate(); 
  Writeword(D[0],Tran_Disbuf[3]);
  Writeword(D[1],Tran_Disbuf[2]);
  Writeword(D[2],Tran_Disbuf[1]);
  Writeword(D[3],Tran_Disbuf[0]);  
 }
 
void translate() 
{ int i; 
  for(i=0;i<8;i++)
   { switch(Disbuf[i])
	 { case 0:
	         { Tran_Disbuf[i]=0x7e;
		       break;
		     }
	   case 1:
	         { Tran_Disbuf[i]=0x30;
		       break;
		     }
	   case 2:
	         { Tran_Disbuf[i]=0x6d;
		       break;
		     }
	   case 3:
	         { Tran_Disbuf[i]=0x79;
		       break;
		     }
	   case 4:
	         { Tran_Disbuf[i]=0x33;
		       break;
		     }
	   case 5:
	         { Tran_Disbuf[i]=0x5b;
		       break;
		     }
	   case 6:
	         { Tran_Disbuf[i]=0x5f;
		       break;
		     }
	   case 7:
	         { Tran_Disbuf[i]=0x70;
		       break;
		     }
	   case 8:
	         { Tran_Disbuf[i]=0x7f;
		       break;
		     }
	   case 9:
	         { Tran_Disbuf[i]=0x7b;
		       break;
 		     }
 	  default:break;
 	}	     
  }
}

void Writeword(uchar addr,uchar num) 
{
  LOAD=0;
  asm("nop");
  Sendchar(addr);
  asm("nop");
  Sendchar(num);
  asm("nop");
  LOAD=1;
}

void Sendchar(uchar ch)
{
 uchar j,temp;
 asm("nop");
 for(j=0;j<8;j++)
   {
	  temp=ch&0x80;
	  ch=ch<<1;
	  if(temp)
	   { DIN=1;
		 CLK=0;
		 CLK=1;
		}
	  else
	   { DIN=0;
		 CLK=0;
		 CLK=1;
		}
    } 
}  
		 
void ADD(uchar k)
{
 int tmp;
 tmp=Disbuf[k]++;
 if(tmp>=10)
    Disbuf[k]=0;
 translate();
 Writeword(D[k],Tran_Disbuf[11-k]);
}
void send()//----------------------------发送数据----------------------------
{
  sciint();
  di();//------------------------------中断禁止------------------------------
  psend[0]=sum%100;
  psend[1]=sum/100;
  CREN=1;
  TXEN=1;
  while(1)
  {
	  if(RCIF==1)
	  break;
  }
  receive=RCREG;
  if(receive==0xff)
    for(s=0;s<2;s++)
     {
	     TXREG=psend[s];
	     while(1)
	      {
		     if(TXIF==1)
		      break;
		   }
		  while(1)
	      {
		     if(RCIF==1)
		      break;
		   }
		      
	     RCREG=RCREG;
	    } 
}
void  sciint()//-------------------初始化程序---------------------------
{
	SPBRG=0X19;
	TXSTA=0X04;
	RCSTA=0X80;
	TRISC6=1;
	TRISC7=1;
}

⌨️ 快捷键说明

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