当前位置:文档之家› 热式红外传感器设计报告

热式红外传感器设计报告

系统实现: 系统任务常量定义 #define N_TASKS 5 /* 定义任务数量为 5 个*/ #define TASK_STK_SIZE 512 /* 堆栈大小定义(字)*/ 任务堆栈及变量定义 OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* 任务堆栈*/ OS_STK SysTaskStk[TASK_STK_SIZE]; int num=0; int a=0; int time1; 任务划分函数: void sdTask(void *pdata); /*系统任务函数*/ void hotTask(void *pdata); /*主任务*/ 创建任务: OSTaskCreate(hotTask, (void *)0, &SysTaskStk[TASK_STK_SIZE - 1], 8); OSTaskCreate(sdTask, (void *)0, &TaskStk[N_TASKS][TASK_STK_SIZE - 1],10);
OSTaskCreate(hotTask, (void *)0, &SysTaskStk[TASK_STK_SIZE - 1], 8); OSTaskCreate(sdTask, (void *)0, &TaskStk[N_TASKS][TASK_STK_SIZE - 1],10); OSStart(); } //************************热式红外感应任务******************************// void hotTask(void *pdata) { char time[]={0}; for (;;) { OSSemPend(hotvalue,timeout,err); if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)) //热式红外传感器 { GPIO_ResetBits(GPIOC, GPIO_Pin_4); //有人 if(a==0) { a=1; Time_Display(); sprintf(time,"%02d%02d%02d",timer.hour,timer.min,timer.sec); time1=atoi(time); OutPutFile(); /*遍历 SD 输出所用文件名并打印出文本文件内容*/ OSSemPost(hotvalue); OSTimeDly(200); } } else { a=0; GPIO_SetBits(GPIOC, GPIO_Pin_4); //无人 } } } //************************SD 卡记录任务*****************************// void sdTask(void *pdata) { for(;;) { OSSemPend(hotvalue,timeout,err); OutPutFile(void); OSSemPost(hotvalue); OSTimeDly(200); } } /*********************** 有关 RTC 的配置************************************/
void RTC_Configuration(void) { /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); //RCC_LSICmd(ENABLE); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {} /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } u32 Time_Regulate(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)/////设置初始时间
主要是由一种高热电系数的材料,如锆钛酸铅系陶瓷、钽酸锂、硫酸三 甘钛等制成尺寸为 2*1mm 的探测元件。在每个探测器内装入一个或两个探 测元件,并将两个探测元件以反极性串联,以抑制由于自身温度升高而产 生的干扰。由探测元件将探测并接收到的红外辐射转变成微弱的电压信号, 经装在探头内的场效应管放大后向外输出。为了提高探测器的探测灵敏度 以增大探测距离,一般在探测器的前方装设一个菲涅尔透镜,该透镜用透 明塑料制成,将透镜的上、下两部分各分成若干等份,制成一种具有特殊 光学系统的透镜,它和放大电路相配合,可将信号放大 70 分贝以上,这样 就可以测出 10~20 米范围内人的行动。
基于 ucos-II 的热式红外路记系统
系统简介:现在许多重要场合都需要监控以及记录很多数据,比如人流量。基于 这种需求,我们小组利用 CotexM3 设计了一种类似“暗箱”的人流量记录系统。 整个设计主要分为两个部分,一个是热式红外传感器感知“有人”或“无人” 状 况;另一部分是 SD 卡的写操作。这样两部分协同工作,可以把每个路人的经过 时间写入 SD 卡,通过分析这种数据就可以知道一个场合一天内的人流量以及人 员达到的时间。 用热释电红外传感器设计的监控报警系统具有结构简单、成本低等优点。 热式红外传感器: PIR 管教分布图如下:
{ u16 t; u32 seccount=0; if(syear<2000||syear>2136)return 1; for(t=2000;t<syear;t++)//////所有年份秒相加 定义 1970 为基准时间 { if(Is_Leap_year(t))seccount+=31622400;//////闰年的秒钟数 else seccount+=31536000; } smon-=1; for(t=0;t<smon;t++)/////////月份秒钟数相加 { seccount+=(u32)mon_table[t]*86400; if(Is_Leap_year(syear)&&t==1)seccount+=86400;/////闰年 2 月份增加一天的秒钟数 } seccount+=(u32)(sday-1)*86400;///////日期秒数相加 seccount+=(u32)hour*3600;////////小时秒相加 seccount+=(u32)min*60;///////分钟秒相加 seccount+=sec;////////最后的秒相加 RCC->APB1ENR|=1<<28;//////使能电源时钟 RCC->APB1ENR|=1<<27;//////使能备份区时钟 PWR->CR|=1<<8;//////取消备份区写保护 RTC->CRL|=1<<4;//////允许配置 while ((RTC->CRL & RTC_FLAG_RTOFF) == (unsigned int)RESET); RTC->CNTL=seccount&0xffff; RTC->CNTH=seccount>>16; RTC->CRL&=~(1<&p;(1<<5)));//////等待 RTC 寄存器操作完成 return 0; } void Time_Display(void) { static u16 daycnt=0; u32 timecount=0; u32 temp=0; u16 temp1=0; timecount=RTC->CNTH; timecount<<=16; timecount+=RTC->CNTL; temp=timecount/86400; if(daycnt!=temp) /////将计数器里的时间化为公历时间并显示
任务通信: hotvalue = OSSemCreate(1); OSSemPend(hotvalue,timeout,err); OSSemPost(hotvalue); //*********************RTC*********************// 有关 RTC 变量定义: const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31} ;////月份日期表 typedef struct///////时间结构体 { u8 hour; u8 min; u8 sec; u16 w_year; u8 w_month; u8 w_date; u8 week; }tm; tm timer; /****************************************************************************** * * 函数名 : main * 描述 : Main 函数 * 输入参数 : None * 输出 : None * 返回值 : None ******************************************************************************* / void main(void) { #ifdef DEBUG debug(); #endif INT8U i,hotvalue; uHAL_Init(); SD_Set(); /*SD 卡设置*/ if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A3) { RTC_Configuration(); Time_Regulate(2012,5,28,15,14,50); BKP_WriteBackupRegister(BKP_DR1, 0xA5A3); } OSInit(); hotvalue = OSSemCreate(1);
相关主题