网站导航: 首页 > 设计参考 > 正文 文章搜索
一款简单的被动式红外线报警器制作
 
文章编号:
090113124642
文章分类: 电子制作 光电
点 击:
...
关 键 词: 红外,报警器
文章来源:
www.527dz.com
摘 要:
本文介绍了一款简单式被动式红外线防盗报警器的制作,此报警器由红外线发射、接收、蜂鸣器和发光二极管组成。工作时,绿色的发光二极管常烁,表示被监控区域正常。一旦被监控区域有人闯入,绿色发光二极熄灭,红色的

程序实现

程序主要要完成三大功能:38KHZ载波信号的产生、红外接收头TL0038输出电平的检测、发光二极管和蜂鸣器的驱动。
本程序使用8位定时计数器T/C0溢出中断使PD0产生38KHZ的方波信号,然后驱动红外线发射管。T/C0计数器是单一向上计数器,其计数值TCNT0一旦计数到0XFF后,T/C0马上产生溢出中断。因此,我们可以通过设置TCNT0的初始值来调整中断产生的频率。每产生一次中断就改变一次PD0的电平状态,从而在PD0口产生38KHZ的方波信号。

Atmega8采用内部8MHZ的RC时钟信号,T/C0的时钟源采用系统时钟8分频,即每计一个数(TCNT0增加1)需要1us的时间。38KZH的时钟周期大约为26us左右,因此,半周期需要计数13次左右,即TCNT0初始值为256-13=243。另外,我们还需要在38KHZ的载波信号上调制上一个码信号,也就是说38KHZ的载波信号不是一直在产生,而是间断的发射。如下图所示:

 

同时,程序通过不断地读取PC5脚的电平值来判断TL0038是否接收到红外信号。一旦连续检测到多次PC5为低电平,则立即打开蜂鸣器和红色的LED。之所以要连续检测多次,主要是防止TL0038上产生杂波信号而误报警。
 

源代码如下:

 
  1. /**************************************************************************  
  2. 实验2:简单的被动式红外线报警器  
  3. PB1: 绿色LED  
  4. PB0: 红色LED  
  5. PD7: 蜂鸣器  
  6. PC5: 连接TL0083的输出端  
  7. PD0: 红外LED  
  8. 2004年8月4日  
  9. ***************************************************************************/  
  10.   
  11. #include <iom8v.h>//和单片机类型相对应的头文件,选择Atmega8做实验;   
  12. #include <macros.h>   
  13. void delay_nus(unsigned int n);//函数声明,本实验中会用到这两个函数   
  14. void delay_nms(unsigned int n);   
  15. void main(void)//主函数   
  16. {  //L6   
  17.   unsigned int i;   
  18.   unsigned char n;   
  19.   OSCCAL=0X9E;//系统时钟校准,不同的芯片和不同的频率,   
  20.   //其校准值是不一样的   
  21.   TCCR0=BIT(CS01);//T/C0时钟8分频   
  22.   TIMSK=BIT(TOIE0);//允许定时器T/C0溢出中断   
  23.   SEI();//开中断   
  24.   DDRD|=BIT(0)|BIT(7);//设置PD0、7为输出口   
  25.   DDRC&=~BIT(5);//设置PC5为输入口   
  26.   DDRB|=BIT(1)|BIT(0);//定义B口的PB0、PB1为输出口   
  27.   PORTB|=BIT(1);//PB1口输出高电平,绿灯亮   
  28.      
  29.      
  30.   while(1)   
  31.     {   //L5    
  32.      for (n=0;n<10;n++)   
  33.         {  //L4   
  34.          delay_nus(60);   
  35.          if ((PINC&0B00100000)==0) //检测PC5是否为低电平   
  36.             {   //L3   
  37.              i++;   
  38.              if (i>8)//如果连续检测到有301-399次PC5都为低电平,则报警   
  39.                 {     //L2   
  40.                     CLI();    
  41.                     for(i=0;i<10;i++)   
  42.                     {  //L1   
  43.                      PORTB&=~BIT(1);//关闭绿灯   
  44.                      PORTD|=BIT(7);//打开蜂鸣器   
  45.                      PORTB^=BIT(0);//翻转PB1口,红灯快闪   
  46.                      delay_nms(300);   
  47.                     }  //L1   
  48.                  PORTD&=~BIT(7);//关闭蜂鸣器   
  49.                  PORTB&=~BIT(0);//关闭红灯   
  50.                  i=0;   
  51.                  SEI();   
  52.                 }    //L2 */   
  53.              PORTB|=BIT(1);//打开绿灯   
  54.             }  //L3    
  55.         }  //L4    
  56.      //-------------------码调制----------------------------/   
  57.      CLI();//PD0连续2ms都无输出   
  58.      PORTD&=~BIT(0);   
  59.      delay_nms(2);   
  60.      TCNT0=245;   
  61.      SEI();//PD0连续600us产生38KHZ信号   
  62.      //delay_nus(100);   
  63.     }   //L5 */   
  64.        
  65. }  //L6   
  66.   
  67. #pragma interrupt_handler LED0:iv_TIMER0_OVF//指定中断服务程序的入口   
  68. void LED0(void)//产生38KHz的方波信号   
  69. {   
  70.   PORTD^=BIT(0);//翻转PD0口电平   
  71.   TCNT0=245;   
  72. }   
  73.   
  74. void delay_nus(unsigned int n)//n微秒延时函数   
  75. {   
  76. unsigned int i;   
  77. for (i=0;i<n;i++)   
  78.   {   
  79.       asm("nop");   
  80.   }   
  81. }   
  82.   
  83. void delay_nms(unsigned int n)//n毫秒延时函数   
  84. {   
  85.   unsigned int i;   
  86.   for (i=0;i<n;i++) //执行n次1毫秒延时   
  87.   delay_nus(1000);    
  88. }   
  89.   

 

 
相关文章:

上一页 12
 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4