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

📄 laserbeam._c

📁 AVR单片机实现的窗户红外光报警器程序
💻 _C
字号:
/*
	电子窗户防盗网
	main.c
	硬件:CA-M8
	时钟:1MHz
*/

#include <io8515v.h>
#include <macros.h>

void DelayUs(unsigned int t)
{
	int a;
	for (a = 1; a<t; a++){;}  
}

void DelayMs(unsigned int t)
{
	int a, b;
	for (a = 1; a<t; a++){
	  for (b = 1; b<150; b++){;}
	}  
}

void main()
{
	unsigned char i,a,b,d;
	int Alarm1_triggered,Alarm2_triggered; //,Burglar_Triggered;
	int Time_Alarm,Alarm1_Time,Alarm2_Time;

	Alarm1_triggered =0;            //警报1触发标记,没有触发为0,触发为1
	Alarm2_triggered =0;            //警报2触发标记,没有触发为0,触发为1
    //Burglar_Triggered=0;            //同时触发两条激光线标记,没有触发为0,触发为1
	Alarm1_Time = 30;               //第一级(低音)报警时间(毫秒)
	Alarm2_Time = 40;               //第二级(高音)报警时间(毫秒)
	DDRC = 0xFF;	                //整个C口设置为输出
    PORTC =0;                       //C口输出为0
	while (1){
       if((Alarm1_triggered==0) && (Alarm2_triggered==0)){
	      DDRD = 0;	                // 整个D口设置为输入
	      PORTD =0xFF;              // D口上拉电阻全部有效
	      PORTC = PORTC & (~1);     // C口第3脚C1输出低电平
	      PORTC = PORTC | 2;        // C口第2脚C2输出高电平
	      a =1;
		  for(i = 0; i < 8; i++){
		      DDRB  = a;	        // B口第i脚设置为输出 
	          PORTB = 0xFF;         // B口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
	          DelayUs(50);          // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
		      b = PINB;
			  d = ~PIND;
		      if((d!=a) || (b!=0xFF)){      //如果没有报警发生,并且产生了警情,就输出报警信号
			     Alarm1_triggered =1;       //标记产生了警情
			     Time_Alarm =0;             //报警计时器清0
				 PORTC = PORTC | BIT(3);    //触发第一级报警
		         goto AlarmStatus;
			  }
			  a = a<<1;
	      }	

          DDRB = 0;	               // 整个B口设置为输入
	      PORTB =0xFF;             // B口上拉电阻全部有效
	      PORTC = PORTC & (~2);    // C口第2脚C1输出低电平
	      PORTC = PORTC | 1;       // C口第3脚C2输出高电平
	      a = 1;
		  for(i = 0; i < 8; i++){
		      DDRD  = a;	       // D口第i脚设置为输出 
	          PORTD = 0xFF;        // D口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
		      DelayUs(50);         // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
		      b = ~PINB;
			  d = PIND;
		      if((b!=a) || (d!=0xFF)){       //如果没有报警发生,并且产生了警情,就输出报警信号
			     Alarm1_triggered =1;        //标记产生了警情
			     Time_Alarm =0;              //报警计时器清0
		         PORTC = PORTC | BIT(3);     //触发第一级报警
		         goto AlarmStatus;
			  }
			  a = a<<1;
	      }	
       }
AlarmStatus:
	   if((Alarm1_triggered ==1) || (Alarm2_triggered ==1)){
	      Time_Alarm = Time_Alarm+1;         //报警时间计时
	      DelayMs(100);                      //延时100毫秒
	      if((Time_Alarm>Alarm1_Time) && (Alarm2_triggered ==0)){   //触发第二级报警
             Alarm1_triggered =0;
			 Alarm2_triggered =1;
			 PORTC = PORTC & (~BIT(3));      //第一级报警时间到了,报警关闭(电话铃声)
		     PORTC = PORTC | BIT(4);         //接通第二级报警
          }
		  if(Time_Alarm>(Alarm1_Time+Alarm2_Time)){
	         Alarm2_triggered =0;            //清除报警标记,停止报警
		     PORTC = PORTC & (~BIT(4));      //第二级报警(高音量)时间到了,报警关闭(高声喇叭报警)
	         //if(Time_Alarm>600)PORTC = PORTC | BIT(5);    //接通第五脚进行报警(拨电话号码报警)
	      }
	   }
	}
}

⌨️ 快捷键说明

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