ccczzh 发表于 2025-5-26 15:16:05

定时器计时期间无法通过读取传感器数据清除定时器计数值

求助大佬们!目前程序想在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();
      }
}




ccczzh 发表于 2025-5-26 15:17:31

跪求大佬解答{:baoquan:}

ccczzh 发表于 2025-5-26 15:57:28

这是我目前使用的keil5的版本信息

ercircle 发表于 2025-5-26 16:15:59

定时器部分看着没问题。怎么判断PIR_Read正常的呢

ccczzh 发表于 2025-5-26 16:36:39

ercircle 发表于 2025-5-26 16:15
定时器部分看着没问题。怎么判断PIR_Read正常的呢

谢谢大佬,我使用逻辑分析仪抓取了一下我热释电传感器的数据,发现是传感器后续获取数据出现错误的原因导致无法改变定时器的值。改了YS312热释电驱动程序后就可以使用了。再次感谢

ercircle 发表于 2025-5-26 16:42:56

ccczzh 发表于 2025-5-26 16:36
谢谢大佬,我使用逻辑分析仪抓取了一下我热释电传感器的数据,发现是传感器后续获取数据出现错误的原因导 ...

{:qiang:}{:qiang:}{:qiang:}
页: [1]
查看完整版本: 定时器计时期间无法通过读取传感器数据清除定时器计数值