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

📄 main.c

📁 这是一个红外报警系统
💻 C
字号:


//红外报警系统

#include<REGX52.H>
//#include "1602S51.H"

sbit Alarm_sound=P1^3; 	  //蜂鸣器,低电平有效
sbit LED_Green=P2^5;     //正常工作指示  --绿
sbit LED_Test=P2^6;       //测试状态指示  --红
sbit Relay_Control=P1^4;     //继电器 低电平有效
sbit Red_LED1=P1^0;		  //红外接收头1
sbit Red_LED2=P1^1;		  //红外接收头2
sbit Red_LED3=P1^2;		  //红外接收头3
sbit human=P3^0;           //热释电按口 

unsigned int Alarm_Number=10;       //报警门限值,可通过按键改变
unsigned char  Style_bit=0;         //类型标志位
unsigned int Count_number=0;	    //计数
bit Alarm_bit=0;		 			//强制报警开关
bit Test_bit=0;					    //测试标志
bit Red_recognize_bit1=0;           //识别到物体标志
bit Red_recognize_bit2=0;           //识别到物体标志
unsigned char delay_count;	        //灯的开关状态	延迟计数,当到一定次数,就进行开关灯操作,
                                    //这样做的好处时为了使灯的闪烁时间不影响其他子程序,如按键扫描
   
 
unsigned char  style[6]={"STYLE:"}; //显示      Style 类型
unsigned char  raster[6]={"Raster"};//显示	    光栅
unsigned char  identify[8]={"Identify"}; // 显示  人体识别
unsigned char  TestModel[9]={"TestModel"}; //显示 测试模式
unsigned char  count[7]={"Count: "}; // 显示  人体识别
unsigned char  change[9]={"Alarm_Num"};
unsigned char  Clear9[9]={"         "};	   //用于清屏
unsigned char  Clear16[16]={"                "};	   //用于清屏
unsigned char  Warning[16]={"   Warning!     "};

void Alarm_CLOSE(void);
void Alarm_OPEN(void);
void Key_Scan(void);
void Test(void);

//------------------------------------------------------
//液晶1602相关定义
sbit LCDE=P2^7;
sbit RW=P3^4;
sbit RS=P3^5;

wr_com(unsigned char comm);//********写控制字符程序 E=1 RS=0 RW=0**********//
wr_data(unsigned char dat);//*****当前位置写字符子程序:E=1 RS=1 RW=0
void display(unsigned char addr,unsigned char *a,unsigned char c);
unsigned char rd_bf();//*****忙状态检查*******//


//*************delay_ms******************************** 
void delay_10us(unsigned char x)  
{  
  while(x--); 
}  

void delay_ms(unsigned char cnt) 
{ 
    unsigned char i; 
do { 
  i = 4; 
  do { 
   delay_10us(39); 
  } while(--i); 
} while(--cnt); 
} 

//====================================================
//     1602液晶相关


wr_com(unsigned char comm)//********写控制字符程序 E=1 RS=0 RW=0**********//
{                         
		LCDE=0;
		RS=0;             //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
		RW=0;             //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
		LCDE=1;
		P0=comm;
		RS=0;
		RW=0;
		LCDE=0;
}

wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
		LCDE=0;
		RS=0;             //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
		RW=0;             //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
		RS=1;
		RW=0;
		LCDE=1;
		P0=dat;
  		LCDE=0;
		RS=0;
		RW=0;
}


unsigned char rd_bf()//*****忙状态检查*******//
{
		unsigned char i;
		//P0=0xff;
		LCDE=0;
		RS=0;
		RW=0;
		RS=0;
		RW=1;
		LCDE=1;
		i=P0;
  		LCDE=0;
	
//		while(i){i=P0_7;}

		return(i);
}
	
void init_LCD()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
	wr_com(0x38);   //*****显示模式设置必须三次,不用检测忙信号
	delay_ms(5);
	wr_com(0x38);
	delay_ms(5);
	wr_com(0x38);
	delay_ms(5);

	//rd_bf();
	//delay5ms();
	wr_com(0x01);   ///***清屏****
	delay_ms(5);
	rd_bf();
	delay_ms(5);
	wr_com(0x06);   ///****光标移动设置***
   delay_ms(5);
	rd_bf();
	delay_ms(1);
	wr_com(0x38);   ////***显示模式设置****
	delay_ms(1);
	rd_bf();
    delay_ms(1);
	wr_com(0x0f);   /////***显示开***
    delay_ms(1);
	rd_bf();
	delay_ms(1);
	
	wr_com(0x40);		//set cgram address
	delay_ms(1);
//	rd_bf();
	

}

//---------------------------------------
//名称:显示子程序
//功能:在指定地方显示字符
//入口:a 是指向要显示的数组
//      addr是要显示的地址
//      c 为数组长度
//返回:无
void display(unsigned char addr, unsigned char *a, unsigned char c)  
{
    unsigned char i;
//	if(rd_bf())
	wr_com(addr);
    for(i=0;i<c;i++)
	  {
      	rd_bf();   
	    wr_data(a[i]);
        delay_10us(1);
	  }


	
} 
 
//---------------------------------------------------------------
//功能:数据输出
//输入:str为要显示的数据,X为坐标
void Printf_Number(unsigned char X,unsigned long Temp)
	{
		
	 	unsigned char i = 8;
	    char vec[9];
	    char *ptr=vec; 
	    vec[i]  = 0;         
	    do
		{
	        vec[--i] = Temp%10 + '0';
	        Temp /= 10;
	    }
		while (Temp!=0);

	    ptr=ptr+i;

	    wr_com(X);
		while((*ptr) != '\0')	
		{
		//	wr_lcd (dat, *ptr);

			rd_bf();   
	        wr_data(*ptr);
			ptr ++;
			delay_10us(2);
		}
	}




void main(void)
{
   
   P0=0;
   P1=0xff;
   P2=0xFF;
   P3=0xff;

   Alarm_sound=1;	  //关蜂鸣器
   LED_Green=1;
   LED_Test=0;		   
   Relay_Control=1;
   init_LCD(); //初始化1602
   display(0x80,style,6);   //第一行  
   display(0x88,raster,6);   //第二行 
   display(0xc0,count,7);   //第二行
//   Print_Number(0xc7,12);

   while(1)
   {
      //Printf_Number(0xc8,Alarm_Number);
    
       Key_Scan();

	   if(Alarm_bit==1)
	     {
		   delay_count++;
		   delay_ms(10);	     //延迟10MS
		   if(delay_count>100)	 //当延迟100次10毫秒=1S 
		     {
			    delay_count=0;
				Relay_Control=~Relay_Control; //开灯 或 关灯	   ---------达到让报警时灯闪烁的效果
			 }
		 }

	

	  switch(Style_bit)
		{
		     case 0:  if(Alarm_bit==0)	                 //光栅模式
			            {
			             Test(); 
			             if(Count_number>Alarm_Number)	//当超过设定的门限值,就报警
		    			  {
			   				Count_number=0;
							Alarm_OPEN();	
							Alarm_bit=1;					
						  }
                        }						

			            break;	
			 case 1: 	if(human==1&&Alarm_bit==0) 		 //人体识别模式
			 			 {
						   if(Red_recognize_bit1==1)    //每一个跳变数一次,为了防止一次多数问题
						    { 
							  Red_recognize_bit1=0;
							  LED_Green=1;
							  Count_number++;
							  display(0xc7,Clear9,7); //清屏
							  display(0xc0,count,7);
							  Printf_Number(0xc8,Count_number);
			   				  Red_recognize_bit1=0;		        
							  if(Count_number>Alarm_Number)		 //当超过设定的门限值,就报警
							   {
							   	   Count_number=0;
								   Alarm_OPEN();	
								   Alarm_bit=1;
							   }
							 }

				
							 
			             
		                   }
						 else
						  {
						    LED_Green=0;
							Red_recognize_bit1=1;
						  }
			 		    
			            break;	
			 default:break;
			 	 	
		}					   
     
 	 
   }
  
}

  
//------------------------------------------
//按键扫描子程序
//------------------------------------------
void Key_Scan(void)
{
    unsigned char temp;
	
    P2_0=1;
	P2_1=1;
	P2_2=1;
	P2_3=1;
	temp=P2;
	temp=temp&0x0f;
    if(temp!=0x0f)		//改变
	  {
	    P2|=0x0f;
		delay_ms(10);

	
	    temp=P2;
	    temp=temp&0x0F;
		if(temp!=0x0F)
		  {
		      switch(temp)
			  {
			     case 0x0E:  Style_bit++;
				             if(Style_bit==2)Style_bit=0;
							   switch(Style_bit)	 //做界面
								{
		    					 case 0: Count_number=0;
								         display(0x87,Clear9,9);	//清屏
								 		 display(0xc0,Clear16,16);	//清屏
										 display(0xc0,count,7);   // 
								         display(0x88,raster,6);break;	 //光栅模式

								 case 1:  Count_number=0;
								         display(0x87,Clear9,9); //清屏
								         display(0xc0,Clear16,16);	//清屏
										 display(0xc0,count,7);   // 
								 		 display(0x88,identify,8); break;	 //人体识别模式

								 default:break;
								}				
							   
				                                  break;	   //改变类型	 Test_bit=-Test_bit	调试模式
				 case 0x0D:  Alarm_bit=~Alarm_bit;
				             if(Alarm_bit==1)
							   {
							     Alarm_OPEN();
							   }
							   else
							   {
							     Alarm_CLOSE();
								 display(0xc0,Clear16,16);	//清屏
								 display(0xc0,count,7);   //第二行
							   }
				             break;	   //强制开报警	  1101
				 case 0x0B:  Count_number=0;
				 			Alarm_Number++;
				 			display(0xc0,change,9); 
							display(0xca,Clear9,5); //清屏 
				 			Printf_Number(0xca,Alarm_Number); break;	   //加加		  1011
				 case 0x07:	 Count_number=0;
				             Alarm_Number--;
				             display(0xc0,change,9);
							 display(0xca,Clear9,5); //清屏
				             Printf_Number(0xca,Alarm_Number); break;      //减减		// 0111
				 default:break;
			  }

			  while(temp!=0x0f)
			  {
			    P2|=0x0f;
	    	
	    		temp=P2;
	    		temp=temp&0x0f;
			  }
		     
		  }
	  }
 
}


//开关警报
void Alarm_OPEN(void)
{
 
   Alarm_sound=0;   //开蜂鸣器
   Relay_Control=0; //开灯
   
   display(0xc0,Warning,16);
}

void Alarm_CLOSE(void)
{
   Alarm_sound=1;   //关蜂鸣器
   Relay_Control=1; //关灯
   display(0xc0,count,7);
   Alarm_bit=0;	//关了报警的标志
   Count_number=0;
}


void Test(void)
{

       P3_2=1;
	   delay_ms(30);
	    
	   
	   if(((Red_LED1==0)&&(Red_LED2==0))||((Red_LED2==0)&&(Red_LED3==0))||((Red_LED1==0)&&(Red_LED3==0)))
	   {
	   	   LED_Test=1;
		   Red_recognize_bit1=1;   
	   }
    
	   else	
	   {
	    LED_Test=0;
		if(Red_recognize_bit1==1)
		  {
		  		Count_number++;	 
				display(0xc7,Clear9,7); //清屏
				display(0xc0,count,7);
				Printf_Number(0xc8,Count_number);
				Red_recognize_bit1=0;
		  }
		
		
	   }
	   P3_2=0;
       delay_ms(30);
   
 //  	 
       
}

//void Identify_Model(void)
//{
  
//}

⌨️ 快捷键说明

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