当前位置:文档之家› 热释红外传感器实验

热释红外传感器实验

热释红外传感器实验学院:计信专业:自动化姜木北【实验目的】1. 理解热释红外传感器的工作原理;2. 掌握热释红外传感器的使用方法。

【实验设备】1. 装有IAR 开发工具的PC机一台;2. 下载器一个;3. 物联网多网技术综合教学开发设计平台一套。

【实验原理】1. 热释红外传感器简介普通人体会发射10um左右的特定波长红外线,用专门设计的传感器就可以针对性的检测这种红外线的存在与否,当人体红外线照射到传感器上后,因热释电效应将向外释放电荷,后续电路经检测处理后就能产生控制信号。

这种专门设计的探头只对波长为10μm左右的红外辐射敏感,所以除人体以外的其他物体不会引发探头动作。

探头内包含两个互相串联或并联的热释电元,而且制成的两个电极化方向正好相反,环境背景辐射对两个热释元件几乎具有相同的作用,使其产生释电效应相互抵消,于是探测器无信号输出。

一旦人侵入探测区域内,人体红外辐射通过部分镜面聚焦,并被热释电元接收,但是两片热释电元接收到的热量不同,热释电也不同,不能抵消,于是输出检测信号。

如图 1.127所示:为了增强敏感性并降低白光干扰,通常在探头的辐射照面覆盖有特殊的菲泥尔滤光透镜,菲泥尔滤光片根据性能要求不同,具有不同的焦距(感应距离),从而产生不同的监控视场视场越多,控制越严密。

传感器的光谱范围为1~10μm,中心为6μm,均处于红外波段是由装在TO-5型金属外壳的硅窗的光学特性所决定。

热释电红外传感器不但适用于防盗报警场所,亦适于对人体伤害极为严重的高压电及X射线、γ射线工业无损检测。

本实验所使用的热释电传感器输出信号为高低电平,当检测到人时输出高电平,否则输出低电平。

【电路连接】热释电(人体红外)传感器和CC2530节点电路连接如图 1.128所示:图中J13为传感器模组与CC2530单片机的P1口相连,J14与传感器的接口相连;C26为滤波电容,传感器工作电压为5V,“2”引脚为信号输出端。

【程序流程图】驱动程序流程图如图 1.129所示。

:【热释红外传感器的驱动程序】#include "Basic.h"#include "UART.h"void main(void){uint8 SensorValue;LEDPortInit();UART0_Init( BAUD_115200 );SetIOInput(1,0);for( ; ; ){SensorValue = GetIOLevel( 1, 0 );UART0_Send( "Safety Sensor:", sizeof("Safety Sensor:")-1 );UART0_Dis_uNum(SensorValue);if(0 == SensorValue)UART0_Send( "NoBody Nearby", sizeof("NoBody Nearby")-1 );else if(1 == SensorValue)UART0_Send( "Someone Nearby!", sizeof("Someone Nearby!")-1 );UART0_Send( "\r\n", sizeof("\r\n")-1 );SET_LED_D8;Delay(5);CLR_LED_D8;Delay(120);}}#include "Basic.h"void delay(uint n){uint i;for(i=0;i<n;i++);for(i=0;i<n;i++);for(i=0;i<n;i++);for(i=0;i<n;i++);for(i=0;i<n;i++);}void Delay(uint n){uint i,j,k;for(i=0;i<n;i++)for(j=0;j<100;j++)for(k=0;k<100;k++)}void LEDPortInit(void){P1SEL &= ~0X02;P2SEL &= ~0X01;P1DIR |= 0X02;P2DIR |= 0X01;CLR_LED_D8;CLR_LED_D9;}uint8 GetCh08bitADC(void){uint8 v = 0;ADCCFG = 0x01;ADCCON1 = 0x33;ADCCON2 = 0xB0;ADCCON1 |= 0x40;while(!(ADCCON1 & 0x80));v = ADCL;v = ADCH;return(v);}// pull: 0 - disable, 1 - pulldown, 2 - pullupvoid SetIOInput(uint8 group, uint8 bit){switch(group){case 0: P0DIR &= ~(1 << bit); P0SEL &= ~(1 << bit); P0INP |=(1 << bit); break;case 1: P1DIR &= ~(1 << bit); P1SEL &= ~(1 << bit); P1INP |=(1 << bit); break;case 2: P2DIR &= ~(1 << bit); P2SEL &= ~(1 << bit); P2INP |=(1 << bit); break;}}void SetIOOutput(uint8 group, uint8 bit){switch(group){case 0: P0DIR |= (1 << bit); P0SEL &= ~(1 << bit); break;case 1: P1DIR |= (1 << bit); P1SEL &= ~(1 << bit); break;case 2: P2DIR |= (1 << bit); P2SEL &= ~(1 << bit); break;}}uint8 GetIOLevel(uint8 group, uint8 bit){switch(group){case 0: return !!(P0 & (1 << bit));case 1: return !!(P1 & (1 << bit));case 2: return !!(P2 & (1 << bit));}return 0;}void SetIOLevel(uint8 group, uint8 bit, uint8 value){switch(group){if(value)P0 |= (1 << bit);elseP0 &=~(1 << bit);break;case 1:if(value)P1 |= (1 << bit);elseP1 &=~(1 << bit);break;case 2:if(value)P2 |= (1 << bit);elseP2 &=~(1 << bit);break;}}#include "UART.h"void UART0_Init(BaudSel baud){CLKCONCMD &= ~0X40; //晶振while(!(SLEEPSTA & 0X40)) CLKCONCMD &= ~0X47;SLEEPCMD |= 0X04; //关闭不用的RC振荡器PERCFG = 0X00;//位置1 P0口P0SEL |= 0X0C;//P0用作串口U0CSR |= 0X80;//UART方式switch(baud){case BAUD_2400: U0GCR |= 6; U0BAUD |= 59; break;case BAUD_4800: U0GCR |= 7; U0BAUD |= 59; break;case BAUD_9600: U0GCR |= 8; U0BAUD |= 59; break;case BAUD_14400: U0GCR |= 8; U0BAUD |= 216; break;case BAUD_19200: U0GCR |= 9; U0BAUD |= 59; break;case BAUD_28800: U0GCR |= 9; U0BAUD |= 216; break;case BAUD_38400: U0GCR |= 10; U0BAUD |= 59; break;case BAUD_57600: U0GCR |= 10; U0BAUD |= 216; break;case BAUD_76800: U0GCR |= 11; U0BAUD |= 59; break;case BAUD_115200: U0GCR |= 11; U0BAUD |= 216; break;case BAUD_230400: U0GCR |= 12; U0BAUD |= 216; break;default : U0GCR |= 11; U0BAUD |= 216; break; //BAUD_115200; }U0CSR |= 0X40;//允许接收IEN0 |= 0X84;//开总中断,接收中断}void UART0_Send(char *Data,int len){int i;for(i=0;i<len;i++){U0DBUF = *Data++;while(UTX0IF == 0)UTX0IF = 0;}}void UART0_Dis_uNum(uint16 uValue ){uint8 i;char cData[5] = {'0','0','0','0','0'};cData[0] = uValue % 100000 / 10000 + '0';cData[1] = uValue % 10000 / 1000 + '0';cData[2] = uValue % 1000 / 100 + '0';cData[3] = uValue % 100 / 10 + '0';cData[4] = uValue % 10 / 1 + '0';if(0 != uValue ){for( i=0; i<5; i++){if('0' != cData[i] )break;if('0' == cData[i] )cData[i] = ' ';}}else if(0 == uValue ){for( i=0; i<4; i++){cData[i] = ' ';}}UART0_Send(" ", 1);UART0_Send(cData, 5);UART0_Send(" ", 1);}void UART0_Dis_fNum(float fValue ){uint16 uValue = (uint16)( 100 * fValue );char cData[5] = {'0','0','.','0','0'};cData[0] = uValue % 10000 / 1000 + '0';cData[1] = uValue % 1000 / 100 + '0';cData[2] = '.';cData[3] = uValue % 100 / 10 + '0';cData[4] = uValue % 10 / 1 + '0';UART0_Send(" ", 1);UART0_Send(cData, 5);UART0_Send(" ", 1);}#pragma vector = URX0_VECTOR__interrupt void UART0_ISR(void){// static char temp[1];// temp[0] = U0DBUF;// UART0_Send(temp, 1);URX0IF = 0;//清中断标志}【实验现象及其结果】当运行程序,并靠近红外传感器时可以发现串口运行窗口中数据值一表示检测到人存在:(有人存在)。

相关主题