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

📄 报警器.c

📁 报警器单片机VC程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//函数名:void I2cDelay()
//函数功能:I2C延时
//制作者:
//日期:08-03-15
//============================================ 
void I2cDelay()
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}

//============================================
//函数名:void I2cStart()
//函数功能:I2C起始条件
//制作者:
//日期:08-03-15
//============================================ 
void I2cStart()
{
  SDA=1;
  _nop_();
  SCL=1;
  I2cDelay();
  SDA=0;
  I2cDelay();
  SCL=0;                 //钳住I2C总线,准备发送或接收数据
  _nop_();
}
//============================================
//函数名:void I2cStop()
//函数功能:I2C停止条件
//制作者:
//日期:08-03-15
//============================================ 
void I2cStop()
{
   SDA=0;
   _nop_();
   SCL=1;
   I2cDelay();
   SDA=1;
   I2cDelay();
}
//============================================
//函数名:void I2cAck()
//函数功能:发ACK应答
//制作者:
//日期:08-03-15
//============================================ 
void I2cAck()
{
   SDA=0;
   _nop_();
   SCL=1;
   I2cDelay();
   SCL=0;
   _nop_();
}
//============================================
//函数名:void I2cNoAck()
//函数功能:发NOACK应答
//制作者:
//日期:08-03-15
//============================================ 
void I2cNoAck()
{
   SDA=1;
   _nop_();
   SCL=1;
   I2cDelay();
   SCL=0;
   _nop_();
}
//============================================
//函数名:bit WaitAck()
//函数功能:等待应答
//制作者:
//日期:08-03-15
//============================================ 
bit WaitAck()
{
   uchar Time=255;
   SDA=1;
   _nop_();
   SCL=1;
   I2cDelay();
   while(SDA)
   {
      Time--;
      if(Time==0)
        {
         I2cStop();
         return (0);
        }
   }
   SCL=0;
   _nop_();
   return (1);
}
//============================================
//函数名:void I2cWriteByte(uchar Data)
//函数功能:I2C写一字节数据
//制作者:
//日期:08-03-15
//============================================ 
void I2cWriteByte(uchar Data)
{
    uchar i;
    for(i=0;i<8;i++)
    {
       SCL=0;
       I2cDelay();
       SDA=(bit)(Data&0x80);
       Data<<=1;
       I2cDelay();
       SCL=1;
       I2cDelay();
    }
  SCL=0;
}
//============================================
//函数名:uchar I2cReadByte()
//函数功能:I2C读一字节数据
//制作者:
//日期:08-03-15
//============================================ 
uchar I2cReadByte()
{
  uchar i,TmpData=0;
  SDA=1;
  for(i=0;i<8;i++)
  {
    SCL=0;
    I2cDelay();
    SCL=1;
    I2cDelay();
    TmpData<<=1;
    TmpData|=SDA;
   }
  SCL=0;
  return(TmpData);
}
//============================================
//函数名:void I2cWrite(uchar Address,uchar Data)
//函数功能:I2C写数据到AT24C02
//制作者:
//日期:08-03-15
//============================================ 
void I2cWrite(uchar Address,uchar Data)
{
   I2cStart();   //启动总线
   I2cWriteByte(0xA0);//发送器件地址
   WaitAck();
   I2cWriteByte(Address);//发送器件子地址
   WaitAck();
   I2cWriteByte(Data);//发送数据
   WaitAck();
   I2cStop();
}
//============================================
//函数名:uchar I2cRead(uchar Address)
//函数功能:I2C从AT24C02读数据
//制作者:
//日期:08-03-15
//============================================ 
uchar I2cRead(uchar Address)
{
   uchar TmpData;
   I2cStart();//启动总线
   I2cWriteByte(0xA0);//发送器件地址
   WaitAck();
   I2cWriteByte(Address);//发送器件子地址
   WaitAck();
   I2cStart();//启动总线
   I2cWriteByte(0xA1);//发送器件地址
   I2cAck();
   TmpData=I2cReadByte();//读取数据
   I2cNoAck();
   I2cStop();
   return(TmpData);
}



//============================================
//函数名:void mode2(void)interrupt 1
//函数功能:定时器0
//制作者:
//日期:08-03-15
//============================================ 
void mode2(void) interrupt 1  //报警模式2
    {	  
	  TH0=(65535-50000)/256;	
	  TL0=(65535-50000)%256; //50ms的中断
	  count++;
	  if(count==20)			 //1S 的中断
	    {
		  seconds++;
	  	  count=0;
		  if(seconds==120)	//如果120秒钟内没解除 报警则报警
			 { 
			  if(alarm_flag==1)	 
			  spk_flag=1; //报警
           TR0=0;      //关闭定时器
			 }
	  	 }	  
	  }
//============================================
//函数名:void main()
//函数功能:主函数
//制作者:
//日期:08-03-15
//============================================ 
void main()
    {
     spk_flag=0;
	  P1=0x0f;   	 

	  TMOD=0x01;
	  TH0=(65535-50000)/256;
	  TL0=(65535-50000)%256;
	  ET0=1;
	  EA=1;
	 	 
	 code_set();
    setalarm();

	 while(1)
	   {  		 
/*******遥控和报警信号****************/
		//读取P1口的值,即触发地点及遥控的值 
      if((P1&0x0f)!=0x0f)   
		   {
			 Indata=P1;
		//如果P1口的值有改变则执行
          if(Indata!=Indata2)	
				 {
				  Indata1=Indata;
				  Indata2=Indata;
				  }
      //如果是热释电传感器则马上报警
			 if((Indata1>2)&&(Indata1<8)&&alarm_flag)   
				 spk_flag=1;
      //如果是门磁则执行
          if((Indata>=8)&&(Indata<=16)&&alarm_flag)  
				{
				if(mode==1)			//报警方式1门磁一触发则报警
					{								 								  
					spk_flag=1;
					}
				if(mode==2)
               { 
					TR0=1;  		   //启动定时器0						  
					}
				}
        	//遥控置位报警
			 if(Indata1==1)	
				{ 
				setalarm();
				}
			 if(Indata1==2)		 //遥控清零报警
				{ 
				Indata1=0;
				spk_flag=0;
				alarm_flag=0;
				beep();
				display_buffer[1]=0x11;
				}
			 }
			display_buffer[0]=Indata;
        /*************按键*************/
	   	if(key_flag())	            //如果有键按下则执行此
           	{
		     	keycode= keyscan();    	//取得键值
				if(keycode==0xf0)	      //如果按了密码设置键(f0)则置位密码设置标志位
				  { 
					Lbeep();
					codeset_flag=1;
					codeinput();
					code_read();
					if(coderight())
					  {
						codeset_flag=1;
						codeinput();
						code_set();
						CodeBuff[2]='\0';	//在这加一个干扰信号,破坏缓存
						}	  
					else
						{ 
						 display_buffer[1]=0x0e;
						 alarm_flag=1;
						}
						  
               }
            else if(keycode==0xf2)//按下设置报警,置位报警位
						{
						 setalarm();
						}
                  else if(keycode==0xf3)//按下清除报警,清零报警位
					         { 
						      Lbeep();
							   codeset_flag=1;
							   codeinput();	//输入密码
						      code_read();	//从24C 02读出原来的密码用于校验
							   if(coderight()) //如果输入密码正确则执行
							  		 {
							   	  alarm_flag=0;
							  	     display_buffer[1]=0x11;
									  CodeBuff[2]='\0';	//在这加一个干扰信号,破坏缓存
							  	     }	  
							   else	//如果密码不正确则显示E
							       {
									  display_buffer[1]=0x0e;
									  alarm_flag=1;
									 }
						        }
					  else if(keycode==0xf1)//如果按下MODE键则更改模式
					       {
						      mode++;
							   if(mode==3)
							   mode=1;
							   display_buffer[1]= mode;
						    }
                    else if(keycode==0xfb||keycode==0xff); 
                         //这里什么都不做							  
		    		          else 
	         		           display_buffer[1]=keycode;	   //否则显示键值		
	 	   			}
          display();
			 alarm();
			   
	     } 
   }

⌨️ 快捷键说明

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