- 打卡等级:初来乍到
- 打卡总天数:3
- 最近打卡:2025-06-11 11:14:23
已绑定手机
新手上路
- 积分
- 33
|
求助大佬们!目前程序想在Sensor_Task_Dark函数中,通过读取PIR_Data热释电人体传感器的值进行定时器计时20s,然后在20s期间读取热释电人体传感器如果读取到人在的值就重新开始计时20s。目前无法重新开始计时20s,必须计数完成后才能进行下一次读取。主程序如下:
#include "Config.h"
//========================================================================
#include "RGB_Gradient.h"
#include "App_Pwm.h"
#include "App_GPIO.h"
#include "App_Timer.h"
#include "Touch_Key.h"
#include "App_ADC.h"
#include "KEY.h"
#include "YS312.h"
#include "Sleep_Mode.h"
#include "Delay.h"
//#include "UART.h"
//========================================================================
//全局使用
volatile u8 SYS_Mode = 0; //系统模式:0-待机,1-常亮,2-夜晚感应
//待机模式使用
bit First_In_Standby_Task_Flag = 0; //第一次进入待机模式标志位
//夜间感应使用
volatile u8 PIR_Data = 0; //YS312感应数据,初始化为0,表示未感应到人
//bit CDS_Data = 1; //光敏CDS感应数据,初始化为1,表示为亮光状态
extern bit CDS_Result;
bit First_In_Sensor_Task_Flag = 0; //第一次进入感应模式标志位
bit Choose_Sensor_Flag = 0; //选择传感器标志位:0,选择先光敏再人体。1,选择人体
//========================================================================
/****当前颜色****/
extern u8 CurRed;
extern u8 CurGreen;
extern u8 CurBlue;
/****感应模式延时20s标志位****/
extern volatile bit Open_20s_Timer_Flag; //定时器打开计时20s标志位
extern volatile bit Timer_20s_Flag; //定时器计时20ms标志位
/****感应模式定时器延时20s的计数位****/
extern volatile u32 Timer0_Cnt1;
//========================================================================
/*********待机模式*********/
void Standby_Task(void)
{
//进入待机(渐灭) ,睡眠模式
if(First_In_Standby_Task_Flag == 1)
{
Fade_Out_RGB(CurRed,CurGreen,CurBlue);
CurRed = 0;
CurGreen = 0;
CurBlue = 0;
First_In_Standby_Task_Flag = 0;
}
Sleep_Handler2();//进入掉电睡眠模式
}
/*********常亮模式*********/
void Constant_Loop_Task(void)
{
RGB_Gradient_Handler();
}
/*********夜间感应模式*********/
void Sensor_Task_Dark(void)
{
//进入夜间感应:闪烁两次
if(First_In_Sensor_Task_Flag == 1)
{
RGB_Flicker(CurRed,CurGreen,CurBlue);
First_In_Sensor_Task_Flag = 0;
}
//直接先获取YS312和CDS的数据
PIR_Data = PIR_Read();
CDS_GetHandler();
if(Choose_Sensor_Flag == 0)
{//先判断光敏再判断YS312
if(CDS_Result == 0)
{//暗光
if(PIR_Data == 1)
{//感应到人
Timer0_Cnt1 = 0;
Choose_Sensor_Flag = 1;//选择再次进入为直接判断YS312
Timer_20s_Flag = 0; //将定时器完成20s计时标志位置0
Open_20s_Timer_Flag = 1;//打开定时器20s计时标志位
}
}
}
else if(Choose_Sensor_Flag == 1)
{//仅判断YS312
if(PIR_Data == 1)
{//感应到人
Timer0_Cnt1 = 0;
Timer_20s_Flag = 0; //将定时器完成20s计时标志位置0
Open_20s_Timer_Flag = 1;//打开定时器20s计时标志位
}
}
//通过判断Timer_20s_Flag来让RGB灯工作
if(Timer_20s_Flag == 0)
{//检测到人后时间未到——>开灯
RGB_Gradient_Handler();
}
else
{//未检测到人或者定时器20s结束 进入
RGB_Set(0,0,0);
Choose_Sensor_Flag = 0;
if(CDS_Result == 1)
{
//进入掉电模式,等待INT4(KEY)唤醒
Sleep_Handler2();//需要用非阻塞延时来让进入掉电模式不是随时进入
}
else
{//暗光
//进入掉电模式
Sleep_Timer_Mode();
}
}
}
//========================================================================
/*********整个项目的入口任务*********/
void Project_Enter_Task(void)
{
switch(SYS_Mode)
{
case 0://待机
Standby_Task();
break;
case 1://常亮
Constant_Loop_Task();
break;
case 2://夜晚感应
Sensor_Task_Dark();
break;
}
}
//========================================================================
void main(void)
{
EAXSFR(); /* 扩展寄存器访问使能 :P_SW2 |= 0x80; */
GPIO_Init();
KEY_Init();
PWM_Init();
Touch_Key_Init();
ADC_config();
// Uart1_Init();
PIR_Init();
Timer0_Init();
Timer1_Init();
EA = 1;
while (1)
{
Project_Enter_Task();
}
}
test_pir.7z
(130.68 KB, 下载次数: 7)
|
|